Перейти к содержимому

Алерты Prometheus и Grafana в телефон

Prometheus уже знает, что у вас горит, — не хватает только доставки: почта теряется, а поднимать отдельный бот-шлюз ради push на телефон не хочется. В Notifly есть нативный приёмник формата Alertmanager: один receiver в alertmanager.yml — и алерты приходят push-уведомлениями с правильным приоритетом, ссылками на Runbook и Silence и отдельным [RESOLVED].

Тот же приёмник понимает webhook contact point из Grafana Alerting.

Создайте в админке канал, например prometheus, и скопируйте его токен канала (префикс A). В настройках канала на вкладке Отправка → Приём из систем мониторинга уже лежат готовые фрагменты конфигурации с этим токеном.

route:
receiver: notifly
group_by: ['alertname', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: notifly
webhook_configs:
- url: https://api.notifly.ru/integrations/alertmanager
send_resolved: true
max_alerts: 50
http_config:
authorization:
type: Bearer
credentials: <токен канала>

Перечитайте конфигурацию (SIGHUP или POST /-/reload). Токен лучше держать в заголовке, а не в URL: адреса вебхуков попадают в логи Alertmanager.

Одно уведомление Alertmanager = одно сообщение Notifly: вся группа из group_by приходит одним push-ем [FIRING:3] HighCPUUsage, а не сотней отдельных. Восстановление — отдельным тихим сообщением [RESOLVED] ….

Приоритет берётся из метки severity: critical/page → 9, error/high → 8, warning → 6, info → 3. Если шкала у вас своя — поставьте в правиле метку notifly_priority:

groups:
- name: node
rules:
- alert: DiskAlmostFull
expr: node_filesystem_avail_bytes / node_filesystem_size_bytes < 0.05
for: 10m
labels:
severity: warning
notifly_priority: '8' # громче обычного warning
annotations:
summary: 'На {{ $labels.instance }} осталось меньше 5% диска'
runbook_url: https://wiki.example.com/runbooks/disk

Полная таблица соответствий — в документации приёмника.

Alerting → Contact points → Add contact point, интеграция Webhook:

  • URL — https://api.notifly.ru/integrations/alertmanager;
  • Optional Webhook settings → Authorization Header: схема Bearer, credentials — токен канала.

Тап по уведомлению открывает панель Grafana, с которой пришёл алерт.

Окно терминала
curl -X POST "https://api.notifly.ru/integrations/alertmanager" \
-H "Authorization: Bearer $NOTIFLY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"version":"4","status":"firing","alerts":[{"status":"firing",
"labels":{"alertname":"TestAlert","severity":"warning","instance":"host-1"},
"annotations":{"summary":"Проверка приёма"}}]}'
# {"created":1,"ids":[...]}
  • Эскалация канала: если push с critical не прочитан за 5 минут — SMS или звонок, за 15 минут — PagerDuty или Opsgenie. Отметка «Прочитано» (в приложении или прямо из уведомления Android) останавливает досылку.
  • Тихие часы: ночью эскалируется только то, что не ниже порога (по умолчанию 8) — critical пробивает тишину, warning ждёт утренней сводки.
  • Окна обслуживания: алерты во время плановых работ приходят беззвучно и не эскалируются — см. «Плановые работы без ложных алертов».
  • Без своего шлюза: никаких alertmanager-telegram-ботов и прокси — только receiver в конфиге.
  • Шум под контролем: группировку задаёт сам Alertmanager, а Notifly не дробит группу на отдельные push-и.
  • Контекст в кармане: summary, метки и ссылки Source / Runbook / Silence прямо в уведомлении.
  • Разнести алерты по разным каналам (prod, staging, db) — отдельный receiver с токеном своего канала для каждой ветки маршрута.
  • Добавить heartbeat на сам мониторинг: вечно горящее правило Watchdog (expr: vector(1)) отправляйте отдельным маршрутом с repeat_interval короче интервала heartbeat-а в receiver с URL https://api.notifly.ru/heartbeat/ping/H…. Замолчал Prometheus или Alertmanager — пинги прекратятся, и Notifly пришлёт алерт.