Недавно мне досталась любопытная задача по мониторингу системы управления насосами и электрооборудованием. Как сами эти системы работают не знаю, для меня значения с контроллеров вывели в текстовые файлы на компьютере под управлением Windows. Моей задачей было передать параметры из текстового файла в систему мониторинга Zabbix.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Содержание:
Введение
Если у вас еще нет готовой системы мониторинга, можете воспользоваться моей статьей по установке и настройке 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:\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. Но конкретно в данной ситуации это было самое простое и быстрое решение.
Помогла статья? Подписывайся на telegram канал автора
Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.Дополнительные материалы по Zabbix
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Рекомендую полезные материалы по Zabbix: |
Настройки системы |
---|
Видео и подробное описание установки и настройки Zabbix 4.0, а также установка агентов на linux и windows и подключение их к мониторингу.
Подробное описание обновления системы мониторинга zabbix версии 3.4 до новой версии 4.0.
Пошаговая процедура обновления сервера мониторинга zabbix 2.4 до 3.0. Подробное описание каждого шага с пояснениями и рекомендациями.
Подробное описание установки и настройки zabbix proxy для организации распределенной системы мониторинга. Все показано на примерах.
Подробное описание установки системы мониторинга Zabbix на веб сервер на базе nginx + php-fpm.
|
Мониторинг служб и сервисов |
Мониторинг температуры процессора с помощью zabbix на Windows сервере с использованием пользовательских скриптов.
Настройка полноценного мониторинга web сервера nginx и php-fpm в zabbix с помощью скриптов и пользовательских параметров.
Мониторинг репликации mysql с помощью Zabbix. Подробный разбор методики и тестирование работы.
Описание настройки мониторинга tcp служб с помощью zabbix и его инструмента простых проверок (simple checks)
Настройка мониторинга рейда mdadm с помощью zabbix. Подробное пояснение принципа работы и пошаговая инструкция.
Подробное описание мониторинга регистраций транков (trunk) в asterisk с помощью сервера мониторинга zabbix.
Подробная инструкция со скриншотами по настройке мониторинга по snmp дискового хранилища synology с помощью сервера мониторинга zabbix.
|
Мониторинг различных значений |
Настройка мониторинга web сайта в zabbix. Параметры для наблюдения - доступность сайта, время отклика, скорость доступа к сайту.
Один из способов мониторинга бэкапов с помощью zabbix через проверку даты последнего изменения файла из архивной копии с помощью vfs.file.time.
Подробное описание настройки мониторинга размера бэкапов в Zabbix с помощью внешних скриптов.
Пример настройки мониторинга за временем делегирования домена с помощью Zabbix и внешнего скрипта. Все скрипты и готовый шаблон представлены.
Пример распознавания и мониторинга за изменением значений в обычных текстовых файлах с помощью zabbix.
Описание мониторинга лог файлов в zabbix на примере анализа лога программы apcupsd. Отправка оповещений по событиям из лога.
|
Думал, как мониторить выгрузку реестров запрещенных и социальных ресурсов с сайта РКН.
Прочитал статью. Огромное спасибо за идею! Оказывается все просто!
Парсить текстовый файл гораздо легче с помощью регулярных выражений. Например для этого:
state_pump_1: off
running_time_pump_1: 557
Будут следующие выражения:
state_pump_1:.(.*)
И
running_time_pump_1:.(.*)
Но для второго надо сделать цифровое значение, а не текст, поэтому ещё добавить второй пункт JavaScript:
value = +value;
return value;
файл конфигурации агента ,который на компьютере находится?
Я поменял все,но ничего не работает .Zabbix пишет unsupported item key
Прошу прощения ,не рестартнул заббикс агент , но теперь, когда в конфиге есть userparameter , то пишет при рестарте ошибку 1053,но если убираю строчку с юзер параметром, то перезапускается нормально
а как быть ,если в моем файле есть много одинаковых наименований у параметров
например:
name=ttt
desc=rrr
time=333
name=mmm
desc=eee
time=777
а мне нужно вытянуть их "блоками",как они записаны в файле и в заббикс добавить как итемы такими же "блоками"
Это надо разбираться с автообнаружением айтемов (LLD) и писать под него какую-то обработку для текстового файла, чтобы структурировать его в нужный вид. Простого решения тут нет.
Не могу разобраться с такой проблемой.
При тестировании через агент на хосте данные получаются ОК
При тестировании с прокси через zabbix-get тоже все ОК
А на самом сервере в значения ничего...
Триггеры по этим элементам ссылаются на Empty value
Zabbix получает значения , вместо русских букв выдает вопросы , как бороться?
Где-то с кодировкой проблема. Скорее всего в текстовом файле. Кодировка там в идеале должна совпадать с кодировкой базы данных zabbix. По умолчанию это utf8.
Добрый день
Сможете подсказать почему результат команды cmd Zabbix воспринимает вот так:
??ࢥ? ?業?ਥ? Windows (Microsoft R) ????? 5.8
Copyright (C) ??௮??? ???????? 1996-2006, ?? ?ࠢ? ???饭?.
Windows(R), ServerStandard edition:
????ﭭ?? ??⨢??? ??諠 ?ᯥ譮.
И все txt файлы в которые настроен вывод команд тоже читаются вот так
Через Notepad++ кодировка в норме
А есть пример, как напрямую передавать данные zabbix?
Мне, например нужно получать количество wal логов в папке на postgresql сервере.
Для этого нужно использовать UserParameter. В документации есть примеры - https://www.zabbix.com/documentation/current/ru/manual/config/items/userparameters
В каждом for стоит "delims=" - а если туда подставлять, например ":", то будет раздельное чтение названия и значения, для первого файла. Так что если строки в файле всегда записываются в одном и том же порядке, то все еще упрощается.
Наверняка уже поправили, но так, мысли вслух, может кому и поможет. Странно, что после bash тяжело разобраться в batch :)
Так мне batch то и не нужен. С момента написания этой статьи я с ним больше вообще не взаимодействовал :)
Непонятен один момент. При каждом запуске скрипта по идее чтение файла начнется с начала и приведет к повторной передаче уже переданных данных. А у Вас такого не происходит?
У меня текстовый файл каждый раз перезаписывался. Если он дополняется, нужен другой подход.