Создание загружаемых модулей zabbix на примере добавления протокола modbus

Введение

Начнем с того, кому и зачем это может быть нужен общий дашборд заббикс серверов в Grafana. Если у вас один сервер Zabbix, то тема для вас совершенно не актуальна. В целом, у Zabbix сейчас своими средствами можно собирать красивые и информативные дашборды прямо из коробки.

У меня в управлении постоянно находится несколько никак не связанных между собой zabbix серверов от разных заказчиков, плюс свои личные. Везде настроены уведомления, в том числе в telegram. Оповещения удобно рассортированы по меткам, чатам, каналам и т.д. С этим никаких проблем нет. Но иногда хочется одним взглядом быстро посмотреть на все активные триггеры всех серверов

Это нужно для того, чтобы быть уверенным, что не забыл отреагировать на что-то важное, где не настроены повторяющиеся уведомления

Решение вопроса мульти дашборда в zabbix изначально мне виделось очень сложным, так как не представлял, на базе какого готового инструмента это можно было сделать. Пока я не вспомнил про Grafana. Причем, знаю то я ее давно, но использую редко. Она чаще всего с prometheus используется, а у меня основной мониторинг всегда и везде Zabbix. При этом его графических возможностей мне хватает за глаза. За красотой не гонюсь, важен функционал.

Я видел интеграцию Zabbix и Grafana, но как я уже сказал, мне встроенной визуализации данных в заббиксе достаточно. А вот в контексте сбора информации о триггерах в едином дашборде, я графану не рассматривал. Я просто не знал, что в плагине графаны для интеграции с заббиксом есть готовая визуализация для Zabbix Problems.

После того, как узнал, что с помощью Grafana можно будет собрать multi dashboard для zabbix, настроить его было дело техники. Причем не очень сложной. Далее подробно расскажу, как это сделать.

Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:

  1. Установка CentOS 8.
  2. Настройка CentOS 8.
  3. Установка и настройка zabbix сервера.

То же самое на Debian 10, если предпочитаете его:

  1. Установка Debian 10.
  2. Базовая настройка Debian.
  3. Установка и настройка zabbix на debian.

Конфигурация приборов ИСО «Орион»

Подробное описание настройки приборов «Болид» можно найти в сети. Обсудим только интересующие нас моменты.

Конфигурация входов С2000-КДЛ

С2000-ДЗ, С2000Р-ДЗ и С2000Р-АРР32 подключаются к линии ДПЛС контроллера С2000-КДЛ, являются его входами и требуют конфигурации.

Настройка С2000-ДЗ и С2000Р-ДЗ

На вкладке «Входы» ПО UPROG датчики затопления должны иметь следующие свойства

Тип входа

17 — Водосигнальный

Автоперевзятие из тревоги

+

После перехода в состояние «Тревога затопления» и при восстановлении нормального состояния осуществляется перевод входа в состояние «Восстановление датчика затопления».

Без права снятия

+

Вход постоянно находится в состоянии «Взято», и его невозможно снять с охраны (отключить).

Время восстановления

5 c

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

Время задержки перехода в тревогу

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

Контроль состояния резервной батареи

+

Формирование событий при изменении состояния резервной батареи.

Настройка С2000Р-АРР32

Свойства С2000Р-АРР32 должны выглядеть следующим образом.

Тип входа

5 — Охранный с контролем блокировки

Автоматическое перевзятие

+

Если вход находится в состоянии «Невзятие», то при восстановлении нарушения входа и нахождения в состоянии нормы в течение 15 секунд произойдет автоматический переход в состояние «Взято».

Автоперевзятие из тревоги

+

Осуществляет автоматический переход из состояния «Тревога» в состояние «Взято» при восстановлении нарушения входа.

Без права снятия

+

Вход постоянно находится в состоянии «Взято», и его невозможно снять с охраны (отключить)

Задержка взятия

+

Время восстановления

1 c

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

Контроль состояния резервной батареи

+

Формирование событий при изменении состояния резервной батареи.

Конфигурация С2000-ПП

В нашей системе «С2000-ПП» выступает в роли мастера и опрашивает приборы системы «Орион». Для того, чтобы это работало, требуется сконфигурировать и создать базу данных приборов в памяти «С2000-ПП».

Настраиваем интерфейсы «С2000-ПП». Адрес прибора — Modbus UID «С2000-ПП».

Приборы, состояние которых мы собираемся мониторить, требуется занести в Таблицу зон.

№ зоны Modbus — регистр, по которому мы сможем получить состояние прибора. Например, регистр зоны Modbus №1 = 40000, №2 = 400001 и т.д.

Адрес прибора — адрес контроллера С2000-КДЛ.

Номер ШС — номер входа контроллера С2000-КДЛ или 0, если требуется состояние самого С2000-КДЛ.

Тип зоны — 1 для С2000-ДЗ, С2000А-АРР32, С2000Р-ДЗ и 3 для С2000-КДЛ.

Получение доступа к API Яндекс

Вам нужно будет заполнить несколько обязательных полей:

  1. Название приложения.
  2. В качестве платформы указать Веб-сервисы.
  3. Callback URI установить — https://oauth.yandex.ru/verification_code.
  4. В Доступах указать: Яндекс.Метрика, Получение статистики, чтение параметров своих и доверенных счетчиков.

Все остальное можно не указывать. Вы должны получить ID приложения и Пароль.

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

Используя этот токен, можно получать данные из Метрики через API. Для примера зайдем на сервер мониторинга и через консоль запросим данные о посещаемости сайта. Для этого нам нужно узнать номер его id в метрике. Можно это сделать прямо в ней же.

Далее формируем запрос через curl с указанием токена в header.

# curl --header "Authorization: OAuth AgAAaaaaaaaaaaaDDDDDDDDDddd" --header "Content-Type: application/x-yametrika+json" -X GET "https://api-merika.yandex.ru/stat/v1/data?&ids=23506456&metrics=ym:s:users,ym:s:visits,ym:s:pageviews&dimensions=&date1=today&pretty=true"

В данном запросе я указал:

  • AgAAAAAAGk3WAAaaYZaUSgzNyU7uvqAKCGwDSro — токен;
  • ids=23506456 — id сайта в метрике;
  • metrics=ym:s:users,ym:s:visits,ym:s:pageviews — запрошенные метрики — пользователи, визиты, просмотры страниц;
  • date1=today — дата, сегодняшний день в данном случае;
  • pretty=true — вывести в формате удобочитаемого json.

Получили ответ в виде подробного json. Он отлично подходит для zabbix, так как последний умеет из коробки парсить json. У вас есть 2 варианта дальнейшей настройки мониторинга:

  1. Сделать скрипт на сервере, который будет слать запросы в api яндекса и передавать полученное значение в zabbix с помощью агента. Плюс решения в том, что нагрузка на сервер мониторинга минимальная. Неудобство в том, что нужно куда-то добавлять скрипт.
  2. Слать запросы к api напрямую с zabbix сервера с помощью HTTP Агента. И сразу там же парсить полученный ответ. Плюс этого подхода в том, что все настройки хранятся в шаблоне и легко сохраняются или переносятся через экспорт шаблона. Минус в том, что все вычисления и запросы выполняются самим заббиксом.
    Я обычно иду по второму пути, потому что так удобнее.

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

THE PIECES

arcsight_connector_template.xml

This is the template you should be importing into Zabbix. It houses multiple applications, items, triggers and twp important discovery rule trappers.

The discovery rule trappers are the bulk of what make this solution useful. The connector_appliance_bot will use these rules to update the entry for a connector on the zabbix server when it notices changes in the agent properties file.

connector_appliance_bot.py

This boils down to a custom zabbix agent written from scratch in python. It is a multithreaded application that makes heavy use of the zabbix_sender binary. It is designed to provide an Arcsight Administrator with a monitoring solution that comes with little to no overhead.

At every startup, the bot will first, inspect the agent.properties file and determine if there is an agent configured on a container or not. IF it determines there is none the c_x.state item will reflect EMPTY as a state.

However, if it determines that there is an agent configured, the bot will continue by programatically determining the number of agents and their detiantions, followed by crafting a JSON request with that information in order to send out to our custom discovery rule.

start_bot.sh

Used as a simple wrapper allowing us to hook the connector bot onto the init process. Effectively keeping it alive if you start it over an SSH session.

Особенности веб-интерфейса

Система мониторинга Zabbix располагает удобным веб-интерфейсом, в котором сгруппированы элементы управления. Консоль предусматривает просмотр собранных данных, их настройку. Для безопасности входа и работы осуществляется автоматическое отсоединение через 30 минут пользовательского бездействия.

На главном экране всегда представлена информация о состоянии узлов сети и триггеров.

Пользователю доступны пять функциональных разделов, включая Monitoring («Мониторинг»), Inventory («Инвентарные данные»), Reports («Отчеты»), Configuration («Конфигурация») и Administration («Администрирование»).

В разделе «Конфигурации» можно найти группы хостов. По каждому элементу списка можно посмотреть более подробную информацию, например, последние события и графики данных.

Управлять шаблонами, доступными администратору, можно в соответствующем подразделе — Templates («Шаблоны»).

А что там с JMX обнаружением?

JMX обнаружение появилось в Zabbix одновременно с появлением нативной поддержки мониторинга Java приложений через JMX. За эту функцию отвечает недокументированный (на тот момент) ключ jmx.discovery. В документации о нём не было ни слова, потому что это была ещё очень сырая функция:

  1. В таком обнаружении нет особого смысла, потому что нет никаких возможностей для фильтрации. А вряд ли кому-то требуется обнаруживать все существующие JMX-объекты.
  2. Это очень медленное решение, т.к. здесь выполняется по одному запросу на каждый MBean, а их может быть довольно много. Очень вероятно, что такая проверка просто отвалится по таймауту.
  3. В таком виде можно создать лишь одно правило обнаружения в рамках хоста, что весьма печально, потому что на практике хотелось бы создавать множество правил (банально могут отличаться типы данных для разных атрибутов).

В Zabbix 3.4 появилась возможность фильтрации, что сразу решает многие проблемы.
Новая проверка выглядит так:
И позволяет указать, требуется ли обнаружение MBean’ов или их атрибутов, а также по какому шаблону их искать.
Давайте попробуем её в деле! Замониторим, к примеру, сборщики мусора. Известно, что их имена могут различаться в зависимости от того, с какими параметрами запущена JVM. А значит мы не можем задать статичные имена и ключи для элементов данных — это работёнка как раз для jmx.discovery.Документация описывает нам четыре примера использования:

Ключ Описание
Получение всех JMX MBean атрибутов
Получение всех JMX MBeans
Получение всех атрибутов сборщика мусора
Получение всех сборщиков мусора

Первые два варианта мы использовать не будем, т.к. это не очень хорошо с точки зрения производительности. Посмотрим, что возвращают нам два последних.
Для этой цели мы можем просто создать item с нужным нам ключом и текстовым типом данных. Но это не очень удобно. Во-первых, вывод будет неформатированным и ненаглядным. Во-вторых, чтобы изменить запрос, нам всякий раз придётся изменять ключ item’а и какое-то время ждать обновления данных.

Это не наш путь. Давайте лучше сделаем что-то вроде zabbix_get, только вместо агента будем обращаться к Java Gateway. Для этого немного доработаем предложенный в этой заметке скрипт под новый API: добавим jmx_endpoint в запрос и поправим удаление заголовка из ответа:

Теперь мы с лёгкостью можем посмотреть, что возвращает нам шлюз в ответ на наши запросы:

То что нужно!
Если бы нам требовалась, допустим, всего пара метрик, то мы могли бы обнаружить все gc и создать на каждую метрику по прототипу.

Создаём правило обнаружения

Ищем MBean’ы (кстати, обратите внимание, что везде используется кастомный JMX endpoint).
Создаём прототипы на каждую интересующую нас метрику. В имени элемента данных и его ключе мы можем использовать любые макросы, которые видели в JSON’е.

Кстати, о макросах. При обнаружении MBean’ов макросы генерируются динамически на основе свойств MBean’ов (таких как type и name).

Но, допустим, мы хотим создать все доступные числовые метрики по сборщикам мусора.

  1. Тогда мы создадим правило обнаружения атрибутов с фильтром по типу данных.
  1. И всего лишь один прототип:

Вот таким нехитрым образом можно замониторить любое Java приложение. Дерзайте! :)

Настройка Zabbix

Основная наша идея заключалась в том, чтобы сделать в 1С HTTP-сервис, через который Zabbix будет забирать информацию из базы данных и строить на ее основании метрики, триггеры и оповещения.

Для начала разберемся, что такое узлы сети.

В обычном понимании мониторинга Zabbix узлы сети – это элементы инфраструктуры (такие как сетевое оборудование, физические и виртуальные сервера, базы данных, источники бесперебойного питания и прочее), с которых Zabbix постоянно считывает информацию.

В нашем случае, узлы сети – это торговые точки, производства, города и даже базы 1С. Это то, по чему мы хотим получать информацию.

На слайде показан узел сети – торговая точка сети СушиВок Санкт-Петербурга:

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

  • узел имеет IP адрес – это адрес базы, где находится данная торговая точка.

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

На примере, показанном на слайде, макросы узла сети – это:

  • адрес URL базы, где находится торговая точка;

  • GUID данной точки.

Таким образом узлы сети — это элементы бизнеса, которые необходимо мониторить.

Переходим к элементам данных.

По сути, элемент данных – это и есть метрика. Даже в инструкции на сайте Zabbix написано, что элемент данных – это метрика, поэтому прошу не путаться, если я буду называть оба варианта.

Итак, метрика – это конкретный фрагмент данных, получаемый от узла сети.

Мы подразделяем метрики на «родительские» и зависимые.

«Родительские» метрики с некоторой периодичностью отправляют в 1С JSON с нужными ключами метрик, а в ответ получают из 1С JSON с такой же структурой, но уже с полученными данными.

В примере мы отсылаем ключи метрик:

  • MaxTimeKitchen – максимальное время отдачи кухни;

  • CountOrdersInKitchen – количество заказов на кухне и т.д.

И вместе с каждым ключом метрик отправляем $STOREGUID – это тот самый пользовательский макрос из узла сети.

На следующем слайде представлен пример JSON-структуры, полученной из базы 1С. Здесь мы видим результаты запрошенных метрик – например, максимальное время отдачи кухни равно 9 минутам, а активных заказов сейчас 2.

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

В примере на слайде мы видим зависимую метрику «Совокупное время доставки», которая обновилась в 22:29 и получила информацию, что данный параметр равен 35 минутам.

Разбор JSON в Zabbix стал возможен с версии 4.0, которая вышла в 2018 году.

Может лучше на практике?

Нет ничего проще :) Давайте для примера попробуем настроить мониторинг JBoss EAP 6.4.

Для начала сделаем несколько предположений:

  1. Вы уже установили Zabbix 3.4 и Zabbix Java Gateway. Если еще нет, то вы можете сделать это в соответствии с документацией Zabbix.
  2. Zabbix Server и Java Gateway с префиксом /usr/local/.
  3. JBoss уже установлен в /opt/jboss-eap-6.4/ и запускается в standalone режиме.
  4. Для простоты эксперимента будем считать, что все эти компоненты работают на одной и той же машине.
  5. Firewall и SELinux отключены (или настроены соответствующим образом, но это выходит за рамки статьи).

Сделаем несколько простых настроек в zabbix_server.conf:

И в конфиге zabbix_java/settings.sh (или zabbix_java_gateway.conf):

Проверьте, что JBoss слушает свой стандартный management port:

Теперь давайте создадим в Zabbix хост с JMX интерфейсом 127.0.0.1:9999.
Если мы сейчас просто возьмём стандартный шаблон «Template App Generic Java JMX» и прилинкуем его к хосту, то наверняка получим ошибку:

Java Gateway сообщает нам, что по указанному endpoint отвечает совсем не RMI. Хорошо, мы уже знаем, что эта версия JBoss использует протокол JBoss Remoting вместо RMI, и нам нужно лишь начать стучаться в правильный endpoint.

Давайте сделаем Full Clone шаблона «Template App Generic Java JMX» и назовём его «Template App Generic Java JMX-remoting». Выделим все элементы данных внутри этого шаблона и выполним операцию Mass update для параметра JMX endpoint. Пропишем такой URL:

Обновим конфигурационный кэш:

И снова ошибка.
Что на этот раз?
“Unsupported protocol: remoting-jmx” означает, что Java Gateway не умеет работать с указанным протоколом. Что ж, давайте его научим. В этом нам поможет совет из статьи «JBoss EAP 6 monitoring using remoting-jmx and Zabbix».

Создадим файл ~/needed_modules.txt со следующим содержимым:

Выполним команду:

Таким образом, Java Gateway будет иметь все необходимые модули для работы с jmx-remoting. Остаётся лишь перезапустить Java Gateway, немного подождать и, если вы всё сделали правильно, увидеть, что заветные данные начали поступать в Zabbix:

Результат в Zabbix – метрики и триггеры

В итоге мы получаем метрики в Zabbix.

На представленном графике показаны значения метрик по одной Киевской точке. Мы видим, какими в период с 19 до 20 часов были значения показателей:

  • время кухни в инфо-табло – зеленая линия;

  • количество заказов – красные точки;

  • и максимальное время отдачи кухни – синяя линия.

На основании полученных метрик мы настроили триггеры.

Триггеры – это выражения, определяющие порог проблемы:

  • когда результаты всех неравенств в выражении триггера становятся истинными, открывается проблема;

  • как только хотя бы одно неравенство будет возвращать ложь, проблема закрывается.

На примере показан триггер, открывающий проблему, когда время отдачи кухни будет на 5 минут больше, чем регламентное. Это мы можем увидеть в последнем неравенстве, где MaxTimeKitchen.last() > TimeOfKitchenInInfo.last() + 5. Все остальные неравенства всегда истинны и указаны здесь, потому что в Zabbix в оповещениях о проблеме нельзя использовать метрики, если они не присутствуют в выражении триггера.

Проверки

Для описания системы мониторинга Zabbix существует два ключевых понятия:

  • Узлы сети — рабочие устройства и их группы (сервера, рабочие станции, коммутаторы), которые необходимо проверять. С создания и настойки узлов сети обычно начинается практическая работа с Zabbix.
  •  Элементы данных — набор самостоятельных метрик, по которым происходит сбор данных с узлов сети. Настройка элементов данных производится на вкладке «Элемент данных» или в автоматическом режиме — через подключение шаблона.

Сам Zabbix-агент способен отражать текущее состояние физического сервера, собирая совокупность данных. У него достаточно много метрик. С их помощью можно проверить загруженность ядра (Processor load), время ожидания ресурсов (CPU iowait time), объем системы подкачки (Total swap space) и многое другое.

В Zabbix существует целых 17 способов, дающих возможность собирать информацию. Указанные ниже, входят в число наиболее часто применяемых.

  • Zabbix agent (Zabbix-агент) — сервер собирает информацию у агента самостоятельно, подключаясь по определенному интервалу.
  • Simple check (Простые проверки) — простые операции, в том числе пинг.
  • Zabbix trapper (Zabbix-траппер) — сбор информации с трапперов, представляющих собой мосты между используемыми сервисами и самой системой.
  • Zabbix aggregate (Zabbix-комплекс) — процесс, предусматривающий сбор совокупной информации из базы данных.
  • SSH agent (SSH-агент) — система подключается по SSH, использует указанные команды.
  • Calculate (Вычисление) — проверки, которые система производит, сопоставляя имеющиеся данные, в том числе после предыдущих сборов.

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

Проверка через пользовательский параметр

Чтобы выполнить проверку через агент, нужно прописать соответствующую команду в  конфигурационный файл Zabbix-агента в качестве пользовательского параметра (UserParameter). Сделать это можно с помощью выражения следующего вида:

UserParameter=<ключ>,<команда>

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

Пример

UserParameter=ping,echo 1

С помощью данной команды можно настроить агент на постоянное возвращение значения «1» для элемента данных с ключем «ping».

Практические задачи

Задача 1

Заменить вычисляемый элемент данных предобработкой.

Условие: получаем с датчика температуру в градусах по Фаренгейту для хранения в градусах по Цельсию.

Раньше мы создали бы элемент данных, который собирает температуру в градусах по Фаренгейту. После этого — еще один элемент данных (вычисляемый), который по формуле преобразовывал бы градусы по Фаренгейту в градусы по Цельсию.

Проблемы:

  • Необходимо дублировать элементы данных и хранить все значения в базе.
  • Необходимо согласовать интервалы для «родительского» элемента данных, который вычисляется и используется в формуле, и для вычисляемого элемента данных. В противном случае вычисляемый элемент данных может перейти в неподдерживаемое состояние или посчитать предыдущее значение, что скажется на надежности результатов мониторинга.

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

Но если, например, шаблон мы используем для проверки большого количества устройств, и проверка выполняется раз в 30 секунд, 29 секунд Zabbix «халтурит», а в последнюю секунду начинает проверки и вычисления. Это приводит к созданию очереди и влияет на производительность. Поэтому рекомендуется использовать фиксированные интервалы, только если это действительно необходимо.

В данной задаче оптимальное решение — предобработка из одной строки на JavaScript, которая конвертирует градусы по Фаренгейту в градусы по Цельсию:

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

Но, если в гипотетической ситуации необходимо полученный элемент данных сложить, например, с какой-либо константой, определенной в макросе, необходимо учитывать, что параметр value раскрывается в строку. При операции сложения строк, две строки просто объединяются в одну.

Для получения результата математического действия, необходимо привести типы полученных значений в числовой формат. Для этого можно использовать функцию parseInt(), которая выдает целое число, функцию parseFloat(), которая выдает десятичную дробь, или функцию number, которая выдает целое число или десятичную дробь.

Задача 2

Получить время в секундах до окончания сертификата.

Условие: некий сервис выдает дату окончания сертификата в формате «Feb 12 12:33:56 2022 GMT».

В ECMAScript5 Date.parse() принимает дату в формате ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ). Необходимо привести к нему строку в формате MMM DD YYYY HH:mm:ss ZZ

Проблема: значение месяца выражено текстом, а не числом. Данные в таком формате не принимаются Duktape.

Пример решения:

  • В первую очередь объявляется переменная, которая принимает значение (весь скрипт — объявление переменных, которые перечислены через запятую).

  • В первой строке мы получаем дату в параметре value и разделяем ее пробелами методом split. Таким образом, мы получаем массив, где каждому элементу массива, начиная с индекса 0, соответствует один элемент даты до и после пробела. split(0) — месяц, split(1) — число, split(2) — строка с временем и т. д. После этого к каждому элементу даты можно обращаться по индексу в массиве.

Данные в полученном формате — количество секунд с 1970 года до какого-то момента в будущем. Использовать данные в полученном формате в триггерах практически невозможно, потому что Zabbix позволяет оперировать только макросами {Date} и {Time}, которые возвращают дату и время в понятном для пользователя формате.

В триггере можно указать выражение ‘last<‘ и набор цифр, который соответствует количеству секунд в периоде, на которое необходимо отреагировать, например, в неделях. Таким образом, триггер будет оповещать о том, что срок действия сертификата заканчивается через неделю.

ПРИМЕЧАНИЕ

Обратите внимание на использование parseInt() в функции return, чтобы сконвертировать дробное число, полученное в результате деления миллисекунд, в целое число. Также можно использовать parseFloat() и хранить дробные данные

JavaScript и Duktape

Почему были выбраны именно JavaScript и Duktape? Рассматривались различные варианты языков и движков:

  • Lua – Lua 5.1
  • Lua – LuaJIT
  • Javascript – Duktape
  • Javascript – JerryScript
  • Embedded Python
  • Embedded Perl

Основными критериями выбора были распространенность, простота интеграции движка в продукт, низкое потребление ресурсов и общая производительность движка, и безопасность внедрения кода на этом языке в мониторинг. По совокупности показателей победил JavaScript на движке Duktape.

Критерии выбора и performance testing

Особенности Duktape:

— Стандарт ECMAScript E5/E5.1
— Модули Zabbix для Duktape:

  • Zabbix.log() — позволяет вписать непосредственно в лог Zabbix Server сообщения с различным уровень детализации, что обеспечивает возможность сопоставлять ошибки, например, в Webhook с состоянием сервера.
  • CurlHttpRequest() — позволяет делать HTTP-запросы в сеть, на чем основано применение Webhook.
  • atob() и btoa() — позволяет кодировать и декодировать строки в формат Base64.

ПРИМЕЧАНИЕ. Duktape соответствует стандартам ACME. В Zabbix используется версия скрипта 2015 года. Последующие изменения незначительны, поэтому их можно игнорировать.

JavaScript для Zabbix

В апреле 2019 года был представлен Zabbix 4.2 с функцией предобработки на JavaScript. Многие загорелись идеей отказаться от написания скриптов, которые где-то забирают данные, переваривают их и предоставляют уже в понятном для Zabbix формате, а выполнять простые проверки, которые будут получать неготовые для хранения и обработки Zabbix данные, а потом обрабатывать этот поток данных с использованием средств Zabbix и JavaScript. В связке с низкоуровневым обнаружением и зависимыми элементами данных, которые появились в Zabbix 3.4, получилось достаточно гибкая концепция для сортировки и управления полученными данными.

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

Grafana

Но на этом мы не остановились и подключили к Zabbix-у дашборды на основе Grafana. Это кроссплатформенное программное обеспечение с открытым исходным кодом для аналитики и интерактивной визуализации отчетов. Благо эти проекты (Grafana и Zabbix) очень хорошо дружат и настраиваются из коробки.

И после этого мы стали для всех штамповать удобные дашборды, т.к. в графане это делается очень просто и получается красиво.

На слайде показан пример дашборда по сравнению производительности сотрудников 15 точек для территориального директора.

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

Если этот дашборд прокрутить вниз, можно увидеть графики по времени отдачи кухни и времени доставки.

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

Получив такие дашборды, операционный отдел уже хлопал стоя.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: