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 как регулярное выражение.
Вам не обязательно использовать имена макросов вроде FSNAME/FSTYPE в пользовательских правилах LLD, вы можете использовать любые имена.
Если используется JSONPath, то строка LLD будет элементом массива, который может быть объектом, но также может быть и другим массивом или значением.
Обратите внимание: при использовании пользовательского параметра возвращаемое значение ограничено 16 МБ. Подробнее см. ограничения на данные для возвращаемых значений LLD.