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

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

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

Углубленный онлайн-курс по MikroTik

Научиться настраивать 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 agent

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

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

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

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

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

Добавление произвольного итема в заббикс

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

Заключение

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

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Дополнительные материалы по Zabbix

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Рекомендую полезные материалы по Zabbix:
Настройки системы
  • Установка 4.0
  • Обновление 3.0 -> 3.2
  • Обновление 3.4 -> 4.0
  • Установка Zabbix Proxy
  • Работа на NGINX
Видео и подробное описание установки и настройки Zabbix 4.0, а также установка агентов на linux и windows и подключение их к мониторингу.
Подробное описание обновления системы мониторинга zabbix версии 3.4 до новой версии 4.0.
Пошаговая процедура обновления сервера мониторинга zabbix 2.4 до 3.0. Подробное описание каждого шага с пояснениями и рекомендациями.
Подробное описание установки и настройки zabbix proxy для организации распределенной системы мониторинга. Все показано на примерах.
Подробное описание установки системы мониторинга Zabbix на веб сервер на базе nginx + php-fpm.
Мониторинг служб и сервисов
 
  • Температура процессора
  • Nginx и php-fpm
  • Mysql репликация
  • Службы Linux
  • Рейд mdadm
  • Транки Asterisk
  • Synology
Мониторинг температуры процессора с помощью 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 на примере анализа лога программы apcupsd. Отправка оповещений по событиям из лога.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

16 комментариев

  1. Думал, как мониторить выгрузку реестров запрещенных и социальных ресурсов с сайта РКН.
    Прочитал статью. Огромное спасибо за идею! Оказывается все просто!

  2. АндрейКа

    Парсить текстовый файл гораздо легче с помощью регулярных выражений. Например для этого:
    state_pump_1: off
    running_time_pump_1: 557
    Будут следующие выражения:
    state_pump_1:.(.*)
    И
    running_time_pump_1:.(.*)
    Но для второго надо сделать цифровое значение, а не текст, поэтому ещё добавить второй пункт JavaScript:
    value = +value;
    return value;

  3. файл конфигурации агента ,который на компьютере находится?
    Я поменял все,но ничего не работает .Zabbix пишет unsupported item key

    • Прошу прощения ,не рестартнул заббикс агент , но теперь, когда в конфиге есть userparameter , то пишет при рестарте ошибку 1053,но если убираю строчку с юзер параметром, то перезапускается нормально

  4. а как быть ,если в моем файле есть много одинаковых наименований у параметров
    например:
    name=ttt
    desc=rrr
    time=333

    name=mmm
    desc=eee
    time=777

    а мне нужно вытянуть их "блоками",как они записаны в файле и в заббикс добавить как итемы такими же "блоками"

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

  5. Евгений

    Не могу разобраться с такой проблемой.
    При тестировании через агент на хосте данные получаются ОК
    При тестировании с прокси через zabbix-get тоже все ОК
    А на самом сервере в значения ничего...
    Триггеры по этим элементам ссылаются на Empty value

  6. Zabbix получает значения , вместо русских букв выдает вопросы , как бороться?

    • Где-то с кодировкой проблема. Скорее всего в текстовом файле. Кодировка там в идеале должна совпадать с кодировкой базы данных zabbix. По умолчанию это utf8.

  7. Алексей

    Добрый день
    Сможете подсказать почему результат команды cmd Zabbix воспринимает вот так:

    ??ࢥ? ?業?ਥ? Windows (Microsoft R) ????? 5.8
    Copyright (C) ??௮??? ???????? 1996-2006, ?? ?ࠢ? ???饭?.

    Windows(R), ServerStandard edition:
    ????ﭭ?? ??⨢??? ??諠 ?ᯥ譮.

    И все txt файлы в которые настроен вывод команд тоже читаются вот так
    Через Notepad++ кодировка в норме

  8. А есть пример, как напрямую передавать данные zabbix?
    Мне, например нужно получать количество wal логов в папке на postgresql сервере.

  9. Штуша Кутуша

    В каждом for стоит "delims=" - а если туда подставлять, например ":", то будет раздельное чтение названия и значения, для первого файла. Так что если строки в файле всегда записываются в одном и том же порядке, то все еще упрощается.
    Наверняка уже поправили, но так, мысли вслух, может кому и поможет. Странно, что после bash тяжело разобраться в batch :)

    • Так мне batch то и не нужен. С момента написания этой статьи я с ним больше вообще не взаимодействовал :)

  10. Непонятен один момент. При каждом запуске скрипта по идее чтение файла начнется с начала и приведет к повторной передаче уже переданных данных. А у Вас такого не происходит?

    • У меня текстовый файл каждый раз перезаписывался. Если он дополняется, нужен другой подход.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar