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

Consultas SQL são executadas usando um tipo de item "Database monitor". Portanto, a maioria das instruções na página 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[<unique short description>,<dsn>,<connection string>] - este item transforma o resultado da consulta SQL em uma matriz JSON, convertendo os nomes das colunas do resultado da consulta em nomes de macros de descoberta em baixo nível associados aos 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[<unique short description>,<dsn>,<connection string>] - este item transforma o resultado da consulta SQL em uma matriz JSON, mantendo os nomes originais das colunas do resultado da consulta como nome de campo no JSON, associados aos valores descobertos. Em comparação com db.odbc.discovery[], este item não cria macros de descoberta em 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 em baixo nível podem ser definidas como uma etapa adicional, conforme 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 em baixo nível de proxies do Zabbix por meio da execução de uma consulta ODBC no banco de dados do Zabbix. Isso é útil para a criação automática de "zabbix[proxy,<name>,lastaccess]" itens internos 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 de entrada obrigatórios são marcados com um asterisco vermelho.

Aqui, a seguinte consulta direta no banco de dados do Zabbix é usada para selecionar todos os proxies do 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 dessa 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 estiver claro 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 passa a não ser suportada, com a mensagem de erro detalhando o número da coluna problemática. Se for necessária ajuda adicional, os nomes de coluna obtidos são fornecidos em 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} em protótipos de item:

item\_prototype\_odbc.png

Depois que a descoberta for executada, 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 ali. No entanto, macros personalizadas de descoberta de baixo nível podem ser criadas na aba Macros 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