Что понадобится для интеграции Zabbix с MAX
Схема работы достаточно простая:
Zabbix
│
│ Webhook / HTTPS
▼
MAX API
│
▼
Бот MAX
│
▼
Чат с администраторами
Когда в Zabbix возникает проблема, Action формирует уведомление и передаёт его созданному Media type. Webhook обращается к API MAX, а бот публикует сообщение в нужном чате.
Для настройки нам понадобятся:
- работающий сервер Zabbix;
- бот MAX;
- токен бота;
- чат, в который добавлен бот;
- chat_id этого чата;
- сетевой доступ от Zabbix Server к API MAX.
Создаём бота в MAX и получаем токен
Для отправки уведомлений из Zabbix понадобится чат-бот MAX. Именно от его имени будут приходить сообщения о проблемах и восстановлении сервисов.
Перейдите на платформу разработчиков MAX и создайте нового чат-бота.
При создании укажите:
- название бота;
- описание;
- аватар — при необходимости.
Например, для системы мониторинга можно назвать бота:
Zabbix
После создания откройте настройки бота и перейдите во вкладку Интеграция.
Нажмите Получить токен и скопируйте полученное значение.
Токен выглядит примерно так:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ExampleToken...
Он понадобится при настройке Webhook в Zabbix.
Создаём чат MAX и добавляем бота
Теперь необходимо подготовить чат, в который Zabbix будет отправлять уведомления.
Для мониторинга удобнее использовать отдельный групповой чат, куда можно добавить системных администраторов и других ответственных сотрудников.
Создаём группу
Откройте MAX и создайте новую группу:
- нажмите +;
- выберите Создать группу;
- добавьте необходимых участников;
- задайте название группы.
Например:
Zabbix Monitoring
или:
Zabbix Alerts
Добавляем бота
Откройте созданную группу и перейдите к списку участников.
Далее:
- нажмите Добавить участника;
- найдите созданного ранее бота;
- добавьте его в группу.
После добавления бота отправьте в группу обычное сообщение, например:
test
Теперь можно получить идентификатор созданного чата.
Получаем chat_id в MAX
Для отправки сообщения через API необходимо знать chat_id — уникальный идентификатор чата.
Получить список доступных боту чатов можно через API MAX.
Получаем chat_id через PowerShell
В Windows откройте PowerShell и выполните:
Invoke-WebRequest -Uri "https://platform-api.max.ru/chats" `
-Headers @{Authorization="ВАШ_ТОКЕН"}
Если необходимо вывести непосредственно содержимое ответа:
(Invoke-WebRequest -Uri "https://platform-api.max.ru/chats" `
-Headers @{Authorization="ВАШ_ТОКЕН"}).Content
Получаем chat_id через curl
В Linux или macOS можно выполнить:
curl -X GET "https://platform-api.max.ru/chats" \
-H "Authorization: ВАШ_ТОКЕН"
API вернёт список доступных боту чатов. Нас интересует параметр:
chat_id
Например:
-73905479971513
Если нужный чат не отображается
Проверьте:
- добавлен ли бот в нужную группу;
- отправлялось ли сообщение после добавления бота;
- правильно ли указан токен;
- возвращает ли запрос к API успешный ответ.
После этого повторите запрос.
Создаём Webhook MAX в Zabbix
Теперь у нас есть две основные вещи:
- Token — токен бота;
- ChatId — идентификатор чата.
Можно переходить к настройке Zabbix.
Откройте:
Alerts → Media types
Нажмите Create media type.
Укажите:
- Name: MAX;
- Type: Webhook.
Добавляем параметры Webhook
В блоке Parameters создайте следующие параметры:
| Параметр | Значение |
|---|---|
| Token | ВАШ_ТОКЕН |
| ChatId | ВАШ_CHAT_ID |
| Subject | {ALERT.SUBJECT} |
| Message | {ALERT.MESSAGE} |
| Severity | {EVENT.SEVERITY} |
Параметр Severity понадобится для преобразования стандартных уровней важности Zabbix в более читаемый вид.
Добавляем JavaScript Webhook
В поле Script вставьте следующий код:
try {
var params = JSON.parse(value);
if (!params.Token) {
throw 'MAX webhook error: Token is empty.';
}
if (!params.ChatId) {
throw 'MAX webhook error: ChatId is empty.';
}
// Перевод уровня важности
var severityMap = {
"Not classified": "⚪ Не классифицировано",
"Information": "🔵 Информация",
"Warning": "🟡 Предупреждение",
"Average": "🟠 Средняя",
"High": "🔴 Высокая",
"Disaster": "💥 Авария",
"Не классифицировано": "⚪ Не классифицировано",
"Информация": "🔵 Информация",
"Предупреждение": "🟡 Предупреждение",
"Средняя": "🟠 Средняя",
"Высокая": "🔴 Высокая",
"Авария": "💥 Авария"
};
var severity = params.Severity || '';
var severityText = severityMap[severity] || severity;
var subject = params.Subject || '';
var message = params.Message || '';
if (severity) {
subject = subject.replace(severity, severityText);
message = message.replace(severity, severityText);
}
var text = '';
if (subject) {
text += subject + '\n';
}
if (message) {
text += message;
}
var url = 'https://platform-api.max.ru/messages?chat_id=' +
encodeURIComponent(params.ChatId);
var payload = JSON.stringify({
text: text,
format: "html"
});
var req = new HttpRequest();
req.addHeader('Content-Type: application/json');
req.addHeader('Accept: application/json');
req.addHeader('Authorization: ' + params.Token);
var response = req.post(url, payload);
var status = req.getStatus();
Zabbix.log(4, '[MAX webhook] HTTP status: ' + status);
Zabbix.log(4, '[MAX webhook] Response: ' + response);
if (status < 200 || status >= 300) {
throw 'MAX webhook error: HTTP ' + status +
'. Response: ' + response;
}
return 'OK';
}
catch (error) {
Zabbix.log(3, '[MAX webhook] Failed: ' + error);
throw 'Sending failed: ' + error;
}
После добавления скрипта нажмите Add.
Проверяем Webhook
После сохранения Media type найдите созданный MAX и нажмите Test.
Проверьте значения параметров и запустите тестовую отправку.
Если параметры указаны правильно и API доступен, тестовое сообщение появится в MAX.
Настраиваем шаблоны Problem и Recovery
Webhook работает. Теперь настроим содержимое сообщений, которые будут приходить при возникновении и устранении проблемы.
Откройте:
Alerts → Media types → MAX
Перейдите в раздел Message templates.
Нам понадобятся два шаблона:
- Problem — возникновение проблемы;
- Problem recovery — восстановление.
Шаблон Problem
Создайте шаблон с типом:
Problem
Subject:
🚨 <b>ПРОБЛЕМА</b>: {EVENT.NAME}
Message:
<br />
<b>Событие:</b> {EVENT.NAME}
<b>Хост:</b> {HOST.NAME}
<b>Уровень:</b> {EVENT.SEVERITY}
<b>Время:</b> {EVENT.DATE} {EVENT.TIME}
{TRIGGER.URL}
Шаблон Recovery
Создайте второй шаблон для восстановления.
Message type:
Recovery
Subject:
✅ <b>РЕШЕНО</b>: {EVENT.NAME}
Message:
<br />
<b>Событие:</b> {EVENT.NAME}
<b>Хост:</b> {HOST.NAME}
<b>Уровень:</b> {EVENT.SEVERITY}
<b>Восстановлено:</b> {EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
<b>Длительность:</b> {EVENT.DURATION}
{TRIGGER.URL}
Теперь сообщения о проблемах и восстановлении будут иметь единый читаемый формат.
Добавляем MAX пользователю Zabbix
Создания Media type недостаточно. Zabbix должен знать, какому пользователю отправлять уведомления.
Откройте раздел управления пользователями и выберите пользователя, которому необходимо добавить новый способ оповещения.
Можно использовать существующего администратора или отдельного пользователя, созданного специально для уведомлений.
Перейдите во вкладку Media и нажмите Add.
Укажите:
- Type: MAX;
- Send to: например, max;
- When active: 1-7,00:00-24:00;
- Use if severity: необходимые уровни важности;
- Enabled: включено.
В моём случае в рабочей инфраструктуре имеет смысл отправлять в этот канал прежде всего события высокой важности, например High и Disaster.
При необходимости одному пользователю можно оставить несколько каналов уведомлений. Например, MAX может работать параллельно с электронной почтой или другим уже используемым каналом.
Создаём Action для отправки уведомлений
Теперь необходимо определить, при каких событиях Zabbix должен отправлять сообщение.
За это отвечает механизм Actions.
Перейдите:
Alerts → Actions → Trigger actions
Нажмите Create action.
Основные параметры Action
Например:
Name: Send to MAX
В Conditions задайте условия, при которых должно выполняться действие.
Здесь можно ограничить уведомления:
- по уровню важности;
- по группе хостов;
- по конкретным хостам;
- по тегам событий;
- по другим доступным условиям.
Отправка сообщения при возникновении проблемы
Перейдите во вкладку Operations и добавьте операцию отправки сообщения.
Укажите:
- Operation type: Send message;
- пользователя или группу пользователей;
- Send only to: MAX.
Отправка сообщения после восстановления
Теперь перейдите во вкладку Recovery operations.
Добавьте операцию отправки сообщения тому же пользователю или группе и укажите:
Send only to: MAX
Сохраните Action.
Проверяем реальные уведомления Zabbix в MAX
Тест Media type подтверждает работу Webhook, но финальную проверку лучше провести через настоящее событие Zabbix.
Для теста можно использовать подходящий некритичный хост и временно вызвать заранее известное контролируемое событие.
Например, если для остановки Zabbix Agent уже существует триггер, можно остановить агент на тестовой системе.
Windows
net stop "Zabbix Agent"
Linux
systemctl stop zabbix-agent
После срабатывания соответствующего триггера в MAX должно появиться сообщение о проблеме.
Проверяем Recovery
После проверки возвращаем агент в рабочее состояние.
Windows:
net start "Zabbix Agent"
Linux:
systemctl start zabbix-agent
Когда триггер перейдёт в состояние восстановления, должно прийти второе сообщение.
Таким образом мы проверили всю цепочку:
Trigger
↓
Action
↓
User
↓
Media MAX
↓
Webhook
↓
MAX API
↓
Чат
Что проверить, если уведомления в MAX не приходят
Если тестирование не прошло, проверяйте цепочку последовательно.
Есть ли проблема в Zabbix
Сначала убедитесь, что событие действительно возникло и отображается в разделе проблем мониторинга.
Сработал ли Action
Проверьте условия созданного Action. Событие должно соответствовать заданным фильтрам.
Назначен ли пользователю MAX
У пользователя должен быть включён созданный Media type, а уровень важности события должен соответствовать параметру Use if severity.
Проверяем журнал уведомлений
Проверьте историю отправки уведомлений в Zabbix. В зависимости от используемой версии интерфейса расположение соответствующего отчёта может отличаться.
Проверяем журнал Zabbix Server
На Linux можно посмотреть журнал сервера:
tail -f /var/log/zabbix/zabbix_server.log
Для нашего Webhook также полезно искать сообщения:
[MAX webhook]
Мы специально добавили их в JavaScript через Zabbix.log().
Проверяем доступ к API MAX
Сервер Zabbix должен иметь возможность установить HTTPS-соединение с:
platform-api.max.ru
Проверьте DNS, маршрутизацию, межсетевой экран, прокси-сервер и доступ по TCP 443.
В итоге наиболее частые причины проблемы:
- неверный Token;
- неверный ChatId;
- бот не добавлен в нужный чат;
- сервер Zabbix не имеет доступа к API MAX;
- Media не назначен пользователю;
- уровень важности события запрещён настройками Media;
- условия Action не выполняются;
- не настроена Recovery operation.
FAQ
Можно ли отправлять уведомления Zabbix в MAX без внешнего скрипта?
Да. В этой конфигурации используется встроенный Media type Webhook. JavaScript выполняется средствами Zabbix и отправляет HTTP-запрос непосредственно к API MAX.
Где взять chat_id для MAX?
После добавления бота в чат запросите доступные боту чаты через API MAX. В полученном ответе найдите параметр chat_id нужного чата.
Почему тест Webhook работает, а реальные уведомления не приходят?
Проверьте назначение Media пользователю, разрешённые уровни важности, условия Action и Operations/Recovery operations. Тест Media type проверяет сам Webhook, но не всю цепочку обработки события Zabbix.
Можно ли отправлять Problem и Recovery разными сообщениями?
Да. Для Media type создаются отдельные шаблоны Problem и Recovery, а в Action настраиваются обычные Operations и Recovery operations.
Можно ли отправлять в MAX только критические события?
Да. Ограничение можно задать через Use if severity у Media пользователя и/или через Conditions соответствующего Action.
Какой сетевой доступ нужен серверу Zabbix?
Для рассмотренной интеграции Zabbix Server должен иметь возможность обращаться по HTTPS к platform-api.max.ru, то есть должен быть разрешён исходящий TCP 443 и корректно работать DNS-разрешение имени.
Где искать ошибку Webhook MAX?
Проверьте результат тестирования Media type и журнал Zabbix Server. В приведённом скрипте предусмотрены записи [MAX webhook], содержащие HTTP-статус, ответ API и информацию об ошибке отправки.
Заключение
Мы полностью настроили отправку уведомлений Zabbix в MAX через Webhook: создали бота и групповой чат, получили Token и ChatId, настроили Media type, добавили JavaScript для обращения к API MAX, создали шаблоны Problem и Recovery и привязали новый способ оповещений к пользователю.
После этого настроили Action и проверили не только тестовую отправку Webhook, но и полный рабочий сценарий: возникновение проблемы → уведомление в MAX → восстановление → сообщение Recovery.
Преимущество такого подхода в том, что для интеграции не требуется отдельный сервис или внешний скрипт. Вся логика отправки находится непосредственно в Zabbix и при необходимости легко дорабатывается.
Например, дальше можно разделить уведомления по нескольким чатам, добавить разные правила для High и Disaster, изменить оформление сообщений или маршрутизировать события в зависимости от тегов и групп хостов.
Если вы активно автоматизируете работу с Zabbix, смотрите также статью Как массово добавить хосты в Zabbix из Excel через API.