Обнаружение папок и запрос их размера LLD Шаблон + Скрипт

Шаблоны заббикс мониторинг связанный с файлами и директориями
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Обнаружение папок и запрос их размера LLD Шаблон + Скрипт

Сообщение Артём Мамзиков »

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

Добавлены элементы авто обнаружения и обычные элементы в шаблон.
Как работает запускается скрипт на хосте(ПК) считает размеры папок и пердает их в элемент(ы) через траппет.
Как запускается скрипт:
1) Через элемент данных в заббиксе 2 варианта что удобнее прописывается частота запуска опроса переменные в макросы.
2) Вариант при помощи планировщика заданий Cron далее либо в нем указываются входные данные в скрипт что проверяем или же назначаем переменные в самом скрипте.

При запросе Элемента данных Zabbix агент и Zabbix активный агент - у нас ограничение по времени ответа, т.е. ответ должен успеть придти за указанное время в файле конфигурации сервера и агента, максимальное время 30 секунд!
В нашем случае опрос директорий с множеством папок и файлов может занять длительное время опроса размера.
У меня периодически срабатывали триггеры на то что нет данных более 24 часов, опрос был 465 папок из них 120 например вылетали в ошибку что нет данных. Переделка из пассивного в активный агент данную проблему не решила. Таймаут был 15 секунд.


"При наличии больших директорий или медленных дисков этот элемент данных может превысить время ожидания из-за настройки Timeout в файлах конфигурации агента и сервера/прокси. При необходимости увеличьте эти значения времени ожидания."

Получаем что обнаружение у нас работает хорошо оставляем его без изменений, а вот с запросом элементов данных у нас есть проблемы.
Вместо ключа vfs.dir.size будем использовать, другой ключ. Так же Тип: Элемента данных Заббикс агент и Заббикс агент активный нам не подходит, и сделать скрипт на хосте у агента прописать его в конфиг назначить пользовательский ключ, ничего нее выйдет так как опять работа через агента время ограниченно и приходим к той же проблеме.

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

2. Можно сделать скрипт с входными данными указав их в ключе, далее скрипт нам отдаст размер опять же получаем ограничение времени на ответ аналогично ключу vfs.dir.size) не подходит

3. Вывести скриптом размер директорий в файл лога и забрать значения из файла лога уже посчитанные, и не тратить время на ожидания подсчета.

4. Получить списком через траппер данные виде одного лога и сделать зависимые элементы на основе его (что то вроде распарсивание данных для элементов по регуляркам)

5. Сделать через внешнюю проверку, через скрипт вместо заббикс агента

Скажу сразу что вышло в итоге:
1.Скрипт закидывается на хост с которого нам нужно получить данные

2.Запуск скрипта:
2.1.Можно прописать его в Крон с входными параметрами или задать переменные внутри скрипта.
2.2.Запускать скрипт с Заббикс сервера через заббикс агент указав ключ system.run['{$SCRIPT.DIR}' '{HOST.HOST}' '{$PATH.DIR}',nowait]
Запуск удаленного скрипта, через заббикс агент
Запуск удаленного скрипта, через заббикс агент
2.3.Запускать скрипт с Заббикс сервера чрез внешнюю проверку указав ключ size-dir.sh[{HOST.CONN},runscript,'{$SCRIPT.DIR}',"'{HOST.HOST}'","'{$PATH.DIR}'"] (тут получается что сперва даем внутреннему скрипту данные после он запускает внешний скрипт на удаленном хосте)
Запуск удаленного скрипта, через основной Linux
Запуск удаленного скрипта, через основной Linux

3.Получение данных после запуска скрипта 2 варианта:
Авто обнаружение нам создает из прототипов элементов, элементы данных
3.1.Из скрипта для каждого элемента шлем данные через trapper из выполняемого цикла для каждой директории
Прототип элемента Имя Size-Dir-Trapper-{#DIRSIZELINUX} Ключ folder[{#DIRSIZELINUX}]
Size-Dir-Trapper-{#DIRSIZELINUX}
Size-Dir-Trapper-{#DIRSIZELINUX}
3.2.Из скрипта отправляем данные после выполнения циклов одним Логом в 1 элемент данных через trapper Имя Size-Dir-Trapper-LOG Ключ dirlog
далее в прототипах элементов создаем зависимые элементы данных от основного элемента, и распарсиваем лог по элементам по регулярке.
Size-Dir-Trapper-LOG
Size-Dir-Trapper-LOG
Size-Dir-Trapper-LOG-{#DIRSIZELINUX}
Size-Dir-Trapper-LOG-{#DIRSIZELINUX}

Установить если не установлен zabbix_sender

Инструкция под Linux OS
Скачать можно например
http://repo.zabbix.com/zabbix/4.2/debia ... /z/zabbix/ пакет zabbix-sender_4.2.8-1+jessie_amd64.deb для 8 debian 64-bit
Установка
dpkg -i zabbix-sender_4.2.8-1+jessie_amd64.deb


Переходим непосредственно к написанию скрипта.
Для скрипта нам нужны входные данные, куда направлять ответ и что проверять:
$1 - Имя узла сети {HOST.HOST}
$2 - Директории через точку запятую какие нужно проверить

Тестовая отправка и прием данных
Формируем для заббикс сервера, под ключ ответ
1.Со стороны хоста отправка через траппер
zabbix_sender -z 192.168.175.111 -p 10051 -s HOST.HOST -k Имя-директории -o полученный-размер
zabbix_sender -z 192.168.175.111 -p 10051 -s cloud -k folder[/var/www/owncloud/data/проверяемая/] -o 4386280

Прием со стороны Заббикс Сервера прототип ключа автобнаружения
folder[{#DIRSIZELINUX}]
получаем folder[/var/www/owncloud/data/проверяемая/]

Все ок работает можно делать скрипт)

Еще протестировал другой вариант
2.Пример на основе зависимых элементов передаем весь текст через траппер
Делаем зависимый элементов
Регулярка /var/www/owncloud/data/ZalyginaES/ ([0-9]+) вывод \1 - получаем размер

3.Можно попробовать сделать ключ запроса system.run["du -s {#DIRSIZELINUX}| awk '{print $1}'"] но опять же получаем работу через агента ограничение по времени ответа

Получился такой скрипт для удаленного хоста dir-size-trappet.sh
dir-size-trappet.sh
Показать
#!/bin/bash

# Входные данные $1 -Имя узла сети {HOST.HOST} ; $2 - Директории через точку запятую какие нужно проверить
# Пример команды ./ИмяТекущегоСкрипта.sh "HOST.HOST" "/root;/var/www/owncloud/data"
# Данный скрипт в указанной папке сканирует директории, далее поочередно запрашивает их размер

# Проверка нескольких директорий на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo $2)

# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# # ls -aF a -отобразить все содержимое, параметр F -Добавить специальные символы к именам файлов, которые показывают, что это за файл
get=`ls -F "${puti}"|grep -E \*/`

# Запрашиваем папки циклом
IFS=$'\n'
for dirp in $get
do
putdir="${puti}"/"${dirp}"

# Получение размера в байтах | первый столбец (du -sb .[^.]* *)
sizedir=`du -sb "${putdir}"| awk '{print $1}'`
JSON=$JSON""${putdir}" "${sizedir}"\n"

# Вывод поочередно и отправка траппетом для каждой директории отдельно.

#echo "${putdir}" "${sizedir}"
#zabbix_sender -z 192.168.175.111 -p 10051 -s $1 -k folder["${putdir}"] -o "${sizedir}"
done
done

# Вывод одним списком для всех директорий и отправка в виде Лога

#echo -e $JSON
zabbix_sender -z 192.168.175.111 -p 10051 -s $1 -k dirlog -o "${JSON}"

Пример запроса
./dir-size-trappet.sh "HOST.HOST" "/root;/var/www/owncloud/data"
./dir-size-trappet.sh "HOST.HOST" /root


Вместо крона, запуск со стороны заббикс сервера
$1 {HOST.CONN} - IP адрес или DNS имя узла сети (192.168.101.23)
$2 {$SCRIPT.DIR} - Путь где лежит скрипт на удаленном хосте (/root/test kat d/dir-size-trappet.sh)
$3 {HOST.HOST} - Имя узла сети (cloud)
$4 {$PATH.DIR} - Путь сканируемых Директорий (/root;/var/www/owncloud/data)
Для порта $2 {$HOST.PORTS} пример zabbix_get -s $1 -p $2 -k system.run


zabbix_get -s $1 -k system.run["$2 $3 $4",nowait]
zabbix_get -s $1 -p $2 -k system.run["$3 $4 $5",nowait]

Виде элемента, так как элемент уже будет запрашивается с узла IP и Port уже не нужен получаем ключ
system.run[''{$SCRIPT.DIR}' '{HOST.HOST}' '{$PATH.DIR}'',nowait]
1 - в режиме​ nowait не ожидать завершения выполнения команды (независимо от результата выполнения команды)

Ключ заббикс через Zabbix агент (дает команду на запуск скрипта на удаленном хосте)
Ключ system.run['{$SCRIPT.DIR}' '{HOST.HOST}' '{$PATH.DIR}',nowait]
Ключ system.run['{$SCRIPT.DIR}' {$HOST.PORTS} '{HOST.HOST}' '{$PATH.DIR}',nowait]
Ключ system.run[$('{$SCRIPT.DIR}' {$HOST.PORTS} '{HOST.HOST}' '{$PATH.DIR}'),nowait]
Ключ system.run[`'{$SCRIPT.DIR}' {$HOST.PORTS} '{HOST.HOST}' '{$PATH.DIR}'`,nowait]
Ключ system.run[{$SCRIPT.DIR} "{HOST.HOST}" "{$PATH.DIR}",nowait] -Windows
Ключ system.run['{$SCRIPT.DIR}' '{HOST.HOST}' '{$PATH.DIR}',nowait] -Linux


Или делаем через основной скрипт поиска директорий
Получаем следующий вид ключа заббикс Внешняя проверка
Одни кавычки теряются при входе в ходе скрипт, далее надо передать значение так же в кавычка экранировано по этому 2ные кавычки
size-dir.sh[{HOST.CONN},runscript,'{$SCRIPT.DIR}',"'{HOST.HOST}'","'{$PATH.DIR}'"]
Проверка командой на сервере
cd /usr/local/share/zabbix/externalscripts
./size-dir.sh '192.168.175.111' 'runscript' "'/root/test kat d/dir-size-trappet.sh'" "'agentzabbixserver'" "'/root'"

Добавлено в основной скрипт следующее:
Ключ size-dir.sh[{HOST.CONN},runscript,'{$SCRIPT.DIR}',"'{HOST.HOST}'","'{$PATH.DIR}'"]
в скрипте
if [[ $2 = "runscript" ]]
then
zabbix_get -s $1 -k system.run["$3 $4 $5",nowait]
# Для тестирования вывод в лог
#SDATE=`date '+%d.%m.%y %H:%M:%S'`
#echo ${SDATE} zabbix_get -s $1 -k system.run["$3 $4 $5",nowait] >> /tmp/log
fi

С портом
Ключ size-dir.sh[{HOST.CONN},{$HOST.PORTS},runscript,"'{$SCRIPT.DIR}'","'{HOST.HOST}'","'{$PATH.DIR}'"]
в скрипте
if [[ $3 = "runscript" ]]
then
zabbix_get -s $1 -p $2 -k system.run["$4 $5 $6",nowait]
# Для тестирования вывод в лог
#SDATE=`date '+%d.%m.%y %H:%M:%S'`
#echo ${SDATE} zabbix_get -s $1 -p $2 -k system.run["$4 $5 $6",nowait] >> /tmp/log
fi


Разные варианты запроса папок с пробелами и экранирующие кавычки.
zabbix_get -s 192.168.175.97 -k system.run[''/root/dir-size-trappet.sh' 'cloud' '/root;/var/www/owncloud/data'',nowait]
еще пример
zabbix_get -s 192.168.175.111 -k system.run[''/root/dir-size-trappet.sh' 'agentzabbixserver' '/root;'',nowait]


скрипт можно закинуть например в /etc/zabbix/script/dir-size-trappet.sh

Лучше использовать
ключ system.run['{$SCRIPT.DIR}' '{HOST.HOST}' '{$PATH.DIR}',nowait] более прямой путь запроса
И элементы на основе лога
количество слов: 657
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Обнаружение папок и запрос их размера LLD Шаблон + Скрипт

Сообщение Артём Мамзиков »

Для Windows скрипт на CMD bat

Данные скрипты работают нормально на формирование лог файла и далее на зависимые элементы данных, данные выводятся из скрипта для того что бы переделать кодировку из cp866 в utf8. Если использовать передачу для каждого элемента в цикле он не поддерживает русское название папок.
Еще момент при запуске скрипта через элемент заббикса путь где лежит сам скрипт на хосте не должен содержать пробелы так как system.run не работает с командой которая начинается на " двойные кавычки , а если передать в ' одинарных кавычках не работает команда в cmd по этому первая входная переменная не экранирована остальные все переменные далее ок.


Проверка
в cmd Путь-Имя-Скрипта Имя-ПК Проверяемые-Директории
C:\Windows\system32>C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "21Program" "C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"

Со стороны заббикс сервера через скрипт
root@ZABBIXSERVER:/usr/local/share/zabbix/externalscripts# zabbix_get -s 192.168.175.8 -k system.run['C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "21Program" "C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"']

root@ZABBIXSERVER:/usr/local/share/zabbix/externalscripts# ./size-dir.sh 192.168.175.8 runscriptwin 'C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat' '"21Program"' '"C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"'

dir-size-trapper-win-cp866-File.bat
dir-size-trapper-win-cp866-File.bat
Показать
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.0 30.04.2021
TITLE dir-size-trapper-win

:: Входные переменные %1 - имя узла, %2 - путь сканируемой директории
setlocal enabledelayedexpansion

set PCNAME=%1
set way=%2
:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слеш \ , разворачиваем.
set way=%way:/=\%
::set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории (накопительная переменная)
for /f "tokens=1 delims=" %%b in ('dir /A:D /B %%a\') do set puti=!puti!%%a\%%b;
)
:: Убираем все кавычки
set puti=%puti:"=%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
::echo %puti%

:: Разбор по адресам (путям)
for %%c in (%puti%) do set dirname=%%c& call:size

:: Меняем кодировку через файл так как Zabbix sender принимает строки в UTF-8 кодировке
:: Определение текущей кодировки может отличатся 866 и 1251
for /f "tokens=2 delims=:" %%s in ('chcp') do set "kodstr=%%s"
:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
:: Вывод одним списком для всех директорий и отправка в виде Лога
echo "%JSON%" >> "%~dp0SIZEDIR.TXT"
:: Cкрыть временный файл
::copy /b NUL "%~dp0SIZEDIR.TXT"
attrib +h "%~dp0SIZEDIR.TXT"
:: Кодировка 1251
chcp 1251 > nul
:: Читаем перекодированный файл и выводим в переменную
for /f "usebackq tokens=*" %%t in ("%~dp0SIZEDIR.TXT") do set JSON=%%t
zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k dirlogwin -o %JSON%
:: Удаление файла
del /F /Q /A:H "%~dp0SIZEDIR.TXT"
:: Возврат кодировки
chcp %kodstr:~1% > nul
:end

:size
:: Получаем размер директории в байтах (слово файлов в 866 д c<Rў)
for /f "tokens=1-3" %%d in ('2^>nul Dir %dirname% /-C /S /A:-D^|find /I "файлов"') Do Set DirSize=%%f
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
set dirname=%dirname:\=/%
:: Вывод поочередно и отправка траппетом для каждой директории отдельно. (вместо set JSON=!JSON!%DirNS%) не поддерживает русские имена папок
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %PCNAME% -k folderwin[%dirname%] -o "%DirSize%"
set DirNS=%dirname% %DirSize%\n
set JSON=!JSON!%DirNS%
:: Убираем все кавычки
set JSON=%JSON:"=%
setlocal DISABLEDELAYEDEXPANSION
dir-size-trapper-win-cp1251-File.bat
dir-size-trapper-win-cp1251-File.bat
Показать
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.0 30.04.2021
TITLE dir-size-trapper-win

:: Входные переменные %1 - имя узла, %2 - путь сканируемой директории
setlocal enabledelayedexpansion

set PCNAME=%1
set way=%2
:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слеш \ , разворачиваем.
set way=%way:/=\%
::set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории (накопительная переменная)
for /f "tokens=1 delims=" %%b in ('dir /A:D /B %%a\') do set puti=!puti!%%a\%%b;
)
:: Убираем все кавычки
set puti=%puti:"=%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
::echo %puti%

:: Разбор по адресам (путям)
for %%c in (%puti%) do set dirname=%%c& call:size

:: Меняем кодировку через файл так как Zabbix sender принимает строки в UTF-8 кодировке
:: Определение текущей кодировки может отличатся 866 и 1251
for /f "tokens=2 delims=:" %%s in ('chcp') do set "kodstr=%%s"
:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
:: Вывод одним списком для всех директорий и отправка в виде Лога
echo "%JSON%" >> "%~dp0SIZEDIR.TXT"
:: Cкрыть временный файл
::copy /b NUL "%~dp0SIZEDIR.TXT"
attrib +h "%~dp0SIZEDIR.TXT"
:: Кодировка 1251
chcp 1251 > nul
:: Читаем перекодированный файл и выводим в переменную
for /f "usebackq tokens=*" %%t in ("%~dp0SIZEDIR.TXT") do set JSON=%%t
zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k dirlogwin -o %JSON%
:: Удаление файла
del /F /Q /A:H "%~dp0SIZEDIR.TXT"
:: Возврат кодировки
chcp %kodstr:~1% > nul
:end

:size
:: Получаем размер директории в байтах (слово файлов в 866 д ©«®ў)
for /f "tokens=1-3" %%d in ('2^>nul Dir %dirname% /-C /S /A:-D^|find /I "д ©«®ў"') Do Set DirSize=%%f
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
set dirname=%dirname:\=/%
:: Вывод по очередной и отправка траппетом для каждой директории отдельно. (вместо set JSON=!JSON!%DirNS%) не поддерживает русские имена папок
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %PCNAME% -k folderwin[%dirname%] -o "%DirSize%"
set DirNS=%dirname% %DirSize%\n
set JSON=!JSON!%DirNS%
:: Убираем все кавычки
set JSON=%JSON:"=%
setlocal DISABLEDELAYEDEXPANSION
Прием данных логом
Элемент данных: Size-Dir-Trapper-LOG-Windows
Тип: Zabbix траппер
Ключ: dirlogwin
Тип информации: Текст
Группа элемента данных: Size-Dir
Описание:
Для долгих элементов подсчета размера директорий
Общий Лог пути и размер директорий, на него настраиваем зависимые элементы
Активировать не обходимо если используется правило автообнаружения
Windows Обнаружение папок в определенной дириктории Trapper Логом
Size-Dir-Trapper-LOG-Windows.jpg
Size-Dir-Trapper-LOG-Windows.jpg

Вместо планировщика задания 2 варианта
Элемент данных: Запуск удаленного скрипта, через основной Windows
Тип: Внешняя проверка
Ключ: size-dir.sh[{HOST.CONN},runscriptwin,'{$SCRIPT.DIR}','"{HOST.HOST}"','"{$PATH.DIR}"']
Тип информации: Текст
Интервал обновления: 6h
Периуд хранения истории: 90d
Группа элемента данных: Size-Dir
Описание:
Запуск удаленного скрипта, через основной
Для получение данных о размере директорий через trapper
Вместо крона запуск со стороны заббикс сервера
Макросы с $ задать в узле
{HOST.CONN} - IP адрес или DNS имя узла сети (192.168.101.23)
{$SCRIPT.DIR} - Путь где лежит скрипт на удаленном хосте нужной кодировки без кавычек, не работает путь с пробелами ("C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat")
{HOST.HOST} - Имя узла сети (test)
{$PATH.DIR} - Путь сканируемых Дирикторий (C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users)
Получаем команду
zabbix_get -s $1 -k system.run['$4 "$5" "$6",nowait']
Запуск удаленного скрипта, через основной Windows.jpg
Запуск удаленного скрипта, через основной Windows.jpg

Элемент данных: Запуск удаленного скрипта, через заббикс агент Windows
Тип: Zabbix агент
Ключ: system.run[{$SCRIPT.DIR} "{HOST.HOST}" "{$PATH.DIR}",nowait]
Тип информации: Числовой (целое положительное)
Интервал обновления: 6h
Периуд хранения истории: 90d
Группа элемента данных: Size-Dir
Описание:
Запуск удаленного скрипта, через заббикс агент
Для получение данных о размере директорий через trapper
Вместо крона запуск со стороны заббикс сервера
Макросы с $ задать в узле
{$SCRIPT.DIR} - Путь где лежит скрипт на удаленном хосте (C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat или dir-size-trapper-win-cp1251-File.bat)
{HOST.HOST} - Имя узла сети (test)
{$PATH.DIR} - Путь сканируемых Дирикторий (C:\Users\1;C:\Program Files (x86);C:\Users\All Users)
Запуск удаленного скрипта, через заббикс агент Windows
Запуск удаленного скрипта, через заббикс агент Windows

Автообнаружение
Имя: Windows Обнаружение папок в определенной дириктории cp1251 Trapper Логом
Тип: Внешняя проверка
Ключ: size-dir.sh[{HOST.CONN},discoverywincp,{$PATH.DIR},trapper_log]
Интервал обновления: 24h
Период сохранения потерянных ресурсов: 30d
Описание:
Директория где искать задается в Макросе узла
Декодировка Windows для Русcкого шрифта из cp1251
Для определения какая у вас кодировка запросите в cmd команду
chcp
Путь на паку идет с обратными слешеми /, иначе считается \ спец символами
Можно подумать как в Предобработке вернуть Win слеши
Для долгих запросов, подсчета размера директорий вместо ключа vfs.dir.size используем скрипт, через крон и траппер для передачи данных о размерах директорий разом (логом) в 1 элемент, далее создаются зависимые элементы.

Активировано
Windows Обнаружение папок в определенной дириктории cp1251 Trapper Логом.jpg
Windows Обнаружение папок в определенной дириктории cp1251 Trapper Логом.jpg

Прототипы элементов данных
Имя: Size-Dir-Trapper-LOG-{#DIRSIZEWINCP}
Тип: Зависимый элемент данных
Ключ: dirlogwin[{#DIRSIZEWINCP}]
Основной элемент данных: Обнаружение папок и запрос их размера: Size-Dir-Trapper-LOG-Windows
Тип информации: Числовой (с плавающей точкой)
Единица измерения: B
Период хранения истории: 90d
Период хранения динамики изменений: 90d
Отображение значения: Как есть
Группы элементов данных: Size-Dir
Описание:
Получаем размер директории с помощью скрипта и траппера , которые долго обсчитываются. Получаем их из общего лога элемента и обрабатываем регулярным выражением.
Создать активированным: V

Предобработка
Регулярное выражение {#DIRSIZEWINCP} ([0-9]+) \1
Прототип элемента данных Size-Dir-Trapper-LOG-{#DIRSIZEWINCP}.jpg
Прототип элемента данных Size-Dir-Trapper-LOG-{#DIRSIZEWINCP}.jpg

Прототипы триггеров
Имя: {HOST.NAME}-DIR-{#DIRSIZEWINCP}-TRAPPER-LOG-SIZE-BOLEE>9GB
Важность: Средняя
Выражение: {Discovery-size-dir:dirlogwin[{#DIRSIZEWINCP}].last()}>9663676416 or
{Discovery-size-dir:dirlogwin[{#DIRSIZEWINCP}].nodata(25h)}=1
Разрешить закрывать вручную: V
Описание:
Объем папки {#DIRSIZEWINCP} на {HOST.NAME} более ГБ
Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})
Если нет данных 25 часов ошибка
Создать активированным: V
Прототип триггера {HOST.NAME}-DIR-{#DIRSIZEWINCP}-T
Прототип триггера {HOST.NAME}-DIR-{#DIRSIZEWINCP}-T

Автообнаружение
Имя: Windows Обнаружение папок в определенной дириктории cp1251 Trapper
Тип: Внешняя проверка
Ключ: size-dir.sh[{HOST.CONN},discoverywincp,{$PATH.DIR},trapper]
Интервал обновления: 24h
Период сохранения потерянных ресурсов: 30d
Описание:
Директория где искать задается в Макросе узла
Декодировка Windows для Русcкого шрифта из cp1251
Для определения какая у вас кодировка запросите в cmd команду
chcp
Путь на паку идет с обратными слешеми /, иначе считается \ спец символами
Можно подумать как в Предобработке вернуть Win слеши
Для долгих запросов, подсчета размера директорий вместо ключа vfs.dir.size используем скрипт, через крон и траппер для передачи данных о размерах директорий разом (логом) в 1 элемент, далее создаются зависимые элементы.

Активировано
Windows Обнаружение папок в определенной дириктории cp1251 Trapper
Windows Обнаружение папок в определенной дириктории cp1251 Trapper

Прототипы элементов данных
Имя: Size-Dir-Trapper-{#DIRSIZEWINCP}
Тип: Zabbix траппер
Ключ: folderwin[{#DIRSIZEWINCP}]
Тип информации: Числовой (с плавающей точкой)
Единица измерения: B
Период хранения истории: 90d
Период хранения динамики изменений: 90d
Отображение значения: Как есть
Группы элементов данных: Size-Dir
Описание:
Получаем размер директории с помощью скрипта и траппера , которые долго обсчитываются.
zabbix_sender.exe -z IP-узла -p Порт -s HOST.HOST -k Имя-дириктории -o полученный-размер
Создать активированным: V
Прототип элемента данных Size-Dir-Trapper-{#DIRSIZEWINCP}.jpg
Прототип элемента данных Size-Dir-Trapper-{#DIRSIZEWINCP}.jpg

Прототипы триггеров
Имя: {HOST.NAME}-DIR-{#DIRSIZEWINCP}-TRAPPER-LOG-SIZE-BOLEE>9GB
Важность: Средняя
Выражение: {Discovery-size-dir:folderwin[{#DIRSIZEWINCP}].last()}>9663676416 or
{Discovery-size-dir:folderwin[{#DIRSIZEWINCP}].nodata(25h)}=1
Разрешить закрывать вручную: V
Описание:
Объем папки {#DIRSIZEWINCP} на {HOST.NAME} более ГБ
Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})
Если нет данных 25 часов ошибка

Создать активированным: V
Прототип триггера {HOST.NAME}-DIR-{#DIRSIZEWINCP}-T
Прототип триггера {HOST.NAME}-DIR-{#DIRSIZEWINCP}-T
Для кодировки cp866 все аналогично так же шаблон с портом добавлен только макрос порта
Правила обнаружения папок директорий.jpg
Правила обнаружения папок директорий.jpg
количество слов: 956
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Обнаружение папок и запрос их размера LLD Шаблон + Скрипт

Сообщение Артём Мамзиков »

Как создался скрипт для windows запрос размера
Команды запроса размера директорий тестирование
Показать
::@echo off
setlocal enabledelayedexpansion

set test="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set test=%test:;=";"%
echo %test%
pause

for %%a in (%test%) do ECHO %%a
pause

Set D=C:\Users\14-1
For /F "tokens=1-3" %%a IN ('Dir "%D%" /-C/S/A:-D') Do Set DirSize=!n2!& Set n2=%%c
Set DirSize=%DirSize:~0,-6%
Echo Size of %D% is %DirSize% MB.
pause


Set D=l:\Bash
For /F "tokens=1-3" %%a IN ('Dir "%D%" /-C/S/A:-D') Do Set DirSize=!n2!& Set n2=%%c
CAll :var_count "%DirSize%" VarC
Set /A VarC-=6
if %VarC% LEQ 0 (Set DirSizeMB=0) else (Set DirSizeMB=%DirSize:~0,-6%)
if %VarC% GEQ 1 Set DirSizeMB=%DirSizeMB%,!DirSize:~%VarC%,2!
Echo Size of %D% is %DirSizeMB% MB.
pause& Goto :eof

:var_count %1-Var.Value %2-Var.Count.Result
::Определяет длину переменной
set var=%~1
if not defined var exit /b
set var=%var:~1%
set /a %~2+=1
call :var_count "%var%" %~2
exit /b


for /f "tokens=3" %%a in ('2^>nul Dir "C:\Users\14-1" /-C /S /A:-D^|find /I "д ©«®ў"') do set pps=%%a
echo Размер папки - %pps% байт
pause

set "d=C:\papka"

for /f "tokens=3" %%a in ('2^>nul dir /a-d/s/-c "%d%"') do set sz=!pps!& set pps=%%a
echo Размер папки - %sz% байт
pause

set size=0
for /f "tokens=*" %%x in ('dir C:\Users\14-1 /s /a /b %1') do set /a size+=%%~zx
echo.!size!

endlocal
pause

set size=0
for /r %%x in (dir C:\Users\14-1\*) do set /a size+=%%~zx
echo %size% Bytes

For /F "skip=4 tokens=1-3" %%a IN ('Dir "%DirProg%" /-C /S /A:-D^|find /I "файлов"') Do (
If !flag!==1 Set dirsize=%%c
If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)
)
Echo %dirsize%

pause

Начало создания скрипта

Для одной папки
dir-size-trapper-win.bat
Показать
::@echo off
::mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 20.04.2021
TITLE dir-size-trapper-win

:: Входные переменные %1 - имя узла, %2 - путь сканируемой дириктории

setlocal enabledelayedexpansion
:: Разбор входных дирикторий, если их нексколько
::for /f "tokens=* delims=;" %%a in (%2) do (
set tes=C:\Users\14-1
:: Запрос содержание данной директории
for /f "tokens=1 delims=" %%b in ('dir /A:D /B %tes%\') do (
:: Получаем размер дириктории в байтах (слово файлов в 866 д ©«®ў) Вывод одним списком для всех дирикторий виде Лога
for /f "tokens=1-3" %%c in ('2^>nul Dir "%tes%\%%b" /-C /S /A:-D^|find /I "д ©«®ў"') Do (
If !flag!==1 set JSON=!JSON!%tes%\%%b %%e\n
If "%%d"=="д ©«®ў:" (Set flag=1) Else (Set flag=0)
))
:: Вывод одним списком для всх дирикторий и отправка в виде Лога
echo "%JSON%"
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k dirlogwin -o "%JSON%"

:: Вывод по очередно и отправка траппетом для кадой дириктории отдельно. (вместо set JSON=!JSON!%tes%\%%b %%e\n)
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k folderwin["%tes%\%%b"] -o "%%e"
setlocal DISABLEDELAYEDEXPANSION
pause

:: Получаем размер дириктории в байтах (слово файлов в 866 д ©«®ў)
::For /F "skip=4 tokens=1-3" %%c IN ('Dir "%dirname%" /-C /S /A:-D^|find /I "д ©«®ў"') do (
::If !flag!==1 Set dirsize=%%e
::If "%%d"=="д ©«®ў:" (Set flag=1) Else (Set flag=0)
::)
Далее попытки для нескольких папок, после вопрос с кодировкой utf-8 все же пришлось делать вывод в файл.
dir-size-trapper-win2.bat
Показать
::@echo off
::mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 20.04.2021
TITLE dir-size-trapper-win

:: Входные переменные %1 - имя узла, %2 - путь сканируемой дириктории
setlocal enabledelayedexpansion

set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных дирикторий, если их нексколько
for %%a in (%way%) do set waydir=%%a& call:put

:: Вывод одним списком для всх дирикторий и отправка в виде Лога
echo 123"%JSON%"
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k dirlogwin -o "%JSON%"
pause
goto:eof

:put
:: Запрос содержание данной директории
for /f "tokens=1 delims=" %%b in ('dir /A:D /B %waydir%\') do set dirname=%waydir%\%%b& call:size
:: Вывод одним списком для всх дирикторий и отправка в виде Лога
echo "%JSON%"
pause

:size
:: Получаем размер дириктории в байтах (слово файлов в 866 д ©«®ў)
for /f "tokens=1-3" %%c in ('2^>nul Dir "%dirname%" /-C /S /A:-D^|find /I "д ©«®ў"') Do (
Set DirSize=%%e
)
set DirNS=%dirname% %DirSize%
set JSON=!JSON!%DirNS%
exit /b
:: Вывод по очередно и отправка траппетом для кадой дириктории отдельно. (вместо set JSON=!JSON!%tes%\%%b %%e\n)
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k folderwin["%dirname%"] -o "%DirSize%"
setlocal DISABLEDELAYEDEXPANSION
dir-size-trapper-win3.bat
Показать
::@echo off
::mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 20.04.2021
TITLE dir-size-trapper-win

:: Входные переменные %1 - имя узла, %2 - путь сканируемой дириктории
setlocal enabledelayedexpansion

set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных дирикторий, если их нексколько
for %%a in (%way%) do (
:: Запрос содержание данной директории
for /f "tokens=1 delims=" %%b in ('dir /A:D /B %%a\') do set dirname=%%a\%%b& call:size
)
:: Вывод одним списком для всх дирикторий и отправка в виде Лога
echo 123"%JSON%"
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k dirlogwin -o "%JSON%"
pause
goto:eof
:size
:: Получаем размер дириктории в байтах (слово файлов в 866 д ©«®ў)
::for /f "tokens=1-3" %%c in ('2^>nul Dir "%dirname%" /-C /S /A:-D^|find /I "д ©«®ў"') Do Set DirSize=%%e
set DirNS=%dirname% %DirSize%
set JSON=!JSON!%DirNS%
echo err %ERRORLEVEL%
pause
exit /b
:: Вывод по очередно и отправка траппетом для кадой дириктории отдельно. (вместо set JSON=!JSON!%tes%\%%b %%e\n)
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k folderwin["%dirname%"] -o "%DirSize%"
setlocal DISABLEDELAYEDEXPANSION
dir-size-trapper-win4.bat
Показать
::@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 20.04.2021
TITLE dir-size-trapper-win

:: Входные переменные %1 - имя узла, %2 - путь сканируемой дириктории
setlocal enabledelayedexpansion

set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных дирикторий, если их нексколько
for %%a in (%way%) do (
:: Запрос содержание данной директории
for /f "tokens=1 delims=" %%b in ('dir /A:D /B %%a\') do (
:: Получаем размер дириктории в байтах (слово файлов в 866 д ©«®ў)
for /f "tokens=1-3" %%c in ('2^>nul Dir "%%a\%%b" /-C /S /A:-D^|find /I "д ©«®ў"') Do Set DirSize=!n2!& Set n2=%%e
)
set DirNS=%%a\%%b %DirSize%
set JSON=!JSON!%DirNS%
echo %%a\%%b %DirSize%
)
pause
:: Вывод по очередно и отправка траппетом для кадой дириктории отдельно. (вместо set JSON=!JSON!%tes%\%%b %%e\n)
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k folderwin["%dirname%"] -o "%DirSize%"
setlocal DISABLEDELAYEDEXPANSION
dir-size-trapper-win5.bat
Показать
::@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.0 30.04.2021
TITLE dir-size-trapper-win

:: Входные переменные %1 - имя узла, %2 - путь сканируемой дириктории
setlocal enabledelayedexpansion
set way=%2
:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слешь \ , разворачиваем.
set way=%way:/=\%
::set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных дирикторий, если их нексколько
for %%a in (%way%) do (
:: Запрос содержание данной директории (накопительная переменная)
for /f "tokens=1 delims=" %%b in ('dir /A:D /B %%a\') do set puti=!puti!%%a\%%b;
)
:: Убираем все кавычки
set puti=%puti:"=%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
::echo %puti%
:: Разбор по адресам (путям)
for %%c in (%puti%) do set dirname=%%c& call:size

:: Вывод одним списком для всх дирикторий и отправка в виде Лога
:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
for %%g in ("%JSON%") do set JSONS=%%g
chcp 1251 > nul
echo %JSONS%
zabbix_sender.exe -z 192.168.175.111 -p 10051 -s 21Program -k dirlogwin -o %JSONS%
pause
:end

:size
:: Получаем размер дириктории в байтах (слово файлов в 866 д ©«®ў)
for /f "tokens=1-3" %%d in ('2^>nul Dir %dirname% /-C /S /A:-D^|find /I "д ©«®ў"') Do Set DirSize=%%f
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
set dirname=%dirname:\=/%
:: Вывод по очередно и отправка траппетом для кадой дириктории отдельно. (вместо set JSON=!JSON!%DirNS%)
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k folderwin[%dirname%] -o "%DirSize%"
set DirNS=%dirname% %DirSize%\n
set JSON=!JSON!%DirNS%
:: Убираем все кавычки
set JSON=%JSON:"=%
setlocal DISABLEDELAYEDEXPANSION
dir-size-trapper-win5-cp866.bat
Показать
::@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.0 30.04.2021
TITLE dir-size-trapper-win

:: Определение текущей кодировки может отличатся 866 и 1251
for /f "tokens=2 delims=:" %%s in ('chcp') do set "kodstr=%%s"

:: Входные переменные %1 - имя узла, %2 - путь сканируемой дириктории
setlocal enabledelayedexpansion

set way=%2
:: Так как элементы данных у нас обнаруживаются с обычным слешем /, а для выполнения команд нам нужен обратный слешь \ , разворачиваем.
set way=%way:/=\%
::set way="C:\Users\14-1;C:\Program Files (x86);C:\Users\All Users"
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных дирикторий, если их нексколько
for %%a in (%way%) do (
:: Запрос содержание данной директории (накопительная переменная)
for /f "tokens=1 delims=" %%b in ('dir /A:D /B %%a\') do set puti=!puti!%%a\%%b;
)
:: Убираем все кавычки
set puti=%puti:"=%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
::echo %puti%

:: Разбор по адресам (путям)
for %%c in (%puti%) do set dirname=%%c& call:size

:: Вывод в кодировке UTF-8 (Zabbix sender принимает строки в UTF-8 кодировке (BOM))
chcp 65001 > nul
:: Вывод одним списком для всх дирикторий и отправка в виде Лога
echo "%JSON%"
zabbix_sender.exe -z 192.168.175.111 -p 10051 -s 21Program -k dirlogwin -o "%JSON%"
:: Возврат кодировки
chcp %kodstr:~1% > nul
pause
:end

:size
:: Получаем размер дириктории в байтах (слово файлов в 866 д c<Rў)
for /f "tokens=1-3" %%d in ('2^>nul Dir %dirname% /-C /S /A:-D^|find /I "файлов"') Do Set DirSize=%%f
:: Разворачиваем слеши, для совпадения ключей на заббик сервере и правильной работе регулярного выражения
set dirname=%dirname:\=/%
:: Вывод по очередно и отправка траппетом для кадой дириктории отдельно. (вместо set JSON=!JSON!%DirNS%)
::zabbix_sender.exe -z 192.168.175.111 -p 10051 -s %1 -k folderwin[%dirname%] -o "%DirSize%"
set DirNS=%dirname% %DirSize%\n
set JSON=!JSON!%DirNS%
:: Убираем все кавычки
set JSON=%JSON:"=%
setlocal DISABLEDELAYEDEXPANSION
И далее рабочие скрипты в сообщении выше через файл.
количество слов: 1335
Ответить Вложения 34 Пред. темаСлед. тема

Вернуться в «Файлы и Папки»