12 Atklāšana, izmantojot ODBC SQL vaicājumus
Pārskats
Šis zema līmeņa atklāšanas veids tiek veikts, izmantojot SQL vaicājumus, kuru rezultāti tiek automātiski pārveidoti par JSON objektu, kas ir piemērots zema līmeņa atklāšanai.
Vienuma atslēga
SQL vaicājumi tiek izpildīti, izmantojot "Database monitor" vienuma tipu. Tāpēc lielākā daļa norādījumu ODBC monitoring lapā ir piemērojami, lai izveidotu darbojošos "Database monitor" atklāšanas noteikumu.
"Database monitor" atklāšanas noteikumos var izmantot divas vienuma atslēgas:
-
db.odbc.discovery[<unique short description>,<dsn>,<connection string>] - šis vienums pārveido SQL vaicājuma rezultātu JSON masīvā, pārvēršot vaicājuma rezultāta kolonnu nosaukumus zema līmeņa atklāšanas makro nosaukumos, kas ir sasaistīti ar atklātajiem lauku vērtībām. Šos makro var izmantot, veidojot vienuma, trigeris u.c. prototipus. Skatiet arī: Using db.odbc.discovery.
-
db.odbc.get[<unique short description>,<dsn>,<connection string>] - šis vienums pārveido SQL vaicājuma rezultātu JSON masīvā, saglabājot sākotnējos kolonnu nosaukumus no vaicājuma rezultāta kā lauka nosaukumu JSON, kas ir sasaistīts ar atklātajām vērtībām. Salīdzinājumā ar
db.odbc.discovery[], šis vienums atgrieztajā JSON neveido zema līmeņa atklāšanas makro, tāpēc nav nepieciešams pārbaudīt, vai kolonnu nosaukumi var būt derīgi makro nosaukumi. Zema līmeņa atklāšanas makro var definēt kā papildu soli pēc nepieciešamības, izmantojot custom LLD macro funkcionalitāti ar JSONPath, kas norāda uz atklātajām vērtībām atgrieztajā JSON. Skatiet arī: Using db.odbc.get.
Izmantojot db.odbc.discovery
Kā praktisku piemēru, lai ilustrētu, kā SQL vaicājums tiek pārveidots JSON formātā, aplūkosim Zabbix starpniekserveru zema līmeņa atklāšanu, veicot ODBC vaicājumu Zabbix datubāzē. Tas ir noderīgi automātiskai "zabbix[proxy,<name>,lastaccess]" iekšējo vienumu izveidei, lai uzraudzītu, kuri starpniekserveri ir aktīvi.
Sāksim ar atklāšanas noteikuma konfigurāciju:

Visi obligātie ievades lauki ir atzīmēti ar sarkanu zvaigznīti.
Šeit tiek izmantots šāds tiešs vaicājums Zabbix datubāzei, lai atlasītu visus Zabbix starpniekserverus kopā ar to uzraudzīto hosts skaitu. Hosts skaitu var izmantot, piemēram, lai filtrētu tukšus starpniekserverus:
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)
Iekšējās "db.odbc.discovery[,{$DSN}]" vienuma darbības rezultātā šī vaicājuma rezultāts automātiski tiek pārveidots šādā JSON:
[
{
"{#HOST}": "Japan 1",
"{#COUNT}": "5"
},
{
"{#HOST}": "Japan 2",
"{#COUNT}": "12"
},
{
"{#HOST}": "Latvia",
"{#COUNT}": "3"
}
]
Var redzēt, ka kolonnu nosaukumi kļūst par makro nosaukumiem, bet atlasītās rindas - par šo makro vērtībām.
Ja nav acīmredzams, kā kolonnu nosaukumi tiks pārveidoti par makro nosaukumiem, ieteicams izmantot kolonnu aliasus, piemēram, "COUNT(h2.host) AS count" iepriekšējā piemērā.
Ja kolonnu nosaukumu nevar pārveidot par derīgu makro nosaukumu, atklāšanas noteikums kļūst neatbalstīts, un kļūdas ziņojumā tiek norādīts problemātiskās kolonnas numurs. Ja nepieciešama papildu palīdzība, iegūtie kolonnu nosaukumi ir pieejami Zabbix servera žurnāla failā pie DebugLevel=4:
$ 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.
Tagad, kad saprotam, kā SQL vaicājums tiek pārveidots JSON objektā, mēs varam izmantot {#HOST} makro vienumu prototipos:

Kad atklāšana ir veikta, katram starpniekserverim tiks izveidots vienums:

db.odbc.get izmantošana
Izmantojot db.odbc.get[,{$DSN}] un šādu SQL piemēru:
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)
tiks atgriezts šāds JSON:
[
{
"host": "Japan 1",
"count": "5"
},
{
"host": "Japan 2",
"count": "12"
},
{
"host": "Latvia",
"count": "3"
}
]
Kā redzat, tajā nav zema līmeņa atklāšanas makrosu. Tomēr pielāgotus zema līmeņa atklāšanas makrosus var izveidot atklāšanas kārtulas cilnē LLD macros, izmantojot JSONPath, piemēram:
{#HOST} → $.host
Tagad šo {#HOST} makrosu var izmantot vienumu prototipos:
