Иногда нужно настроить мониторинг каких-либо объектов на серверах, которые могут изменятся, например IIS сайты\пулы, размеры файлов, размеры кластерных дисков, базы данных и прочее. Для получения самих значений можно использовать встроннее метрики, например Performance Monitor в Windows Server, либо же скрипты\запросы, которые их получают.
Трудности доставляют сами изменяющиеся объекты, которые могут добавлятся\убираться, и каждый раз ручками конфигурировать итемы на хостах как-то не хочется. Вот тут нам поможет Low-level discovery (LLD).
К примеру у вас есть сервер, на котором крутятся сайты, которые ваши разработчки с некой переодичностью добавляют\удаляют. Задача мониторить количество коннекций к сайту, количество get/head/post запросов, статус апликейшн пулов (запущен или нет).
Поскольку я Виндовый админ, то будем использовать PowerShell, но по такому же принципу можно написать на любом языке.
И так для создания нового LLD нужен скрипт,а даже 2, которые будет получать список сайтов и список пулов, конвертировать его в JSON формат и предоставлять Заббиксу.
Выглядит готовый JSON так:
{
"data":[
{ "{#SITE}" : "site1" },
{ "{#SITE}" : "site2" },
{ "{#SITE}" : "site3" }
]
}
А потом уже заббикс для каждого из объектов будет получать данные параметров, для сайтов используя запоросы в Performance Monitor, для пулов - скрипт.
Получать список объектов можно любым скриптом, главное что бы заббикс агент его смог запустить.
И так создаём фаил с названием get-sites.ps1
Получаем список сайтов на сервере:
Import-Module WebAdministration
$sites = Get-ChildItem -Path IIS:\Sites -Name
Если вы тестите то для вывода результата введите $sites
Теперь весь список нужно представить в JSON формате, особенностью является то что в конце последнего значения объекта, не должна стоять запятая.
По этому вводим переменную $idx по которой мы будем проверять последний это объект или нет.
$idx = 1
Далее делаем шапку JSON:
write-host "{"
write-host " `"data`":[`n"
Далее будем каждый объект полученный ранее проверят последний он или нет.
Сверку будем проводить путем увеличения переменной $idx на 1, после создания каждого JSON объекта.
Если нет, то создаём JSON объект с запятой, если да, то создаём без запятой.
foreach ($currentsite in $sites) #каждый сайт из списка будет получать переменную $currentsite
{
if ($idx -lt $sites.count) #сравниваем $idx с количеством сайтов. -lt - меньше чем. Если получаем True то создаём строчку с запятой, если нет то двигаемся дальше.
{
$line= "{ `"{#SITE}`" : `"" + $currentsite + "`" }," # создание строчки с запятой
write-host $line
}
elseif ($idx -ge $site.count) # здесь опять сравниваем $idx с количеством с сайтов. -ge - больше или равно чем. Если True то создаём строчку без запятой
{
$line= "{ `"{#SITE}`" : `"" + $currentsite + "`" }" #строчка без запятой
write-host $line
}
$idx++; #В конце каждого прохода увеличиваем $idx на 1.
}
Ну и закрываем JSON.
write-host
write-host " ]"
write-host "}"
Логика проста: Получаем список сайтов, например 3 сайта. Значит нужно 3 прохода для создания 3 строчек для JSON.
Первый проход первый сайт. $idx=1. 1<3? Да. Создаём с запятой. Увеличиваем $idx на 1.
Второй проход второй сайт. $idx=2 . 2<3? Да. Создаём с запятой. Увеличиваем $idx на 1.
Третий проход третий сайт. $idx=3. 3<3? Нет. Идем дальше. 3>=3? Да. Создаём без запятой.
Таким же образом создаём скрипт get-apppool.ps1 для получения списка пулов:
Import-Module WebAdministration
$apppool = Get-ChildItem -Path IIS:\Apppools -Name
$idx = 1
write-host "{"
write-host " `"data`":[`n"
foreach ($currentapppool in $apppool)
{
if ($idx -lt $apppool.count)
{
$line= "{ `"{#APPPOOL}`" : `"" + $currentapppool + "`" },"
write-host $line
}
elseif ($idx -ge $apppool.count)
{
$line= "{ `"{#APPPOOL}`" : `"" + $currentapppool + "`" }"
write-host $line
}
$idx++;
}
write-host
write-host " ]"
write-host "}"
Далее оба скрипта кладем на сервер, например туда где стоит заббикс агент и в конфиг агента добавляем 2 юзер параметра:
UserParameter=apppool.discovery,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Program Files\Zabbix_agent\scripts\get-apppool.ps1"
UserParameter=site.discovery,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Program Files\Zabbix_agent\scripts\get_sites.ps1"
(Если честно, то не помню, нужно ли включать ActiveChecks и EnableRemoteCommands в конфиге. У меня везде включено.)
apppool.discovery и site.discovery - будут использиваться как ключи при создании LLD для запуска соответсвующих скриптов.
Далее в Заббиксе нашего сервера создаём новый дискавери:
Name: IIS Site #Название дискавери
Type: Zabbix agent #то чем будем делать дискавери
Key: site.discovery #ключ для вызова скрипта с получем списка сайтов. Мы его указали в UserParameter в конфиге агента на сервере
Host interface: айпишка и порт агент на сервере
Update interval (in sec): 3600 #как часто будем вызывать скрипт и получать список сайтов
Keep lost resources period (in days):3 #через сколько удалять сайтов, которых больше нет.
В фильтрах можно указать какие сайты исключить из списка.
Label Macro {#SITE} Regular expression @IIS
Сам список IIS создаётся в Administration > general > Regular Expresssions.
Например можно исключить Default Web Site для этого создаём список IIS и добавляем Expression type: Result is False; Expression: Default Web Site
Далее создаём прототипы айтемов в дискавери. Они практически ничем не будут отличаться от создания обычных айтемов. Только для объявления сайта используем {#SITE}
Например количество коннекций к IIS сайту. Данные получаем с Performance monitor:
Name: {#SITE}: Current connections
Type: Zabbix agent
Key: perf_counter[\Web Service({#SITE})\Current Connections]
Type of information: Numeric (unsigned)
Прежде чем создавать дискавеи для пулов, нужно создать скрипт, который будет получать статус пула.
Создаём PowerShell скрипт get-apppoolstate.ps1
param ([string] $name = 0)
Import-Module WebAdministration
$apppoolState = Get-WebAppPoolState -name "$name"
Write-Output ($apppoolState.value)
Сохраняем и кладем к агенту, туда куда и прошлые скрипты. Добавляем UserParameter в конфиг:
UserParameter=apppool.state[*],powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Program Files\Zabbix_agent\scripts\get_apppoolstate.ps1" "$1"
apppool.state - ключ для вызова скрипта.
[*] - параметр который мы будем передавать вместе с ключем, в нашем случае имя пула
$1 означает что мы будем передавать имя пула в скрипт, внутри скрипта имя пула пойдет в параметр $name
Теперь создаём дискавери для мониторинга апликейшн пулов создаём новый дискавери.
Name: IIS AppPool
Type: Zabbix agent
Key: apppool.discovery
Остальное как для сайта.
Создаём прототип айтема:
Name:IIS AppPool {#APPPOOL} state
Type:Zabbix agent
Key:apppool.state[{#APPPOOL}]
Type of information: Text
Ну и все, дальше можно настроить триггеры для обоих дискавери.
Например что пул не запущен:
Name: IIS AppPool {#APPPOOL} is down
Severity: Disaster
Expression: {MyWebServer:apppool.state[{#APPPOOL}].str(Stopped)}<>0