8 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 Datenbank-Server.

Dazu sollte ein benutzerdefinierter Datenpunkt erstellt werden, der eine JSON-Zeichenfolge zurückgibt und die gefundenen Objekte sowie optional einige ihrer Eigenschaften angibt. Die Anzahl der Makros pro Entität ist nicht begrenzt – während die integrierten Discovery-Regeln entweder ein oder zwei Makros zurückgeben (zum Beispiel zwei bei der Dateisystem-Erkennung), ist es möglich, mehr zurückzugeben.

Beispiel

Das erforderliche JSON-String-Format lässt sich am besten anhand eines Beispiels veranschaulichen. Angenommen, Sie verwenden einen alten Zabbix 1.8 Agent (einen, der den Schlüssel vfs.fs.discovery nicht unterstützt), müssen aber dennoch Dateisysteme erkennen. Hier ist ein einfaches Perl-Skript für Linux, das eingehängte Dateisysteme erkennt und JSON ausgibt, das sowohl den Dateisystemnamen als auch den Typ enthält. Eine Möglichkeit, es zu verwenden, 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 Übersichtlichkeit neu formatiert) ist unten dargestellt. Das JSON für benutzerdefinierte Discovery-Prüfungen muss demselben Format folgen.

[
    { "{#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 Prototypen verwendeten LLD-Makronamen übereinstimmen. Alternativ können LLD-Makrowerte mit JSONPath extrahiert werden: {#FSNAME}$.fsname und {#FSTYPE}$.fstype. Dadurch wird ein solches Skript möglich:

#!/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 Übersichtlichkeit neu formatiert) ist unten dargestellt.

[
    { "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önnen Sie im Feld Filter der Discovery-Regel "{#FSTYPE}" als Makro und "rootfs|ext3" als regulären Ausdruck angeben.

Sie müssen bei benutzerdefinierten LLD-Regeln keine Makronamen wie FSNAME/FSTYPE verwenden; Sie können beliebige Namen Ihrer Wahl verwenden. Falls JSONPath verwendet wird, ist die LLD-Zeile ein Array-Element, das ein Objekt sein kann, aber auch ein anderes Array oder ein Wert sein kann.

Beachten Sie, dass der Rückgabewert bei Verwendung eines Benutzerparameters auf 16 MB begrenzt ist. Weitere Details finden Sie unter Datenlimits für LLD-Rückgabewerte.