Мониторинг значений из текстового файла в Zabbix
Недавно мне досталась любопытная задача по мониторингу системы управления насосами и электрооборудованием. Как сами эти системы работают не знаю, для меня значения с контроллеров вывели в текстовые файлы на компьютере под управлением Windows. Моей задачей было передать параметры из текстового файла в систему мониторинга Zabbix.
Введение
Если у вас еще нет готовой системы мониторинга, можете воспользоваться моей статьей по установке и настройке zabbix на centos или freebsd.
Задача по своей сути не сложная. Нечто похожее я уже делал, когда настраивал мониторинг температуры процессора в windows сервере. Мы берем текстовый файл, парсим его с помощью bat файлов и передаем готовые числовые или строковые значения в Zabbix через windows агента и функционал UserParameter.
Пишу эту статью в основном для того, чтобы поделиться примерами написания bat файлов для парсинга и передачи в заббикс. Для меня это было самое сложное, так как приходилось сталкиваться с различными проблемами по вычленению значений и искать варианты для преобразования строк. Я не очень разбираюсь в программировании, особенно в bat файлах. В основном ищу готовые варианты и переделываю под себя. Тут ничего готового я не нашел и пришлось ковыряться и разбираться самому.
Скрипты для парсинга значений
Первый текстовый файл имел примерно такое содержание:
Описание возможных значений параметров:
- state_pump может принимать значения on или off
- running_time_pump имеет нарастающее числовое значение
- sensor может принимать 3 значения: empty, full, overflow
- general_state либо ОК, либо номер ошибки
Рисуем батник для первого параметра. Если значение on, передаем в заббикс 1, если off — 0.
Обращаю внимание на то, что у меня имя файла было на русском языке. Чтобы его корректно обрабатывало, необходимо сохранить файл в кодировке OEM 866. ПО крайней мере так она называлась в Notepad++, который я использовал для изменения кодировки. Это была самая простая задача, которая решилась прямо в лоб. По аналогии написал скрипт для параметра sensor:
Дальше пришлось соображать, как передать числовое значение, обрезав все, что стоит перед ним. Наверное, для любого программиста это простая задача, для скрипта в linux я тоже не вижу больших проблем придумать что-нибудь с sed, cat, grep или чем-то еще. Но тут у меня в распоряжении bat. Можно было на vbs написать, но для меня это было бы еще сложнее.
Начал читать документацию по for и find, смотреть примеры и пробовать. В итоге все получилось очень просто и коротенько, но повозиться мне пришлось прилично, пока родились эти строки:
Подробно описывать не буду, что тут к чему, при желании сами можете поискать описание параметров. Обращу внимание только на строку set d=%str:
21,25%. Она меня очень выручила. Наткнулся где-то в примере на описание обрезания строк по заданным колонкам. Тут мы выводим значения с 21 по 25 колонки найденной строки. Как раз то, что мне нужно. На выходе просто цифры, которые отлично принимает zabbix.
Обработку параметра general_state делаем аналогичным способом:
Поступающее значение я передаю в заббикс как простую строку, в отличие от чисел в предыдущих примерах.
Второй текстовый файл был примерно такого содержания:
Здесь по аналогии делается все так же, как и в первом примере за одним исключением. Я в какой-то момент поставил в команде find ключ /i, который означает, что значение ищется без учета регистра. В итоге в новом файле я получил проблемы при поиске строк, где есть слово power. Таких строк несколько, причем первая точно повторяет 6-ю, где встречается точно такая же конструкция:
Или еще пример со строками:
Я начал думать, гадать и заходить окольными путями для решения проблемы. В цикле for есть параметр eol, который позволяет задать символ начала строки, при встрече которого строка не обрабатывается. Например вот так:
То есть я нахожу первую и нужную мне строку с active_power, а вторую, где тоже есть эта фраза пропускаю, так как она начинается с символа R. Такой вот костыль придумал, но тем не менее поставленную задачу эта конструкция решает. Рассказываю об этом, чтобы поделиться опытом и самому потом не забыть эти подходы. В итоге я просто убрал ключ /i в команде find и поиск стал работать с учетом регистра без лишних телодвижений.
Распарсил в итоге второй файл. Проверять работу скриптов нужно в командной строке, просто их запуская. На выходе вы должны получать готовые значения, без лишних строк. Теперь двигаемся дальше и настраиваем zabbix agent на сбор данных.
Добавляем UserParameter в zabbix agent
Открываем конфигурационный файл агента и добавляем в самый конец новые параметры, которые будет собирать zabbix:
И так далее. Не стал приводить полный вывод своего файла. По аналогии делаете у себя. Первое значение это название ключа, который будет указан в итеме на сервере, второе это путь к батнику.
После изменения конфигурационного файла нужно перезапустить службу агента. Проверить, все ли сделано правильно можно с помощью команды в консоли:
Если у вас все работает и значения правильные выводятся, идем на сервер, настраивать сбор параметров.
Настройка новый итемов на сервере zabbix
Мы можем добавить новые итемы на одиночный хост, в котором указаны в агенте необходимые для сбора UserParameter, либо создать сразу шаблон и потом его добавить к нужным хостам. Если у вас хостов с одинаковым мониторингом больше одного, то делать нужно шаблон, чтобы упростить себе жизнь.
Создаем новый итем в хосте, либо шаблоне. Указываете следующие обязательные параметры (я рекомендую использовать английский язык везде):
Имя | Произвольное имя итема |
Тип | В общем случае используются пассивные проверки (Zabbix agent) |
Ключ | Название ключа, который указан в агенте в UserParameter |
Тип данных | Выбираете в зависимости от типа поступаемых данных. В моем случае это были цифровые целые или с плавающей точкой, если значения дробные, и текстовые. Здесь важно не перепутать тип. Если перепутаете, получите ошибку итема. |
Интервал обновления | Как часто будут поступать новые данные |
На этом все. Сохраняете итем и ждете поступление данных. Числовые значения, которые генерируют скрипты на клиенте с агентом будут поступать на сервер.
Заключение
Подобным способом можно настроить мониторинг любых значений текстового файла. Достаточно его распарсить нужным образом. Хотя в большинстве случаев это будет костылем. У заббикса очень много способов получения данных. Лучше обходиться без промежуточных звеньев в виде текстового файла и передавать данные напрямую в zabbix. Но конкретно в данной ситуации это было самое простое и быстрое решение.
Zabbix Documentation 3.2
Sidebar
Table of Contents
4 Пользовательские параметры
Обзор
Иногда вы можете захотеть выполнять проверку через агент, которая не предопределена в Zabbix. В этом случае вам на помощь придут пользовательские параметры.
Вы можете написать команду, которая вернет необходимые вам данные и добавить эту команду как пользовательский параметр в файл конфигурации агента (параметр конфигурации ‘UserParameter’).
Пользовательский параметр имеет следующий синтаксис:
Как вы можете видеть, пользовательский параметр также содержит ключ. Ключ потребуется при настройке элемента данных. Введите ключ на ваш выбор, на который будет легко ссылаться (он должен быть уникальным в пределах узла сети). Перезапустите агента.
Затем, когда настроите элемент данных, введите ключ на который ссылается команда из пользовательского параметра, которую вы хотите выполнять.
Команды из пользовательских параметров выполняются Zabbix агентом. Может быть возвращено до 512КБ данных. Однако, обратите внимание на то, что такое текстовое значение, которое может быть сохранено в базе данных ограничено 64КБ в MySQL
В операционных системах UNIX используется интерпретатор командной строки /bin/sh. Пользовательские параметры подчиняются времени ожидания проверок на агента; если время ожидания будет превышено, созданный по пользовательским параметрам процесс будет завершен.
Примеры простых пользовательских параметров
Агент будет всегда возвращать ‘1’ для элемента данных с ключем ‘ping’.
Более сложный пример:
Агент будет возвращать ‘1’, если MySQL сервер доступен, ‘0’ — в противном случае.
Гибкие пользовательские параметры
Гибкие пользовательские параметры допускают параметры с указанным ключем. В этом случае гибкие пользовательские параметры могут быть основой для создания нескольких элементов данных.
Гибкие пользовательские параметры имеют следующий синтаксис:
Параметр | Описание |
---|---|
Ключ | Уникальный ключ элемента данных. [*] задает, что ключ может принимать параметры из скобок. Параметры указываются при настройке элемента данных. |
Команда | Команда, которая выполняется для получения значения ключа. Только для гибких пользовательских параметров: Вы можете использовать ссылки на позиции $1…$9 для того, чтобы обратиться к соответствующему параметру в ключе элемента данных. Zabbix разбирает параметры заключенные в [ ] ключа элемента данных и заменяет $1,…,$9 в команде соответственно. $0 будет заменена оригинальной командой (до раскрытия $0,…,$9) для выполнения. Ссылки на позиции интерпретируются Zabbix агентом независимо от того заключены ли они в двойные (“) или в одинарные (‘) кавычки. Для использования ссылок на позиции без изменения, укажите двойной символ доллара — например, awk ‘ |
Пример 1
Очень простой пример:
Мы можем создать неограниченное количество элементов данных для наблюдения за чем угодно, указав в таком формате ping[что угодно].
Пример 2
Давайте добавим больше смысла!
Этот параметр можно использовать для мониторинга доступности баз данных MySQL. В качестве параметров мы можем передать имя пользователя и пароль:
Пример 3
Сколько строк в файле, которые соответствуют регулярному выражению?
Этот параметр можно использовать для подсчета количества строк в файле.
Результат команды
Результирующим значением команды является стандартный вывод вместе со стандартным выводом ошибок.
Пользовательские параметры, которые возвращают текст (символ, журнал, текстовый типы информации) могут возвращать пробел. В случае ошибочного результата элемент данных станет неподдерживаемым.
Zabbix. User Parameters (Пользовательские параметры)
При мониторинге серверов с использованием системы Zabbix иногда требуется снимать некоторые “особые” данные, характерные только для этого сервера, либо необходимые для решения очень узкого круга задач. Zabbix позволяет расширять набор забираемых с агента данных с помощью опции UserParameter .
Итак, первое, что необходимо сделать — это написать команду, результатом которой будет некоторое значение, которое подлежит мониторингу. Для построения графика это будет число, хотя допускаются и литеральные (строковые) значения.
В качестве примера возьмем, например, такую задачу: необходимо мониторить и выводить на график количество файлов в каталоге /var/www/ . Команда в данном случаи будет такая: dir /var/www/ | wc -l . Запускаем ее в терминале и убеждаемся, что ее результатом действительно является число, равное количеству файлов в нужной директории.
Теперь, когда у нас есть команда необходимо добавить ее в конфиг zabbix-агента. Допишем в файл /etc/zabbix/zabbix-agent.conf (на том сервере, значение с которого будем снимать) такую строчку:
и перезапустим zabbix-agentd
Теперь о том, что это за параметры.
В данном случае mon.filecount — это уникальный ключ, который однозначно характеризует снимаемый параметр. Он может быть любым, но не должен пересекаться с уже существующими. Этот ключ позже необходимо будет ввести при создании нового Элемента данных (Data Item) в поле Ключ (Key).
dir / | wc -l — Команда, которая будет использоваться для получения значения.
Также реализована возможность передачи параметров нашей команде. Например, если мы заранее не знаем, для какой директории нам необходимо мониторить количество файлов, то мы можем написать в конфиге агента так:
И использовать в качестве ключа Элемента данных такую строчку: mon.filecount[/var/www/] , то передаваемый параметр подставится вместо $1 и результат будет таким же.
Для передачи нескольких параметров необходимо указывать их через запятую, а в команде использовать $1 , $2 и т. д.