gendesign/ops/metrics/prometheus/prometheus.yml
bot-backend 99125b8093
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
fix(ops/metrics): Prometheus не видел ни одного Alertmanager — цель file_sd осталась пустой
Профиль 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
2026-08-27 21:10:25 +03:00

69 lines
3.7 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Prometheus — серверная сторона, живёт на Beget.
#
# СКРЕЙПА ЧУЖИХ ХОСТОВ ЗДЕСЬ НЕТ. Метрики с Poincare приходят push'ем через
# remote-write receiver (--web.enable-remote-write-receiver), потому что открывать
# входящие порты на продуктовом хосте ради мониторинга — плохой размен.
# Локально скрейпится только то, что стоит на этом же хосте.
#
# Метка `host` проставляется агентом Alloy на своей стороне (external_labels),
# поэтому здесь её нет: если задать и там и тут, honor_labels-семантика сделает
# результат неочевидным.
global:
scrape_interval: 30s
scrape_timeout: 10s
evaluation_interval: 30s
external_labels:
cluster: gendesign
rule_files:
- /etc/prometheus/rules/*.yml
# Пока профиль alerts выключен, сервиса alertmanager не существует. Со
# static_configs это раз в интервал давало "lookup alertmanager: no such
# host" в логах и up{job="alertmanager"}=0. file_sd_configs вместо
# static_configs делает цель опциональной идиоматично для Prometheus: пустой
# список ([]) — алертов нет и ошибок разрешения имени тоже нет. Prometheus
# перечитывает file_sd на лету, так что включение профиля сводится к
# наполнению файла, без рестарта и без правки этого конфига.
#
# Файл ПРОИЗВОДНЫЙ (суффикс .gen, в .gitignore): его рендерит deploy-metrics.yml
# тем же условием, которым включает профиль. Одно условие — один результат.
# Отслеживаемая git'ом версия этого не давала: 27.08 профиль подняли, а файл
# так и остался плейсхолдером []. Alertmanager был Up и healthy, Prometheus же
# не видел ни одного приёмника (activeAlertmanagers: []), и 1568 уведомлений
# ушли в prometheus_notifications_dropped_total — молча, без единой ошибки ни
# в одном логе. Держать включатель и цель в разных местах больше нельзя.
alerting:
alertmanagers:
- file_sd_configs:
- files: ["/etc/prometheus/alertmanager_targets.gen.yml"]
scrape_configs:
# Сам Prometheus. Нужен не для красоты: по нему строится алерт на здоровье
# приёмника — пустая панель неотличима от «ошибок нет», и это надо различать.
- job_name: prometheus
static_configs:
- targets: ["localhost:9090"]
labels:
host: infra
# Тот же опциональный source, что и в alerting.alertmanagers выше: пока
# профиль alerts не включён, файл целей пуст — up{job="alertmanager"}
# просто не появится в выдаче вместо ошибки "no such host".
- job_name: alertmanager
file_sd_configs:
- files: ["/etc/prometheus/alertmanager_targets.gen.yml"]
- job_name: loki
static_configs:
- targets: ["loki:3100"]
labels:
host: infra
- job_name: grafana
static_configs:
- targets: ["grafana:3000"]
labels:
host: infra
metrics_path: /metrics