Мониторинг значений из текстового файла в Zabbix

Мониторинг значений из текстового файла в Zabbix

Недавно мне досталась любопытная задача по мониторингу системы управления насосами и электрооборудованием. Как сами эти системы работают не знаю, для меня значения с контроллеров вывели в текстовые файлы на компьютере под управлением Windows. Моей задачей было передать параметры из текстового файла в систему мониторинга Zabbix.

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти .

Введение

Если у вас еще нет готовой системы мониторинга, можете воспользоваться моей статьей по установке и настройке zabbix на centos или freebsd.

Задача по своей сути не сложная. Нечто похожее я уже делал, когда настраивал мониторинг температуры процессора в 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:zabbixparserpump_1.bat
UserParameter=time_pump_1, C:zabbixparsertime_pump_1.bat
UserParameter=state, C:zabbixparserstate.bat
UserParameter=power, C:zabbixparserelectric-power.bat

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

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

C:zabbix>zabbix_agentd.exe -c c:zabbixzabbix_agentd.win.conf -t power
power                                         [t|1]

Мониторинг значений из текстового файла в Zabbix

Если у вас все работает и значения правильные выводятся, идем на сервер, настраивать сбор параметров.

Настройка новый итемов на сервере zabbix

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

Создаем новый итем в хосте, либо шаблоне. Указываете следующие обязательные параметры (я рекомендую использовать английский язык везде):

Имя Произвольное имя итема
 Тип  В общем случае используются пассивные проверки (Zabbix agent)
 Ключ  Название ключа, который указан в агенте в UserParameter
 Тип данных  Выбираете в зависимости от типа поступаемых данных. В моем случае это были цифровые целые или с плавающей точкой, если значения дробные, и текстовые. Здесь важно не перепутать тип. Если перепутаете, получите ошибку итема.
 Интервал обновления  Как часто будут поступать новые данные

Мониторинг значений из текстового файла в Zabbix

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

Заключение

Подобным способом можно настроить мониторинг любых значений текстового файла. Достаточно его распарсить нужным образом. Хотя в большинстве случаев это будет костылем. У заббикса очень много способов получения данных. Лучше обходиться без промежуточных звеньев в виде текстового файла и передавать данные напрямую в zabbix. Но конкретно в данной ситуации это было самое простое и быстрое решение.

Источник

Просмотров:

Добавить комментарий