All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
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 / openapi-codegen-check (pull_request) Has been skipped
Метрик в проекте не было ни одной: ни экспортеров, ни /metrics в бэкендах, единственный канал наблюдения — journald, единственный сигнал об аварии — исключение в GlitchTip. Из-за этого целый класс отказов невидим в принципе: задача рапортует done, строк ноль, исключения нет. Так протухли данные на семь месяцев (#2998), 34 дня был мёртв house_imv_backfill (#2698), 8 суток писал ноль newbuilding_enrich (#2767), 91 день копилось раздутие listings (#2992). Grafana не заменяет GlitchTip: ошибки остаются там. Grafana OSS не принимает Sentry DSN ни одним компонентом, а скрубберы в before_send — требование 152-ФЗ. Здесь появляется другой класс данных: ряды и алерты по трендам. Наблюдатель поставлен у ДРУГОГО провайдера, чем наблюдаемое: серверная сторона на Beget, рядом с GlitchTip. Если ляжет Poincare, мониторинг должен об этом сказать, а не лечь вместе с ним. Транспорт push, а не pull: агент на Poincare шлёт remote_write и логи исходящим HTTPS, поэтому там не открывается ни одного входящего порта сверх 22/80/443. При обрыве канала Alloy копит в WAL и досылает — pull-скрейп в той же ситуации терял бы точки именно в аварии, ради которой мониторинг и нужен. Два контура доступа с разными учётками. Пароль приёмника по построению лежит открытым на продуктовом хосте, значит его компрометация неизбежна вместе с хостом; будь это учётка витрины, утёк бы и доступ к дашбордам. GlitchTip читается прямым SQL, а не Sentry-плагином: у плагина на 6.1.6 stats_v2 отдаёт 500 (баг GlitchTip #381), Events/Discover — 404 (#416), а в grafana/sentry-datasource слово glitchtip не встречается ни разу. Схема сверена на живой базе: колонка времени называется timestamp, а не received, и отдельной таблицы IssueIndex не существует — агрегаты лежат на самой issue_events_issue. Алерты за профилем alerts: канал доставки — открытый вопрос #3078, и стек не должен на нём стоять. Деплой предупреждает, что уведомлять пока некому. Каждая настройка, способная отказать молча, закрыта явно: ретенция Prometheus задана и по времени и по размеру, retention_enabled у компактора Loki (без него retention_period не работает вовсе), путь к журналу и запуск Alloy от root (иначе агент читает ноль записей без ошибки), проверка Caddy до перезагрузки (на этом хосте тот же Caddy держит git, errors и obsidian). Refs #3078
58 lines
2.4 KiB
YAML
58 lines
2.4 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 выключен, этой цели не существует и Prometheus раз в
|
||
# интервал пишет в лог, что не смог её разрешить. Это шум, а не отказ: правила
|
||
# считаются и видны в интерфейсе, просто уведомлять некому. Молча выключать
|
||
# alerting не стали — тогда включение алертов потребовало бы правки конфига,
|
||
# а не одной переменной.
|
||
alerting:
|
||
alertmanagers:
|
||
- static_configs:
|
||
- targets: ["alertmanager:9093"]
|
||
|
||
scrape_configs:
|
||
# Сам Prometheus. Нужен не для красоты: по нему строится алерт на здоровье
|
||
# приёмника — пустая панель неотличима от «ошибок нет», и это надо различать.
|
||
- job_name: prometheus
|
||
static_configs:
|
||
- targets: ["localhost:9090"]
|
||
labels:
|
||
host: infra
|
||
|
||
- job_name: alertmanager
|
||
static_configs:
|
||
- targets: ["alertmanager:9093"]
|
||
labels:
|
||
host: infra
|
||
|
||
- 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
|