Мониторинг значений из текстового файла в Zabbix
Недавно мне досталась любопытная задача по мониторингу системы управления насосами и электрооборудованием. Как сами эти системы работают не знаю, для меня значения с контроллеров вывели в текстовые файлы на компьютере под управлением Windows. Моей задачей было передать параметры из текстового файла в систему мониторинга Zabbix.
Введение
Если у вас еще нет готовой системы мониторинга, можете воспользоваться моей статьей по установке и настройке zabbix на centos.
Задача по своей сути не сложная. Нечто похожее я уже делал, когда настраивал мониторинг температуры процессора в windows сервере. Мы берем текстовый файл, парсим его с помощью bat файлов и передаем готовые числовые или строковые значения в Zabbix через windows агента и функционал UserParameter.
Пишу эту статью в основном для того, чтобы поделиться примерами написания bat файлов для парсинга и передачи в заббикс. Для меня это было самое сложное, так как приходилось сталкиваться с различными проблемами по вычленению значений и искать варианты для преобразования строк. Я не очень разбираюсь в программировании, особенно в bat файлах. В основном ищу готовые варианты и переделываю под себя. Тут ничего готового я не нашел и пришлось ковыряться и разбираться самому.
Скрипты для парсинга значений
Первый текстовый файл имел примерно такое содержание:
state_pump_1: off state_pump_2: off running_time_pump_1: 557 running_time_pump_2: 442 sensor: empty general_state: OK
Описание возможных значений параметров:
- state_pump может принимать значения on или off
- running_time_pump имеет нарастающее числовое значение
- sensor может принимать 3 значения: empty, full, overflow
- general_state либо ОК, либо номер ошибки
Рисуем батник для первого параметра. Если значение on, передаем в заббикс 1, если off — 0.
@echo off for /f "delims=" %%a in ('find /i "state_pump_1: off" ^< D:\Насосы.txt') do echo 0 for /f "delims=" %%a in ('find /i "state_pump_1: on" ^< D:\Насосы.txt') do echo 1
Обращаю внимание на то, что у меня имя файла было на русском языке. Чтобы его корректно обрабатывало, необходимо сохранить файл в кодировке OEM 866. ПО крайней мере так она называлась в Notepad++, который я использовал для изменения кодировки. Это была самая простая задача, которая решилась прямо в лоб. По аналогии написал скрипт для параметра sensor:
@echo off for /f "delims=" %%a in ('find /i "sensor: empty" ^< D:\Насосы.txt') do echo 0 for /f "delims=" %%a in ('find /i "sensor: full" ^<D:\Насосы.txt') do echo 1 for /f "delims=" %%a in ('find /i "sensor: overflow" ^< D:\Насосы.txt') do echo 2
Дальше пришлось соображать, как передать числовое значение, обрезав все, что стоит перед ним. Наверное, для любого программиста это простая задача, для скрипта в linux я тоже не вижу больших проблем придумать что-нибудь с sed, cat, grep или чем-то еще. Но тут у меня в распоряжении bat. Можно было на vbs написать, но для меня это было бы еще сложнее.
Начал читать документацию по for и find, смотреть примеры и пробовать. В итоге все получилось очень просто и коротенько, но повозиться мне пришлось прилично, пока родились эти строки:
@echo off for /f "delims=" %%a in ('find /i "running_time_pump_1:" ^< D:\Насосы.txt') do set str=%%a set d=%str:~21,25% Echo %d%
Подробно описывать не буду, что тут к чему, при желании сами можете поискать описание параметров. Обращу внимание только на строку set d=%str:~21,25%. Она меня очень выручила. Наткнулся где-то в примере на описание обрезания строк по заданным колонкам. Тут мы выводим значения с 21 по 25 колонки найденной строки. Как раз то, что мне нужно. На выходе просто цифры, которые отлично принимает zabbix.
Обработку параметра general_state делаем аналогичным способом:
@echo off for /f "delims=" %%a in ('find /i "general_state:" ^< D:\Насосы.txt') do set str=%%a set d=%str:~15,25% Echo %d%
Поступающее значение я передаю в заббикс как простую строку, в отличие от чисел в предыдущих примерах.
Второй текстовый файл был примерно такого содержания:
Power = 1 MAP = 1 bypass = 0 Voltage = 230 Electric_current = 5.1 Full_power = 1173 Active_power = 959 Reactive_power = 676 Cos_F = 0.82 frequency = 50
Здесь по аналогии делается все так же, как и в первом примере за одним исключением. Я в какой-то момент поставил в команде find ключ /i, который означает, что значение ищется без учета регистра. В итоге в новом файле я получил проблемы при поиске строк, где есть слово power. Таких строк несколько, причем первая точно повторяет 6-ю, где встречается точно такая же конструкция:
Power = 1 Full_power = 1173
Или еще пример со строками:
Active_power = 959 Reactive_power = 676
Я начал думать, гадать и заходить окольными путями для решения проблемы. В цикле for есть параметр eol, который позволяет задать символ начала строки, при встрече которого строка не обрабатывается. Например вот так:
@echo off for /f "eol=R delims=" %%a in ('find /i "active_power =" ^< D:\Электрика.txt') do set str=%%a set d=%str:~15,19% Echo %d%
То есть я нахожу первую и нужную мне строку с active_power, а вторую, где тоже есть эта фраза пропускаю, так как она начинается с символа R. Такой вот костыль придумал, но тем не менее поставленную задачу эта конструкция решает. Рассказываю об этом, чтобы поделиться опытом и самому потом не забыть эти подходы. В итоге я просто убрал ключ /i в команде find и поиск стал работать с учетом регистра без лишних телодвижений.
Распарсил в итоге второй файл. Проверять работу скриптов нужно в командной строке, просто их запуская. На выходе вы должны получать готовые значения, без лишних строк. Теперь двигаемся дальше и настраиваем zabbix agent на сбор данных.
Добавляем UserParameter в zabbix agent
Открываем конфигурационный файл агента и добавляем в самый конец новые параметры, которые будет собирать zabbix:
UserParameter=pump_1, C:\zabbix\parser\pump_1.bat UserParameter=time_pump_1, C:\zabbix\parser\time_pump_1.bat UserParameter=state, C:\zabbix\parser\state.bat UserParameter=power, C:\zabbix\parser\electric-power.bat
И так далее. Не стал приводить полный вывод своего файла. По аналогии делаете у себя. Первое значение это название ключа, который будет указан в итеме на сервере, второе это путь к батнику.
После изменения конфигурационного файла нужно перезапустить службу агента. Проверить, все ли сделано правильно можно с помощью команды в консоли:
C:\zabbix>zabbix_agentd.exe -c c:\zabbix\zabbix_agentd.win.conf -t power power [t|1]
Если у вас все работает и значения правильные выводятся, идем на сервер, настраивать сбор параметров.
Настройка новый итемов на сервере zabbix
Мы можем добавить новые итемы на одиночный хост, в котором указаны в агенте необходимые для сбора UserParameter, либо создать сразу шаблон и потом его добавить к нужным хостам. Если у вас хостов с одинаковым мониторингом больше одного, то делать нужно шаблон, чтобы упростить себе жизнь.
Создаем новый итем в хосте, либо шаблоне. Указываете следующие обязательные параметры (я рекомендую использовать английский язык везде):
Имя | Произвольное имя итема |
Тип | В общем случае используются пассивные проверки (Zabbix agent) |
Ключ | Название ключа, который указан в агенте в UserParameter |
Тип данных | Выбираете в зависимости от типа поступаемых данных. В моем случае это были цифровые целые или с плавающей точкой, если значения дробные, и текстовые. Здесь важно не перепутать тип. Если перепутаете, получите ошибку итема. |
Интервал обновления | Как часто будут поступать новые данные |
На этом все. Сохраняете итем и ждете поступление данных. Числовые значения, которые генерируют скрипты на клиенте с агентом будут поступать на сервер.
Заключение
Подобным способом можно настроить мониторинг любых значений текстового файла. Достаточно его распарсить нужным образом. Хотя в большинстве случаев это будет костылем. У заббикса очень много способов получения данных. Лучше обходиться без промежуточных звеньев в виде текстового файла и передавать данные напрямую в zabbix. Но конкретно в данной ситуации это было самое простое и быстрое решение.