Возможно также создать полностью пользовательское правило 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";
Пример его вывода (отформатированный для наглядности) показан ниже. 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" }
]
Затем, в поле «Фильтры» правила обнаружения, мы можем указать «{#FSTYPE}» как макрос и «rootfs|ext3» как регулярное выражение.
Вы не обязаны использовать имена макросов FSNAME/FSTYPE в пользовательских правилах LLD, вы можете выбирать такие имена, как вам нравится. В случае, если используется JSONPath, то строка LLD будет элементом массива, который может являться объектом, но также может быть другим массивом или значением.
Обратите внимание, если используется пользовательский параметр, то возвращаемое значение ограничено 16 МБ. Для получения более подробной информации смотрите ограничения данных для возвращаемых значений LLD.