8 Regole LLD personalizzate
Panoramica
È anche possibile creare una regola LLD completamente personalizzata, in grado di rilevare qualsiasi tipo di entità, ad esempio 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 stiate eseguendo un vecchio agent Zabbix 1.8 (che non supporta la chiave vfs.fs.discovery), ma che abbiate comunque bisogno di individuare i file system. Ecco un semplice script Perl per Linux che rileva i file system montati e produce un output in JSON, che include sia il nome che il tipo del 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 suo 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
utilizzati 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 suo 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, potete specificare "{#FSTYPE}" come macro e "rootfs|ext3" come espressione regolare.
Non è necessario usare nomi di macro come FSNAME/FSTYPE con regole LLD personalizzate; siete liberi di usare qualsiasi nome preferiate. Nel caso in cui venga usato JSONPath, allora la riga LLD sarà un elemento dell'array che può essere un oggetto, ma può anche essere un altro array o un valore.
Si noti che, se si utilizza un parametro utente, il valore restituito è limitato a 16MB. Per maggiori dettagli, vedere limiti dei dati per i valori restituiti LLD.