gendesign/ops/metrics/prometheus/prometheus.yml
bot-backend c6e15954ba
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
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(observability): контейнерные метрики терялись целиком + два хвоста стека
Три независимых дефекта, найденных на живом проде после подъёма стека метрик.

1. cAdvisor-метрики не доезжали ВООБЩЕ. В Prometheus ноль имён container_*
   при 2034 именах всего, хотя cAdvisor отдаёт 880 рядов, scrape-таргет в
   alloy health=up с последним скрейпом 10 мс назад, а remote_write рабочий
   (node/postgres идут через него же и доезжают). Методом исключения — потери
   в prometheus.relabel.cadvisor_trim, во втором правиле:

       rule { source_labels = ["name"], regex = "", action = "drop" }

   Замысел был выкинуть безымянные cgroup-ряды (id="/"). Но regex в Alloy
   документированно дефолтится в (.*), и пустая строка неотличима от
   незаданного значения — такой drop рискует выкидывать вообще всё, что и
   наблюдалось. Заменено на однозначное keep regex=".+" — тот же замысел,
   без зависимости от того, как трактуется пустой regex.

2. healthcheck alloy не мог пройти никогда: дёргал wget, которого в образе
   grafana/alloy нет (как и curl, и nc). Контейнер вечно unhealthy при
   полностью исправном alloy — ложная тревога, маскирующая настоящие сбои.
   Заменено на сырой HTTP через bash /dev/tcp, без внешних утилит.

3. Prometheus раз в минуту писал "lookup alertmanager: no such host" и держал
   up{job="alertmanager"}=0. Alertmanager намеренно за профилем alerts до
   решения #3078 — дефект не в профиле, а в безусловной ссылке на сервис.
   Оба места (alerting.alertmanagers и job_name: alertmanager) переведены на
   file_sd_configs с файлом целей, по умолчанию пустым: целей нет — ошибок
   тоже нет. Prometheus перечитывает file_sd на лету, поэтому включение
   профиля сведётся к наполнению файла, без рестарта и правки конфига.
   Файл целей смонтирован в сервис prometheus явным volume.

Проверено на живом хосте, не на глаз:
- alloy fmt обоих .alloy в одноразовом контейнере grafana/alloy:v1.6.1 - exit 0
- promtool check config в prom/prometheus:v3.1.0 - valid, 16 rules found
- механизм нового healthcheck выполнен внутри работающего gendesign-alloy:
  первая строка ответа "HTTP/1.0 200 OK", grep матчится, RESULT=HEALTHY
- наличие bash/head/grep/printf в образе alloy подтверждено command -v
2026-08-26 13:14:28 +03:00

62 lines
2.9 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 на лету, так что
# включение профиля alerts сводится к наполнению файла, без рестарта и без
# правки этого конфига.
alerting:
alertmanagers:
- file_sd_configs:
- files: ["/etc/prometheus/alertmanager_targets.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.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