Отправка уведомлений из 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

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

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


Подписаться
Уведомить о
guest

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

44 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Андрей
Андрей
4 лет назад

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

Egor
Egor
4 лет назад

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

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
4 лет назад

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

mczen
mczen
4 лет назад
Ответить на  Михаил

Спасибо работает!!!!
И кстати: в zabbix v4.4 при импорте, ругается на то что поля:
_event_menu_url_https://t.me/botfather__event_menu_url_
_event_menu_name_Telegram to ‘botfather’__event_menu_name__
должны быть пустыми. (Не проблема, но так.. FYI )

Xorira
Xorira
4 лет назад

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

Сергей
Сергей
4 лет назад

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

Иван
Иван
4 лет назад

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

Иван
Иван
4 лет назад
Ответить на  Михаил

Спасибо за ваш ответ. Как сейчас реализованы уведомления у меня, это 4 телеграмм группы в которых отправляются уведомления различной важности. Я их просматриваю и знаю о возникших проблемах, НО было бы исключительно замечательно иметь отдельную группу с текущим списком проблем, т.е. там были бы только те проблемы которые не решены. Мне представляется это таким удаленным аналогом вкладки Мониторинг-Проблемы.

Иван
Иван
4 лет назад
Ответить на  Михаил

Так же это удобно в случае если у вас разветвленная сеть по регионам и главному итшнику нужно видеть скопом например все не решенные критичные проблемы по всем регионам.

Иван
Иван
4 лет назад
Ответить на  Михаил

Если я правильно понимаю, можно попробовать реализовать это через апи телеграмма — метод поиска, искать вхождения по ИД инцендента забикса и в случае если такой найден, то удалить.
https://core.telegram.org/method/messages.search

Юрий
Юрий
4 лет назад

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

Artem
Artem
3 лет назад

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

Иван
Иван
3 лет назад
Ответить на  Михаил

Здравствуйте.
В Zabbix 5.0.1 сломалось ещё сильнее. Даже вставка самих картинок в поля отправки не всегда работает.
Например, «red circle» 🔴 или «stop sign» 🛑 тест проходят нормально, а их использование непосредственно в шаблонах сообщений ломает отправку с ошибкой «Telegram failed: Error: cannot convert request contents to utf8».
При этом сообщения с «check mark button» ✅ уходят нормально.
В Zabbix 5.0.0 всё работало.

Алексей
Алексей
3 лет назад
Ответить на  Иван

Кто-нибудь знает, починили ли отправку emoji, и если да — в какой версии?

Иван
Иван
3 лет назад
Ответить на  Алексей

В 5.0.1 и новее работает отправка только трёх-байтных эмоджиков.
Вот по этой ссылке
https://gist.github.com/watson/ea44886af36c5495b00e
всё что в секции three-byte-emojis.json работает.

Алексей
Алексей
3 лет назад
Ответить на  Иван

спасибо.
для себя временно решил небольшим изменением кода (метод отправки изменил с POST на GET).
когда исправят — уберу свои правки дилетантские.

Артем
Артем
3 лет назад

добрый день. всерия 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 раза подряд.

Артем
Артем
3 лет назад
Ответить на  Михаил

спасибо, сработало. я думал что весь интернет перевернул, оказалось не весь.
Тогда еще 1 вопрос по оповещалкам в Slack. Сообщения приходят, но забикс не видит что они доставлены и отсылает их 3 раза подряд. соответственно отчет о доставке в дашборде провален. если без прокси то все нормально. если через корп проксю то вот такие ошибки вылетают. пробовал крутить скрипт но тоже ничего не дало.

Михаил
Михаил
3 лет назад
Ответить на  Артем

По Slack не подскажу, не использую его.

Кирилл
2 лет назад
Ответить на  Михаил

У меня 5.4.10 (revision db03ff023d) официальный скрипт для телеги но та же ошибка. подозреваю что где-то на этапе отправки реквеста косяк но как это отдебажить не знаю.

Денис
Денис
3 лет назад

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

ise
ise
3 лет назад

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

Владимир
Владимир
3 лет назад
Ответить на  ise

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

алекс
алекс
2 лет назад

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

Evgeniy
Evgeniy
2 лет назад

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

Nikolay
Nikolay
2 лет назад

вот такая ошибка при добавление эмодзи в версии 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
10 месяцев назад

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

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

44
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x