fix(ops): убрать Watchdog из человеческой ленты + эскалация по длительности #3589
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3589
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/alert-noise-and-escalation"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
DiskWillFillIn24hутонул между Watchdog (10080/10080 интервалов firing за 7 суток по построению) и вечно горящимNoActiveCeleryWorkers. Теперьwatchdog-ping— webhook на внешний deadman-приёмник (METRICS_WATCHDOG_PING_URL, healthchecks.io-подобный сервис): человек не получает ни одного штатного сообщения, живость канала по-прежнему подтверждается регулярным HTTP-пингом. Полностью проверку не выключали.AlertFiringTooLong(ops/metrics/prometheus/rules/infra.yml):label_replace((time() - ALERTS_FOR_STATE{alertname!~"Watchdog|AlertFiringTooLong"}) > 6*3600, "stuck_alertname", "$1", "alertname", "(.+)"). Исключены Watchdog (горит всегда по построению) и сама себя (иначе продлевала бы себя бесконечно — та же болезнь, которую лечим). Маршрутизирована вtelegram-clientsпоalertname, не поhost— исходная тревога может быть про любой хост, врать в лейбле не стали.backend/tests/ops/(test_3078_alert_topic.py,test_3078_oncall_route.py) обновлены под новую форму шаблона: один прямой Telegram-получатель вместо двух, маркерwatchdog-pingвместоtelegram-heartbeat.Известное поведение после мержа
NoActiveCeleryWorkersсейчас firing (чинится параллельным PR) —AlertFiringTooLongсработает по ней сразу после деплоя этого PR. Это ожидаемо и корректно: тревога держится из-за реальной незакрытой проблемы, а не по построению.Manual step (не применялось на проде)
METRICS_WATCHDOG_PING_URLне заведён на хосте — нужен аккаунт healthchecks.io (или аналог) и добавление секрета в окружение деплоя (envsubst,.forgejo/workflows/deploy-metrics.ymlне трогали). До этого шага webhook Watchdog будет тихо фейлиться по DNS/сети — так же незаметно для человека, как и задумано, но проверку стоит завершить.Verify
promtool check rules— SUCCESS (26 rules)promtool test rules(новый кейс на эскалацию, проверено реальным прогоном, не выдумано) — SUCCESSamtool check-configна шаблоне с заглушками (prom/alertmanager:v0.28.0) — SUCCESS, 3 receiverspytest backend/tests/ops— 131 passed, 2 failed (test_3443_caddy_reload_not_recreate.py, Caddy-recreate — не затронуто этим диффом, pre-existing)Не сделано
docker exec gendesign-prometheus wget ...для live-проверки NoActiveCeleryWorkers НЕ выполнялся — согласно правилу devops-engineer «prod SSH требует явного approval пользователя», а инструкция задачи не является таким approval. Заменено эквивалентной проверкой черезpromtool test rulesс синтетическими данными.METRICS_WATCHDOG_PING_URLна хосте — ручной шаг пользователя.🤖 Generated with Claude Code
https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
amtool check-config падал на "unsupported scheme \"\" for URL": шаблон заводил url: "${METRICS_WATCHDOG_PING_URL}" напрямую, а envsubst в deploy-metrics.yml вызывается с явным allow-list переменных, в который эту новую переменную не добавили — литерал плейсхолдера (или пустая строка, если бы добавили без блока) доезжал до amtool и валил проверку целиком, то есть ронял ВЕСЬ Alertmanager, а не только Watchdog. Тот же приём, что уже применён для темы форума: подставляется ЦЕЛЫЙ БЛОК (webhook_configs целиком), а не голое значение url. Собирается в deploy-metrics.yml через METRICS_WATCHDOG_PING_BLOCK — если секрет задан, блок с url и send_resolved; если пуст, пустая строка и ::warning в лог. Пустой блок оставляет receiver watchdog-ping без единого *_configs — это валидный конфиг Alertmanager (приёмник молча ничего не шлёт), а не деградация всего алертинга. METRICS_WATCHDOG_PING_URL добавлен в env/envs appleboy/ssh-action и в allow-list envsubst. _render() в test_3078_alert_topic.py переписан так, чтобы подставлять РОВНО тот набор переменных, что реально в allow-list деплоя (вытащен регексом из самого воркфлоу), а не свой отдельный список — так и воспроизвёлся бы этот регресс автоматически. Добавлен явный тест test_every_template_placeholder_is_in_envsubst_allowlist на этот инвариант и два теста на обе ветки watchdog-секрета (пуст / задан), проверенные amtool check-config на prom/alertmanager:v0.28.0 вручную для обоих рендеров.Исправлено в
b8d2e749. Причина подтвердилась:envsubstвdeploy-metrics.ymlвызывается с явным allow-list, кудаMETRICS_WATCHDOG_PING_URLне попал — литерал плейсхолдера доезжал доamtool check-configи валил его (unsupported scheme ""), роняя весь Alertmanager.Фикс — тот же приём, что уже используется для темы форума: подставляется целый блок
METRICS_WATCHDOG_PING_BLOCK(webhook_configs целиком или пустая строка +::warning), а не голое значение url. Пустой блок оставляетwatchdog-pingбез*_configs— валидная деградация, не падение. Переменная добавлена вenv:/envs:шага appleboy/ssh-action и в allow-list envsubst._render()вtest_3078_alert_topic.pyтеперь берёт allow-list из самого воркфлоу регексом (не свой список), плюс новыйtest_every_template_placeholder_is_in_envsubst_allowlist— тот же класс регресса впредь ловится тестом, а не вручную. Оба рендера (секрет задан / пуст) провереныamtool check-configнаprom/alertmanager:v0.28.0вручную.