Иногда возникает задача осуществлять мониторинг времени изменения какого-то файла или каталога. Например, если есть лог-файл, в который что-то постоянно пишется, или каталог, в который валится почта, результаты работы скриптов и тому подобное. Мы на работе, например, отслеживаем приход новостей от разных агентств.
В любом случае, нам может захотеться отслеживать и получать оповещения про любой случай прекращения изменений фала/каталога. Сделать это средствами zabbix довольно легко:
- создаём айтем vfs.file.time[/path/to/our_file]
- создаём триггер с выражением {flycat.info:vfs.file.time[/path/to/our_file]. fuzzytime(600) }=0 (сигнализировать, если время модификации файла больше 10 минут)
- наслаждаемся результатом: в случае, если время модификации нашего файла или каталога становится больше 600 секунд, нам приходит оповещение
Хороший способ? Хороший! Но не очень 🙂 Какие есть у него недостатки:
- Время модификации файла считается на клиентской машине исходя из показаний её часов, а текущее время для fuzzytime берётся с zabbix-сервера. Нужно ли объяснять, что произойдёт, если часы на этих машинах “разбегутся”?
- Вычисление разницы времени происходит на zabbix-сервере. Естественно, что это его, хоть и незначительно, но нагружает. А если таких параметров у вас много, нагрузка может стать довольно значительной
- Ну и ещё один фактор: низкая наглядность. Посмотрите на график айтема. По нему невозможно определить, превысило ли ожидаемое время модификации предельный срок.
Давайте теперь сделаем тоже самое, но другим способом. Пишем (на клиенте) такой скрипт под названием modtime:
#!/bin/bash s=`ls -d -l --full-time $1|awk '{print $6" "$7}'` a=`date +%s` b=`date --date="$s" +%s` echo $(( ($a - $b)/60 ))
и кладём его в каталог zabbix-плагинов. В случае, если вы не знаете, где этот каталог, можно положить его куда заблагорассудится (не забывая, конечно, о разрешениях для zabbix), но тогда нужно будет прописать в строке конфигурации zabbix-агента следующую строчку:
UserParameter=modtime[*],/opt/zabbix/plugins/modtime $1
Теперь создаём следующий айтем: modtime[/path/to/our_file] и триггер с выражением: {flycat.info:modtime[/path/to/our_file].last(0) }>10. Обратите внимание, что в этом варианте скрипта идёт учёт времени не в секундах, а в минутах.
Что мы теперь видим на графике?
По-моему, всё стало гораздо более наглядным и понятным. Пожалуй, единственный недостаток второго способа — работает он только под unix / linux, где есть bash. На Windows такие трюки не пройдут.
Основано на стандартных ключах zabbix.
Оф. Поддерживаемые ключи элементов данных
Некоторые из ключей, что можно мониторить из коробки.
vfs.file.cksum[файл] — Контрольная сумма файла, вычисленная по алгоритму используемом в UNIX cksum. Целое число.
vfs.file.contents[файл,<кодировка>] — Получение содержимого файла. Текст.
vfs.file.exists[файл] — Проверка существования файла. 0 — файл не найден;1 — файл найден.
vfs.file.md5sum[файл] — MD5 контрольная сумма файла. Строка (MD5 хэш файла).
vfs.file.regexp[файл,регулярное выражение,<кодировка>,<начальная строка>,<конечная строка>,<вывод>] — Поиск строки в файле. Строка содержащая совпадающую подстроку или то, что определено в дополнительном параметре вывод.
vfs.file.regmatch[файл,регулярное выражение,<кодировка>,<начальная строка>,<конечная строка>] — Поиск строки в файле. 0 — совпадение не найдено; 1 — найдено
vfs.file.size[файл] — Размер файла (в байтах). Целое число.
vfs.file.time[файл,<режим>] — Информация о времени файла. Целое число (Unix timestamp).
- Некоторые из стандартных ключей zabbix для работы с файлами
Файл Лог
log[файл,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<вывод>,<максзадержка>] — Мониторинг файлов журналов (логов). Журнал (лог).
log.count[файл,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<максзадержка>] — Подсчёт количества совпадающих строк в мониторинге файла журнала (логов). Целое число.
logrt[файл_regexp,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<вывод>,<максзадержка>,<опции>] — Мониторинг файлов журналов (логов) с поддержкой ротации логов. Журнал (лог).
logrt.count[файл_regexp,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<максзадержка>,<опции>] — Подсчёт количества совпадающих строк в мониторинге файла журнала (логов) с поддержкой ротации логов. Целое число.
СКАЧАТЬ
О Веб проверке в данном шаблоне Тут
Если при проверке Элемент данных выдает нет доступа к директории permission denied или путь не найден NOT_FOUND
Тут несколько вариантов:
1. Проверить путь и наличие файла возможно экранирование пути и \
2. Не хватает прав на папки (путь) на сам файл.
Решение: Выдать необходимые права или Сменить пользователя от которого работает Заббикс Агент
Windows в Службе заббикс агента
в Linux пример Запуск Zabbix Agent от Root
3. В конфигурации Заббикс Агента начиная с Zabbix 5.0 system.run
Удаленные команды по-прежнему отключены по умолчанию, но в новых конфигурационных файлах, которые выражаются с помощью нового параметра DenyKey (DenyKey=system.run[*]) черный список, разрешить все AllowKey=system.run[*].
Удаленные команды можно включить, удалив (или закомментировав) ключ DenyKey=system.run[*]
Либо настроить разрешения для определённых путей
Подробнее в оф.
Ранее этот параметр был EnableRemoteCommands = 1, иначе агент не сможет принимать команды.
Параметр EnableRemoteCommands теперь устарел.
Более подробно Поддержка черных и белых списков для метрик на стороне агента
О скриптах и проверке написанной ранее ее будем переделывать в шаблон
Создание удаление копий на неделю create_backup.cmd и backup_delete.vbs
Проверка через check_bk_fs.bat или zabbix_bk.vbs
делаем проверку виде шаблона, без доп скриптов с отправкой через zabbix_sender trapper.
Делаем Шаблон на основе некоторых ключей указанных выше.
Данный шаблон облегчает настройку мониторинга файла на однотипных серверах, на частично с разными путями и названием файла. Не нужно везде вручную создавать элементы данных триггеры и группы данных, а просто прописать пару макросов в узле.
Шаблон будет для определенных серверов, у которых путь до файла одинаковый но имя файла отличается.
Например : D:\копия\базы-данных\export_bd_r304.bak у другова D:\копия\базы-данных\export_bd_r307.bak и так далее.
Будем использовать 2 макроса:
{$PUTFSESRN} — путь до файла по умолчанию в шаблоне задан D:\копия\базы-данных если он отличается на каких то узлах прописываем в узле другой путь. Так же путь может быть по сети \\192.168.507.38\базы-данных\export_bd_r307.bak.
Учитывать доступ учетной записи от которой работает заббикс агент!
{$NUM.RAYON} — номер файла соответствии с подразделением. например 307 задаем каждый на своем узле.
Получаем следующий вид пути:
{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak
Данный файл выгружается каждый день Агентом SQL (файл должен быть, дата изменения не более суток то что файл новый, и размер файла должен быть в пропорциях что означает что с бд все хорошо. Если файл стал увеличивается в разы с базой что то не то. далее файл будет упакован в архив и скопирован с текущей датой на другой сервер с бэкапом на 1 неделю, там так же проверяется что архив не битый архивация прошла успешно размер отличается от предыдущего не более чем на * %.
- Шаблон Веб проверки и проверка файла
ЭЛЕМЕНТЫ ДАННЫХ
- Проверка файлов Элементы данных zabbix
Имя: Время изменения свойств файла export_bd_r{$NUM.RAYON}.bak
Тип: Zabbix Агент
Ключ: vfs.file.time[«{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak»,change]
Тип информации: Числовой (целое положительное)
Единица измерения: unixtime
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
- Время изменения свойств файла
Имя: Время изменения файла export_bd_r{$NUM.RAYON}.bak
Тип: Zabbix Агент
Ключ: vfs.file.time[«{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak»,modify]
Тип информации: Числовой (целое положительное)
Единица измерения: unixtime
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
- Время изменения файла
Дата время в ответе приходит в формате unixtime
можно преобразовать в дату онлайн из секунд в дату или онлайн из секунд в дату2
Имя: Наличие файла export_bd_r{$NUM.RAYON}.bak
Тип: Zabbix Агент
Ключ: vfs.file.exists[«{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak»]
Тип информации: Числовой (целое положительное)
Единица измерения:
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание:
1 — файл найден
0 — файл не найден
- Наличие файла
Имя: Размер файла export_bd_r{$NUM.RAYON}.bak
Тип: Zabbix Агент
Ключ: vfs.file.size[«{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak»]
Тип информации: Числовой (целое положительное)
Единица измерения: B
Интервал обновления: 12h
Группы элементов данных: Проверка файлов
Описание:
- Размер файла
ТРИГГЕР
- Триггер Файл бейкап АИС старый или отсутствует
Имя: Файл бейкап АИС старый или отсутствует R{$NUM.RAYON}
Важность: Средняя
Выражение: {Chek:vfs.file.exists[«{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak»].max(25h)}=0 or
{Chek:vfs.file.time[«{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak»,modify].fuzzytime(25h)}=0 or
{Chek:vfs.file.size[«{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak»].last(#2)}/{Chek:vfs.file.size[«{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak»].last()}<0.9 or
{Chek:vfs.file.size[«{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak»].last()}/{Chek:vfs.file.size[«{$PUTFSESRN}\export_bd_r{$NUM.RAYON}.bak»].last(#2)}>1.1
Разрешить закрывать вручную: V
Описание:
Файл выгружается SQL Агентом, архивируется бэйкапится на файловый.
D:\копия\базы-данных\export_bd_r{$NUM.RAYON}.bak
Проверки:
1.Наличие файла
2.Дата изменения файла не более 25 часов
3.Проверяем что файл не битый и увеличения размера происходит нормально.
Старый размер делим на новый должно быть не меньше <0.9 или
новый размер файла делить на старый значение должно быть не больше>1.1
Значение должно быть в районе 1
Активировано: V
- Триггер Файл бейкап АИС старый или отсутствует R
Проверка Копии на ФС уже в архиве с датой
реализовано в check_bk_fs.bat
Путь на архив: \\192.168.%1.9\es-backups\ES_%y%.%m%.%d%.*» в cmd путь указан по сети так как чиклом перебираются подсети и проверяется архив, с одного сервера.
по факту если проверять на каждом сервере через сервере путь D:\es-backups\ES_2022.01.11.zip
Если папка расшарена можно проверить командой
zabbix_get -s 192.168.175.8 -p 10050 -k vfs.file.exists[«\\\\192.168.175.8\\es-backups\\ES_2022.01.11.zip»]
Если на большинстве серверов путь один и тот же , а на нескольких отличается можно прописать его макросом по умолчанию в шаблоне, а где отличается прописать другой путь в макросе узла.
Попытка сделать проверку виде шаблона без доп скриптов с отправкой через zabbix_sender trapper.
- Шаблон Элементы данных Файловых серверов Проверки файлов
- Триггер Файл бекапа АИС старый или отсутствует
И ничего не получилось(
А все почему?
так как в элементе ключа vfs.file.size[«D:\es-backups\ES_{DATE}.zip»]
Макрос {DATE} не раскрывается в ключе элемента данных, а раскрывается только в
→ Оповещения и команды, основанные на триггерах
→ Оповещения об обнаружениях
→ Оповещения о авторегистрациях
→ Внутренние оповещения
→ Оповещения обновления проблем
Текущая дата в гггг.мм.дд формате.
Оф. Макросы поддерживаемые по назначению
ТЕКУЩАЯ ДАТА в Элементе данных , макрос в zabbix
Как подставить текущую дату в zabbix в разных форматах
1.Сделать пользовательский макрос {$DATE} дальше что каждый день прописывать дату? не вариант
2.Сделать авто обнаружение файла так же не вариант так как:
Файл будет каждый день новый сравнить размер не получится, после удаления предыдущих файлов сработает триггер на старые файлы что нет данных, можно конечно выставить удаление через 0 дней если не обнаруживается сразу удалился, если файла нет то и проверка не создастся и мы ничего не узнаем.
Обнаружение файлов и запрос их наличия, размера, даты изменения Шаблон + LLD скрипт
3.Подставлять дату через API доступ в базу получать ее например с php или командой.
API Zabbix через Bash и Curl
Готовый скрипт Проверяет существует ли глобальный макрос если нет создает проверяет совпадает ли текущая дата если нет изменяет на текущую.
/usr/local/share/zabbix/externalscripts/dateglobalmacroapi.sh Имя-узла
Скачать
Шаблон можно закрепить у узлу заббикс сервер так как макросы глобальные, если макросы уровня узла то шаблон к узлам крепим.
Шаблон запускает скрипт, при ошибках траппер скидывает данные об ошибке и срабатывает триггер.
dateglobalmacroapi.sh
Код: Выделить всё
#!/bin/bash
#2022/01/15 v2.0
# Автор Мамзиков Артём Андреевич Описание по скрипту https://diyit.ru/viewtopic.php?t=1938
# Входные атрибуты для отправки информации об ошибке
HOSTCONN=$1
#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111' # Или localhost 127.0.0.1
zabbixUsername='Admin'
zabbixPassword='zabbix'
#Конец пользовательских переменных
#***********************************************************************
header='Content-Type:application/json-rpc'
zabbixApiUrl="http://$zabbixServer/zabbix/api_jsonrpc.php"
function exit_with_error() {
echo '**********************************'
echo "$errorMessage"
echo '----------------------------------'
echo 'Сформированная Команда выполнения'
echo '----------------------------------'
echo curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl
echo '----------------------------------'
echo 'Выходные данные'
echo '----------------------------------'
echo "$result"
echo '**********************************'
zabbix_sender -z $zabbixServer -p 10051 -s "${HOSTCONN}" -k dateglobmacerror -o "ERROR $errorMessage Команда выполнения: curl --silent --show-error --insecure --header $header --data $json $zabbixApiUrl Результат $result"
}
#------------------------------------------------------
# Аутентификация пользователя. https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/login
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить токен авторизации Zabbix'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\"},\"id\": 1 }`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
auth=$(echo "${result}" |sed -e 's|.*result":"||' -e 's/","id.*//g')
check=$(echo "${auth}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&exit 1 ; fi
echo "Вход в систему выполнен успешно - Идентификатор авторизации: $auth"
errorMessage="";json="";result="";check="" # Очистка переменных
function outapi(){
#------------------------------------------------------
# Выход из zabbix https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/logout
#------------------------------------------------------
# Выполнение выхода из API.
errorMessage='*ERROR* - Не удалось выйти из системы'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.logout\",\"params\": [],\"id\": 1, \"auth\": \"$auth\"}`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
logout=$(echo "${result}" |sed -e 's|.*result":||' -e 's/,"id.*//g')
check=$(echo "${logout}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo 'Успешно вышел из Zabbix' "${logout}"
errorMessage="";json="";result="";check="" # Очистка переменных
exit 1
}
# Запрос информации об авторизовавшемся пользователе
#usinfo=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\",\"userData\": true},\"id\": 1 }`
#infouser=`curl --silent --show-error --insecure --header $header --data "$usinfo" $zabbixApiUrl`
#echo "${infouser}"
# Создаваемые и проверяемые глобальные макросы (пишем через , без пробелов между ними экранируем \$)
globmacros="{\$DATE},{\$DATER},{\$DATEYYYY},{\$DATEYYYYMMDD}"
# Формирование фильтра запроса глоб.макросов. Подставим и экранируем \" для Curl
apifiltr=`echo $globmacros|sed -e 's/{/\\"{/g' -e 's/}/}\\"/g'`
#------------------------------------------------------
# Получение глобальных макросов. https://www.zabbix.com/documentation/current/ru/manual/api/reference/usermacro/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить выбранные глобальные макросы Zabbix'
json=$(echo {\"jsonrpc\": \"2.0\",\"method\": \"usermacro.get\",\"params\":{\"output\": [\"macro\",\"value\"],\"globalmacro\": true ,\"filter\": {\"macro\": [$apifiltr]}},\"auth\": \"$auth\",\"id\": 1})
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
echo "Отображение существующих глобальны макросов даты": $result
proverka="${result}"
#dateglobmac=`echo $proverka|sed 's|.*result:||'|sed 's/,id.*//g'` # Выберем глобальные макросы даты
errorMessage="";json="";result="";check="" # Очистка переменных
# Сгенерируем фильтр для проверки макроса и создания если нет, делим через ,
IFS=',' read -ra sumdir < <(echo "${globmacros}")
# Печать разделенной строки
for sverka in "${sumdir[@]}"
do
case $proverka in
*"${sverka}"*)
echo "Макрос Найден" "${sverka}"
;;
*)
echo "Макрос Не найден Создаём" "${sverka}"
#------------------------------------------------------
# Создание глобального макроса. https://www.zabbix.com/documentation/current/ru/manual/api/reference/usermacro/createglobal
#------------------------------------------------------
errorMessage='*ERROR* - Не удается изменить значение глобального макроса Zabbix'
json=$(echo {\"jsonrpc\": \"2.0\",\"method\": \"usermacro.createglobal\",\"params\":{\"macro\": \"$sverka\",\"value\": \"test\"},\"auth\": \"$auth\",\"id\": 1})
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
echo "Изменение даты в глобальном макросе" $result
errorMessage="";json="";result="";check="" # Очистка переменных
;;
esac
# Зададим соответствие даты к макросы
case $sverka in
{\$DATE})
DATE=`date +"%Y.%m.%d"` # Получаем переменную текущей даты гггг.мм.дд
;;
{\$DATER})
DATE=`date +"%d.%m.%Y"` # Текущая дата дд.мм.гггг
;;
{\$DATEYYYY})
DATE=`date +"%Y"` # Текущая дата гггг
;;
{\$DATEYYYYMMDD})
DATE=`date +"%Y%m%d"` # текущая дата ггггммдд
;;
*)
echo "Соответствие макроса к дате Не найдено" "${sverka}"
zabbix_sender -z $zabbixServer -p 10051 -s "${HOSTCONN}" -k dateglobmacerror -o "ERROR Соответствие макроса к дате Не найдено $sverka "
esac
# Проверим дату и обновим если дата отличается
znacenie=`echo $proverka|sed 's|.*'$sverka'","value":"||'|sed 's/"}.*//g'` # Выберем дату для конкретного макроса
idglobalmacro=`echo $proverka|sed 's|","macro":"'$sverka'.*||'|sed 's/.*"globalmacroid":"//g'` # Для обновление нужно знать ID макроса выберм его
if [ "$DATE" != "$znacenie" ]; then
echo "не совпадает дата" $DATE $znacenie
#------------------------------------------------------
# Обновление глобального макроса. https://www.zabbix.com/documentation/current/ru/manual/api/reference/usermacro/updateglobal
#------------------------------------------------------
errorMessage='*ERROR* - Не удается изменить значение глобального макроса Zabbix'
json=$(echo {\"jsonrpc\": \"2.0\",\"method\": \"usermacro.updateglobal\",\"params\":{\"globalmacroid\": \"$idglobalmacro\",\"value\": \"$DATE\"},\"auth\": \"$auth\",\"id\": 1})
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
echo "Изменение даты в глобальном макросе" $result
errorMessage="";json="";result="";check="" # Очистка переменных
fi
done
outapi # Запустим блок Выхода
- выполнении скрипта dateglobalmacroapi.sh Элементы и триггер
Пример ошибки не правильный пароль.
- выполнении скрипта dateglobalmacroapi.sh Пример ошибок
Код: Выделить всё
#!/bin/bash
# Тестовая версия 1
#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111'
zabbixUsername='Admin'
zabbixPassword='zabbix'
#Конец пользовательских переменных
#***********************************************************************
header='Content-Type:application/json-rpc'
zabbixApiUrl="http://$zabbixServer/zabbix/api_jsonrpc.php"
function exit_with_error() {
echo '********************************'
echo "$errorMessage"
echo '--------------------------------'
echo 'Входные данные'
echo '--------------------------------'
echo "$json" $zabbixApiUrl $usexit
echo '--------------------------------'
echo 'Выходные данные'
echo '--------------------------------'
echo "$result" "${logout}"
echo '********************************'
exit 1
}
#------------------------------------------------------
# Аутентификация пользователя. https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/login
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить токен авторизации Zabbix'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\"},\"id\": 1 }`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
auth=$(echo "${result}" |sed -e 's|.*result":"||' -e 's/","id.*//g')
check=$(echo "${auth}"|tr -d '\r\n'| sed -n 's/error.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo "Вход в систему выполнен успешно - Идентификатор авторизации: $auth"
#------------------------------------------------------
# Получение глобального макроса. https://www.zabbix.com/documentation/current/ru/manual/api/reference/usermacro/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить ID глобального макроса Zabbix'
getglobmacro=$(echo {\"jsonrpc\": \"2.0\",\"method\": \"usermacro.get\",\"params\":{\"output\": \"extend\",\"globalmacro\": true},\"auth\": \"$auth\",\"id\": 1})
macrocglobget=`curl --silent --show-error --insecure --header $header --data "$getglobmacro" $zabbixApiUrl`
echo "Изменение даты в глобальном макросе $macrocglobget"
DATE=`date +"%Y.%m.%d"` # Получаем переменную текущей даты гггг.мм.дд
#------------------------------------------------------
# Создание глобального макроса. https://www.zabbix.com/documentation/current/ru/manual/api/reference/usermacro/createglobal
#------------------------------------------------------
errorMessage='*ERROR* - Не удается изменить значение глобального макроса Zabbix'
globmacro=$(echo {\"jsonrpc\": \"2.0\",\"method\": \"usermacro.updateglobal\",\"params\":{\"globalmacroid\": \"3\",\"value\": \"$DATE\"},\"auth\": \"$auth\",\"id\": 1})
macrocglob=`curl --silent --show-error --insecure --header $header --data "$globmacro" $zabbixApiUrl`
echo "Изменение даты в глобальном макросе $macrocglob"
#------------------------------------------------------
# Выход из zabbix https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/logout
#------------------------------------------------------
# Выполнение выхода из API.
errorMessage='*ERROR* - Не удалось выйти из системы'
usexit=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.logout\",\"params\": [],\"id\": 1, \"auth\": \"$auth\"}`
logout=`curl --silent --show-error --insecure --header $header --data "$usexit" $zabbixApiUrl`
check=$(echo "${logout}"|tr -d '\r\n'| sed -n 's/error.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo 'Успешно вышел из Zabbix' "${logout}"
Авторизуемся получим токен аунтификации
curl —silent —show-error —insecure —header ‘Content-Type: application/json-rpc’ —data ‘{«jsonrpc»: «2.0»,»method»:»user.login»,»params»:{«user»: «Admin»,»password»: «zabbix»},»id»: 1 }’ http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ: {«jsonrpc»:»2.0″,»result»:»e56692223b1ec39702106d8155b7de74″,»id»:1}
Запрос Глобальных Макросов
curl —silent —show-error —insecure —header ‘Content-Type:application/json-rpc’ —data ‘{«jsonrpc»: «2.0»,»method»: «usermacro.get»,»params»: {«output»: «extend»,»globalmacro»: true },»auth»:»e56692223b1ec39702106d8155b7de74″, «id»: 1 }’ http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{«jsonrpc»:»2.0″,»result»:[{«globalmacroid»:»2″,»macro»:»{$SNMP_COMMUNITY}»,»value»:»public»},{«globalmacroid»:»13″,»macro»:»{$DATE}»,»value»:»2022.01.14″},{«globalmacroid»:»14″,»macro»:»{$DATEYYYYMMDD}»,»value»:»20220114″}],»id»:1}
Запрос с фильтром только макрос {$DATE}
curl —silent —show-error —insecure —header ‘Content-Type:application/json-rpc’ —data ‘{«jsonrpc»: «2.0»,»method»: «usermacro.get»,»params»: {«output»: «extend»,»globalmacro»: true ,»filter»: {«macro»: «{$DATE}»}},»auth»:»e56692223b1ec39702106d8155b7de74″, «id»: 1 }’ http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{«jsonrpc»:»2.0″,»result»:[{«globalmacroid»:»13″,»macro»:»{$DATE}»,»value»:»2022.01.14″}],»id»:1}
Запрос с фильтром только макрос {$DATE} и вывод без value только globalmacroid и macro
curl —silent —show-error —insecure —header ‘Content-Type:application/json-rpc’ —data ‘{«jsonrpc»: «2.0»,»method»: «usermacro.get»,»params»: {«output»: [«macro»],»globalmacro»: true ,»filter»: {«macro»: «{$DATE}»}},»auth»:»e56692223b1ec39702106d8155b7de74″, «id»: 1 }’ http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{«jsonrpc»:»2.0″,»result»:[{«globalmacroid»:»13″,»macro»:»{$DATE}»}],»id»:1}
Запрос с фильтром только макрос {$DATE} и вывод без macro только globalmacroid и value
curl —silent —show-error —insecure —header ‘Content-Type:application/json-rpc’ —data ‘{«jsonrpc»: «2.0»,»method»: «usermacro.get»,»params»: {«output»: [«value»],»globalmacro»: true ,»filter»: {«macro»: «{$DATE}»}},»auth»:»e56692223b1ec39702106d8155b7de74″, «id»: 1 }’ http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{«jsonrpc»:»2.0″,»result»:[{«globalmacroid»:»13″,»value»:»2022.01.14″}],»id»:1}
Запрос с фильтром только макрос {$DATE} и вывод «macro»,»value»
curl —silent —show-error —insecure —header ‘Content-Type:application/json-rpc’ —data ‘{«jsonrpc»: «2.0»,»method»: «usermacro.get»,»params»: {«output»: [«macro»,»value»],»globalmacro»: true ,»filter»: {«macro»: «{$DATE}»}},»auth»:»e56692223b1ec39702106d8155b7de74″, «id»: 1 }’ http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{«jsonrpc»:»2.0″,»result»:[{«globalmacroid»:»13″,»macro»:»{$DATE}»,»value»:»2022.01.14″}],»id»:1}
Запрос с фильтром макросов «{$DATE}»,»{$DATEYYYYMMDD}»
curl —silent —show-error —insecure —header ‘Content-Type:application/json-rpc’ —data ‘{«jsonrpc»: «2.0»,»method»: «usermacro.get»,»params»: {«output»: [«macro»,»value»],»globalmacro»: true ,»filter»: {«macro»: [«{$DATE}»,»{$DATEYYYYMMDD}»]}},»auth»:»e56692223b1ec39702106d8155b7de74″, «id»: 1 }’ http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{«jsonrpc»:»2.0″,»result»:[{«globalmacroid»:»4″,»macro»:»{$DATEYYYYMMDD}»,»value»:»20220109″},{«globalmacroid»:»3″,»macro»:»{$DATE}»,»value»:»2022.01.13″}],»id»:1}
Создание макроса {$DATER} значение 1
curl —silent —show-error —insecure —header ‘Content-Type:application/json-rpc’ —data ‘{«jsonrpc»: «2.0»,»method»: «usermacro.createglobal»,»params»:{«macro»: «{$DATER}»,»value»: «1»},»auth»: «e56692223b1ec39702106d8155b7de74″,»id»: 1}’ http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ:
{«jsonrpc»:»2.0″,»result»:{«globalmacroids»:[«5″]},»id»:1}
Выход из API
curl —silent —show-error —insecure —header ‘Content-Type: application/json-rpc’ —data ‘{«jsonrpc»: «2.0»,»method»:»user.logout»,»params»: [],»id»: 1, «auth»: «e56692223b1ec39702106d8155b7de74»}’ http://192.168.175.111/zabbix/api_jsonrpc.php
4.Сделать проверку элемента Через внешний скрипт в элементе прописать команду даты которая будет раскрывается в скрипте
или же запускать команду прямо через заббикс агент ключом system.run (ключ в ключе попробовать с раскрытием даты в команде)
Скачать пример Шаблон + скрипт
Пример шаблона проверка через сеть
Скачиваем скрипт ложим его на заббикс сервер в моем случае путь такой
/usr/local/share/zabbix/externalscripts
Так выглядит ключ изначально
zabbix_get -s 192.168.175.8 -k vfs.file.exists[«D:\es-backups\ES_{DATE}.zip»] — не раскрывается дата
Команда прилетает на Хост Windows
zabbix_get -s 192.168.175.8 -k system.run[«dir /a-d /B D:\%date:~6,4%.zip»] — имя архива текущий год, не работает так как запятая делить команду и не экранируется получаем команду со стороны узла dir /a-d /B D:\%date:~6
Попытка раскрыть дату еще на сервере Linux
zabbix_get -s 192.168.175.8 -k system.run[«dir /a-d /B D:\date +»%Y».zip»] — с разными вариантами кавычек так же не вариант
Внешняя проверка
dir-file-date.sh[{HOST.CONN},{$HOST.PORTS},vfs.file.exists[«D:\»${DATEYYYY}».zip»]
- Элемент данных с датой внешняя проверка
Пример Элемента данных:
Имя: Наличие файла ES_{$DATE}.zip
Тип: Внешняя проверка
Ключ: dir-file-date.sh[{HOST.CONN},{$HOST.PORTS},vfs.file.exists[«D:\es-backups\ES_${DATE}.zip»]
Тип информации: Числовой (целое положительное)
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание:
1 — файл найден
0 — файл не найден
Активировано: V
Если перед переменой у нас идет слеш \$ выходит что мы экранируем символ $ и это уже будет не переменная
root@ZABBIXSERVER:~# ./dir-file-date.sh 192.168.175.8 10050 ‘vfs.file.exists D:\${DATEYYYY}.zip’
vfs.file.exists D:$DATEYYYY.zip
root@ZABBIXSERVER:~# ./dir-file-date.sh 192.168.175.8 10050 ‘vfs.file.exists D:\»${DATEYYYY}».zip’
vfs.file.exists D:$DATEYYYY.zip
root@ZABBIXSERVER:~# ./dir-file-date.sh 192.168.175.8 10050 ‘vfs.file.exists D:\ ${DATEYYYY}.zip’
vfs.file.exists D: 2021.zip
./dir-file-date.sh 192.168.175.8 10050 ‘vfs.file.exists[«D:\${DATEYYYY}.zip»‘
Ответ: 1
./dir-file-date.sh 192.168.175.8 10050 ‘vfs.file.exists[«D:\es-backups\ES_${DATE}.zip»‘
t1=1
t2=t1
t3=$(eval echo \$$t2)
echo $t3
1
t1=1
t2=t1
echo ${!t2}
1
eval echo \$$i
скрипт копируем на заббикс сервер, в моем случае путь такой:
/usr/local/share/zabbix/externalscripts
#!/bin/bash
#2021/11/28 v1
# Автор Мамзиков Артём Андреевич
# Подставляем дату в ключ
# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
KEY=$3
# Для теста просмотр входных переменных
STV=$(date «+%F %T»)
#echo «${STV}» «${IP}» «${PORT}» «${KEY}» >> /tmp/log-date-dir-file
# Переменные Даты для файлов и папок https://losst.ru/komanda-date-v-linux
DATE=`date +»%Y.%m.%d»`
DATEYYYY=`date +»%Y»`
DATEYYYYMMDD=`date +»%Y%m%d»`
# так как \ у нас экранирует знак переменой $ если она сразу идет сделаем ее подстановочной
SL=’\’
# Замена \ на переменную
show=$(echo «${KEY}»| sed ‘s/\\/»${SL}»/g’)
# Раскрытие переменных
#eval varval=\»\$$show\»
eval varval=\»\$show\»
#eval echo «${varval}»
KEYP=$(eval echo «${varval}»)
#eval echo \»\$$show\»
# Запрос сформированного ключа
# Так как Многоуровневые массивы параметров, например [a,[b,[c,d]],e], недопускаются. параметр в кавычках разрешена левая квадратная скобка [ , добавим закрывающую правую скобку ] . https://www.zabbix.com/documentation/cu … s/item/key
zabbix_get -s $IP -p $PORT -k «${KEYP}»]
#echo «${KEYP}»
5. Сделать глобальный макрос и значение даты напрямую подставлять в таблице SQL процедурой каждые цать интервал времени.
Хранятся они в таблице globalmacro — Глобальные Макросы
- Глобальные макросы
- MySql таблица globalmacro
Получение даты и времени
Функции NOW(), SYSDATE(), CURRENT_TIMESTAMP() возвращают текущую локальную дату и время на основе системных часов в виде объекта datetime. Все три функции возвращают одинаковый результат
SELECT NOW(); — 2018-05-25 21:34:55
SELECT SYSDATE(); — 2018-05-25 21:34:55
SELECT CURRENT_TIMESTAMP(); — 2018-05-25 21:32:55
Функции CURDATE и CURRENT_DATE возвращают текущую локальную дату в виде объекта date:
SELECT CURRENT_DATE(); — 2018-05-25
SELECT CURDATE(); — 2018-05-25
Функции CURTIME и CURRENT_TIME возвращают текущее время в виде объекта time:
SELECT CURRENT_TIME(); — 20:47:45
SELECT CURTIME(); — 20:47:45
UTC_DATE возвращает текущую локальную дату относительно GMT
SELECT UTC_DATE(); — 2018-05-25
UTC_TIME возвращает текущее локальное время относительно GMT
SELECT UTC_TIME(); — 17:47:45
Подробнее Функции для работы с датами и временем
Проверка SELECT DATE_SUB(CURDATE(), INTERVAL 3 MONTH); — формата гггг-мм-дд
функция DATE_SUB возвращает дату, после которой вычитается определенный интервал даты/времени. минус 3 месяца
CURDATE возвращает текущую дату
DATE_SUB( date, INTERVAL value unit )
UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 3 MONTH)) — в формате unix
date — дата, на которую должен быть вычтен интервал.
value — значение интервала времени / даты, которое вы хотите вычесть. Вы можете указать положительные и отрицательные значения для этого параметра.
unit — единичный тип интервала, например DAY, MONTH, MINUTE, HOUR и т.д.
не совсем подходит Текущая дата в гггг-мм-дд формате.
SELECT CURRENT_DATE(); 2021-11-27
SELECT CURDATE(); 2021-11-27
Идет через тире
Преобразуем дату
SELECT DATE_FORMAT(CURRENT_DATE(), ‘%d/%m/%y’); получим 27/11/21
SELECT DATE_FORMAT(CURRENT_DATE(), ‘%d/%m/%Y’); получим 27/11/2021
SELECT DATE_FORMAT(CURRENT_DATE(), ‘%Y.%m.%d’); получим 2021.11.27 Текущая дата в гггг.мм.дд формате.
И получаем SQL запрос вида
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%Y.%m.%d’) WHERE `globalmacro`.`macro` = ‘{$DATE}’;
Так как у меня дата без точек везде добавим еще один глобальный макрос {$DATEYYYYMMDD}
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%Y%m%d’) WHERE `globalmacro`.`macro` = ‘{$DATEYYYYMMDD}’;
Раздельно выводим Год Месяц Число и составляем как нужно
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%Y’) WHERE `globalmacro`.`macro` = ‘{$DATE_YYYY}’;
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%m’) WHERE `globalmacro`.`macro` = ‘{$DATE_MM}’;
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%d’) WHERE `globalmacro`.`macro` = ‘{$DATE_DD}’;
Указать 3 глобальных макроса: {$DATE_YYYY} ; {$DATE_MM} ; {$DATE_DD}
И получаем даты
- Глобальные Макросы zabbix с текущей датой
Для времени
SELECT TIME_FORMAT(CURRENT_TIME (),’%H’);
SELECT TIME_FORMAT(CURRENT_TIME(),’%i’);
SELECT TIME_FORMAT(CURRENT_TIME(),’%S’);
Global_Macro_Time
BEGIN
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME (),’%H’) WHERE `globalmacro`.`macro` = ‘{$TIME_HH}’;
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME(),’%i’) WHERE `globalmacro`.`macro` = ‘{$TIME_MM}’;
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME(),’%S’) WHERE `globalmacro`.`macro` = ‘{$TIME_SS}’;
END
Добавим процедуру и событие в MySql для автоматического выполнения команды каждый день в 00:00:00 часов
Выполнение команд от имени администратора root или пользователя с соответствующими правами.
Убедитесь в том, что первый планировщик событий включен значение должно быть ON (Обычно выключен)
SHOW GLOBAL VARIABLES LIKE ‘event_scheduler’;
Команда включения
SET GLOBAL event_scheduler = ON;
Добавим виде процедуры
USE `zabbixdb`;
DELIMITER $$
—
— Процедуры
—
DROP PROCEDURE IF EXISTS `Global_Macro_Date`$$
CREATE PROCEDURE `Global_Macro_Date`()
COMMENT ‘Текущая дата в глобальный макрос’
BEGIN
— Текущая дата в формате ГГГГ.ММ.ДД
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%Y.%m.%d’) WHERE `globalmacro`.`macro` = ‘{$DATE}’;
— Текущая дата в формате ГГГГММДД
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%Y%m%d’) WHERE `globalmacro`.`macro` = ‘{$DATEYYYYMMDD}’;
— Текущая дата в формате ДД.ММ.ГГГГ
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%d.%m.%Y’) WHERE `globalmacro`.`macro` = ‘{$DATEDD.MM.YYYY}’;
— Текущий Год формате ГГГГ
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%Y’) WHERE `globalmacro`.`macro` = ‘{$DATE_YYYY}’;
— Текущий Год Формате ГГ
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%y’) WHERE `globalmacro`.`macro` = ‘{$DATE_YY}’;
— Текущий Месяц формат ММ
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%m’) WHERE `globalmacro`.`macro` = ‘{$DATE_MM}’;
— Текущий День формат ДД
UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%d’) WHERE `globalmacro`.`macro` = ‘{$DATE_DD}’;
— Номер недели в текущем месяце
UPDATE `globalmacro` SET `value` = WEEK(CURDATE(),1)-WEEK(DATE_FORMAT(CURRENT_DATE(),’%Y-%m-01′),1)+1 WHERE `globalmacro`.`macro` = ‘{$WEEK_NUMBER_MONTH}’;
— Номер дня недели (1-ПН)
UPDATE `globalmacro` SET `value` = WEEKDAY(CURDATE())+1 WHERE `globalmacro`.`macro` = ‘{$WEEK_DAY}’;
— Количество дней в текущем месяце
UPDATE `globalmacro` SET `value` =DAY(LAST_DAY(CURDATE())) WHERE `globalmacro`.`macro` = ‘{$DAYS_CURRENT_MONTH}’;
— Количество дней в предыдущем месяце
UPDATE `globalmacro` SET `value` =DAYOFMONTH(LAST_DAY(NOW() — INTERVAL 1 MONTH)) WHERE `globalmacro`.`macro` = ‘{$NUM_DAYS_PREV_MONTH}’;
— Количеством секунд в предыдущем месяце, прибавляя 10800 секунд (3 часа)
UPDATE `globalmacro` SET `value` =DAYOFMONTH(LAST_DAY(NOW() — INTERVAL 1 MONTH)) * 24 * 60 * 60 + 10800 WHERE `globalmacro`.`macro` = ‘{$TRIG_SECONDS_PREV_MONTH}’;
— Минус 1 день из даты
UPDATE `globalmacro` SET `value` = LPAD(DAY(DATE_SUB(CURDATE(), INTERVAL 1 DAY)), 2, ‘0’) WHERE `globalmacro`.`macro` = ‘{$DATE_DD_1DAY}’;
UPDATE `globalmacro` SET `value` = LPAD(MONTH(DATE_SUB(CURDATE(), INTERVAL 1 DAY)), 2, ‘0’) WHERE `globalmacro`.`macro` = ‘{$DATE_MM_1DAY}’;
UPDATE `globalmacro` SET `value` = YEAR(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) WHERE `globalmacro`.`macro` = ‘{$DATE_YYYY_1DAY}’;
END$$
DELIMITER ;
Добавим событие для запуска процедуры каждые сутки в 00:00:00 часов
DROP EVENT `Global_Macro_Date`$$
DELIMITER $$
—
— События
—
CREATE EVENT `Global_Macro_Date`
ON SCHEDULE EVERY 1 DAY STARTS
STARTS ‘2021-11-28 00:00:00’
ON COMPLETION PRESERVE
ENABLE
COMMENT ‘Текущая дата в глобальный макрос’
DO BEGIN
CALL `Global_Macro_Date`();
END$$
DELIMITER ;
Возможно в событии нужно задать пустые приёмные/аргументы для вызова процедуры
SET @p0=»; SET @p1=»; SET @p2=»; CALL `Global_Macro_Date`(@p0, @p1, @p2);
- Процедура
- Событие для процедуры
Текщее время
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME (),’%H’) WHERE `globalmacro`.`macro` = ‘{$TIME_HH}’;
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME(),’%i’) WHERE `globalmacro`.`macro` = ‘{$TIME_MM}’;
UPDATE `globalmacro` SET `value` = TIME_FORMAT(CURRENT_TIME(),’%S’) WHERE `globalmacro`.`macro` = ‘{$TIME_SS}’;
Либо можно через скрипт sh прописать подключение к базе и выполнение команды через Cron либо из самого заббикса выполнение команды виде элемента данных.
mysql -uroot -pПароль -zabbixdb «UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%Y.%m.%d’) WHERE `globalmacro`.`macro` = ‘{$DATE}’;UPDATE `globalmacro` SET `value` = DATE_FORMAT(CURRENT_DATE(), ‘%Y%m%d’) WHERE `globalmacro`.`macro` = ‘{$DATEYYYYMMDD}’;»
И прописываем в крон
5 10 * * * root /etc/cron.d/DateMacroZabbix.sh > /dev/null 2>&1
‘@reboot root /etc/cron.d/DateMacroZabbix.sh > /dev/null 2>&1
Так же можно использовать Макросы Шаблон и узлов выбрав таблицу и ID узла или шаблона
hostmacro — Макросы Узлов (Хостов)
Вот так выглядит готовый шаблон
- Шаблон Подстановка дат
- Пример последних данных
Проверка пути файла Через сеть
- Проверка пути файла Через сеть
Дата раздельными числами потом можно скомпоновать из 3х макросов как угодно что более удобно, так же номер недели , кол — во дней в месяце и тп.
Как запрашивать Элемент данных в определенное время ? Пользовательские интервалы в Элементах данных
Всем привет!
Думаю, многие сталкивались с проблемой, когда в одну папку делается много копий бэкапов. При этом имя бэкапа не постоянное, в котором например, есть дата и время или порядковый номер.
Встает вопрос как мониторить актуальное состояние?
Предлагаю свое решение по реализации данной задачи с использованием Zabbix и небольшого скрипта на Python.
Опишу полный цикл своих бэкапов.
1. MSSQL ежедневно делает бэкап базы с перезаписью в одно и тоже место с одним и тем же именем:
D:\backup\mssql\my_data_base.bak
Данный файл мониторится просто.
в Zabbix создаем Элемент данных
vfs.file.time[D:\backup\mssql\my_data_base.bak,modify]
И на основе него создается тригер который проверяет не прошли ли сутки(86400сек.) с момента последнего бэкапа.
{host:vfs.file.time[D:\backup\mssql\my_data_base.bak,modify].now()}-{host:vfs.file.time[D:\backup\mssql\my_data_base.bak,modify].last()}>86400
2. Далее Cobian сжимает и переносит данный бэкап в несколько мест. В хранилище на том же сервере, плюс кладет в сетевое хранилище, где циклично обновляет 14 копий.
Например:
E:\backup\cobian\my_data_base
\\NAS\backup\cobian\my_data_base
В которых лежат файлы:
my_data_base 2018-12-12 05;30;55.7z
my_data_base 2018-12-11 05;30;54.7z
my_data_base 2018-12-10 05;30;55.7z
my_data_base 2018-12-09 05;30;56.7z
Соответственно имена файлов в каждой из директорий получаются однотипные, но динамические.
Казалось бы можно мониторить дату изменения директории с помощью того же элемента данных что и выше. Но не все так просто. У меня это не заработало. точнее заработало, но не правильно и плохо, дата изменения папки не обновлялась пока в нее не войдешь в ручную, хотя файл бэкапа был с правильной датой. Возможно были где то глюки винды. К тому же это совсем не захотело работать с сетевым путем (\\NAS\backup\ )
По этому собственно и родился данный скрипт:
import os, datetime, sys
def check_backup(path):
old = round(datetime.datetime.now().timestamp() - os.path.getmtime(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime)))
size = os.path.getsize(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime))
err = "1"
if size > 2097152:
if old < 86400:
err = "0"
print(err)
check_backup(sys.argv[1])
Передавая путь к директории с бэкапами данному скрипту он ищет самый новый файл в папке, оценивает размер его и как он давно был создан.
В данной примере бэкап должен быть больше 2MB и он не должен быть старше суток.
Если все ок скрипт передаст в заббикс 0 если что то не так то вернется 1.
В качестве аргумента скрипту передать можно как локальный путь так и сетевой. все прекрасно работает. Главное что бы был доступ.
Как это выглядит в заббиксе.
В первую очередь создаем юзер параметр.
Идем в zabbix_agent.conf и добавляем строку:
UserParameter=check_backup[*], "C:\Program Files (x86)\Python37-32\python.exe" C:\bin\scripts\find.py $1
Собственно здесь указывается путь к компилятору Python, далее путь до скрипта и параметр который будет взят из ключа check_backup[*]
В заббиксе Создаем элемент данных
на основании данного элемента создаем тригер который проверяет что именно передал нам скрипт. если это не 0 значит это проблема.
{host:check_backup[E:\backup\cobian\my_data_base\].last()}<>0
UPD: Добавил в качестве параметров уникальный размер для каждого бэкапа
import os, datetime, sys
def check_backup(path,ves):
ves = int(ves)
old = round(datetime.datetime.now().timestamp() - os.path.getmtime(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime)))
size = os.path.getsize(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime))
err = "1"
if size > ves:
if old < 86400:
err = "0"
print(err)
check_backup(sys.argv[1],sys.argv[2])
В конфиге заббикса соответственно вызывается вот так
UserParameter=check_backup[*],"C:\Program Files (x86)\Python37-32\python.exe" C:\bin\scripts\find.py $1 $2
в элементах данных соответственно через запятую указывается размер в байтах.
{host:check_backup[E:\backup\cobian\my_data_base\,2097152].last()}<>0
Вот собственно и все. Спасибо за внимание.
The table provides details on the item keys that you can use with Zabbix agent items.
Key | ||||
---|---|---|---|---|
Description | Return value | Parameters | Comments | |
agent.hostname | ||||
Returns agent host name. | String value | – | Returns the actual value of the agent hostname from a configuration file. | |
agent.ping | ||||
Check the agent availability. | Returns ‘1’ if agent is available, nothing if unavailable. | – | Use function nodata() to check for host unavailability. | |
agent.version | ||||
Version of Zabbix agent. | String | – | Example of returned value: 1.8.2 | |
kernel.maxfiles | ||||
Maximum number of opened files supported by OS. | Number of files. Integer. | |||
kernel.maxproc | ||||
Maximum number of processes supported by OS. | Number of processes. Integer. |
|||
log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>] | ||||
Monitoring of log file. | Log. | file – full path and name of log file regexp – regular expression describing the required pattern encoding – code page identifier maxlines – maximum number of new lines per second the agent will send to Zabbix server or proxy. This parameter overrides the value of ‘MaxLinesPerSecond’ in zabbix_agentd.conf mode – possible values: all (default), skip (skip processing of older data). The mode parameter is supported from version 2.0. output – an optional output formatting template. The \0 escape sequence is replaced with the matched text while an \N (where N=1…9) escape sequence is replaced with Nth matched group (or an empty string if the N exceeds the number of captured groups). If <output> is left empty – the whole line containing the matched text is returned. Note that all global regular expression types except ‘Result is TRUE’ always return the whole matched line and the <output> parameter is ignored. The output parameter is supported from version 2.2. |
The item must be configured as an active check. If file is missing or permissions do not allow access, item turns unsupported. Examples: See also additional information on log monitoring. |
|
logrt[file_pattern,<regexp>,<encoding>,<maxlines>,<mode>,<output>] | ||||
Monitoring of log file with log rotation support. | Log. | file_pattern – absolute path to file and regexp describing the file name pattern regexp – regular expression describing the required content pattern encoding – code page identifier maxlines – maximum number of new lines per second the agent will send to Zabbix server or proxy. This parameter overrides the value of ‘MaxLinesPerSecond’ in zabbix_agentd.conf mode – possible values: all (default), skip (skip processing of older data). The mode parameter is supported from version 2.0. output – an optional output formatting template. The \0 escape sequence is replaced with the matched text while an \N (where N=1…9) escape sequence is replaced with Nth matched group (or an empty string if the N exceeds the number of captured groups). If <output> is left empty – the whole line containing the matched text is returned. Note that all global regular expression types except ‘Result is TRUE’ always return the whole matched line and the <output> parameter is ignored. The output parameter is supported from version 2.2. |
The item must be configured as an active check. Log rotation is based on the last modification time of files. Examples: See also additional information on log monitoring. |
|
net.dns[<ip>,zone,<type>,<timeout>,<count>] | ||||
Checks if DNS service is up. | 0 – DNS is down (server did not respond or DNS resolution failed) 1 – DNS is up |
ip – IP address of DNS server (leave empty for the default DNS server, ignored on Windows) zone – zone to test the DNS type – record type to be queried (default is SOA) timeout (ignored on Windows) – timeout for the request in seconds (default is 1 second) count (ignored on Windows) – number of tries for the request (default is 2) |
Example key: net.dns[8.8.8.8,zabbix.com,MX,2,1] The possible values for type are: SRV record type is supported since Zabbix agent versions 1.8.6 (Unix) and 2.0.0 (Windows). Internationalized domain names are not supported, please use IDNA encoded names instead. Naming before Zabbix 2.0 (still supported): net.tcp.dns |
|
net.dns.record[<ip>,zone,<type>,<timeout>,<count>] | ||||
Performs a DNS query. | On success returns a character string with the required type of information. | ip – IP address of DNS server (leave empty for the default DNS server, ignored on Windows) zone – zone to test the DNS type – record type to be queried (default is SOA) timeout (ignored on Windows) – timeout for the request in seconds (default is 1 second) count (ignored on Windows) – number of tries for the request (default is 2) |
Example key: net.dns.record[8.8.8.8,zabbix.com,MX,2,1] The possible values for type are: SRV record type is supported since Zabbix agent versions 1.8.6 (Unix) and 2.0.0 (Windows). Internationalized domain names are not supported, please use IDNA encoded names instead. Naming before Zabbix 2.0 (still supported): net.tcp.dns.query |
|
net.if.collisions[if] | ||||
Out-of-window collision. | Number of collisions. Integer. |
if – interface | ||
net.if.discovery | ||||
List of network interfaces. Used for low-level discovery. | JSON object | Supported since Zabbix agent version 2.0.
On FreeBSD, OpenBSD and NetBSD supported since Zabbix agent version 2.2. |
||
net.if.in[if,<mode>] | ||||
Incoming traffic statistics on network interface. | Integer. | if – network interface name mode – possible values: bytes – number of bytes (default) packets – number of packets errors – number of errors dropped – number of dropped packets |
Multi-byte interface names on Windows are supported since Zabbix agent version 1.8.6.
Example keys: You may use this key with a Delta (speed per second) store value in order to get bytes per second statistics. |
|
net.if.out[if,<mode>] | ||||
Outgoing traffic statistics on network interface. | Integer. | if – network interface name mode – possible values: bytes – number of bytes (default) packets – number of packets errors – number of errors dropped – number of dropped packets |
Multi-byte interface names on Windows are supported since Zabbix agent 1.8.6 version.
Example keys: You may use this key with a Delta (speed per second) store value in order to get bytes per second statistics. |
|
net.if.total[if,<mode>] | ||||
Sum of incoming and outgoing traffic statistics on network interface. | Integer. | if – network interface name mode – possible values: bytes – number of bytes (default) packets – number of packets errors – number of errors dropped – number of dropped packets |
Example keys: net.if.total[eth0,errors] net.if.total[eth0] You may use this key with a Delta (speed per second) store value in order to get bytes per second statistics. Note that dropped packets are supported only if both net.if.in and net.if.out work for dropped packets on your platform. |
|
net.tcp.listen[port] | ||||
Checks if this TCP port is in LISTEN state. | 0 – it is not 1 – it is in LISTEN state |
port – TCP port number | Example: net.tcp.listen[80] On Linux supported since Zabbix agent version 1.8.4 |
|
net.tcp.port[<ip>,port] | ||||
Check, if it is possible to make TCP connection to port number port. | 0 – cannot connect 1 – can connect |
ip – IP address(default is 127.0.0.1) port – port number |
Example: net.tcp.port[,80] can be used to test availability of web server running on port 80. Old naming: check_port[*] For simple TCP performance testing use net.tcp.service.perf[tcp,<ip>,<port>] Note that these checks may result in additional messages in system daemon logfiles (SMTP and SSH sessions being logged usually). |
|
net.tcp.service[service,<ip>,<port>] | ||||
Checks if service is running and accepting TCP connections. | 0 – service is down 1 – service is running |
service – either of: ssh, ntp, ldap, smtp, ftp, http, pop, nntp, imap, tcp, https, telnet ip – IP address (default is 127.0.0.1) port – port number (by default standard service port number is used) |
Example key: net.tcp.service[ftp,,45] – can be used to test the availability of FTP server on TCP port 45. Note that these checks may result in additional messages in system daemon logfiles (SMTP and SSH sessions being logged usually). Checking of encrypted protocols (like IMAP on port 993 or POP on port 995) is currently not supported. As a workaround, please use net.tcp.port for checks like these. Checking of LDAP and HTTPS by Windows agent is currently not supported. Note that the telnet check looks for a prompt (‘:’ at the end). Old naming: check_service[*] Note that before Zabbix 1.8.3 version service.ntp should be used instead of ntp. https and telnet services are supported since Zabbix 2.0. |
|
net.tcp.service.perf[service,<ip>,<port>] | ||||
Checks performance of service. | 0 – service is down; seconds – the number of seconds spent while connecting to the service |
service – either of: ssh, ntp, ldap, smtp, ftp, http, pop, nntp, imap, tcp, https, telnet ip – IP address (default is 127.0.0.1) port – port number (by default standard service port number is used) |
Example key: net.tcp.service.perf[ssh] – can be used to test the speed of initial response from SSH server. Checking of encrypted protocols (like IMAP on port 993 or POP on port 995) is currently not supported. As a workaround, please use net.tcp.service.perf[tcp,<ip>,<port>] for checks like these. Checking of LDAP and HTTPS by Windows agent is currently not supported. Note that the telnet check looks for a prompt (‘:’ at the end). Old naming: check_service_perf[*] Note that before Zabbix 1.8.3 version service.ntp should be used instead of ntp. https and telnet services are supported since Zabbix 2.0. |
|
net.udp.listen[port] | ||||
Checks if this UDP port is in LISTEN state. | 0 – it is not 1 – it is in LISTEN state |
port – UDP port number | Example: net.udp.listen[68] On Linux supported since Zabbix agent version 1.8.4 |
|
proc.mem[<name>,<user>,<mode>,<cmdline>] | ||||
Memory used by process running under some user. | Memory used by process (in bytes). | name – process name (default is “all processes”) user – user name (default is “all users”) mode – possible values: avg, max, min, sum (default) cmdline – filter by command line (it is a regular expression) |
Example keys: proc.mem[,root] – memory used by all processes running under the “root” user proc.mem[zabbix_server,zabbix] – memory used by all zabbix_server processes running under the zabbix user proc.mem[,oracle,max,oracleZABBIX] – memory used by the most memory-hungry process running under oracle having oracleZABBIX in its command line |
|
proc.num[<name>,<user>,<state>,<cmdline>] | ||||
The number of processes having certain state running under some user. | Number of processes. | name – process name (default is “all processes”) user – user name (default is “all users”) state – possible values: all (default), run, sleep, zomb cmdline – filter by command line (it is a regular expression) |
Example keys: proc.num[,mysql] – number of processes running under the mysql user proc.num[apache2,www-data] – number of apache2 processes running under the www-data user proc.num[,oracle,sleep,oracleZABBIX] – number of processes in sleep state running under oracle having oracleZABBIX in its command line On Windows, only the name and user parameters are supported. |
|
sensor[device,sensor,<mode>] | ||||
Hardware sensor reading. | device – device name sensor – sensor name mode – possible values: avg, max, min (if this parameter is omitted, device and sensor are treated verbatim). |
On Linux 2.4, reads /proc/sys/dev/sensors. Example key: sensor[w83781d-i2c-0-2d,temp1] Prior to Zabbix 1.8.4, the sensor[temp1] format was used. On Linux 2.6+, reads /sys/class/hwmon. See a more detailed description of sensor item on Linux. On OpenBSD, reads the hw.sensors MIB. |
||
system.boottime | ||||
Timestamp of system boot. | Integer. | A UNIX timestamp (date and time, down to a second) returned. | ||
system.cpu.intr | ||||
Device interrupts. | Integer. | |||
system.cpu.load[<cpu>,<mode>] | ||||
CPU load. | Processor load. Float. |
cpu – possible values: all (default), percpu (total load divided by online CPU count) mode – possible values: avg1 (one-minute average, default), avg5 (5-minute average), avg15 (an average within 15 minutes) |
Example key: system.cpu.load[,avg5] Old naming: system.cpu.loadX |
|
system.cpu.num[<type>] | ||||
Number of CPUs. | Number of available processors. | type – possible values: online (default), max |
Example key: system.cpu.num |
|
system.cpu.switches | ||||
Context switches. | Switches count. | Old naming: system[switches] | ||
system.cpu.util[<cpu>,<type>,<mode>] | ||||
CPU(s) utilisation. | Processor utilisation in percent. | cpu – CPU number (default is all CPUs) type – possible values: idle, nice, user (default), system (default for Windows), iowait, interrupt, softirq, steal mode – possible values: avg1 (one-minute average, default), avg5 (5-minute average), avg15 (an average within 15 minutes) |
Example key: system.cpu.util[0,user,avg5] Old naming: system.cpu.idleX, system.cpu.niceX, system.cpu.systemX, system.cpu.userX |
|
system.hostname[<type>] | ||||
Returns host name. | String value | type (Windows only, must not be used on other systems) – possible values: netbios (default) or host | The value is acquired by either GetComputerName() (for netbios) or gethostname() (for host) functions on Windows and by “hostname” command on other systems. The type parameter for this item is supported since 1.8.6 version. Examples of returned values: See also a more detailed description. |
|
system.hw.chassis[<info>] | ||||
Returns chassis info | String value | info – one of full (default), model, serial, type or vendor | Example: system.hw.chassis[full] Hewlett-Packard HP Pro 3010 Small Form Factor PC CZXXXXXXXX Desktop] Root permissions are required because the value is acquired by reading from memory. Supported since Zabbix agent version 2.0. |
|
system.hw.cpu[<cpu>,<info>] | ||||
Returns CPU info | String or numeric value | cpu – CPU number or all (default) info – one of full (default), curfreq, maxfreq, model or vendor |
Example: system.hw.cpu[0,vendor] AuthenticAMD Gathers info from /proc/cpuinfo and /sys/devices/system/cpu/[cpunum]/cpufreq/cpuinfo_max_freq. Supported since Zabbix agent version 2.0. |
|
system.hw.devices[<type>] | ||||
Lists PCI or USB devices | Text value | type – pci (default) or usb | Example: system.hw.devices[pci] 00:00.0 Host bridge: Advanced Micro Devices [AMD] RS780 Host Bridge [..] Returns the output of either lspci or lsusb utility (executed without any parameters) Supported since Zabbix agent version 2.0. |
|
system.hw.macaddr[<interface>,<format>] | ||||
Lists MAC addresses | String value | interface – all (default) or a regular expression format – full (default) or short |
Example: system.hw.macaddr[«eth0$»,full] [eth0] 00:11:22:33:44:55 Lists MAC adresses of the interfaces whose names match the given interface regexp (“all” lists for all interfaces). Supported since Zabbix agent version 2.0. |
|
system.localtime[<type>] | ||||
System time. | Integer or string value. | utc – (default) the time since the Epoch (00:00:00 UTC, January 1, 1970), measured in seconds. local – the time in the ‘yyyy-mm-dd,hh:mm:ss.nnn,+hh:mm’ format Parameters for this item supported from version 2.0. |
||
system.run[command,<mode>] | ||||
Run specified command on the host. | Text result of the command. | command – command for execution mode – one of wait (default, wait end of execution), nowait (do not wait) |
Up to 512KB of data can be returned, including trailing whitespace that is truncated. To be processed correctly, the output of the command must be text. Example: system.run[ls -l /] – detailed file list of root directory. Note: To enable this functionality, agent configuration file must have EnableRemoteCommands=1 option. |
|
system.stat[resource,<type>] | ||||
Virtual memory statistics | Numeric value | ent – number of processor units this partition is entitled to receive (float) kthr,<type> – information about kernel thread states: r – average number of runnable kernel threads (float) b – average number of kernel threads placed in the Virtual Memory Manager wait queue (float) memory,<type> – information about the usage of virtual and real memory: avm – active virtual pages (integer) fre – size of the free list (integer) page,<type> – information about page faults and paging activity: fi – file page-ins per second (float) fo – file page-outs per second (float) pi – pages paged in from paging space (float) po – pages paged out to paging space (float) fr – pages freed (page replacement) (float) sr – pages scanned by page-replacement algorithm (float) faults,<type> – trap and interrupt rate: in – device interrupts (float) sy – system calls (float) cs – kernel thread context switches (float) cpu,<type> – breakdown of percentage usage of processor time: us – user time (float) sy – system time (float) id – idle time (float) wa – idle time during which the system had outstanding disk/NFS I/O request(s) (float) pc – number of physical processors consumed (float) ec – the percentage of entitled capacity consumed (float) lbusy – indicates the percentage of logical processor(s) utilization that occurred while executing at the user and system level (float) app – indicates the available physical processors in the shared pool (float) disk,<type> – disk statistics: bps – indicates the amount of data transferred (read or written) to the drive in bytes per second (integer) tps – indicates the number of transfers per second that were issued to the physical disk/tape (float) This item is supported starting from version 1.8.1. |
||
system.sw.arch | ||||
Returns software architecture | String value | Example: system.sw.arch i686 Info is acquired from uname() function. Supported since Zabbix agent version 2.0. |
||
system.sw.os[<info>] | ||||
Returns OS info | String value | info – one of full (default), short or name | Example: system.sw.os[short] Ubuntu 2.6.35-28.50-generic 2.6.35.11 Info is acquired from (note that not all files are present in all distributions): Supported since Zabbix agent version 2.0. |
|
system.sw.packages[<package>,<manager>,<format>] | ||||
Lists installed packages | Text value | package – all (default) or a regular expression manager – all (default) or a package manager format – full (default) or short |
Example: system.sw.packages[mini,dpkg,short] python-minimal, python2.6-minimal, ubuntu-minimal Lists (alphabetically) installed packages whose names match the given package regexp (“all” lists them all). Supported packages managers: If format is specified as full, packages are grouped by package managers (each manager on a seperate line beginning with it’s name in square brackets). Supported since Zabbix agent version 2.0. |
|
system.swap.in[<device>,<type>] | ||||
Swap in (from device into memory) statistics. | Numeric value | device – device used for swapping (default is all) type – possible values: count (number of swapins), sectors (sectors swapped in), pages (pages swapped in). See supported by platform for details on defaults. |
Example key: system.swap.in[,pages] The source of this information is: |
|
system.swap.out[<device>,<type>] | ||||
Swap out (from memory onto device) statistics. | Numeric value | device – device used for swapping (default is all) type – possible values: count (number of swapouts), sectors (sectors swapped out), pages (pages swapped out). See supported by platform for details on defaults. |
Example key: system.swap.out[,pages] The source of this information is: |
|
system.swap.size[<device>,<type>] | ||||
Swap space size. | Number of bytes or percentage. | device – device used for swapping (default is all) type – possible values: free (free swap space, default), pfree (free swap space, in percent), pused (used swap space, in percent), total (total swap space), used (used swap space) |
Example key: system.swap.size[,pfree] – free swap space percentage Old naming: system.swap.free, system.swap.total |
|
system.uname | ||||
Returns detailed host information. | String value | Example of returned value: FreeBSD localhost 4.2-RELEASE FreeBSD 4.2-RELEASE #0: Mon Nov i386 Since Zabbix 2.2.0, the value for this item is obtained by using the uname() system call, whereas previously it was obtained by invoking “uname -a” on Unix systems. Hence, the value of this item might differ from the output of “uname -a” and does not include additional information that “uname -a” prints based on other sources. |
||
system.uptime | ||||
System uptime in seconds. | Number of seconds. | In item configuration, use s or uptime units to get readable values. | ||
system.users.num | ||||
Number of users logged in. | Number of users. | who command is used on the agent side to obtain the value. | ||
vfs.dev.read[<device>,<type>,<mode>] | ||||
Disk read statistics. | Integer if type is in: sectors, operations, bytes
Float if type is in: sps, ops, bps |
device – disk device (default is “all”1) type – possible values: sectors, operations, bytes, sps, ops, bps (must be specified, since defaults differ under various OSes). sps, ops, bps stand for: sectors, operations, bytes per second, respectively mode – possible values: avg1 (one-minute average, default), avg5 (five-minute average), avg15 (15-minute average). Note: The third parameter is supported only if the type is in: sps, ops, bps. |
Default values of ‘type’ parameter for different OSes: FreeBSD – bps Linux – sps OpenBSD – operations Solaris – bytes Example key: vfs.dev.read[,operations] Usage of the type parameters ops, bps and sps on supported platforms used to be limited to 8 devices (7 individual devices and one “all”). Starting with Zabbix 2.0.1 this limit has been increased to 1024 (1023 individual devices and one for “all”). Supports LVM since Zabbix 1.8.6. Until Zabbix 1.8.6, only relative device names may be used (for example, sda), since 1.8.6 an optional /dev/ prefix may be used (for example, /dev/sda) |
|
vfs.dev.write[<device>,<type>,<mode>] | ||||
Disk write statistics. | Integer if type is in: sectors, operations, bytes
Float if type is in: sps, ops, bps |
device – disk device (default is “all”1) type – one of sectors, operations, bytes, sps, ops, bps (must specify exactly which parameter to use, since defaults are different under various OSes). sps, ops, bps means: sectors, operations, bytes per second respectively mode – one of avg1 (default),avg5 (average within 5 minutes), avg15. Note: The third parameter is supported only if the type is in: sps, ops, bps. |
Default values of ‘type’ parameter for different OSes: FreeBSD – bps Linux – sps OpenBSD – operations Solaris – bytes Example: vfs.dev.write[,operations] Old naming: io[*] The type parameters ops, bps and sps on supported platforms used to be limited to 8 devices (7 individual devices and one “all”). Starting with Zabbix 2.0.1 this limit has been increased to 1024 (1023 individual devices and one for “all”). Supports LVM since Zabbix 1.8.6. Until Zabbix 1.8.6, only relative device names may be used (for example, sda), since 1.8.6 optional /dev/ prefix may be used (for example, /dev/sda) |
|
vfs.file.cksum[file] | ||||
Calculate file checksum | File checksum, calculated by algorithm used by UNIX cksum. | file – full path to file | Example of returned value: 1938292000 Example: Old naming: cksum The file size limit depends on large file support. |
|
vfs.file.contents[file,<encoding>] | ||||
Get file contents | Contents of a file or empty string if it is empty or it contains only LF/CR characters. | file – full path to file | Example: vfs.file.contents[/etc/passwd] This item is limited to files no larger than 64 Kbytes. Supported since Zabbix agent version 2.0. |
|
vfs.file.exists[file] | ||||
Check if file exists | 1 – regular file or a link (symbolic or hard) to regular file exists.
0 – otherwise |
file – full path to file | Example: vfs.file.exists[/tmp/application.pid]
The return value depends on what S_ISREG POSIX macro returns. The file size limit depends on large file support. |
|
vfs.file.md5sum[file] | ||||
File’s MD5 checksum | MD5 hash of the file. | file – full path to file | Example of returned value: b5052decb577e0fffd622d6ddc017e82 Example: The file size limit (64 MB) for this item was removed in version 1.8.6. The file size limit depends on large file support. |
|
vfs.file.regexp[file,regexp,<encoding>,<start line>,<end line>,<output>] | ||||
Find string in a file. | The line containing the matched string, or as specified by the optional <output> parameter. An empty string if no line matched the expression. |
file – full path to file regexp – GNU regular expression encoding – Code Page identifier start line – the number of first line to search. Defaults to the first line of file. end line – the number of last line to search. Defaults to the last line of file. output – an optional output formatting template. The \0 escape sequence is replaced with the matched text while an \N (where N=1…9) escape sequence is replaced with Nth matched group (or an empty string if the N exceeds the number of captured groups). If <output> is left empty – the whole line containing the matched text is returned. The start line, end line and output parameters are supported from version 2.2. |
Only the first matching line is returned. Examples: vfs.file.regexp[/etc/passwd,zabbix] vfs.file.regexp[/path/to/some/file,”([0-9]+)$”,,3,5,\1] vfs.file.regexp[/etc/passwd,^zabbix:.:([0-9]+),,,,\1] – getting the ID of user zabbix |
|
vfs.file.regmatch[file,regexp,<encoding>,<start line>,<end line>] | ||||
Find string in a file | 0 – expression not found 1 – found |
file – full path to file regexp – GNU regular expression encoding – Code Page identifier start line – the number of first line to search. Defaults to the first line of file. end line – the number of last line to search. Defaults to the last line of file. The start line and end line parameters are supported from version 2.2. |
Example: vfs.file.regmatch[/var/log/app.log,error] | |
vfs.file.size[file] | ||||
File size | Size in bytes. | file – full path to file | File must have read permissions for user zabbix
Example: vfs.file.size[/var/log/syslog] The file size limit depends on large file support. |
|
vfs.file.time[file,<mode>] | ||||
File time information. | Unix timestamp. | file – full path to the file mode – one of modify (default, modification time), access – last access time, change – last change time |
Example: vfs.file.time[/etc/passwd,modify]
The file size limit depends on large file support. |
|
vfs.fs.discovery | ||||
List of mounted filesystems. Used for low-level discovery. | JSON object | Supported since Zabbix agent version 2.0. | ||
vfs.fs.inode[fs,<mode>] | ||||
Number of inodes | Numeric value | fs – filesystem mode – one of total (default), free, used, pfree (free, percentage), pused (used, percentage) |
Example: vfs.fs.inode[/,pfree] Old naming: vfs.fs.inode.free[*], vfs.fs.inode.pfree[*], vfs.fs.inode.total[*] | |
vfs.fs.size[fs,<mode>] | ||||
Disk space | Disk space in bytes | fs – filesystem mode – one of total (default), free, used, pfree (free, percentage), pused (used, percentage) |
In case of a mounted volume, disk space for local file system is returned. Example: vfs.fs.size[/tmp,free] Old naming: vfs.fs.free[*], vfs.fs.total[*], vfs.fs.used[*], vfs.fs.pfree[*], vfs.fs.pused[*] | |
vm.memory.size[<mode>] | ||||
Memory size | Memory size in bytes or in percentage from total | mode – one of total (default), active, anon, buffers, cached, exec, file, free, inactive, pinned, shared, wired, used, pused, available, pavailable | Old naming: vm.memory.buffers, vm.memory.cached, vm.memory.free, vm.memory.shared, vm.memory.total
Item vm.memory.size[] accepts three categories of parameters. First category consists of total – total amount of memory. Second category contains platform-specific memory types: active, anon, buffers, cached, exec, file, free, inactive, pinned, shared, wired. Third category are user-level estimates on how much memory is used and available: used, pused, available, pavailable. See a more detailed description of vm.memory.size parameters. |
|
web.page.get[host,<path>,<port>] | ||||
Get content of web page | Web page source as text | host – hostname path – path to HTML document (default is /) port – port number (default is 80) |
Returns empty string on fail. Example: web.page.get[www.zabbix.com,index.php,80] |
|
web.page.perf[host,<path>,<port>] | ||||
Get timing of loading full web page | Time in seconds | host – hostname path – path to HTML document (default is /) port – port number (default is 80) |
Returns 0 on fail. Example: web.page.perf[www.zabbix.com,index.php,80] |
|
web.page.regexp[host,<path>,<port>,<regexp>,<length>,<output>] | ||||
Find string on a web page. | The matched string, or as specified by the optional <output> parameter. An empty string if no match was found. |
host – hostname path – path to HTML document (default is /) port – port number (default is 80) regexp – GNU regular expression length – maximum number of characters to return output – an optional output formatting template. The \0 escape sequence is replaced with the matched text while an \N (where N=1…9) escape sequence is replaced with Nth matched group (or an empty string if the N exceeds the number of captured groups). If <output> is left empty – the whole line containing the matched text is returned. The output parameter is supported from version 2.2. |
Returns empty string on fail (no match). Example: web.page.regexp[www.zabbix.com,index.php,80,OK,2] |
A Linux-specific note. Zabbix agent must have read-only access to filesystem /proc. Kernel patches from www.grsecurity.org limit access rights of non-privileged users.