From 26a7f1c1631ebdaebf48c683cd82dd18671a44ab Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 17 Sep 2026 12:38:14 +0500 Subject: [PATCH] =?UTF-8?q?fix(metrics):=20=D1=82=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B3=D0=B0,=20=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=B1=D1=8D?= =?UTF-8?q?=D0=BA=D0=B5=D0=BD=D0=B4=20=D0=9C=D0=B5=D1=80=D1=8B=20=D0=BB?= =?UTF-8?q?=D1=91=D0=B3,=20=D0=B0=20=D0=BB=D1=8D=D0=BD=D0=B4=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=20=D0=B5=D1=89=D1=91=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20(#2214)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Мёртвый или зависший tradein-backend не давал ни одного сигнала вне Poincare. GlitchTip-монитор 6 смотрит на лэндинг meraocenka.ru, а его отдаёт фронт из пререндер-кэша (x-nextjs-cache: HIT) — при мёртвом бэкенде там 200. Монитор 2 (gendsgn.ru/health) проверяет бэкенд Птицы. AppHighErrorRate и AppHighLatencyP95 считают метрики самого бэкенда и при его смерти молчат. Новое правило MeraBackendDown: up{job="app",app="mera"} == 0 или серия пропала, 5 минут, severity critical + host apps — маршрут telegram-clients, тема 158. Считается и доставляется на Beget. Порог 5 минут откалиброван по истории up за 26.08–17.09: 140 провалов, самый длинный — 4 нулевые точки (~2 минуты, окна деплоя). Юнит-тесты promtool: мёртвый бэкенд — тревога; окно деплоя и упавшая Птица — тишина; цель пропала из скрейпа — тревога. Co-Authored-By: Claude Opus 5 --- ops/metrics/prometheus/rules/infra.yml | 34 +++++++++++++ ops/metrics/prometheus/tests/infra_test.yml | 55 +++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/ops/metrics/prometheus/rules/infra.yml b/ops/metrics/prometheus/rules/infra.yml index 6f050c92..a78751d0 100644 --- a/ops/metrics/prometheus/rules/infra.yml +++ b/ops/metrics/prometheus/rules/infra.yml @@ -215,6 +215,40 @@ groups: - name: app interval: 60s rules: + # Бэкенд «Меры» лежит или завис (#2214). До этого правила такой отказ не + # давал ни одного сигнала вне Poincare. GlitchTip-монитор 6 смотрит на + # лэндинг meraocenka.ru, а его отдаёт tradein-frontend из пререндер-кэша + # (x-nextjs-cache: HIT) — при мёртвом бэкенде там по-прежнему 200. + # Монитор 2 (gendsgn.ru/health) — это бэкенд «Птицы». Два правила ниже + # считают метрики, которые отдаёт сам бэкенд: мёртвый не отдаёт, и они + # молчат по построению. + # + # Скрейп идёт с Poincare (Alloy), но решение и доставка — здесь, на Beget. + # Зависший event loop даёт таймаут скрейпа (20s), удалённый контейнер — + # ошибку DNS; в обоих случаях up=0. Смерть всего хоста ловят + # HostAgentDown/RemoteWriteStalled; `absent()` — на случай, когда цель + # тихо пропала из alloy-apps.alloy. + # + # for: 5m — по истории up{app="mera"} 26.08–17.09 (61 857 точек): 140 + # провалов, все короткие (окна деплоя), самый длинный — 4 нулевые точки + # подряд, ~2 минуты до восстановления. 5 минут — запас в 2.5 раза. + # + # Чего правило НЕ видит: публичный путь до бэкенда (DNS, TLS, Caddy). + # Для лэндинга его проверяет монитор 6; монитора на публичную ручку + # бэкенда (meraocenka.ru/trade-in/api/public/mera/stats) пока нет — он + # заводится в UI GlitchTip, а не кодом. + - alert: MeraBackendDown + expr: | + up{job="app", app="mera"} == 0 + or absent(up{job="app", app="mera"}) + for: 5m + labels: + severity: critical + host: apps + annotations: + summary: "Бэкенд «Меры» не отвечает" + description: "Агент на Poincare 5 минут не может снять /metrics с tradein-backend (up=0), либо цель пропала из скрейпа. Проверь `docker ps` и /health изнутри сети. Лэндинг meraocenka.ru может открываться из кэша и при мёртвом бэкенде — это не признак жизни." + # Гейт по RPS внутри знаменателя — тот же приём, что у # PostgresLowHotUpdateRatio: делит только там, где трафик уже есть, # иначе один упавший запрос при нулевой нагрузке даёт 100% и будит diff --git a/ops/metrics/prometheus/tests/infra_test.yml b/ops/metrics/prometheus/tests/infra_test.yml index 810f18d8..e7d9dfbf 100644 --- a/ops/metrics/prometheus/tests/infra_test.yml +++ b/ops/metrics/prometheus/tests/infra_test.yml @@ -115,3 +115,58 @@ tests: exp_annotations: summary: "Ни одного живого воркера Celery" description: "celery-exporter работает, но не видит ни одного heartbeat от воркера Site Finder. Все periodic-таски (парсинг, аналитика, синк слоёв) встали." + + # #2214: tradein-backend умер, хост и агент живы — агент шлёт up=0. + # До MeraBackendDown этот случай не давал ни одного сигнала вне Poincare. + - interval: 30s + input_series: + - series: 'up{job="app",app="mera",instance="tradein-backend:8000",host="apps"}' + values: '1x9 0x40' + alert_rule_test: + - eval_time: 15m + alertname: MeraBackendDown + exp_alerts: + - exp_labels: + severity: critical + host: apps + job: app + app: mera + instance: tradein-backend:8000 + exp_annotations: + summary: "Бэкенд «Меры» не отвечает" + description: "Агент на Poincare 5 минут не может снять /metrics с tradein-backend (up=0), либо цель пропала из скрейпа. Проверь `docker ps` и /health изнутри сети. Лэндинг meraocenka.ru может открываться из кэша и при мёртвом бэкенде — это не признак жизни." + + # Окно деплоя: самый длинный провал за 26.08–17.09 — 4 нулевые точки подряд + # (~2 минуты). Тревоги быть не должно. Заодно упавший бэкенд «Птицы» не должен + # поднимать тревогу про «Меру». + - interval: 30s + input_series: + - series: 'up{job="app",app="mera",instance="tradein-backend:8000",host="apps"}' + values: '1x19 0 0 0 0 1x40' + - series: 'up{job="app",app="sitefinder",instance="gendesign-backend-1:8000",host="apps"}' + values: '0x64' + alert_rule_test: + - eval_time: 11m + alertname: MeraBackendDown + exp_alerts: [] + - eval_time: 30m + alertname: MeraBackendDown + exp_alerts: [] + + # Цель пропала из скрейпа (агент жив, «Птица» снимается), серии «Меры» нет. + - interval: 30s + input_series: + - series: 'up{job="app",app="sitefinder",instance="gendesign-backend-1:8000",host="apps"}' + values: '1x40' + alert_rule_test: + - eval_time: 10m + alertname: MeraBackendDown + exp_alerts: + - exp_labels: + severity: critical + host: apps + job: app + app: mera + exp_annotations: + summary: "Бэкенд «Меры» не отвечает" + description: "Агент на Poincare 5 минут не может снять /metrics с tradein-backend (up=0), либо цель пропала из скрейпа. Проверь `docker ps` и /health изнутри сети. Лэндинг meraocenka.ru может открываться из кэша и при мёртвом бэкенде — это не признак жизни." -- 2.45.3