12 Individuazione tramite query SQL ODBC
Panoramica
Questo tipo di discovery di basso livello viene eseguito utilizzando query SQL, i cui risultati vengono automaticamente trasformati in un oggetto JSON adatto alla discovery di basso livello.
Chiave item
Le query SQL vengono eseguite utilizzando un tipo di item "Database monitor". Pertanto, la maggior parte delle istruzioni nella pagina ODBC monitoring si applica per ottenere una discovery rule "Database monitor" funzionante.
Nelle discovery rule "Database monitor" possono essere utilizzate due chiavi item:
-
db.odbc.discovery[<unique short description>,<dsn>,<connection string>] - questo item trasforma il risultato della query SQL in un array JSON, convertendo i nomi delle colonne del risultato della query in nomi di macro di low-level discovery associati ai valori dei campi rilevati. Queste macro possono essere utilizzate nella creazione di prototipi di item, trigger, ecc. Vedi anche: Using db.odbc.discovery.
-
db.odbc.get[<unique short description>,<dsn>,<connection string>] - questo item trasforma il risultato della query SQL in un array JSON, mantenendo i nomi originali delle colonne del risultato della query come nome di campo in JSON associato ai valori rilevati. Rispetto a
db.odbc.discovery[], questo item non crea macro di low-level discovery nel JSON restituito; pertanto, non è necessario verificare se i nomi delle colonne possano essere nomi di macro validi. Le macro di low-level discovery possono essere definite come passaggio aggiuntivo, se necessario, utilizzando la funzionalità custom LLD macro con JSONPath che punta ai valori rilevati nel JSON restituito. Vedi anche: Using db.odbc.get.
Utilizzo di db.odbc.discovery
Come esempio pratico per illustrare come la query SQL viene trasformata in JSON, consideriamo il low-level discovery dei proxy di Zabbix eseguendo una query ODBC sul database di Zabbix. Questo è utile per la creazione automatica di "zabbix[proxy,<name>,lastaccess]" internal items per monitorare quali proxy sono attivi.
Iniziamo con la configurazione della regola di discovery:

Tutti i campi di input obbligatori sono contrassegnati da un asterisco rosso.
Qui viene utilizzata la seguente query diretta sul database di Zabbix per selezionare tutti i proxy di Zabbix, insieme al numero di host che stanno monitorando. Il numero di host può essere usato, ad esempio, per filtrare i proxy vuoti:
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)
Grazie al funzionamento interno dell'item "db.odbc.discovery[,{$DSN}]", il risultato di questa query viene automaticamente trasformato nel seguente JSON:
[
{
"{#HOST}": "Japan 1",
"{#COUNT}": "5"
},
{
"{#HOST}": "Japan 2",
"{#COUNT}": "12"
},
{
"{#HOST}": "Latvia",
"{#COUNT}": "3"
}
]
Si può notare che i nomi delle colonne diventano nomi di macro e le righe selezionate diventano i valori di queste macro.
Se non è ovvio come il nome di una colonna venga trasformato in un nome di macro, si consiglia di usare alias di colonna come "COUNT(h2.host) AS count" nell'esempio sopra.
Nel caso in cui il nome di una colonna non possa essere convertito in un nome di macro valido, la regola di discovery diventa non supportata, con un messaggio di errore che indica il numero della colonna problematica. Se è necessario ulteriore aiuto, i nomi delle colonne ottenuti sono disponibili con DebugLevel=4 nel file di log di 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.
Ora che abbiamo capito come una query SQL viene trasformata in un oggetto JSON, possiamo usare la macro {#HOST} nei prototipi di item:

Una volta eseguito il discovery, verrà creato un item per ogni proxy:

Utilizzo di db.odbc.get
Utilizzando db.odbc.get[,{$DSN}] e il seguente esempio 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)
verrà restituito questo JSON:
[
{
"host": "Japan 1",
"count": "5"
},
{
"host": "Japan 2",
"count": "12"
},
{
"host": "Latvia",
"count": "3"
}
]
Come puoi vedere, non sono presenti macro di low-level discovery. Tuttavia, è possibile creare macro personalizzate di low-level discovery nella scheda LLD macros di una regola di discovery utilizzando JSONPath, ad esempio:
{#HOST} → $.host
Ora questa macro {#HOST} può essere utilizzata nei prototipi di item:
