IncidentGarden

Подключение Zabbix

Принимайте алерты Zabbix в Incident Garden через webhook.

Это руководство показывает, как подключить Zabbix как источник алертов. Если вы ещё не проходили базовую настройку, начните с Quick Start.

Предусловия

Как и для любой интеграции, сначала подготовьте команду и политику эскалации этой команды — без политики интеграцию создать нельзя. Подробности — в Quick Start: Создание команды и Политика эскалации.

Создание интеграции

Откройте вкладку интеграций команды

Откройте нужную команду, перейдите на вкладку Integrations и нажмите Add Integration.

Заполните параметры

Укажите имя, выберите тип Zabbix, команду и политику эскалации. При выборе типа подставляется пресет маппинга важности.

Скопируйте API key

После сохранения скопируйте API key — он показывается только один раз. Позже виден лишь префикс; ключ можно перевыпустить, но не восстановить.

Endpoint приёма

Zabbix отправляет на обобщённый endpoint:

POST https://api.incidentgarden.ru/api/v1/integrations/<API_KEY>/webhook

Настраивается это через webhook media type (скрипт оповещения Zabbix), который формирует JSON в обобщённом формате и отправляет его на указанный endpoint.

Настройка media type в Zabbix

Media type типа Webhook — это скрипт оповещения на стороне Zabbix. Он собирает из макросов события тело запроса и отправляет его на ваш endpoint приёма.

Создайте media type

В Zabbix откройте Alerts → Media types → Create media type и заполните:

  • Name: Incident Garden
  • Type: Webhook

В таблице Parameters задайте параметры (имя → значение). Значения справа — это макросы Zabbix; замените <API_KEY> на API key вашей интеграции:

ПараметрЗначение
event_id{EVENT.ID}
event_name{EVENT.NAME}
event_severity{EVENT.SEVERITY}
event_value{EVENT.VALUE}
host_name{HOST.HOST}
urlhttps://api.incidentgarden.ru/api/v1/integrations/<API_KEY>/webhook

Остальные поля формы (Message templates и прочие) оставьте со значениями по умолчанию. Исключение — вкладка Options: в ней задаются повторные попытки отправки, о них ниже.

Вставьте скрипт

В поле Script вставьте код целиком:

try {
    var p = JSON.parse(value);
    var status = (String(p.event_value) === '0') ? 'resolved' : 'firing';
    var severity = String(p.event_severity || '').toLowerCase().replace(/ /g, '_');
    var payload = {
        title: p.event_name,
        status: status,
        dedup_key: String(p.event_id),
        labels: { severity: severity, host: p.host_name }
    };
    var req = new HttpRequest();
    req.addHeader('Content-Type: application/json');
    var response = req.post(p.url, JSON.stringify(payload));
    var code = req.getStatus();
    if (code < 200 || code >= 300) {
        throw 'API returned HTTP ' + code + ': ' + response;
    }
    return 'OK';
} catch (err) {
    Zabbix.log(3, '[IncidentGarden] webhook failed: ' + err);
    throw 'Sending failed: ' + err;
}

Готовая форма выглядит так:

Форма создания media type «Incident Garden» в Zabbix

Привяжите media type к пользователю

Откройте Users → <ваш пользователь> → Media → Add и выберите Incident Garden. Без этой привязки Zabbix не будет отправлять оповещения через media type.

Создайте trigger action

Заведите trigger action, который на срабатывание и на восстановление триггера вызывает media type Incident Garden. Тогда одно и то же событие пришлёт и открытие, и закрытие алерта.

Как макросы ложатся в payload

Скрипт переводит макросы события Zabbix в поля обобщённого тела запроса:

  • {EVENT.VALUE} (1 — проблема, 0 — восстановление) → status (firing / resolved).
  • {EVENT.ID}dedup_key. Идентификатор события стабилен между проблемой и её восстановлением, поэтому закрывающее событие находит открытый алерт и переводит его в resolved, а не создаёт новый.
  • {EVENT.SEVERITY}labels.severity. Скрипт приводит значение к нижнему регистру и заменяет пробел на _, чтобы оно совпало со шкалой Zabbix (disaster / high / average / warning / information / not_classified), по которой работает маппинг важности.
  • {EVENT.NAME}title.
  • {HOST.HOST}labels.host.

Повторная отправка при сбое

Доставка события — ответственность отправляющей стороны. Между Zabbix и Incident Garden лежит сеть: запрос может не уйти, ответ может не дойти. Если такое событие не отправить повторно, алерта по нему не будет — а значит, дежурного никто не позовёт.

У разных источников это устроено по-разному. AlertManager повторяет отправку сам, без настройки. Zabbix — повторяет только если это задано в media type.

Проверьте повторные попытки у media type. Откройте Incident Garden → вкладка Options и убедитесь, что заданы:

  • Attempts — сколько раз Zabbix попробует отправить оповещение. Значение 1 означает «одна попытка и всё»: любой сетевой сбой в этот момент тихо съедает событие.
  • Attempt interval — пауза между попытками. Ставьте её не нулевой: мгновенный повтор попадёт в ту же секунду сбоя, что и первая попытка.

Разумная отправная точка — три попытки с интервалом в десяток секунд; дальше подстраивайте под себя. Важно лишь, что попыток больше одной и между ними есть пауза.

Скрипт из шага выше специально написан под этот механизм: при неуспешном ответе он не возвращает OK, а завершается ошибкой (throw) и пишет строку в журнал Zabbix. Для Zabbix это и есть сигнал «не доставлено, повторить». Если переписать скрипт так, чтобы он проглатывал ошибку и всегда возвращал OK, повторные попытки перестанут работать — Zabbix будет считать, что всё дошло.

Проверить фактические отправки и их результат можно в Zabbix: Reports → Action log.

Откуда берётся важность

Важность берётся из плоского объекта labels в теле запроса. Для пресета Zabbix (source_field = severity) скрипт Zabbix должен класть приоритет Zabbix в labels.severity.

Пример тела запроса:

{
  "title": "High CPU on web-01",
  "status": "firing",
  "labels": { "severity": "disaster", "host": "web-01" }
}

Эти же метки из labels используются в условиях Label matchers у Policies. Если скрипт Zabbix не кладёт нужную метку, для политик она считается отсутствующей: matcher «равно» / «присутствует» по ней не совпадёт, а matcher «не равно» / «отсутствует» совпадёт со всеми такими алертами. Проверьте, что скрипт Zabbix присылает метки, на которые вы опираетесь в условиях.

Маппинг важности

Пресет для типа Zabbix:

  • criticaldisaster, high
  • warningaverage, warning, information, not_classified
  • defaultcritical

Как изменить набор значений — см. Настройка важности. Полный формат обобщённого payload — в справочнике Формат payload.