8 Reglas LLD personalizadas
Resumen
También es posible crear una regla LLD completamente personalizada, que descubra cualquier tipo de entidades; por ejemplo, bases de datos en un server de bases de datos.
Para ello, se debe crear un item personalizado que devuelva una cadena JSON, especificando los objetos encontrados y, opcionalmente, algunas de sus propiedades. La cantidad de macros por entidad no está limitada: mientras que las reglas de descubrimiento integradas devuelven una o dos macros (por ejemplo, dos para el descubrimiento de sistemas de archivos), es posible devolver más.
Ejemplo
El formato requerido de cadena JSON se ilustra mejor con un ejemplo.
Supongamos que está ejecutando un agent antiguo de Zabbix 1.8 (uno que no admite la clave vfs.fs.discovery), pero aun así necesita descubrir sistemas de archivos.
Aquí tiene un script Perl simple para Linux que descubre los sistemas de archivos montados y genera la salida en JSON, que incluye tanto el nombre como el tipo del sistema de archivos.
Una forma de usarlo sería como un UserParameter con la clave 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";
Los símbolos permitidos para los nombres de macros LLD son 0-9 , A-Z , _ , .. Las letras minúsculas no son compatibles en los nombres.
A continuación se muestra un ejemplo de su salida (reformateada para mayor claridad). El JSON para comprobaciones de descubrimiento personalizadas debe seguir el mismo 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" }
]
En el ejemplo anterior, se requiere que las claves coincidan con los nombres de macros LLD utilizados en los prototipos; la alternativa es extraer los valores de las macros LLD usando JSONPath {#FSNAME} → $.fsname y {#FSTYPE} → $.fstype, haciendo así posible un script como este:
#!/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";
A continuación se muestra un ejemplo de su salida (reformateada para mayor claridad).
[
{ "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" }
]
Luego, en el campo Filter de la regla de descubrimiento, puede especificar {#FSTYPE} como una macro y rootfs|ext3 como una expresión regular.
No tiene que usar nombres de macros como FSNAME/FSTYPE con reglas LLD personalizadas; puede usar libremente los nombres que desee.
En caso de que se use JSONPath, la fila LLD será un elemento de matriz que puede ser un objeto, pero también puede ser otra matriz o un valor.
Tenga en cuenta que, si utiliza un parámetro de usuario, el valor devuelto está limitado a 16 MB. Para más detalles, consulte límites de datos para valores devueltos de LLD.