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.