Проверено на реальном подключении: Zabbix отправляет проблему через стандартный способ оповещения типа Webhook, событие появляется в Ontik, а подписанные устройства получают браузерное уведомление.

Что получится после настройки

Триггер Zabbix
→
Webhook → API Ontik
→
Лента + Web Push

Со стороны Zabbix интеграция называется Webhook, потому что Zabbix выполняет исходящий HTTP-запрос. В Ontik запрос принимает входной REST API POST /v1/events. Раздел исходящих Webhooks в кабинете Ontik для этой схемы не требуется.

  1. Zabbix обнаруживает проблему или восстановление.
  2. Action запускает способ оповещения Ontik.
  3. JavaScript формирует JSON и отправляет его по HTTPS.
  4. Ontik сохраняет событие вместе с узлом, важностью, статусом и ссылкой.
  5. Владелец и участники проекта получают Web Push на подключённых устройствах.

Что нужно подготовить

  • доступ к настройкам способов оповещения и Actions в Zabbix;
  • проект Ontik, в который должны приходить инциденты;
  • ключ проекта из вкладки «API и интеграция»;
  • внешний адрес интерфейса Zabbix, если из Ontik нужна кликабельная ссылка на инцидент;
  • включённые уведомления Ontik хотя бы на одном устройстве.
Не публикуйте ключ проекта. Он разрешает отправлять события в выбранный проект. Не помещайте его в поле Zabbix «Отправлять на» и не показывайте на скриншотах.

Шаг 1. Создайте способ оповещения

В зависимости от версии Zabbix раздел называется «Оповещения → Способы оповещений» или «Администрирование → Способы оповещений». Нажмите «Создать способ оповещения».

ПолеЗначение
ИмяOntik
ТипWebhook
Время ожидания30s
Обработка теговВыключено
Добавить запись в меню событияВыключено
ОписаниеПередача событий Zabbix в проект Ontik
АктивированоВключено

Шаг 2. Заполните параметры

Удалите стандартные строки, которые не нужны, и добавьте таблицу ниже. Названия параметров чувствительны к регистру.

ИмяЗначениеНазначение
URLhttps://app.ontik.ru/v1/eventsВходной API Ontik
APIKeyКлюч выбранного проектаАвторизация источника
HTTPProxyПустоЗаполните только при наличии proxy
SourceZabbixИсточник для фильтра в Ontik
Subject{ALERT.SUBJECT}Заголовок события
Message{ALERT.MESSAGE}Подробности
Host{HOST.NAME}Узел Zabbix
EventID{EVENT.ID}ID события источника
EventStatus{EVENT.STATUS}PROBLEM или RESOLVED
Severity{EVENT.SEVERITY}Важность
Trigger{TRIGGER.NAME}Название триггера
TriggerID{TRIGGER.ID}ID триггера
EventTime{EVENT.DATE} {EVENT.TIME}Время Zabbix
ZabbixURLНапример, https://zabbix.example.ruОснова ссылки на инцидент

Если интерфейс Zabbix недоступен пользователям Ontik по внешнему адресу, оставьте ZabbixURL пустым. Остальные данные продолжат передаваться.

Шаг 3. Вставьте готовый JavaScript

Нажмите значок редактирования возле поля «Скрипт» и вставьте код целиком.

var params = JSON.parse(value),
    request = new HttpRequest(),
    response,
    status,
    payload,
    meta,
    eventUrl;

function text(value, maxLength) {
    var result;

    if (value === null || typeof value === 'undefined') {
        return '';
    }

    result = String(value);
    return result.length > maxLength
        ? result.substring(0, maxLength)
        : result;
}

if (!params.URL) {
    throw 'Не указан параметр URL';
}

if (!params.APIKey) {
    throw 'Не указан API-ключ проекта Ontik';
}

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

request.addHeader('Content-Type: application/json');
request.addHeader('X-Ontik-Key: ' + params.APIKey);

meta = {
    host: text(params.Host, 500),
    severity: text(params.Severity, 500),
    status: text(params.EventStatus, 500),
    trigger: text(params.Trigger, 500),
    event_id: text(params.EventID, 500),
    event_time: text(params.EventTime, 500),
    message: text(params.Message, 500)
};

if (params.ZabbixURL && params.EventID && params.TriggerID) {
    eventUrl = String(params.ZabbixURL).replace(/\/+$/, '')
        + '/tr_events.php?triggerid='
        + encodeURIComponent(params.TriggerID)
        + '&eventid='
        + encodeURIComponent(params.EventID);

    meta.url = text(eventUrl, 500);
}

payload = {
    event: text(params.Subject || params.Trigger || 'Событие Zabbix', 120),
    source: text(params.Source || 'Zabbix', 100),
    meta: meta
};

Zabbix.log(4, '[Ontik webhook] Отправка: ' + JSON.stringify(payload));

response = request.post(params.URL, JSON.stringify(payload));
status = request.getStatus();

Zabbix.log(4, '[Ontik webhook] HTTP ' + status + ': ' + response);

if (status < 200 || status >= 300) {
    throw 'Ontik вернул HTTP ' + status + ': ' + response;
}

return 'OK';

Код ограничивает длину полей под контракт API Ontik, формирует источник Zabbix и добавляет meta.url. Значение url в ленте Ontik отображается кликабельной ссылкой.

Шаг 4. Добавьте шаблоны сообщений

Откройте вкладку «Шаблоны сообщений». Они нужны даже при использовании собственного JavaScript: Zabbix подставляет их в {ALERT.SUBJECT} и {ALERT.MESSAGE}.

Проблема

Тема:

[PROBLEM] {TRIGGER.NAME}

Сообщение:

Узел: {HOST.NAME}
Проблема: {TRIGGER.NAME}
Важность: {EVENT.SEVERITY}
Статус: {EVENT.STATUS}
Время: {EVENT.DATE} {EVENT.TIME}
Последнее значение: {ITEM.LASTVALUE}
ID события: {EVENT.ID}

Восстановление проблемы

Тема:

[RESOLVED] {TRIGGER.NAME}

Сообщение:

Узел: {HOST.NAME}
Проблема устранена: {TRIGGER.NAME}
Важность: {EVENT.SEVERITY}
Статус: {EVENT.STATUS}
Время восстановления: {EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
ID события: {EVENT.ID}

Сохраните способ оповещения.

Шаг 5. Свяжите интеграцию с пользователем и Action

Добавьте способ оповещения пользователю

  1. Откройте пользователя Zabbix, от имени которого выполняются оповещения.
  2. Перейдите на вкладку способов оповещения.
  3. Добавьте тип Ontik.
  4. В обязательном поле «Отправлять на» напишите Ontik. Это технический заполнитель; ключ проекта сюда вводить не нужно.
  5. Выберите периоды активности и уровни важности.
  6. Включите запись и сохраните пользователя.

Добавьте Ontik в действие

  1. Откройте «Действия» → «Действия триггеров».
  2. Создайте новое действие или откройте существующее.
  3. В операции проблемы выберите пользователя и способ оповещения Ontik.
  4. В операциях восстановления добавьте такую же отправку, если хотите получать [RESOLVED].
  5. Проверьте условия действия, уровни важности и состояние «Включено».
Если уведомления по email уже работают: необязательно заменять их. К одному Action можно добавить Ontik как дополнительный канал.

Шаг 6. Проверьте доставку

  1. В списке способов оповещения нажмите «Тест» напротив Ontik.
  2. Для теста укажите короткие значения параметров макросов, если Zabbix попросит заполнить их вручную.
  3. Успешный скрипт вернёт OK.
  4. Откройте проект Ontik: в ленте должно появиться новое событие с источником Zabbix.
  5. Разверните карточку и проверьте host, severity, status, event_id и ссылку.
  6. Создайте безопасную тестовую проблему Zabbix и затем восстановите её, чтобы проверить реальный Action.

API Ontik отвечает кодом 202 Accepted. Это означает, что событие принято и фоновые доставки поставлены в очередь. Видимый Web Push дополнительно зависит от разрешений браузера и операционной системы.

Если тест не сработал

СимптомЧто проверить
Не указан параметр URLНазвание параметра должно быть ровно URL, значение — https://app.ontik.ru/v1/events.
Не указан API-ключПроверьте параметр APIKey и ключ выбранного проекта.
HTTP 401 или 422Ключ недействителен, отсутствует заголовок либо данные не соответствуют контракту API.
Timeout / connection errorСервер Zabbix должен иметь исходящий HTTPS-доступ к app.ontik.ru:443. Проверьте DNS, firewall и proxy.
Тест успешен, события нетУбедитесь, что проверяете проект, ключ которого указан в Media type.
Событие есть, Web Push нетПроверьте уведомления для app.ontik.ru в браузере и в настройках операционной системы.
Тест работает, реальная проблема нетПроверьте пользователя, его способы оповещения, условия Action, операции и шаблоны сообщений.
HttpRequest is not definedВероятно старая версия Zabbix: для старой версии может потребоваться другой объект HTTP-запроса.

Для подробной проверки откройте журнал действий Zabbix и лог zabbix_server.log. Скрипт пишет диагностические строки с префиксом [Ontik webhook], но не выводит API-ключ.

Особенности текущей интеграции

  • PROBLEM и RESOLVED — отдельные события. Сейчас Ontik не объединяет их автоматически в одну карточку. Общий event_id помогает сопоставить записи.
  • Подавление повторов настраивается в Zabbix. Ontik сохраняет каждый принятый POST как событие.
  • Большие графики и история остаются в Zabbix. В Ontik передаются краткий контекст и ссылка.
  • Один ключ относится к одному проекту. Для разных проектов создайте отдельные способы оповещения или отдельные интеграции.
  • Webhook Ontik не нужен для входящего события. Он понадобится только если принятое событие нужно дополнительно передать из Ontik в другую систему.

Описание создания пользовательского Webhook и тестирования Media type также есть в официальной документации Zabbix.

Получайте оповещения Zabbix там, где работает команда

После настройки инциденты сохраняются в проекте Ontik, доступны владельцу и участникам и приходят на подключённые браузеры.

Сценарий мониторинга →Контракт API →
Если браузер не показывает уведомления →Чем входной API отличается от Webhook Ontik →Уведомления об ошибках резервного копирования →

Не получилось подключить? Напишите на info@ontik.ru и укажите версию Zabbix и текст ошибки без API-ключа.