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
Три независимых дефекта, найденных на живом проде после подъёма стека метрик.
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
62 lines
2.9 KiB
YAML
62 lines
2.9 KiB
YAML
# 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
|