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ādēļ lielākā daļa norādījumu lapā ODBC monitoring ir piemērojami, lai iegūtu strādājošu "Database monitor" atklāšanas kārtulu.
"Database monitor" atklāšanas kārtulās var izmantot divas vienumu 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 kolonnu nosaukumus no vaicājuma rezultāta par zema līmeņa atklāšanas makrosu nosaukumiem, kas ir sapāroti ar atklāto lauku vērtībām. Šos makrosus var izmantot, veidojot vienumu, trigeru 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 formātā, sapārotu ar atklātajām vērtībām. Salīdzinot ar
db.odbc.discovery[], šis vienums neatgrieztajā JSON neveido zema līmeņa atklāšanas makrosus, tādēļ nav nepieciešams pārbaudīt, vai kolonnu nosaukumi var būt derīgi makrosu nosaukumi. Zema līmeņa atklāšanas makrosus 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.
db.odbc.discovery izmantošana
Tālāk redzamais piemērs parāda, kā SQL vaicājums tiek pārveidots par JSON, izmantojot Zabbix starpniekserveru zema līmeņa atklāšanu, pamatojoties uz ODBC vaicājumu Zabbix datubāzē. Tas ir noderīgi, lai automātiski izveidotu "zabbix[proxy,<name>,lastaccess]" iekšējos vienumus, ar kuriem uzraudzīt, kuri starpniekserveri ir aktīvi.
Sāciet ar atklāšanas kārtulas 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āzē, lai atlasītu visus Zabbix starpniekserverus kopā ar to uzraudzīto hostu skaitu. Hostu skaitu var izmantot, piemēram, lai atfiltrē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)
"db.odbc.discovery[,{$DSN}]" vienuma iekšējās darbības rezultātā šī vaicājuma rezultāts tiek automātiski pārveidots šādā JSON formātā:
[
{
"{#HOST}": "Japan 1",
"{#COUNT}": "5"
},
{
"{#HOST}": "Japan 2",
"{#COUNT}": "12"
},
{
"{#HOST}": "Latvia",
"{#COUNT}": "3"
}
]
Var redzēt, ka kolonnu nosaukumi kļūst par makrosu nosaukumiem, bet atlasītās rindas kļūst par šo makrosu vērtībām.
Ja nav uzreiz skaidrs, kā kolonnas nosaukums tiks pārveidots par makrosa nosaukumu, ieteicams izmantot kolonnu aizstājvārdus, kā iepriekš minētajā piemērā "COUNT(h2.host) AS count".
Ja kolonnas nosaukumu nevar pārveidot par derīgu makrosa nosaukumu, atklāšanas kārtula kļūst neatbalstīta, 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 zem DebugLevel=4 Zabbix serveris žurnālfailā:
$ 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 par JSON objektu, varam izmantot {#HOST} makrosu 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, tur 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:
