6 Regras de LLD personalizadas

Visão geral

Também é possível criar uma regra de LLD completamente personalizada, descobrindo qualquer tipo de entidades - por exemplo, bancos de dados em um servidor de banco de dados.

Para fazer isso, um item personalizado deve ser criado para que retorne JSON, especificando objetos encontrados, e opcionalmente, algumas de suas propriedades. A quantidade de macros por entidade não é limitada - enquanto as regras de criação retornam uma ou duas macros (por exemplo, duas para descobertas de sistema de arquivos) é possível retornar mais.

Exemplo

O formato JSON necessário é melhor ilustrado com um exemplo. Digamos que estamos executando um agente Zabbix 1.8 antigo (um que não suporta "vfs.fs.discovery"), mas ainda precisamos descobrir os sistemas de arquivo. Aqui está um simples script Perl para Linux que descobre sistemas de arquivos montados e gera um JSON, que inclui tanto o nome quanto o tipo do sistema de arquivos. Uma forma de usar seria com um UserParameter com key "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 macros são 0-9 , A-Z , _ , . Letras minúsculas não são permitidas nos nomes.

Um exemplo de seu output (reformatado para um melhor entendimento) é mostrado abaixo. O JSON para verificações personalizadas de descoberta tem que seguir o mesmo formato 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"  }
       ]

No exemplo anterior, é necessário que as keys correspondam aos nomes das macros de LLD usadas em prototypes. A alternativa é extrair os valores das macros de LLD usando JSONPath {#FSNAME}$.fsname e {#FSTYPE}$.fstype, tornando assim 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 de seus outputs (reformatados para um melhor entendimento) é mostrado a seguir.
O JSON para verificações personalizadas deve seguir o mesmo formato 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, poderíamos especificar "{#FSTYPE}" como uma macro e "rootfs|ext3" como uma expressão regular.

Você não precisa utilizar os nomes macros FSNAME/FSTYPE com regras de LLD personalizadas, você tem liberdade para utilizar os nomes que desejar. Caso JSONPath seja utilizado, a linha LLD será um elemento array que pode ser um objeto, mas também pode ser uma outra array ou um valor.

Observe que, ao usar um parâmetro de usuário, o valor retornado será limitado a 16MB. Para mais detalhes, ver data limits for LLD return values..