Aquest tipus de descoberta de baix nivell es realitza mitjançant consultes SQL, els resultats de les quals es transformen automàticament en un objecte JSON adequat per a la descoberta de baix nivell.
Les consultes SQL es realitzen mitjançant un element de tipus "Monitoratge de bases de dades". Per tant, la majoria de les instruccions de la pàgina monitoratge ODBC s'apliquen per obtindre una regla de descoberta de "monitoratge de bases de dades" que funcioni.
Es poden emprar dues claus d'elements a les regles de descoberta "Monitoratge de bases de dades":
db.odbc.discovery[]
, aquest element no crea macros de descoberta de baix nivell al JSON retornat, de manera que no cal comprovar si els noms de columnes poden ser noms de macro vàlids . Les macros de descoberta de baix nivell es poden definir com una passa addicional si cal, emprant la funció macro LLD personalitzada amb JSONPath apuntant als valors descoberts al JSON retornat. Veieu també: emprant db.odbc.get.Com a exemple pràctic per il·lustrar com la consulta SQL es transforma en JSON, considereu la descoberta de baix nivell dels proxys Zabbix mitjançant la realització d'una consulta ODBC a la base de dades Zabbix. Això és útil per a la creació automàtica d'elements interns "zabbix[proxy,<nom>,lastaccess]" per monitorar quins proxys són actius.
Comencem amb la configuració de la regla de descoberta:
Tots els camps d'entrada obligatoris són marcats amb un asterisc vermell.
Aquí, la següent consulta directa a la base de dades Zabbix s'empra per triar tots els proxys Zabbix, juntament amb el nombre d'equips que monitoren. El nombre d'equips es pot emprar, per exemple, per filtrar els proxys buits:
mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.host;
+---------+-------+
| equip | recompte |
+---------+-------+
| Japonès 1 | 5 |
| Japonès 2 | 12 |
| Letònia | 3 |
+---------+-------+
3 files en conjunt (0,01 segons)
Gràcies al funcionament intern de l'element “db.odbc.discovery[,{$DSN}]”, el resultat d'aquesta consulta es transforma automàticament en el següent JSON:
[
{
"{#HOST}": "Japó1",
"{#COUNT}": "5"
},
{
"{#HOST}": "Japó 2",
"{#COUNT}": "12"
},
{
"{#HOST}": "Letònia",
"{#COUNT}": "3"
}
]
Podem veure que els noms de les columnes es converteixen en noms de macro i les fileres triades es converteixen en els valors d'aquestes macros.
Si no és obvi com convertir un nom de columna en un nom de macro, es recomana emprar àlies de columna com ara "COUNT(h2.host) AS count" a l'exemple anterior. Si un nom de columna no es pot convertir en un nom de macro vàlid, la regla de descoberta no s'admet, amb el missatge d'error que detalla el nombre de columna ofensiu. Si cal més ajuda, els noms de columnes obtinguts es proporcionen a DebugLevel=4 al fitxer de registre del servidor Zabbix:
$ grep db.odbc.discovery /tmp/zabbix_server.log
...
23876:20150114:153410.856 A la consulta db_odbc_discovery(): 'SELECT h1.host, COUNT(h2.host) FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.BY6 GROUP IN (GRUP) h1.host;'
23876:20150114:153410.860 db_odbc_discovery() columna[1]:'amfitrió'
23876:20150114:153410.860 db_odbc_discovery() column[2]:'COUNT(h2.host)'
23876:20150114:153410.860 Final de db_odbc_discovery():NOTSUPPORTED
23876:20150114:153410.860 Error de l'element [Servidor Zabbix:db.odbc.discovery[proxies,{$DSN}]]: no es pot convertir el nom de la columna 2 a macro.
Ara que entenem com es transforma una consulta SQL en un objecte JSON, podem emprar la macro {#HOST} als prototips d'elements:
Un cop descobert, es crearà un element per a cada proxy:
Emprant db.odbc.get[,{$DSN}]
i el següent exemple:
mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.host;
+---------+-------+
| equip | recompte |
+---------+-------+
| Japan 1 | 5 |
| Japan 2 | 12 |
| Latvia | 3 |
+---------+-------+
3 rows in set (0.01 sec)
el JSON que retornarà:
[
{
"host": "Japan 1",
"count": "5"
},
{
"host": "Japan 2",
"count": "12"
},
{
"host": "Latvia",
"count": "3"
}
]
Com podeu veure, no hi ha macros de descoberta de baix nivell. Tanmateix, es poden crear macros de descoberta personalitzades de baix nivell a la pestanya LLD Macros d'una regla de descoberta mitjançant JSONPath, per exemple:
{#HOST} → $.host
Ara aquesta macro {#HOST} es pot emprar a prototips d'elements: