Отправка уведомлений из Zabbix в Telegram через Webhook

Не так давно вышел Zabbix 4.4 в котором появилось много всего интересного. Например, добавлена возможность использования web-хуков и собственных обработчиков действий и уведомлений при выявлении сбоев проверяемых сервисов. Обработчики можно создавать на JavaScript и применять для обращения к внешним службам доставки уведомлений или системами отслеживания ошибок. Например, можно написать обработчик для отправки сообщений о проблемах в корпоративный чат.

В данной статье я расскажу как можно из Zabbix 4.4 (а так же из 5.0) отправлять сообщения в Телеграм без использования дополнительных скриптов.

Исходные данные: Zabbix 4.4
Задача: Сделать отправку уведомлений из Zabbix в Telegram через Webhook

Для того чтобы отправлять сообщения в Телеграм необходим доступ до api.telegram.org на порт 443 с Вашего Zabbix-сервера.

1. Создаем бота у @botfather, официальная инструкция тут

Команда для создания бота /newbot
Далее вводим имя желаемого бота обязательно маленькими буквами и в конце префикс _bot, например: myxxxxxxx_bot
Если имя не занято, то botfather скажет «Done! Congratulations on your new bot» и далее выдаст ссылку на бота, вида: t.me/myxxxxxxx_bot
А так же кроме всего прочего после слов «Use this token to access the HTTP API:» выдаст API-ключ нашего бота, он нам пригодиться дальше.

Нам нужно перейти по ссылке на нашего бота и нажать ЗАПУСТИТЬ или ввести /start, если этого не сделать, то сообщения Вам приходить не будут. Данную ссылку Вы можете давать всем кто будет получать оповещения.

2. Теперь нам нужно узнать собственный идентификатор, чтобы указать его в настройках профиля пользователя в Zabbix

Самый простой способ узнать свой ID — это подключиться к боту @get_id_bot, нажать ЗАПУСТИТЬ и он выдаст вам Ваш ID. Дополнительную информацию о боте можно узнать здесь.

3. Импорт нового способа оповещения:

Скачиваем архив с xml файлом нового способа оповещения и распаковываем его.

Открываем Zabbix, переходим в «Администрирование» -> «Способы оповещений», наживаем «Импорт» и выбираем файл zbx_export_mediatypes.xml

У нас появляется новый способ оповещения «Telegram via Webhook», редактируем его и в строку с именем token вводим Ваш API-ключ бота из п.1

Далее Вы можете изменить 3 дополнительных параметра отправки сообщений, это parse_mode, disable_web_page_preview и disable_notification

Параметр parse_mode задает режим разметки сообщений, может иметь значения HTML, Markdown или MarkdownV2, более детально о разметке сообщений можно почитать в официальной документации.

Параметр disable_web_page_preview дает возможность отключить предпросмотр ссылок в сообщениях, может иметь значения true или false. Иногда имеет смысл ставить его в false, выбирать Вам.

Параметр disable_notification дает возможность отключить уведомления о приходе сообщения, может иметь значения true или false.

Параметр HTTPProxy используется только в пропатченой версии zabbix-server v4.4, которая позволяет отправлять сообщения в Телеграм через HTTP-прокси. Не заполняйте это поле в стандартной версии zabbix v4.4! О том как пересобрать zabbix-server с поддержкой HTTPProxy для Web-хуков я описал тут
В Zabbix v5.0 реализована работа вебхуков через прокси и патч не требуется, поэтому Вы можете использовать параметр HTTPProxy и указать в нем адрес прокси-сервера.
Формат параметра HTTPProxy: schema://user:password@ip:port
где
schema — это протокол, может быть http, https или socks5h
user и password — это логин и пароль пользователя если на прокси используется авторизация (не обязательные поля)
ip — это IP адрес или доменное имя
port — это порт прокси
Пример:
http://123.45.67.89:3128
или
socks5h://vasua:[email protected]:1080

Установленная галочка «Включить запись меню события» (Include event menu entry) позволяет добавлять в алармы на странице «Проблемы» ссылку с именем указанном в поле «Имя записи меню» (Menu entry name) при выборе которой будет открываться страница указанная в «URL записи меню» (Menu entry URL). Поле «URL записи меню» установлено в {EVENT.TAGS.tg_message_url} специально, это позволяет вместе с включенной опцией «Обработка тегов» формировать правильные ссылки на сообщения в чате.

Пример настройки, маркировки тегом и вид меню перехода к сообщению:

Настройки метода оповещения

Настройки метода оповещения

Пример маркировки тегами и меню перехода к сообщению в Телеграм

Пример маркировки тегами и меню перехода к сообщению в Телеграм


Сохраните изменения и нажмите кнопку Тест. В поле subj введите заголовок сообщения, в поле message введите тестовое сообщение, в поле chat_id введите ID из п.2 и нажмите Тест. В Ваш телеграм должно прийти сообщение, см. пример ниже на картинке:

Zabbix telegram via webhook test

Zabbix telegram via webhook test

4. Настройка способа оповещения у пользователя

Теперь перейдите в настройки пользователя который должен получать оповещения, добавьте новое оповещение.

Тип выберите «Telegram via Webhook», в поле «Отправлять на» введите ID пользователя из п.2, пример на картинке ниже:

zabbix telegram via webhook user profile

zabbix telegram via webhook user profile

5. Настройка действий

Теперь можно настроить непосредственно действия по отправке уведомления при наступлении определенных событий, для этого перейдите в Zabbix в «Настройка» -> «Действия», выберите Источник событий — Триггеры и нажмите кнопку «Создать действие».

6. Отладка скрипта отправки и логгирование.

Скрипт отправки написан на JavaScript и ведет полное логгирование действий по отправке на уровне 3 (warning), если Вы откроете стандартный лог-файл Zabbix-server по пути /var/log/zabbix/zabbix_server.log, то увидите примерно такое:

  2741:20200326:141654.137 Telegram HTTP response code: 200
  2741:20200326:141654.137 Telegram response: {"ok":true,"result":{"message_id":19,"from":{"id":XXXXXX,"is_bot":true,"first_name":"YYYYY","username":"YYYYYY"},"chat":{"id":-100XXXXXXX,"title":"MyZabbix","type":"supergroup"},"date":158521XXXX,"text":"Alarm\nTest"}}
  2741:20200326:141654.137 Telegram supergroup result: {"tags":{"tg_message_url":"https://t.me/c/140XXXXXXXX/19"}}

Код ответа 200 означает успешную отправку.

Могут быть и ошибки отправки, пример (указан неправильный ID чата):

  2741:20200326:141840.576 Telegram HTTP response code: 400
  2741:20200326:141840.576 Telegram failed json: {"chat_id":"-100XXXXXXX","parse_mode":"html","disable_web_page_preview":"true","text":"Alarm\r\nTest"}
  2741:20200326:141840.576 Telegram failed: {"ok":false,"error_code":400,"description":"Bad Request: chat not found"}

или указан неправильный токен:

  2741:20200326:142005.538 Telegram HTTP response code: 401
  2741:20200326:142005.539 Telegram failed json: {"chat_id":"-100XXXXXX","parse_mode":"html","disable_web_page_preview":"true","text":"Alarm\r\nTest"}
  2741:20200326:142005.539 Telegram failed: {"ok":false,"error_code":401,"description":"Unauthorized"}

В отправляемых сообщениях можно использовать эмодзи символы, коды символов смотрим тут, колонка Unicode. Перед кодом нужно использовать обратный слэш для экранирования.

Внимание! Отправка эмодзи с указанием unicode-кода будет работать только в Zabbix v4.4, в 5-й версии Zabbix нужно использовать непосредственно сами картинки, их можно вставлять в нужные места сообщений (смотрите скриншоты ниже).

Пример отправки сообщения с эмодзи в Zabbix v4.4:

Пример отправки сообщения с эмодзи в Zabbix v4.4

Пример отправки сообщения с эмодзи в Zabbix v4.4

Пример отправки сообщения с эмодзи в Zabbix v5:

Пример отправки сообщения с эмодзи в Zabbix v5

Пример отправки сообщения с эмодзи в Zabbix v5

На этом все, до скорых встреч.

Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.


44
Оставить комментарий

avatar
1000
19 Цепочка комментария
25 Ответы по цепочке
3 Последователи
 
Популярнейший комментарий
Цепочка актуального комментария
19 Авторы комментариев
EpigrapheМихаилКириллNikolayEvgeniy Авторы недавних комментариев

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  Подписаться  
Уведомление о
Андрей
Гость
Андрей

Спасибо, очень познавательно! Очень бы хотелось видеть в форме поле для прокси, ибо телеграмм напрямую не работает.

Egor
Гость
Egor

Михаил в чем может быть проблема?

10400:20200130:114854.927 Webhook request value: {«subj»:»123″,»message»:»233″,»token»:»9XXXXXXXX:XXXXXXXXXXXXXXX»,»parse_mode»:»html»,»disable_web_page_preview»:»true»,»chat_id»:»XXXXXX»,»HTTPProxy»:»»}
10400:20200130:114855.181 Telegram failed json: {«chat_id»:»XXXXXXXXXX»,»parse_mode»:»html»,»disable_web_page_preview»:»true»,»text»:»123\r\n233″}
10400:20200130:114855.181 Telegram failed: Error: cannot get URL: Failure when receiving data from the peer.

mczen
Гость
mczen

Скрипт не отправляет сообщения содержащие ‘<' . Например: Problem name: SRV_TEST has been restarted (uptime < 10m)

Xorira
Гость
Xorira

на 4.4.6 compose — Incorrect value for field «event_menu_url»: should be empty.

Сергей
Гость
Сергей

Добрый день Михаил !
Спасибо за статью, всё понятно и доходчиво.
Но у меня к сожалению при тестировании выдаёт ошибку Telegram failed: Error: cannot get URL: SSL connect error.
Zabbix развёрнут в докере.

Иван
Гость
Иван

Добрый день Михаил, хочу выразить свою признательность за ваш труд, использую ваш замечательный метод уведомления, огромное вам спасибо!
Я порылся в API Telegram и увидел что есть метод удаления сообщений которым менее 7-ми дней. Т.е. прилетело уведомление и когда оно было решено, событие RESOLVED заббикса удаляет из чата предыдущее сообщение о проблеме, таким образом будут висеть только те сообщения которые актуальны на текущий момент(либо не решены в течении 7-ми дней). Вы не смотрели в этом направлении?

Юрий
Гость
Юрий

Добрый день.
Как с отправкой графиков? в случае с webhook.

Artem
Гость
Artem

Здравствуйте, после обновления с 4.4 на 5.0 перестали отправляться emoji, ошибка «Telegram failed: Error: cannot convert request contents to utf8» Как возобновить отправку emoji?

Артем
Гость
Артем

добрый день. всерия 5.0.1. Не работает отправка telegram через корпоративный прокси. как я уже только не прописывал….
если прописываю параметр HTTPProxy то выдает ошибку Sending failed: TypeError: undefined not callable (property ‘setProxy’ of [object Object]).
если прописываю параметр как proxy, то выдает ошибку Sending failed: Error: cannot get URL: Timeout was reached..
пробовал оповещалку slack. тут HTTPProxy работает, но криво — сообщения приходят но заббикс не видит что они отправлены и шлет их 3 раза подряд.

Денис
Гость
Денис

Объясните пожалуйста напримере отправки отформатированного сообщения где parse_made — html. Как отредактировано скажем сообщение о проблеме. Я не могу понять где теги ставить.

ise
Гость
ise

Здравствуйте. Вопрос относительно отправки уведомлений в группу. У группы id начинается с минуса. Например -123456… Валятся ошибки, что id_chat плохой (пишет id группы без минуса), или вообще empty, хотя в логах сервера все указано корректно. Где может быть ошибка?

Владимир
Гость
Владимир

Добавьте бота в эту группы и сообщения будут отправляться, минус на это не влияет.

алекс
Гость
алекс

Привет. переход строки в формате HTML реально сделать? как только с обычного теста перехожу, переходов нет

Evgeniy
Гость
Evgeniy

Установлен zabbix 5.0.9 (Telegram via Webhook Version: 1.5)
Настройки оповещений сделаны как тут по инструкции, оповещения приходят. Так же сделано как «Пример настройки, маркировки тегом и вид меню перехода к сообщению:» как на картинке примера.
Но маркировка не происходит и соответственно не приходят ссылки для перехода к сообщению

Nikolay
Гость
Nikolay

вот такая ошибка при добавление эмодзи в версии 5.4, как победить?
Error in query [UPDATE media_type_message SET message=’Problem started at {EVENT.TIME} on {EVENT.DATE}\r\nHost: {HOST.NAME}\r\nIP: {HOST.IP}\r\n\\😁\r\n’ WHERE mediatype_messageid=’41’] [Incorrect string value: ‘\xF0\x9F\x98\x81\x0D\x0A’ for column ‘message’ at row 1

Epigraphe
Гость
Epigraphe

Доброго дня.
Как поправить скрипт таким образом, чтобы телеграмм слал не только в группу, но и в топик в этой группе?
По сути топики являются ответами на сообщение, поэтому мне надо добавить в скрипт «reply_to_message_id», чтобы URL получился вида
https://api.telegram.org/botToken/sendMessage?chat_id=-100xxxxx&reply_to_message_id=xxx&parse_mode=Markdown&text=«Text»

Подскажите, пожалуйста, как это добавить?
Спасибо