Картинка: источник

Привет, Хабр! Меня зовут Илья Аблеев, я работаю в отделе мониторинга Badoo.

Можно долго холиварить на тему того, какая система мониторинга круче. Основным инструментом для реакции на проблемы в Badoo является Zabbix, и мы неоднократно делились опытом его кастомизации.

«Из коробки» узнавать о новых проблемах можно либо через веб-интерфейс, либо по почте/SMS. Это хорошо работает и до определённого момента нас устраивали эти способы.

На сегодняшний день в нашей системе несколько инстансов сервера, тысячи хостов, сотни тысяч проверок и примерно столько же триггеров, на которые нужно как можно более оперативно реагировать. После ряда инцидентов, когда только на обнаружение проблемы мы тратили до десяти минут (что совершенно недопустимо), мы осознали, что нам жизненно необходимы другие способы уведомления о проблемах. Тогда, возможно, наша реакция была бы быстрее.

Оптимальным решением, на наш взгляд, был бы вывод важных уведомлений поверх всех окон (браузеров, чатов, консолей). В этой статье речь пойдёт о том, как мы допилили Zabbix, научив отправлять их прямо на рабочий стол.

Кому подойдёт данное решение:

  • дежурным администраторам, которые не только круглосуточно смотрят в монитор, но и занимаются решением других задач;
  • всем остальным администраторам, которым не нравится просматривать простыню PROBLEM и OK`ов в почте или SMS, но которые хотят своевременно узнавать о критичных проблемах.

Придётся потратить время на установку, но, думаю, если вы используете Zabbix и уже использовали кастомные скрипты, для вас это не составит труда.

Внимание! Получение уведомлений данным способом вызывает привыкание, долговременное его использование создаёт впечатление, что он является неотъемлемой частью Zabbix.

Расскажу по шагам, что и как мы делали. Техническая реализация достаточно проста:

  1. Zabbix отправляет алерт на какое-то событие.
  2. Скрипт-отправщик на сервере отправляет данные клиенту на десктоп по UDP.
  3. Скрипт-получатель принимает уведомление, и инициирует появление всплывающего сообщения посредством дополнительного приложения.

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

Шаг первый: настройка Zabbix


В официальной документации подробно рассказано, как создать свои алерты.

Код проекта доступен на GitHub: https://github.com/ableev/ZbxDsktp.

  1. Заранее положим zbxpush.py в AlertScriptsPath на Zabbix-сервер.
  2. Далее в веб-интерфейсе: Administration > Media types > Create.




3. Заранее пропишем IP/FQDN, на который мы будем отправлять алерты.

Данный пункт можно модернизировать
Например, у нас сделано так: существует главный сервер мониторинга, при SSH-логине скрипт запоминает IP зашедшего и начинает отправлять на него алерты. Таким образом, чтобы активировать получение данных у себя, не нужно каждый раз менять экшен.

В веб-интерфейсе: Administration > Users > %username% > Media.



4. Создадим действие на триггеры.

В веб-интерфейсе: Configuration > Actions.



Формат отправки


{TRIGGER.NSEVERITY}@@@{HOST.NAME}@@@{TRIGGER.NAME}

Первое — числовой формат триггера (4 или 5 — влияет на отображаемую иконку: High или Disaster), второе — заголовок уведомления, третье — тело сообщения.

@@@ — чтобы было удобно разбивать на столбцы, ибо в названиях триггеров может быть написано что угодно (по крайней мере, у нас :)), но точно не эта комбинация.





Шаг второй: сервер отправляет данные клиенту


Логика простая: получаем событие, пересылаем его клиенту.

zbxpush.py

Здесь вы можете изменить UDP на TCP. Мы выбрали UDP по одной простой причине: Zabbix отправляет все уведомления последовательно, а значит, если ваш компьютер будет недоступен, в случае использования TCP уведомления будут отправляться с большой задержкой.

Но ведь UDP – это ненадёжно
Читатель, до которого доходит шутка про UDP, заметит, что в случае отправки алертов по UDP появляется вероятность потерять их где-нибудь между сервером и десктопом. И будет прав. Но суть не в том, чтобы гарантированно доставить сообщение, а в том, чтобы просто и быстро привлечь внимание к дашборду с проблемами: «Эй, там что-то случилось, пойди и посмотри».

Не забудьте сделать скрипт исполняемым!

Шаг третий: получаем событие и отображаем уведомления


zbxlistenerd.py – скрипт, который будет крутиться в фоне и запускать уведомления

settings.cfg — файл с настройками клиента

icons/5.png, icons/4.png — иконки для разных критичностей триггеров
Дальше наши пути расходятся. «Клиентская» часть предполагает немного творчества, так как каждый создаёт окружение для себя.

Что бывает необходимо:

  • иконки, соответствующие критичностям триггеров;
  • звуковое сопровождение всплывающих уведомлений;
  • выполнение действия по нажатию на уведомление (SSH-логин, открытие ссылки, заведение тикета о проблеме и т. д.).

В нашей компании в качестве десктопной ОС в основном используются Linux и Mac OS, поэтому рассмотрим несколько примеров для них. Если же вы реализуете то же самое для Windows, добро пожаловать в комменты! С радостью дополним пост.

Linux




Приведу пример, который довелось использовать: notify-send в Xfce (на скриншоте выше). Почему notify-send, а не тот же Python с использованием libnotify? Да потому что он есть во всех популярных десктоп-дистрибутивах (Ubuntu, Fedora, SUSE) и работает со всеми (по крайней мере популярными) DE (Gnome, KDE, Xfce).

Совет: если у вас случаются периоды массовой недоступности чего-либо (например, отвалился свитч — и вы завалены горой триггеров о недоступности серверов), сразу настройте хоткей на завершение процесса notify-send.

Mac OS


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

terminal-notifier




После недолгого поиска был выбран бесплатный terminal-notifier.

Плюсы:

  • можно устанавливать разные иконки для разных критичностей;
  • можно формировать ссылки на графики в Zabbix и открывать их по клику на уведомление;
  • можно реализовать открытие SSH-ссылок: увидели нотификацию -> кликнули -> сразу зашли на хост.

Минусы: отсутствуют (особенно после того, как была добавлена поддержка иконок).

Growl



Для включения установите growl_enabled = True в settings.cfg.

Во времена, когда terminal-notifier не умел использовать кастомные иконки, Growl вполне с этим справлялся. Поэтому наше любопытство победило жадность — и мы опробовали это довольно популярное приложение (которое, надо сказать, умеет не только иконки менять — это целый центр уведомлений).

Плюсы:

  • возможно, у вас приложение уже установлено;
  • можно выбрать разные иконки под разные критичности;
  • так же, как и в terminal-notifier, можно настроить действия по нажатию на уведомления.

Минус: платное.

Если же Growl у вас нет, рекомендую всё же воспользоваться terminal-notifier.

Заключение


Вот так, с помощью нехитрых приспособлений…

Что мы получили в итоге:

  • быстрая доставка уведомлений админам;
  • уменьшение времени реакции на события (от момента «узнали» до «починили» или «передали дальше»);
  • возможность совершать простые полуавтоматические действия:

Далее всё зависит от вашего творческого потенциала.

Когда-то давно, когда я работал в компании-провайдере, при падении интернет-канала из всех колонок и наушников на рабочем месте доносился звук сирены. Это приводило дежурного (меня) в ступор, не давало адекватно сообщить о проблеме по телефону, но он (я) старался как можно быстрее эту проблему решить.

Лично мне уже известны случаи прикручивания к скрипту звука свиньи из популярного антивируса и говорилки из популярного переводчика. :)

При наличии свободного времени, желания и современных технологий можно сделать так


Быстрых вам реакций на инциденты!

Комментарии (29)


  1. CrazyRoot
    01.08.2018 18:20
    +4

    Жду коментов с виндой.


    1. Renaissance
      01.08.2018 19:28

      Как альтернативу, могу предложить Nagstamon: nagstamon.ifw-dresden.de
      Поддерживает Zabbix, сам использую ежедневно, уже не знаю как без него обойтись.


    1. soulruins
      01.08.2018 21:17

      На Windows одно время развлекался udp + Miranda NG (с плагином NotifyAnything). Вполне рабочая схема была, только как-то мне не зашла по итогу.


  1. rt3879439
    01.08.2018 18:35

    Кмк куда удобней получать сообщение в телеграм или любой другой мессенджер.


    1. ableev Автор
      01.08.2018 18:45
      +4

      А пожалуйста: https://github.com/ableev/Zabbix-in-Telegram :)


      Но отправить сообщение в мессенджер — это "через десятые руки" + задержка получения + надо открыть + надо увидеть более критичное.


      1. rt3879439
        01.08.2018 18:57
        +1

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


        1. AlexGluck
          01.08.2018 19:00
          +1

          А можно и на десктоп и в мессенджер. Вот ведь круто, да?


          1. eri
            02.08.2018 12:31

            уведомления скроются всей кучей)


      1. fcoder
        01.08.2018 19:31

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

        Для особо критичных алертов можно (нужно) настроить звонок на телефон помимо всего прочего.


      1. eri
        02.08.2018 12:30

        У меня через свой сервер xmpp в telepathy. вылезает такое же уведомление как и в notify-send, но если вы закрыли уведомление, то уже не посмотрите что там было. А с месенжером есть история и гиперлинк на проблему дашборде забикса.


  1. anton1234
    01.08.2018 19:38

    А никого не смущает необходимость знать ip адрес получателя?
    ИМХО в 2018 году что-либо делать по ip адресу можно только из ностальгии по 90м.


    1. ableev Автор
      01.08.2018 19:53
      +2

      Не поймите меня неправильно, но даже при открытии Хабра используется IP адрес.
      И когда мы подключаемся к локальной сети — нам выдаётся айпишник.
      Который можно использовать :)
      Там в середине статьи есть спойлер, в котором описано, как можно обойтись без этого знания.
      В качестве "регистрации" десктопа используется ssh -> who -> запись айпишника в файл. Нас мало, это нужно буквально десяти людям. Делать какую-то систему регистрации/авторизации под это дело — долго, и вообще странно.


      А если это надо одному человеку, который может статикой прибить свой айпишник в офисном dhcp — вообще проблемы отпадают.


      Точно так же можно сказать и про SMS: ведь никого не смущает необходимость знать номер, чтобы отправить сообщение. А в некоторых случаях ещё и разрешение владельца на отправку сообщений.


      1. anton1234
        02.08.2018 11:58

        Не поймите меня неправильно, но то, что сети у нас построены на tcp\ip протоколе никак не оправдывает использования ip адреса в качестве аутентификации и авторизации. Если я правильно понимаю, на клиенте вы предлагает запускать скрипт слуашющий определенный открытый порт и выполняющий команды.
        Также у вас аргументы «нас всего 10» и «делать по-другому сложно».
        Все это плохо вписывается в корпоративный аккаунт такой большой компании как Badoo. У вас же полно программистов, если так хочется свой велосипед, с сегодняшними технологиями можно за пару вечеров написать клиент северное решение. Чего-то подобного я ожидал за ходя в эту тему.
        PS/ Без обид, у меня просто диссонанс от масштаба компании и решения, если в это реально поверить.


        1. ableev Автор
          02.08.2018 12:16

          Масштаб компании никак не связан с величиной отдела.
          Где-то весь отдел – это 40 человек с группами по компонентам.
          Где-то — 2 человека.

          Делать по-другому не сложно, и можно наворотить целый комбайн, который потом нужно будет поддерживать.

          Можно написать свой мониторинг.

          Мой посыл в том, что большое и сложное решение не всегда нужно небольшой команде эксплуатации.
          Есть задача, а то, как она решается (сложно или просто) – большого значения не имеет.

          Статья в стиле «мы молодцы, сделали вот такую крутую штуку под свои нужды и потребности, но вам она ни к чему и использовать у себя вы не сможете» вызвала бы диссонанс у кого-то ещё.

          Смотря под каким углом посмотреть.


          1. anton1234
            02.08.2018 12:46

            Я смотрю под углом «решение имеет небезопасный дизайн».
            Не важно какого размера отдел, потому, что его деятельность влияет на всю компанию. Как говорится, цепь крепка настолько насколько крепко ее самое слабое звено. Если в одном отделе, для решения одной простой задачи используются открытые порты и авториазция по ip адресу это все равно, что во все компании. Вот такой у меня угол.


          1. anton1234
            02.08.2018 12:50

            Есть задача, а то, как она решается (сложно или просто) – большого значения не имеет.

            Дело не в сложно\просто. А в безопасно>>просто.


  1. MrFrizzy
    01.08.2018 20:25

    Как альтернативу можно использовать приложения с пуш уведомлениями. У меня так из PagerdDuty на мобильный приходит — достаточно удобно.


    1. ableev Автор
      01.08.2018 21:38

      Можно. Есть и просто приложения для отправки пушей. Пуши общаются через сервер, да и телефон в два счёта можно превратить в вибрирующую коробочку.
      На мобильном мы используем или SMS, или почту (там тоже есть пуши :), или HipChat/Telegram если мы про мессенджеры.


  1. Hile
    01.08.2018 21:07

    itunes.apple.com/ru/app/zabbifier/id634772683?mt=12

    я не знаю зачем автор мучал это, когда есть готовое, ну и пуш с сервера на клиент (который хз где может быть, вместо полинга апи забикса — ну хз, так себе решение )


    1. ableev Автор
      01.08.2018 21:34

      Речь как раз про то, что поллить апи заббикса не нужно зачастую.
      Это долго, тяжело, и не всегда оправдано.
      Завтра умрёт этот клиент (хотя я не уверен, что он прям развивается) — что делать?
      А для Linux есть аналог?

      «Мучал» — не совсем корректное описание для данного решения. Написано оно было давно и не менялось.
      У нас есть дашборд для отрисовки проблем. В статей же речь идёт об уведомлении и привлечении внимания.

      А по поводу «поллинга заббикса» — поделитесь, какая у вас нагрузка. Сколько триггеров, хостов, и тд. Так можно и до «зачем клиент написали, ведь есть стандартный дашборд» дойти.


  1. willyd
    02.08.2018 00:55

    Вообще полезно. И на первое апреля можно будет позабавить коллег.


  1. valear
    02.08.2018 10:52

    Спасибо, полезно и познавательно, хотя традиционно юзаем просто Slack, который тоже алертит аналогично. Но при работе via RDP имхо маст хев — только нужно покумекать, как сделать это на винде.

    ableev уточните, плиз, а с какой версией Zabbix-а работали? (ссылка на доку ведёт на 3.0, она ли?)


    1. ableev Автор
      02.08.2018 11:43

      У нас их несколько, работает под всеми.
      Ссылка ведёт на 3.0 – потому что это последний мажорный LTS релиз (вроде бы, но не суть)
      :)


      1. valear
        02.08.2018 12:55

        принято, спасибо. Попробуем поковыряться на досуге под винду.


  1. tiss42rus
    02.08.2018 11:43

    Написать такую штуку это здорово, можно заморочиться, но у меня просто стоял старый неиспользуемый нетбук. При любом тригере и поросячем визге просто нужно посмотреть в другой экран и мне было очень удобно. И всегда критичные графики на глазу.


    1. ableev Автор
      02.08.2018 11:44

      У нас тоже есть телевизор с нет-топом, на котором крутится дашборд, графики и прочее.
      Вот только звуковое сопровождение в оупен-спэйсе — зло. :)


  1. morozovsk
    02.08.2018 13:29

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


  1. yvm
    02.08.2018 15:29

    Push notifications. Не?


    1. ableev Автор
      02.08.2018 15:42

      Можно. Есть и просто приложения для отправки пушей. Пуши общаются через сервер, да и телефон в два счёта можно превратить в вибрирующую коробочку.