fix(ops/metrics): Prometheus не видел ни одного Alertmanager — цель file_sd осталась пустой #3160

Merged
bot-backend merged 1 commit from fix/3155-prometheus-no-alertmanager into main 2026-08-27 18:12:11 +00:00
Collaborator

Чинит #3155.

Что было

Profile alerts включён, gendesign-alertmanager и gendesign-alert-ack — Up/healthy, деплой зелёный, в логах чисто. При этом:

GET /prometheus/api/v1/alertmanagers → {"activeAlertmanagers":[],"droppedAlertmanagers":[]}
prometheus_notifications_alertmanagers_discovered 0
prometheus_notifications_dropped_total          1568
cat /etc/prometheus/alertmanager_targets.yml    → []

Горящий с 26.08 10:19 Watchdog (плюс HostAgentDown, 622 сэмпла, и RemoteWriteStalled, 612) не доехал никуда.

Причина

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

Что меняется

Файл целей становится производным — alertmanager_targets.gen.yml, в .gitignore — и рендерится деплоем тем же условием, которым включается профиль. Одно условие — один результат.

Детали, которые не видны из диффа:

  • рендер стоит до docker compose up, чтобы свежесозданный контейнер увидел готовый файл;
  • пишет усечением на месте (: > + echo >>, без rm) — инод сохраняется, поэтому работающий Prometheus подхватывает цель сам, без пересоздания контейнера. Та же ловушка одиночного бинд-маунта, что уже описана в этом workflow у alertmanager.yml;
  • при выключенном профиле пишется явный [], а не удаляется файл: несуществующий путь docker подменяет каталогом, и Prometheus не стартует вовсе.

Проверено до пуша

  • YAML workflow парсится, bash -n извлечённого деплой-скрипта чист;
  • обе ветки рендера прогнаны локально: [{'targets': ['alertmanager:9093'], 'labels': {'host': 'infra'}}] и [], оба — валидный YAML;
  • инод при повторном рендере сохраняется (проверено stat -c %i до и после);
  • ссылок на старое имя файла в трекнутых файлах не осталось;
  • code-reviewer: MINOR (формулировка комментария в .gitignore) — поправлено до коммита.

Приёмка после деплоя

  1. activeAlertmanagers непуст;
  2. prometheus_notifications_dropped_total перестаёт расти, растёт ..._sent_total;
  3. горящий Watchdog доезжает в Telegram-топик алертов.
Чинит #3155. ## Что было Profile `alerts` включён, `gendesign-alertmanager` и `gendesign-alert-ack` — Up/healthy, деплой зелёный, в логах чисто. При этом: ``` GET /prometheus/api/v1/alertmanagers → {"activeAlertmanagers":[],"droppedAlertmanagers":[]} prometheus_notifications_alertmanagers_discovered 0 prometheus_notifications_dropped_total 1568 cat /etc/prometheus/alertmanager_targets.yml → [] ``` Горящий с 26.08 10:19 `Watchdog` (плюс `HostAgentDown`, 622 сэмпла, и `RemoteWriteStalled`, 612) не доехал никуда. ## Причина Включатель профиля и цель для Prometheus лежали в разных местах: профиль поднимает `deploy-metrics.yml` по наличию токена и чата, а файл целей правился руками и остался плейсхолдером. Разъезд не ловится ничем — `[]` штатен при выключенном профиле, поэтому на него не реагируют ни валидация, ни healthcheck, ни лог. ## Что меняется Файл целей становится производным — `alertmanager_targets.gen.yml`, в `.gitignore` — и рендерится деплоем **тем же условием**, которым включается профиль. Одно условие — один результат. Детали, которые не видны из диффа: - рендер стоит **до** `docker compose up`, чтобы свежесозданный контейнер увидел готовый файл; - пишет усечением на месте (`: >` + `echo >>`, без `rm`) — инод сохраняется, поэтому работающий Prometheus подхватывает цель сам, без пересоздания контейнера. Та же ловушка одиночного бинд-маунта, что уже описана в этом workflow у `alertmanager.yml`; - при выключенном профиле пишется явный `[]`, а не удаляется файл: несуществующий путь docker подменяет каталогом, и Prometheus не стартует вовсе. ## Проверено до пуша - YAML workflow парсится, `bash -n` извлечённого деплой-скрипта чист; - обе ветки рендера прогнаны локально: `[{'targets': ['alertmanager:9093'], 'labels': {'host': 'infra'}}]` и `[]`, оба — валидный YAML; - инод при повторном рендере сохраняется (проверено `stat -c %i` до и после); - ссылок на старое имя файла в трекнутых файлах не осталось; - code-reviewer: MINOR (формулировка комментария в `.gitignore`) — поправлено до коммита. ## Приёмка после деплоя 1. `activeAlertmanagers` непуст; 2. `prometheus_notifications_dropped_total` перестаёт расти, растёт `..._sent_total`; 3. горящий `Watchdog` доезжает в Telegram-топик алертов.
bot-backend added 1 commit 2026-08-27 18:10:52 +00:00
fix(ops/metrics): Prometheus не видел ни одного Alertmanager — цель file_sd осталась пустой
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
99125b8093
Профиль alerts включили, а файл целей `alertmanager_targets.yml` остался
плейсхолдером `[]`. Снаружи всё зелёное: alertmanager и alert-ack Up/healthy,
деплой зелёный, в логах ни одной ошибки — при этом `activeAlertmanagers: []`
и 1568 уведомлений в `prometheus_notifications_dropped_total`. Горящий с 26.08
`Watchdog` не доехал никуда, как и HostAgentDown с RemoteWriteStalled.

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

Файл становится производным (`alertmanager_targets.gen.yml`, в .gitignore) и
рендерится деплоем тем же условием, что включает профиль: цель при включённых
алертах, `[]` при выключенных. Рендер идёт до `up` и пишет усечением на месте,
поэтому инод сохраняется и работающий Prometheus подхватывает цель сам — та же
ловушка одиночного бинд-маунта, что уже описана в этом workflow у Alertmanager.

Пустой список пишется явно, а не удалением файла: несуществующий путь docker
подменяет каталогом, и Prometheus не стартует вовсе.

Closes #3155
bot-backend merged commit dc032d11fc into main 2026-08-27 18:12:11 +00:00
Sign in to join this conversation.
No reviewers
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#3160
No description provided.