Het is ook mogelijk om een volledig aangepaste LLD-regel te maken waarmee elk type entiteit kan worden ontdekt, bijvoorbeeld databases op een databaseserver.
Hiervoor moet een aangepast item worden gemaakt dat JSON retourneert en de gevonden objecten en optioneel enkele eigenschappen van die objecten specificeert. Het aantal macro's per entiteit is niet beperkt. Terwijl de ingebouwde ontdekkingsregels één of twee macro's retourneren (bijvoorbeeld twee voor bestandssysteemontdekking), is het mogelijk om er meer te retourneren.
Het vereiste JSON-formaat wordt het best geïllustreerd met een voorbeeld. Stel dat we een oude Zabbix 1.8-agent draaien (een die "vfs.fs.discovery" niet ondersteunt), maar we moeten nog steeds bestandssystemen ontdekken. Hier is een eenvoudig Perl-script voor Linux dat gemonteerde bestandssystemen ontdekt en JSON uitvoert, met zowel de naam als het type van het bestandssysteem. Een manier om dit te gebruiken is als een UserParameter met de sleutel "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";
Toegestane symbolen voor LLD-macro-namen zijn 0-9, A-Z, _, . Kleine letters worden niet ondersteund in de namen.
Een voorbeeld van de uitvoer (opnieuw geformatteerd voor duidelijkheid) wordt hieronder weergegeven. JSON voor aangepaste ontdekkingscontroles moet hetzelfde formaat volgen.
[
{ "{#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" }
]
In het vorige voorbeeld is het vereist dat de sleutels overeenkomen met de LLD-macronamen die worden gebruikt in prototypen; als alternatief kunnen LLD-macro-waarden worden geëxtraheerd met JSONPath {#FSNAME}
→ $.fsname
en {#FSTYPE}
→ $.fstype
, waardoor een dergelijk script mogelijk wordt:
#!/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";
Een voorbeeld van de uitvoer (opnieuw geformatteerd voor duidelijkheid) wordt hieronder weergegeven. JSON voor aangepaste ontdekkingscontroles moet hetzelfde formaat volgen.
[
{ "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" }
]
Vervolgens kunnen we in het "Filter" veld van de ontdekkingsregel "{#FSTYPE}" specificeren als een macro en "rootfs|ext3" als een reguliere expressie.
Je hoeft geen macro-namen FSNAME/FSTYPE te gebruiken bij aangepaste LLD-regels; je bent vrij om welke namen dan ook te gebruiken die je wilt. Als JSONPath wordt gebruikt, is de LLD-rij een array-element dat een object kan zijn, maar het kan ook een andere array of een waarde zijn.
Houd er rekening mee dat als je een gebruikersparameter gebruikt, de retourwaarde beperkt is tot 512 KB. Voor meer details, zie gegevenslimieten voor LLD-retourwaarden.