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

Alertmanager, Grafana и Zabbix

Notifly принимает алерты систем мониторинга нативно — без webhook-роутера и без правил разбора. Для каждого источника есть свой приёмник, который понимает его формат, строит читаемые заголовок и текст и переводит важность алерта в приоритет сообщения:

ИсточникURL приёмникаФормат тела
Prometheus AlertmanagerPOST /integrations/alertmanagerwebhook Alertmanager (version 4)
Grafana AlertingPOST /integrations/alertmanagerwebhook contact point (version 1)
Zabbix (media type «Webhook»)POST /integrations/zabbixпараметры media type, JSON

Авторизация — токен канала, как у POST /message: заголовок X-Notifly-Key, Authorization: Bearer <токен> или параметр ?token=. В админке (настройки канала → вкладка Отправка → Приём из систем мониторинга) готовые фрагменты конфигурации уже содержат URL и токен канала — остаётся скопировать.

Добавьте receiver в alertmanager.yml и перечитайте конфигурацию (SIGHUP или POST /-/reload):

route:
receiver: notifly
group_by: ['alertname']
receivers:
- name: notifly
webhook_configs:
- url: https://api.notifly.ru/integrations/alertmanager
send_resolved: true
max_alerts: 50
http_config:
authorization:
type: Bearer
credentials: <токен канала>

Одно сообщение на уведомление Alertmanager, а не на каждый алерт. Alertmanager уже группирует алерты по group_by маршрута — это и есть выбранная вами единица шума: шторм из сотни алертов одной группы придёт одним сообщением, а не сотней пушей (и не съест сотню событий квоты). Нужно сообщение на каждый алерт — поставьте в маршруте group_by: ['...'].

Внутри уведомления алерты делятся по статусу:

  • firing — сообщение [FIRING:3] HighCPUUsage (для одного алерта — [FIRING] HighCPUUsage · node-1:9100). Приоритет — максимальный по алертам группы;
  • resolved — отдельное сообщение [RESOLVED] … с приоритетом 2: в клиентах оно приходит тихо, а эскалация с минимальным приоритетом ≥ 4 его не пересылает.

Так один запрос создаёт одно или два сообщения. Notifly не склеивает и не дедуплицирует повторные уведомления: Alertmanager повторяет уведомление раз в repeat_interval — это придёт новым сообщением-напоминанием. Частоту напоминаний и группировку задают group_wait, group_interval и repeat_interval маршрута.

Текст — markdown: по каждому алерту имя и severity, summary и description из аннотаций, время начала (и окончания для resolved), метки, ссылки Source (generatorURL), Runbook (runbook_url), Silence (форма создания silence в UI Alertmanager с матчерами по меткам алерта). В тексте — первые 20 алертов группы, остальные — счётчиком. Тап по уведомлению открывает источник алерта (для группы — UI Alertmanager).

В extras сообщения сохраняются исходные данные: extras.alertmanager — статус, groupKey, groupLabels, commonLabels, commonAnnotations, externalURL и до 50 алертов с метками, аннотациями, startsAt/endsAt, fingerprint, generatorURL.

Метка severityПриоритет
disaster10
critical, crit, page, emergency, emerg, alert, fatal9
error, err, high, major8
warning, warn, average, minor6
info, information, informational, notice, low3
none, debug1
нет метки или другое значениеприоритет канала по умолчанию
resolved2

Регистр значения не важен. В группе из нескольких алертов берётся максимальный приоритет.

Метка notifly_priority (число 0–10) задаёт приоритет явно и перекрывает severity — удобно, если шкала важности в ваших правилах нестандартная.

Webhook contact point Grafana шлёт тот же формат, что и Alertmanager, — используйте тот же приёмник:

  1. Alerting → Contact points → Add contact point, интеграция Webhook.
  2. URL — https://api.notifly.ru/integrations/alertmanager.
  3. Optional Webhook settings → Authorization Header - Scheme Bearer, Credentials — токен канала.

Ссылки на панель, дашборд и silence берутся из полей panelURL, dashboardURL, silenceURL. Тап по уведомлению с одним алертом открывает панель (если её нет — дашборд или источник), с группой алертов — адрес Grafana из externalURL. Маппинг severity, notifly_priority и разделение firing/resolved — те же, что у Alertmanager.

Приём работает через media type типа Webhook (Zabbix 6.0 и новее).

Alerts → Media types → Create media type: тип Webhook, имя Notifly. Параметры:

ИмяЗначение
notifly_urlhttps://api.notifly.ru/integrations/zabbix
notifly_token{ALERT.SENDTO}
subject{ALERT.SUBJECT}
message{ALERT.MESSAGE}
severity{EVENT.NSEVERITY}
status{EVENT.VALUE}
update{EVENT.UPDATE.STATUS}
event_id{EVENT.ID}
host{HOST.NAME}
trigger{EVENT.NAME}
trigger_id{TRIGGER.ID}
url{$ZABBIX.URL}/tr_events.php?triggerid={TRIGGER.ID}&eventid={EVENT.ID}
tags{EVENT.TAGSJSON}

Скрипт:

var params = JSON.parse(value);
var url = params.notifly_url,
token = params.notifly_token;
delete params.notifly_url;
delete params.notifly_token;
var req = new HttpRequest();
if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {
req.setProxy(params.HTTPProxy);
}
delete params.HTTPProxy;
req.addHeader('Content-Type: application/json');
req.addHeader('X-Notifly-Key: ' + token);
var resp = req.post(url, JSON.stringify(params));
if (req.getStatus() < 200 || req.getStatus() >= 300) {
throw 'Notifly: HTTP ' + req.getStatus() + ': ' + resp;
}
return 'OK';

На вкладке Message templates добавьте шаблоны Problem, Problem recovery и Problem update — стандартных достаточно. Без шаблонов Zabbix не отправит сообщение (No message defined for media type).

Макрос {$ZABBIX.URL} — адрес фронтенда Zabbix; задайте его в Administration → Macros (или удалите параметр url).

  1. Users → пользователь → Media → Add: тип Notifly, в Send to — токен канала. Разным пользователям (или разным media одного пользователя) можно указать токены разных каналов — media type при этом один.
  2. Alerts → Actions → Trigger actions: добавьте операцию отправки через Notifly (и recovery/update-операции, если нужны).
Событие ZabbixПриоритет
проблема, Disaster10
проблема, High8
проблема, Average6
проблема, Warning5
проблема, Information3
проблема, Not classifiedприоритет канала по умолчанию
восстановление ({EVENT.VALUE}=0)2
обновление (ack, комментарий…)3

Заголовок — {ALERT.SUBJECT}, текст — {ALERT.MESSAGE} как есть (обычный многострочный текст) и ссылка на событие. Без шаблонов сообщения заголовок и текст собираются из триггера, хоста и важности. В extras.zabbix — status (problem/resolved/update), eventId, host, trigger, triggerId, severity, url и разобранные теги.

Имена параметров из официальных webhook-шаблонов Zabbix тоже понимаются: alert_subject, alert_message, event_nseverity, event_value, event_update_status, host_name, trigger_name, zabbix_url — можно переделать существующий media type, поменяв только URL и скрипт.

Алерт из Alertmanager, Grafana или Zabbix — обычное сообщение канала, поэтому на него действуют те же правила, что и на POST /message:

  • тихие часы владельца канала подавляют эскалацию во внешние каналы (email, SMS, звонок, мессенджеры, вебхуки), если приоритет сообщения ниже порога breakthroughPriority (по умолчанию 8). С маппингом выше critical (9) и Zabbix Disaster (10) тишину пробивают, warning — нет;
  • в активном окне обслуживания, которое покрывает канал, сообщения создаются как обычно, но помечаются беззвучными, а эскалация по ним не выполняется.
Окно терминала
curl -X POST "https://api.notifly.ru/integrations/alertmanager" \
-H "Authorization: Bearer <токен канала>" \
-H "Content-Type: application/json" \
-d '{"version":"4","status":"firing","alerts":[{"status":"firing",
"labels":{"alertname":"TestAlert","severity":"warning","instance":"host-1"},
"annotations":{"summary":"Проверка приёма"},
"startsAt":"2026-09-27T10:00:00Z"}]}'

Ответ — {"created": 1, "ids": [...]}. Коды ошибок:

КодПричина
400тело не разобралось или больше лимита; у Alertmanager — нет ни одного алерта, у Zabbix — нет ни subject, ни message, ни trigger
401нет токена или токен неизвестен
403токен без права записи или служебный канал
429исчерпана дневная квота (в ответе — created и ids уже созданных) или слишком частые запросы
  • Доставка и эскалация — дослать непрочитанный алерт в PagerDuty, Opsgenie, Telegram или на звонок, а когда алерт прочитан в Notifly — подтвердить или закрыть инцидент в PagerDuty/Opsgenie (onRead).
  • Webhook-роутер — произвольные вебхуки и сложная маршрутизация по каналам.
  • Доп. поля сообщений — client::display, client::notification.