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 lapā ODBC monitoring 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 par zema līmeņa atklāšanas makro nosaukumiem, kas ir sasaistīti ar atklātajām 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ā lauku nosaukumus JSON, kas ir sasaistīti ar atklātajām vērtībām. Salīdzinājumā ar db.odbc.discovery[], šis vienums neatgrieztajā 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

Šis piemērs demonstrē, kā SQL vaicājums tiek pārveidots JSON, izmantojot Zabbix starpniekserveru zemlīmeņa atklāšanu, kas balstīta uz 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āciet ar atklāšanas noteikuma konfigurāciju:

lld\_rule\_odbc.png

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 kļūst par šo makro vērtībām.

Ja nav uzreiz skaidrs, kā kolonnu nosaukumi tiks pārveidoti par makro nosaukumiem, ieteicams izmantot kolonnu aizstājvārdus, 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 par JSON objektu, mēs varam izmantot {#HOST} makro vienumu prototipos:

item\_prototype\_odbc.png

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

discovered\_items\_odbc1.png

Izmantojot db.odbc.get

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 šis JSON:

[
    {
        "host": "Japan 1",
        "count": "5"
    },
    {
        "host": "Japan 2",
        "count": "12"
    },
    {
        "host": "Latvia",
        "count": "3"
    }
]

Kā redzams, tur nav zema līmeņa atklāšanas makro. Tomēr pielāgotus zema līmeņa atklāšanas makro var izveidot atklāšanas noteikuma cilnē LLD macros, izmantojot JSONPath, piemēram:

{#HOST} → $.host

Tagad šo {#HOST} makro var izmantot vienumu prototipos:

item\_prototype\_odbc.png