8 Пользовательские правила LLD
Обзор
Также можно создать полностью пользовательское правило LLD, обнаруживающее любой тип сущностей — например, базы данных на сервере баз данных.
Для этого следует создать пользовательский элемент данных, который возвращает строку JSON, указывая найденные объекты и, при необходимости, некоторые их свойства. Количество макросов на одну сущность не ограничено — в то время как встроенные правила обнаружения возвращают либо один, либо два макроса (например, два для обнаружения файловых систем), можно вернуть и больше.
Пример
Требуемый формат строки JSON лучше всего иллюстрируется на примере.
Предположим, что вы используете старый агент Zabbix 1.8 (тот, который не поддерживает ключ vfs.fs.discovery), но вам все еще нужно обнаруживать файловые системы.
Ниже приведен простой Perl-скрипт для Linux, который обнаруживает смонтированные файловые системы и выводит данные в JSON, включая имя файловой системы и ее тип.
Один из способов использовать его — как UserParameter с ключом vfs.fs.discovery_perl:
#!/usr/bin/perl
$first = 1;
print "[\n";
for (`cat /proc/mounts`)
{
($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
print "\t,\n" if not $first;
$first = 0;
print "\t{\n";
print "\t\t\"{#FSNAME}\":\"$fsname\",\n";
print "\t\t\"{#FSTYPE}\":\"$fstype\"\n";
print "\t}\n";
}
print "]\n";
Допустимые символы для имен макросов LLD: 0-9 , A-Z , _ , .. Строчные буквы в именах не поддерживаются.
Ниже показан пример его вывода (переформатирован для наглядности). JSON для пользовательских проверок обнаружения должен соответствовать тому же формату.
[
{ "{#FSNAME}":"/", "{#FSTYPE}":"rootfs" },
{ "{#FSNAME}":"/sys", "{#FSTYPE}":"sysfs" },
{ "{#FSNAME}":"/proc", "{#FSTYPE}":"proc" },
{ "{#FSNAME}":"/dev", "{#FSTYPE}":"devtmpfs" },
{ "{#FSNAME}":"/dev/pts", "{#FSTYPE}":"devpts" },
{ "{#FSNAME}":"/lib/init/rw", "{#FSTYPE}":"tmpfs" },
{ "{#FSNAME}":"/dev/shm", "{#FSTYPE}":"tmpfs" },
{ "{#FSNAME}":"/home", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/tmp", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/usr", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/var", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/sys/fs/fuse/connections", "{#FSTYPE}":"fusectl" }
]
В предыдущем примере требуется, чтобы ключи совпадали с именами макросов LLD, используемыми в прототипах; альтернативный вариант — извлекать значения макросов LLD с помощью JSONPath {#FSNAME} → $.fsname и {#FSTYPE} → $.fstype, что делает возможным такой скрипт:
#!/usr/bin/perl
$first = 1;
print "[\n";
for (`cat /proc/mounts`)
{
($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
print "\t,\n" if not $first;
$first = 0;
print "\t{\n";
print "\t\t\"fsname\":\"$fsname\",\n";
print "\t\t\"fstype\":\"$fstype\"\n";
print "\t}\n";
}
print "]\n";
Ниже показан пример его вывода (переформатирован для наглядности).
[
{ "fsname":"/", "fstype":"rootfs" },
{ "fsname":"/sys", "fstype":"sysfs" },
{ "fsname":"/proc", "fstype":"proc" },
{ "fsname":"/dev", "fstype":"devtmpfs" },
{ "fsname":"/dev/pts", "fstype":"devpts" },
{ "fsname":"/lib/init/rw", "fstype":"tmpfs" },
{ "fsname":"/dev/shm", "fstype":"tmpfs" },
{ "fsname":"/home", "fstype":"ext3" },
{ "fsname":"/tmp", "fstype":"ext3" },
{ "fsname":"/usr", "fstype":"ext3" },
{ "fsname":"/var", "fstype":"ext3" },
{ "fsname":"/sys/fs/fuse/connections", "fstype":"fusectl" }
]
Затем в поле Filter правила обнаружения можно указать {#FSTYPE} как макрос и rootfs|ext3 как регулярное выражение.
В пользовательских правилах LLD не обязательно использовать имена макросов вроде FSNAME/FSTYPE; вы можете использовать любые имена по своему усмотрению.
Если используется JSONPath, то строка LLD будет элементом массива, который может быть объектом, но также может быть и другим массивом или значением.
Обратите внимание: при использовании пользовательского параметра возвращаемое значение ограничено 16 МБ. Подробнее см. ограничения на данные для возвращаемых значений LLD.