Alertmanager, Grafana и Zabbix
Notifly принимает алерты систем мониторинга нативно — без webhook-роутера и без правил разбора. Для каждого источника есть свой приёмник, который понимает его формат, строит читаемые заголовок и текст и переводит важность алерта в приоритет сообщения:
| Источник | URL приёмника | Формат тела |
|---|---|---|
| Prometheus Alertmanager | POST /integrations/alertmanager | webhook Alertmanager (version 4) |
| Grafana Alerting | POST /integrations/alertmanager | webhook contact point (version 1) |
| Zabbix (media type «Webhook») | POST /integrations/zabbix | параметры media type, JSON |
Авторизация — токен канала, как у POST /message:
заголовок X-Notifly-Key, Authorization: Bearer <токен> или параметр
?token=. В админке (настройки канала → вкладка Отправка → Приём из систем
мониторинга) готовые фрагменты конфигурации уже содержат URL и токен канала —
остаётся скопировать.
Prometheus Alertmanager
Заголовок раздела «Prometheus Alertmanager»Добавьте 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
Заголовок раздела «Приоритет по severity»Метка severity | Приоритет |
|---|---|
disaster | 10 |
critical, crit, page, emergency, emerg, alert, fatal | 9 |
error, err, high, major | 8 |
warning, warn, average, minor | 6 |
info, information, informational, notice, low | 3 |
none, debug | 1 |
| нет метки или другое значение | приоритет канала по умолчанию |
| resolved | 2 |
Регистр значения не важен. В группе из нескольких алертов берётся максимальный приоритет.
Метка notifly_priority (число 0–10) задаёт приоритет явно и перекрывает
severity — удобно, если шкала важности в ваших правилах нестандартная.
Grafana Alerting
Заголовок раздела «Grafana Alerting»Webhook contact point Grafana шлёт тот же формат, что и Alertmanager, — используйте тот же приёмник:
- Alerting → Contact points → Add contact point, интеграция Webhook.
- URL —
https://api.notifly.ru/integrations/alertmanager. - 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 и новее).
1. Media type
Заголовок раздела «1. Media type»Alerts → Media types → Create media type: тип Webhook, имя
Notifly. Параметры:
| Имя | Значение |
|---|---|
notifly_url | https://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).
2. Пользователь и действие
Заголовок раздела «2. Пользователь и действие»- Users → пользователь → Media → Add: тип
Notifly, в Send to — токен канала. Разным пользователям (или разным media одного пользователя) можно указать токены разных каналов — media type при этом один. - Alerts → Actions → Trigger actions: добавьте операцию отправки
через
Notifly(и recovery/update-операции, если нужны).
Маппинг
Заголовок раздела «Маппинг»| Событие Zabbix | Приоритет |
|---|---|
| проблема, Disaster | 10 |
| проблема, High | 8 |
| проблема, Average | 6 |
| проблема, Warning | 5 |
| проблема, Information | 3 |
| проблема, 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.