Prometheus не видел ни одного Alertmanager: цель file_sd осталась пустой при включённом профиле alerts #3155

Closed
opened 2026-08-27 18:05:57 +00:00 by bot-backend · 1 comment
Collaborator

Симптом

Prometheus не доставил ни одного алерта за всё время работы профиля alerts. Снаружи всё зелёное: gendesign-alertmanager и gendesign-alert-ack — Up/healthy, деплой зелёный, в логах ни одной ошибки.

Проверено на хосте (27.08, Beget):

GET /prometheus/api/v1/alertmanagers
  {"activeAlertmanagers":[],"droppedAlertmanagers":[]}

prometheus_notifications_alertmanagers_discovered 0
prometheus_notifications_dropped_total          1568

cat /etc/prometheus/alertmanager_targets.yml
  []

При этом правил — 16, и часть из них горит прямо сейчас:

Правило Состояние
Watchdog firing с 2026-08-26T10:19
HostAgentDown 622 сэмпла
RemoteWriteStalled 612 сэмплов

Все они ушли в notifications_dropped_total.

Причина

Включатель профиля и цель для Prometheus живут в разных местах:

  • .forgejo/workflows/deploy-metrics.yml поднимает профиль alerts, когда заданы METRICS_TELEGRAM_BOT_TOKEN и METRICS_TELEGRAM_CHAT_ID;
  • ops/metrics/prometheus/alertmanager_targets.yml — отслеживаемый git'ом файл, в котором до сих пор лежит плейсхолдер [] с комментарием «пока профиль alerts выключен (#3078)».

Профиль включили — файл никто не поменял. Разъезд ничем не ловится: [] штатен при выключенном профиле, поэтому ни валидация, ни healthcheck, ни лог на него не реагируют.

Что делаю

Файл целей становится производным (alertmanager_targets.gen.yml, в .gitignore) и рендерится деплоем тем же условием, которым включается профиль: цель при включённых алертах, [] при выключенных. Одно условие — один результат, разъехаться больше нечему.

Почему не оставить файл отслеживаемым: его содержимое каждый деплой возвращалось бы к репозиторному раньше, чем шаг рендера успевал бы его наполнить, а пересозданный инод не виден работающему контейнеру через одиночный бинд-маунт — ровно та ловушка, что поймана сегодня на alertmanager.yml. Рендер пишет усечением на месте, поэтому Prometheus подхватывает цель сам, без пересоздания контейнера.

Приёмка

  • activeAlertmanagers непуст;
  • prometheus_notifications_dropped_total перестаёт расти, растёт ..._sent_total;
  • горящий Watchdog доезжает в Telegram.
## Симптом Prometheus не доставил ни одного алерта за всё время работы профиля `alerts`. Снаружи всё зелёное: `gendesign-alertmanager` и `gendesign-alert-ack` — Up/healthy, деплой зелёный, в логах ни одной ошибки. Проверено на хосте (27.08, Beget): ``` GET /prometheus/api/v1/alertmanagers {"activeAlertmanagers":[],"droppedAlertmanagers":[]} prometheus_notifications_alertmanagers_discovered 0 prometheus_notifications_dropped_total 1568 cat /etc/prometheus/alertmanager_targets.yml [] ``` При этом правил — 16, и часть из них горит прямо сейчас: | Правило | Состояние | |---|---| | `Watchdog` | firing с 2026-08-26T10:19 | | `HostAgentDown` | 622 сэмпла | | `RemoteWriteStalled` | 612 сэмплов | Все они ушли в `notifications_dropped_total`. ## Причина Включатель профиля и цель для Prometheus живут в разных местах: - `.forgejo/workflows/deploy-metrics.yml` поднимает профиль `alerts`, когда заданы `METRICS_TELEGRAM_BOT_TOKEN` и `METRICS_TELEGRAM_CHAT_ID`; - `ops/metrics/prometheus/alertmanager_targets.yml` — отслеживаемый git'ом файл, в котором до сих пор лежит плейсхолдер `[]` с комментарием «пока профиль alerts выключен (#3078)». Профиль включили — файл никто не поменял. Разъезд ничем не ловится: `[]` штатен при выключенном профиле, поэтому ни валидация, ни healthcheck, ни лог на него не реагируют. ## Что делаю Файл целей становится производным (`alertmanager_targets.gen.yml`, в `.gitignore`) и рендерится деплоем **тем же условием**, которым включается профиль: цель при включённых алертах, `[]` при выключенных. Одно условие — один результат, разъехаться больше нечему. Почему не оставить файл отслеживаемым: его содержимое каждый деплой возвращалось бы к репозиторному раньше, чем шаг рендера успевал бы его наполнить, а пересозданный инод не виден работающему контейнеру через одиночный бинд-маунт — ровно та ловушка, что поймана сегодня на `alertmanager.yml`. Рендер пишет усечением на месте, поэтому Prometheus подхватывает цель сам, без пересоздания контейнера. ## Приёмка - `activeAlertmanagers` непуст; - `prometheus_notifications_dropped_total` перестаёт расти, растёт `..._sent_total`; - горящий `Watchdog` доезжает в Telegram.
Author
Collaborator

Приёмка пройдена — цепочка проверена целиком

Замер после деплоя обоих исправлений (#3160 + #3162):

Что Значение
prometheus_notifications_alertmanagers_discovered 1 (было 0)
prometheus_notifications_sent_total 4, растёт
prometheus_notifications_errors_total 3 и не растёт (все три — до #3162)
alertmanager_alerts_received_total{firing} 1 (было 0)
alertmanager_notifications_total{integration="telegram"} 1
alertmanager_notifications_failed_total{telegram,*} 0
health контейнера healthy на обычном пути

То есть Watchdog, горевший с 26.08 10:19 и до сегодня уходивший в dropped_total, доехал до Telegram: маршрут telegram-heartbeat шлёт « Мониторинг жив — сторож отчитался, канал доставки работает» и повторяет раз в 12 часов.

Дефект оказался двойным: пустая цель file_sd (этот тикет) и внешний префикс, распространённый на весь API Alertmanager (#3161). Первый прятал второй — пока Prometheus не находил приёмник, 404 на /api/v2/alerts не мог проявиться.

## Приёмка пройдена — цепочка проверена целиком Замер после деплоя обоих исправлений (#3160 + #3162): | Что | Значение | |---|---| | `prometheus_notifications_alertmanagers_discovered` | **1** (было 0) | | `prometheus_notifications_sent_total` | 4, растёт | | `prometheus_notifications_errors_total` | 3 и **не растёт** (все три — до #3162) | | `alertmanager_alerts_received_total{firing}` | **1** (было 0) | | `alertmanager_notifications_total{integration="telegram"}` | **1** | | `alertmanager_notifications_failed_total{telegram,*}` | **0** | | health контейнера | `healthy` на обычном пути | То есть `Watchdog`, горевший с 26.08 10:19 и до сегодня уходивший в `dropped_total`, доехал до Telegram: маршрут `telegram-heartbeat` шлёт «⚪ Мониторинг жив — сторож отчитался, канал доставки работает» и повторяет раз в 12 часов. Дефект оказался двойным: пустая цель file_sd (этот тикет) и внешний префикс, распространённый на весь API Alertmanager (#3161). Первый прятал второй — пока Prometheus не находил приёмник, 404 на `/api/v2/alerts` не мог проявиться.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3155
No description provided.