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 monitoraggio ODBC si applica per ottenere una regola di discovery "Database monitor" funzionante.
Nelle regole di discovery "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 per creare prototipi di item, trigger, ecc. Vedi anche: Uso di 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 nomi di campo nel JSON associati 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 secondo necessità, utilizzando la funzionalità macro LLD personalizzata con JSONPath che punta ai valori rilevati nel JSON restituito. Vedi anche: Uso di db.odbc.get.
Utilizzo di db.odbc.discovery
L'esempio seguente mostra come una query SQL venga trasformata in JSON utilizzando la low-level discovery dei proxy Zabbix, sulla base di una query ODBC sul database Zabbix. Questo è utile per la creazione automatica di internal items "zabbix[proxy,<name>,lastaccess]" per monitorare quali proxy sono attivi.
Iniziare con la configurazione della regola di discovery:

Tutti i campi di input obbligatori sono contrassegnati con un asterisco rosso.
Qui viene utilizzata la seguente query diretta sul database Zabbix per selezionare tutti i proxy Zabbix, insieme al numero di host che stanno monitorando. Il numero di host può essere utilizzato, ad esempio, per escludere 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)
Per il funzionamento interno dell'item "db.odbc.discovery[,{$DSN}]", il risultato di questa query viene trasformato automaticamente 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 è evidente come un nome di colonna verrebbe trasformato in un nome di macro, si consiglia di utilizzare alias di colonna come "COUNT(h2.host) AS count" nell'esempio sopra.
Nel caso in cui un nome di colonna non possa essere convertito in un nome di macro valido, la regola di discovery diventa non supportata, con il messaggio di errore che riporta il numero della colonna problematica. Se si desidera ulteriore aiuto, i nomi delle colonne ottenuti sono disponibili con DebugLevel=4 nel file di log del server Zabbix:
$ 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 compreso come una query SQL venga trasformata in un oggetto JSON, possiamo utilizzare la macro {#HOST} nei prototipi di item:

Una volta eseguita la discovery, verrà creato un item per ciascun 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:
