Документация

Интеграция с Zabbix

Версия v2.3.1 · Обновлено

Интеграция с Zabbix#

Zabbix — это входящий источник алертов.

Эндпоинт:

POST /api/integrations/zabbix

Аутентификация использует токен приёма маршрута:

Authorization: Bearer ROUTE_TOKEN

Настройка маршрута#

Создайте маршрут с:

Source: zabbix

Привяжите хотя бы один канал уведомлений и скопируйте токен приёма маршрута в настройку типа медиа Zabbix или конфигурацию вебхука.

Готовый Webhook Media Type для Zabbix#

Для Zabbix 6.x/7.x откройте Alerts → Media types → Create media type и выберите тип Webhook. Такой media type может вызывать IncidentRelay напрямую, без внешнего скрипта.

Рекомендуемые параметры:

ПараметрЗначение
urlhttps://incidentrelay.example.com/api/integrations/zabbix
token{$INCIDENTRELAY.TOKEN}
event_id{EVENT.ID}
trigger_id{TRIGGER.ID}
event_name{EVENT.NAME}
host{HOST.NAME}
event_severity{EVENT.SEVERITY}
event_status{EVENT.STATUS}
opdata{EVENT.OPDATA}
tags_json{EVENT.TAGSJSON}
team{EVENT.TAGS.oncall_team}
event_link{$ZABBIX.URL}/tr_events.php?triggerid={TRIGGER.ID}&eventid={EVENT.ID}
HTTPProxyнеобязательный URL proxy или пустое значение

Создайте {$INCIDENTRELAY.TOKEN} как секретный пользовательский макрос Zabbix, а {$ZABBIX.URL} — как внешний URL frontend Zabbix.

Используйте следующий Webhook script:

try {
    var params = JSON.parse(value),
        req = new HttpRequest(),
        payload,
        response,
        status;

    if (params.HTTPProxy) {
        req.setProxy(params.HTTPProxy);
    }

    req.addHeader('Content-Type: application/json');
    req.addHeader('Authorization: Bearer ' + params.token);

    payload = {
        event_id: params.event_id,
        trigger_id: params.trigger_id,
        event_name: params.event_name,
        host: params.host,
        event_severity: params.event_severity,
        event_status: params.event_status,
        opdata: params.opdata,
        tags: params.tags_json,
        team: params.team,
        event_link: params.event_link
    };

    response = req.post(params.url, JSON.stringify(payload));
    status = req.getStatus();

    if (status < 200 || status >= 300) {
        throw 'HTTP ' + status + ': ' + response;
    }

    return response;
} catch (error) {
    Zabbix.log(3, '[ IncidentRelay webhook ] ' + error);
    throw 'IncidentRelay webhook failed: ' + error;
}

Создайте пользователя/media с этим media type и добавьте пользователя или группу в нужный trigger action. Настройте как Operations, так и Recovery operations, иначе событие восстановления из Zabbix не попадёт в IncidentRelay.

Перед подключением к production actions media type можно проверить встроенным тестом в UI Zabbix.

Назначение сервиса#

После того как маршрут сопоставит входящий алерт, IncidentRelay может привязать алерт к сервису.

Есть два способа:

  • Выбрать сервис по умолчанию на маршруте.
  • Настроить правила сопоставления сервисов.

Используйте сервис по умолчанию, когда все алерты через маршрут относятся к одной системе. Используйте правила сопоставления сервисов, когда один маршрут получает алерты для нескольких систем.

Пример правила сопоставления сервиса:

{
  "labels": {
    "service": "cpu",
    "environment": {
      "op": "regex",
      "value": "^(prod|production)$"
    }
  }
}

Пример payload#

{
  "status": "firing",
  "event_id": "123456",
  "trigger_id": "98765",
  "event_name": "High CPU load on host1",
  "host": "host1",
  "event_severity": "High",
  "event_status": "PROBLEM",
  "opdata": "CPU load is above 90%",
  "event_tag": "team: infra, service: cpu",
  "tags": [
    {
      "tag": "team",
      "value": "infra"
    },
    {
      "tag": "service",
      "value": "cpu"
    }
  ],
  "event_link": "https://zabbix.example.com/tr_events.php?triggerid=98765&eventid=123456",
  "team": "infra",
  "labels": {
    "host": "host1",
    "service": "cpu",
    "environment": "prod"
  }
}

Параметры типа медиа Zabbix могут использовать макросы:

{
  "event_id": "{EVENT.ID}",
  "trigger_id": "{TRIGGER.ID}",
  "event_name": "{EVENT.NAME}",
  "host": "{HOST.NAME}",
  "event_severity": "{EVENT.SEVERITY}",
  "event_status": "{EVENT.STATUS}",
  "opdata": "{EVENT.OPDATA}",
  "event_tag": "{EVENT.TAGS}",
  "tags": "{EVENT.TAGSJSON}",
  "event_link": "{$ZABBIX.URL}/tr_events.php?triggerid={TRIGGER.ID}&eventid={EVENT.ID}",
  "team": "{EVENT.TAGS.oncall_team}"
}

event_link сохраняется в labels.event_link и также предоставляется как alert.event_link в ответе API алертов. Оно используется модальным окном деталей алерта для открытия исходного события Zabbix.

event_tag сохраняется в labels.event_tag. Когда оно содержит теговые данные вроде team: infra, service: cpu, IncidentRelay также извлекает отдельные метки, такие как team и service.

Обязательное содержимое payload#

Payload Zabbix должен содержать достаточно данных для идентификации и описания алерта.

Пустые JSON-объекты должны отклоняться при валидации.

Полезные поля:

event_id
trigger_id
event_name
trigger_name
problem_name
title
subject
message
opdata
event_tag
tags
event_link
fingerprint

Нормализованные поля#

Поле IncidentRelayИсточник
sourcezabbix
team_slugteam, labels.team, labels.oncall_team или разобранные теги Zabbix
external_idevent_id, eventid, trigger_id или triggerid
titletitle, subject, event_name, problem_name, trigger_name, labels.alertname, затем заголовок по умолчанию
messagemessage, description или opdata
severityнормализовано из severity, event_severity, trigger_severity или labels.severity
labelslabels, разобранные tags, разобранный event_tag, плюс вспомогательные метки, такие как host, event_name, trigger_name, zabbix_severity и event_link
event_linkevent_link, event_url, problem_url, trigger_url, labels.event_link или собранная из zabbix_url и event_id
statusstatus или event_status, по умолчанию firing

Значения severity Zabbix нормализуются для маршрутизации и фильтрации в IncidentRelay:

Severity ZabbixSeverity IncidentRelay
Disastercritical
Highcritical
Averagewarning
Warningwarning
Informationinfo
Not classifiedinfo

Исходное значение severity Zabbix сохраняется в labels.zabbix_severity.