8 Regole LLD personalizzate

Panoramica

È anche possibile creare una regola LLD completamente personalizzata, in grado di individuare qualsiasi tipo di entità, ad esempio i database su un server di database.

Per farlo, è necessario creare un item personalizzato che restituisca una stringa JSON, specificando gli oggetti trovati e, facoltativamente, alcune loro proprietà. Il numero di macro per entità non è limitato: mentre le regole di discovery integrate restituiscono una o due macro (ad esempio, due per la discovery del filesystem), è possibile restituirne di più.

Esempio

Il formato richiesto della stringa JSON è illustrato al meglio con un esempio. Supponiamo che tu stia eseguendo un vecchio agent Zabbix 1.8 (uno che non supporta la chiave vfs.fs.discovery), ma che tu abbia comunque bisogno di individuare i file system. Ecco un semplice script Perl per Linux che rileva i file system montati e li restituisce in formato JSON, includendo sia il nome sia il tipo di file system. Un modo per utilizzarlo sarebbe come UserParameter con chiave 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";

I simboli consentiti per i nomi delle macro LLD sono 0-9 , A-Z , _ , .. Le lettere minuscole non sono supportate nei nomi.

Di seguito è mostrato un esempio del relativo output (riformattato per maggiore chiarezza). Il JSON per i controlli di discovery personalizzati deve seguire lo stesso formato.

[
    { "{#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"  }
]

Nell'esempio precedente è necessario che le chiavi corrispondano ai nomi delle macro LLD utilizzate nei prototipi; l'alternativa consiste nell'estrarre i valori delle macro LLD usando JSONPath {#FSNAME}$.fsname e {#FSTYPE}$.fstype, rendendo così possibile uno script di questo tipo:

#!/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";

Di seguito è mostrato un esempio del relativo output (riformattato per maggiore chiarezza).

[
    { "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"  }
]

Quindi, nel campo Filter della regola di discovery, puoi specificare {#FSTYPE} come macro e rootfs|ext3 come espressione regolare.

Non è necessario usare nomi di macro come FSNAME/FSTYPE con regole LLD personalizzate; puoi usare liberamente i nomi che preferisci. Nel caso in cui venga usato JSONPath, allora la riga LLD sarà un elemento dell'array che può essere un oggetto, ma anche un altro array o un valore.

Tieni presente che, se si utilizza un parametro utente, il valore restituito è limitato a 16 MB. Per maggiori dettagli, vedi limiti dei dati per i valori restituiti da LLD.