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.