Você está visualizando a documentação da versão de desenvolvimento, que pode estar incompleta.
Esta página foi traduzida automaticamente. Se você notar um erro, selecione-o e pressione Ctrl+Enter para reportá-lo aos editores.

12 Descoberta usando consultas SQL ODBC

Visão geral

Este tipo de descoberta de baixo nível é feito usando consultas SQL, cujos resultados são automaticamente transformados em um objeto JSON adequado para descoberta de baixo nível.

Chave do item

As consultas SQL são executadas usando um tipo de item "Database monitor". Portanto, a maioria das instruções na página de monitoramento ODBC se aplica para obter uma regra de descoberta "Database monitor" funcional.

Duas chaves de item podem ser usadas em regras de descoberta "Database monitor":

  • db.odbc.discovery[<descrição curta e única>,<dsn>,<string de conexão>] - este item transforma o resultado da consulta SQL em um array JSON, convertendo os nomes das colunas do resultado da consulta em nomes de macros de descoberta de baixo nível emparelhados com os valores dos campos descobertos. Essas macros podem ser usadas na criação de protótipos de item, trigger, etc. Veja também: Usando db.odbc.discovery.

  • db.odbc.get[<descrição curta e única>,<dsn>,<string de conexão>] - este item transforma o resultado da consulta SQL em um array JSON, mantendo os nomes originais das colunas do resultado da consulta como nome de campo no JSON emparelhado com os valores descobertos. Comparado ao db.odbc.discovery[], este item não cria macros de descoberta de baixo nível no JSON retornado, portanto não há necessidade de verificar se os nomes das colunas podem ser nomes de macro válidos. As macros de descoberta de baixo nível podem ser definidas como uma etapa adicional, se necessário, usando a funcionalidade de macro LLD personalizada com JSONPath apontando para os valores descobertos no JSON retornado. Veja também: Usando db.odbc.get.

Usando db.odbc.discovery

Como um exemplo prático para ilustrar como a consulta SQL é transformada em JSON, vamos considerar a descoberta de baixo nível de proxies Zabbix realizando uma consulta ODBC no banco de dados Zabbix. Isso é útil para a criação automática de items internos "zabbix[proxy,<name>,lastaccess]" para monitorar quais proxies estão ativos.

Vamos começar com a configuração da regra de descoberta:

lld_rule_odbc.png

Todos os campos obrigatórios estão marcados com um asterisco vermelho.

Aqui, a seguinte consulta direta no banco de dados Zabbix é usada para selecionar todos os proxies Zabbix, juntamente com o número de hosts que eles estão monitorando. O número de hosts pode ser usado, por exemplo, para filtrar proxies vazios:

mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxyid WHERE h1.status IN (5, 6) GROUP BY h1.host;
       +---------+-------+
       | host    | count |
       +---------+-------+
       | Japan 1 |     5 |
       | Japan 2 |    12 |
       | Latvia  |     3 |
       +---------+-------+
       3 rows in set (0.01 sec)

Pelo funcionamento interno do item "db.odbc.discovery[,{$DSN}]", o resultado desta consulta é automaticamente transformado no seguinte JSON:

[
           {
               "{#HOST}": "Japan 1",
               "{#COUNT}": "5"
           },
           {
               "{#HOST}": "Japan 2",
               "{#COUNT}": "12"
           },
           {
               "{#HOST}": "Latvia",
               "{#COUNT}": "3"
           }
       ]

Pode-se ver que os nomes das colunas se tornam nomes de macros e as linhas selecionadas se tornam os valores dessas macros.

Se não for óbvio como um nome de coluna seria transformado em um nome de macro, recomenda-se usar aliases de coluna como "COUNT(h2.host) AS count" no exemplo acima.

Caso um nome de coluna não possa ser convertido em um nome de macro válido, a regra de descoberta se torna não suportada, com a mensagem de erro detalhando o número da coluna com problema. Se desejar ajuda adicional, os nomes das colunas obtidas são fornecidos com DebugLevel=4 no arquivo de log do Zabbix server:

$ grep db.odbc.discovery /tmp/zabbix_server.log
        ...
        23876:20150114:153410.856 In db_odbc_discovery() query:'SELECT h1.host, COUNT(h2.host) FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.host;'
        23876:20150114:153410.860 db_odbc_discovery() column[1]:'host'
        23876:20150114:153410.860 db_odbc_discovery() column[2]:'COUNT(h2.host)'
        23876:20150114:153410.860 End of db_odbc_discovery():NOTSUPPORTED
        23876:20150114:153410.860 Item [Zabbix server:db.odbc.discovery[proxies,{$DSN}]] error: Cannot convert column #2 name to macro.

Agora que entendemos como uma consulta SQL é transformada em um objeto JSON, podemos usar a macro {#HOST} nos protótipos de item:

item_prototype_odbc.png

Uma vez que a descoberta seja realizada, um item será criado para cada proxy:

discovered_items_odbc1.png

Usando db.odbc.get

Usando db.odbc.get[,{$DSN}] e o seguinte exemplo de SQL:

mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxyid WHERE h1.status IN (5, 6) GROUP BY h1.host;
       +---------+-------+
       | host    | count |
       +---------+-------+
       | Japan 1 |     5 |
       | Japan 2 |    12 |
       | Latvia  |     3 |
       +---------+-------+
       3 rows in set (0.01 sec)

este JSON será retornado:

[
           {
               "host": "Japan 1",
               "count": "5"
           },
           {
               "host": "Japan 2",
               "count": "12"
           },
           {
               "host": "Latvia",
               "count": "3"
           }
       ]

Como você pode ver, não há macros de descoberta de baixo nível aí. No entanto, macros de descoberta de baixo nível personalizadas podem ser criadas na aba Macros de LLD de uma regra de descoberta usando JSONPath, por exemplo:

{#HOST} → $.host

Agora esta macro {#HOST} pode ser usada em protótipos de item:

item_prototype_odbc.png