8 Regras LLD personalizadas
Visão geral
Também é possível criar uma regra de LLD completamente personalizada, descobrindo qualquer tipo de entidade — por exemplo, bancos de dados em um server de banco de dados.
Para isso, deve ser criado um item personalizado que retorne uma string JSON, especificando os objetos encontrados e, opcionalmente, algumas de suas propriedades. A quantidade de macros por entidade não é limitada — enquanto as regras de descoberta integradas retornam uma ou duas macros (por exemplo, duas para descoberta de sistemas de arquivos), é possível retornar mais.
Exemplo
O formato de string JSON necessário é melhor ilustrado com um exemplo.
Suponha que você esteja executando um agent Zabbix 1.8 antigo (um que não oferece suporte à chave vfs.fs.discovery), mas ainda precise descobrir sistemas de arquivos.
Aqui está um script Perl simples para Linux que descobre sistemas de arquivos montados e gera a saída em JSON, incluindo o nome e o tipo do sistema de arquivos.
Uma forma de usá-lo seria como um UserParameter com a chave 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";
Os símbolos permitidos para nomes de macros LLD são 0-9 , A-Z , _ , .. Letras minúsculas não são suportadas nos nomes.
Um exemplo da saída (reformatado para maior clareza) é mostrado abaixo. O JSON para verificações de descoberta personalizadas deve seguir o mesmo 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" }
]
No exemplo anterior, é necessário que as chaves correspondam aos nomes das macros LLD usados nos protótipos; a alternativa é extrair os valores das macros LLD usando JSONPath {#FSNAME} → $.fsname e {#FSTYPE} → $.fstype, tornando possível um 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";
Um exemplo da saída (reformatado para maior clareza) é mostrado abaixo.
[
{ "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" }
]
Em seguida, no campo Filter da regra de descoberta, você pode especificar {#FSTYPE} como uma macro e rootfs|ext3 como uma expressão regular.
Você não precisa usar nomes de macro como FSNAME/FSTYPE com regras LLD personalizadas; você pode usar quaisquer nomes que desejar.
Caso JSONPath seja usado, então a linha LLD será um elemento de array que pode ser um objeto, mas também pode ser outro array ou um valor.
Observe que, ao usar um parâmetro de usuário, o valor de retorno é limitado a 16 MB. Para mais detalhes, consulte limites de dados para valores de retorno de LLD.