7 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 servidor 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 del sistema de archivos), es posible devolver más.
Ejemplo
El formato requerido de cadena JSON se ilustra mejor con un ejemplo.
Supongamos que estamos ejecutando un antiguo agent de Zabbix 1.8 (uno que no admite vfs.fs.discovery), pero aun así necesitamos descubrir sistemas de archivos.
Aquí hay un script Perl sencillo para Linux que descubre los sistemas de archivos montados y genera JSON, incluyendo tanto el nombre del sistema de archivos como su tipo.
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 , _ , .. No se admiten letras minúsculas 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, es necesario que las claves coincidan con los nombres de macros LLD usados en los prototipos; la alternativa es extraer los valores de las macros LLD usando JSONPath {#FSNAME} → $.fsname y {#FSTYPE} → $.fstype, lo que hace 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). 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" }
]
Entonces, en el campo "Filter" de la regla de descubrimiento, podríamos especificar {#FSTYPE} como macro y rootfs|ext3 como expresión regular.
No es necesario usar los nombres de macro FSNAME/FSTYPE con reglas LLD personalizadas; puede usar los nombres que prefiera.
En caso de usar JSONPath, la fila LLD será un elemento de array que puede ser un objeto, pero también puede ser otro array o un valor.
Tenga en cuenta que, si se usa un user parameter, el valor devuelto está limitado a 16 MB. Para más detalles, consulte límites de datos para valores devueltos de LLD.