Не так давно вышел 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 и нажмите Тест. В Ваш телеграм должно прийти сообщение, см. пример ниже на картинке:
4. Настройка способа оповещения у пользователя
Теперь перейдите в настройки пользователя который должен получать оповещения, добавьте новое оповещение.
Тип выберите «Telegram via Webhook», в поле «Отправлять на» введите ID пользователя из п.2, пример на картинке ниже:
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 v5:
На этом все, до скорых встреч.
Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, POstgreSQL) на протяжении последних 24 лет.
К сожалению веб-хуки в 4.4 не поддерживают работу через прокси, я создал запрос на доработку ZBXNEXT-5554
Проголосуйте за доработку и возможно Zabbix SIA реализуют работу через прокси.
Спасибо, очень познавательно! Очень бы хотелось видеть в форме поле для прокси, ибо телеграмм напрямую не работает.
К сожалению поддержка HTTP прокси будет доступна только в версии Zabbix v5.0, но для опытных пользователей я подготовил патч (ZBXNEXT-5554) и инструкцию по сборке версии 4.4 с поддержкой HTTP прокси:
https://github.com/CHERTS/zabbix_telegram_webhook/blob/master/HOW-TO-USE-HTTPPROXY-RU.md
Михаил в чем может быть проблема?
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.
Есть вероятность, что с вашего сервера заблокирован Телеграм.
Проверьте для начала с помощью обычного ping до api.telegram.org, а потом отправить тестовое сообщение с помощью curl:
Скрипт не отправляет сообщения содержащие ‘<' . Например: Problem name: SRV_TEST has been restarted (uptime < 10m)
Исправил, выложил в репозитарии новую версию. Спасибо.
Спасибо работает!!!!
И кстати: в zabbix v4.4 при импорте, ругается на то что поля:
_event_menu_url_https://t.me/botfather__event_menu_url_
_event_menu_name_Telegram to ‘botfather’__event_menu_name__
должны быть пустыми. (Не проблема, но так.. FYI )
А какая у Вас точно версия? 4.4.4 ? 4.4.5 ? Возможно это баг в забиксе.
на 4.4.6 compose — Incorrect value for field «event_menu_url»: should be empty.
Исправил, в репо актуальная новая версия. Спасибо.
Всем кто пользуется моей разработкой!
Вышла новая версия 1.4
Из нового:
+ Параметр disable_notification для отключения уведомления;
+ Маркировка алармов тегом и ссылкой на быстрый переход к сообщению (работает только для чатов с типом supergroup);
В тексте статьи про это написано и приведены пара скриншотов.
Добрый день Михаил !
Спасибо за статью, всё понятно и доходчиво.
Но у меня к сожалению при тестировании выдаёт ошибку Telegram failed: Error: cannot get URL: SSL connect error.
Zabbix развёрнут в докере.
Вероятно у Вас какие-то проблемы с установкой защищенного соединения до api.telegram.org из контейнера, попробуйте зайти в контейнер с zabbix-server и выполнить отправку с помощью curl, пример:
XXXXXX замените на свой Tg Chat ID, а YYYYYYYYYYYYYYYYY на свой Tg API Token
Добрый день Михаил, хочу выразить свою признательность за ваш труд, использую ваш замечательный метод уведомления, огромное вам спасибо!
Я порылся в API Telegram и увидел что есть метод удаления сообщений которым менее 7-ми дней. Т.е. прилетело уведомление и когда оно было решено, событие RESOLVED заббикса удаляет из чата предыдущее сообщение о проблеме, таким образом будут висеть только те сообщения которые актуальны на текущий момент(либо не решены в течении 7-ми дней). Вы не смотрели в этом направлении?
Добрый день, вашу идею я понял, но скорее всего реализовать удаление сообщений в Tg не получиться. Я конечно попробую, но пока напрямую не вижу способа решения. И с другой стороны не совсем понятно зачем удалять сообщения о начале проблемы, ведь тогда Вы в принципе не узнаете (по чату в Tg), что какая-то проблема была, у нее была какая-то длительность, а потом она разрешилась.
Спасибо за ваш ответ. Как сейчас реализованы уведомления у меня, это 4 телеграмм группы в которых отправляются уведомления различной важности. Я их просматриваю и знаю о возникших проблемах, НО было бы исключительно замечательно иметь отдельную группу с текущим списком проблем, т.е. там были бы только те проблемы которые не решены. Мне представляется это таким удаленным аналогом вкладки Мониторинг-Проблемы.
Так же это удобно в случае если у вас разветвленная сеть по регионам и главному итшнику нужно видеть скопом например все не решенные критичные проблемы по всем регионам.
Если я правильно понимаю, можно попробовать реализовать это через апи телеграмма — метод поиска, искать вхождения по ИД инцендента забикса и в случае если такой найден, то удалить.
https://core.telegram.org/method/messages.search
Напишите мне в Tg (https://t.me/CHERTS), обсудим идею. В принципе я подумал и наверно это можно реализовать.
Добрый день.
Как с отправкой графиков? в случае с webhook.
Добрый, пока никак.
Есть соответствующий запрос ZBXNEXT на доработку, возможно в версии 5.1 или 5.2 это будет реализовано.
Здравствуйте, после обновления с 4.4 на 5.0 перестали отправляться emoji, ошибка «Telegram failed: Error: cannot convert request contents to utf8» Как возобновить отправку emoji?
Добрый день,
да, возможность указать код emoji в формате Unicode в Zabbix 5 сломалась, но Вы можете вставить в поля отправки непосредственно картинки самих emoji. Картинку нужно просто скопировать из клиента Tg и она будет отправляться. Я добавил пример в статью (последний скриншот).
Здравствуйте.
В Zabbix 5.0.1 сломалось ещё сильнее. Даже вставка самих картинок в поля отправки не всегда работает.
Например, «red circle» 🔴 или «stop sign» 🛑 тест проходят нормально, а их использование непосредственно в шаблонах сообщений ломает отправку с ошибкой «Telegram failed: Error: cannot convert request contents to utf8».
При этом сообщения с «check mark button» ✅ уходят нормально.
В Zabbix 5.0.0 всё работало.
Кто-нибудь знает, починили ли отправку emoji, и если да — в какой версии?
В 5.0.1 и новее работает отправка только трёх-байтных эмоджиков.
Вот по этой ссылке
https://gist.github.com/watson/ea44886af36c5495b00e
всё что в секции three-byte-emojis.json работает.
спасибо.
для себя временно решил небольшим изменением кода (метод отправки изменил с POST на GET).
когда исправят — уберу свои правки дилетантские.
добрый день. всерия 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 раза подряд.
В js-коде media telegram в версии 5.0.0 и 5.0.1 есть ошибка, откройте код и замените в тексте request.setProxy на request.SetProxy и сохраните код.
Или импортируйте исправленный медиа из официального репозитария https://github.com/zabbix/zabbix/tree/master/templates/media/telegram
спасибо, сработало. я думал что весь интернет перевернул, оказалось не весь.
Тогда еще 1 вопрос по оповещалкам в Slack. Сообщения приходят, но забикс не видит что они доставлены и отсылает их 3 раза подряд. соответственно отчет о доставке в дашборде провален. если без прокси то все нормально. если через корп проксю то вот такие ошибки вылетают. пробовал крутить скрипт но тоже ничего не дало.
По Slack не подскажу, не использую его.
У меня 5.4.10 (revision db03ff023d) официальный скрипт для телеги но та же ошибка. подозреваю что где-то на этапе отправки реквеста косяк но как это отдебажить не знаю.
В коде медиа на js Вы можете использовать вызов Zabbix.log(X,’Message’), где X это число, уровень дебага в настройках з-сервер, по умолчанию 3 (warn) и таким образом производить отладку.
Объясните пожалуйста напримере отправки отформатированного сообщения где parse_made — html. Как отредактировано скажем сообщение о проблеме. Я не могу понять где теги ставить.
В коде был баг с отправкой в html, исправил — все работает. Обновите media у себя в забиксе. Так же добавил поддержку режима MarkdownV2
Здравствуйте. Вопрос относительно отправки уведомлений в группу. У группы id начинается с минуса. Например -123456… Валятся ошибки, что id_chat плохой (пишет id группы без минуса), или вообще empty, хотя в логах сервера все указано корректно. Где может быть ошибка?
Добавьте бота в эту группы и сообщения будут отправляться, минус на это не влияет.
Привет. переход строки в формате HTML реально сделать? как только с обычного теста перехожу, переходов нет
А стандартный тег
не помогает?
Установлен zabbix 5.0.9 (Telegram via Webhook Version: 1.5)
Настройки оповещений сделаны как тут по инструкции, оповещения приходят. Так же сделано как «Пример настройки, маркировки тегом и вид меню перехода к сообщению:» как на картинке примера.
Но маркировка не происходит и соответственно не приходят ссылки для перехода к сообщению
вот такая ошибка при добавление эмодзи в версии 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
Добрый день, в версии 5.4 есть родной media type по отправке сообщений в Телеграм и он лучше моего. Рекомендую использовать родной.
Мой целесообразно использовать в версии Zabbix 4.4 или максимум 5.0
Доброго дня.
Как поправить скрипт таким образом, чтобы телеграмм слал не только в группу, но и в топик в этой группе?
По сути топики являются ответами на сообщение, поэтому мне надо добавить в скрипт «reply_to_message_id», чтобы URL получился вида
https://api.telegram.org/botToken/sendMessage?chat_id=-100xxxxx&reply_to_message_id=xxx&parse_mode=Markdown&text=«Text»
Подскажите, пожалуйста, как это добавить?
Спасибо