7 Benutzerdefinierte LLD-Regeln
Übersicht
Es ist auch möglich, eine vollständig benutzerdefinierte LLD-Regel zu erstellen, die beliebige Arten von Entitäten erkennt - zum Beispiel Datenbanken auf einem Datenbankserver.
Dazu sollte ein benutzerdefinierter Datenpunkt erstellt werden, der einen JSON-String zurückgibt, in dem gefundene Objekte und optional einige ihrer Eigenschaften angegeben sind. Die Anzahl der Makros pro Entität ist nicht begrenzt - während die integrierten Erkennungsregeln entweder ein oder zwei Makros zurückgeben (zum Beispiel zwei für die Dateisystemerkennung), ist es möglich, mehr zurückzugeben.
Beispiel
Das erforderliche JSON-String-Format lässt sich am besten anhand eines Beispiels veranschaulichen.
Angenommen, wir betreiben einen alten Zabbix 1.8 Agent (einen, der vfs.fs.discovery nicht unterstützt), benötigen aber dennoch eine Erkennung von Dateisystemen.
Hier ist ein einfaches Perl-Skript für Linux, das eingehängte Dateisysteme erkennt und JSON ausgibt, einschließlich Dateisystemname und Typ.
Eine Möglichkeit zur Verwendung wäre als UserParameter mit dem Schlüssel 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";
Zulässige Symbole für LLD-Makronamen sind 0-9 , A-Z , _ , .. Kleinbuchstaben werden in den Namen nicht unterstützt.
Ein Beispiel für die Ausgabe (zur besseren Lesbarkeit neu formatiert) ist unten dargestellt. JSON für benutzerdefinierte Erkennungsprüfungen muss dasselbe Format einhalten.
[
{ "{#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" }
]
Im vorherigen Beispiel ist es erforderlich, dass die Schlüssel mit den in den Prototypen verwendeten LLD-Makronamen übereinstimmen; alternativ können LLD-Makrowerte mit JSONPath extrahiert werden: {#FSNAME} → $.fsname und {#FSTYPE} → $.fstype, wodurch ein solches Skript möglich wird:
#!/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";
Ein Beispiel für die Ausgabe (zur besseren Lesbarkeit neu formatiert) ist unten dargestellt. JSON für benutzerdefinierte Erkennungsprüfungen muss dasselbe Format einhalten.
[
{ "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" }
]
Dann könnten wir im Feld "Filter" der Erkennungsregel {#FSTYPE} als Makro und rootfs|ext3 als regulären Ausdruck angeben.
Sie müssen bei benutzerdefinierten LLD-Regeln nicht die Makronamen FSNAME/FSTYPE verwenden, Sie können beliebige Namen wählen.
Falls JSONPath verwendet wird, ist die LLD-Zeile ein Array-Element, das ein Objekt sein kann, aber auch ein anderes Array oder ein Wert.
Beachten Sie, dass bei Verwendung eines UserParameter der Rückgabewert auf 16 MB begrenzt ist. Weitere Informationen finden Sie unter Datenlimits für LLD-Rückgabewerte.