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 вручную для обоих
рендеров.
Watchdog горел всегда по построению (10080/10080 интервалов за 7 суток) и
раньше слался в Telegram раз в 12ч — 14 сообщений в неделю ни о чём. Это
приучило пролистывать инфра-тему, и 17.09 настоящий DiskWillFillIn24h утонул
между Watchdog и вечно горящим NoActiveCeleryWorkers: диск дошёл до 84%
незамеченным.
Watchdog переведён на внешний deadman-приёмник (webhook на
METRICS_WATCHDOG_PING_URL, healthchecks.io-подобный сервис) вместо Telegram:
человек не получает ни одного штатного сообщения, а живость канала
по-прежнему подтверждается регулярным HTTP-пингом. Секрет на хосте пока не
заведён — деплой не трогаем, добавление аккаунта и значения переменной на
проде остаётся ручным шагом.
Новое правило Prometheus AlertFiringTooLong эскалирует любую тревогу,
непрерывно firing дольше 6 часов (кроме Watchdog и себя самой — оба
исключения обязательны, иначе получаем второй вечный сигнал). Маршрутизирована
в клиентскую тему (алертменеджер матчит по alertname, не по host — исходная
тревога может быть про любой хост).
Затронуты также два backend-теста ops/ (test_3078_alert_topic.py,
test_3078_oncall_route.py), проверявших структуру шаблона Alertmanager —
обновлены под новую форму (один прямой Telegram-получатель вместо двух,
маркер watchdog-ping вместо telegram-heartbeat).