Este tipo de descubrimiento de bajo nivel se realiza usando consultas SQL, cuyos resultados se transforman automáticamente en un objeto JSON adecuado para descubrimiento de bajo nivel.
Las consultas SQL se realizan utilizando un tipo de métrica "Monitor de base de datos". Por lo tanto, la mayoría de las instrucciones en la página monitoreo ODBC se aplican para obtener una regla de descubrimiento de "Monitor de base de datos" que funcione.
Se pueden utilizar dos claves de métricas en las reglas de descubrimiento del "monitor de base de datos":
db.odbc.discovery[<descripción única corta>,<dsn>,<cadena de conexión>] - esta métrica transforma el resultado de la consulta SQL en una matriz JSON, convirtiendo los nombres de columnas del resultado de la consulta en una macro de descubrimiento de bajo nivel con los nombres emparejados con los valores de campo descubiertos. Estas macros pueden ser utilizadas para crear prototipos de métricas, iniciadores, etc. Ver también: Usando db.odbc.discovery.
db.odbc.get[<descripción corta única>,<dsn>,<cadena de conexión>] - esta métrica transforma el resultado de la consulta SQL en una matriz JSON, manteniendo los nombres de columnas originales del resultado de la consulta como nombre de campo en JSON emparejado con los valores descubiertos. En comparación con db.odbc.discovery[]
, esta métrica no crea macros de descubrimiento de bajo nivel en el JSON devuelto, por lo tanto no es necesario comprobar si los nombres de las columnas pueden ser nombres de macro válidos. Las macros de descubrimiento de bajo nivel se pueden definir como un paso adicional según sea necesario, utilizando la funcionalidad macro LLD personalizada con JSONPath apuntando a los valores descubiertos en el JSON devuelto. Consulte también: Usando db.odbc.get.
Como ejemplo práctico para ilustrar cómo la consulta SQL se transforma en JSON, consideremos el descubrimiento de bajo nivel de proxies de Zabbix realizando una consulta ODBC en la base de datos de Zabbix. Esto es útil para la creación automática de elementos internos "zabbix[proxy,<nombre>,lastaccess]" (elementos internos) para monitorizar qué proxies están activos.
Comencemos con la configuración de la regla de descubrimiento:
Todos los campos obligatorios están marcados con un asterisco rojo.
Aquí, se utiliza la siguiente consulta directa en la base de datos de Zabbix para seleccionar todos los proxies de Zabbix, junto con el número de equipos que están monitorizando. El número de equipos puede usarse, por ejemplo, para filtrar proxies vacíos:
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)
Por el funcionamiento interno del elemento "db.odbc.discovery[,{$DSN}]", el resultado de esta consulta se transforma automáticamente en el siguiente JSON:
[
{
"{#HOST}": "Japan 1",
"{#COUNT}": "5"
},
{
"{#HOST}": "Japan 2",
"{#COUNT}": "12"
},
{
"{#HOST}": "Latvia",
"{#COUNT}": "3"
}
]
Se puede observar que los nombres de las columnas se convierten en nombres de macro y las filas seleccionadas se convierten en los valores de estas macros.
Si no es obvio cómo se transformará un nombre de columna en un nombre de macro, se recomienda utilizar alias de columna como "COUNT(h2.host) AS count" en el ejemplo anterior.
En caso de que un nombre de columna no pueda convertirse en un nombre de macro válido, la regla de descubrimiento pasa a no estar soportada, mostrando un mensaje de error que detalla el número de columna problemático. Si se desea ayuda adicional, los nombres de las columnas obtenidas se proporcionan con DebugLevel=4 en el archivo de registro del servidor 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.
Ahora que entendemos cómo se transforma una consulta SQL en un objeto JSON, podemos usar la macro {#HOST} en prototipos de elementos:
Una vez realizado el descubrimiento, se creará un elemento para cada proxy:
Usando db.odbc.get[,{$DSN}]
y el siguiente ejemplo de SQL:
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)
se devolverá este JSON:
[
{
"host": "Japan 1",
"count": "5"
},
{
"host": "Japan 2",
"count": "12"
},
{
"host": "Latvia",
"count": "3"
}
]
Como puede ver, no hay macros de descubrimiento de bajo nivel allí. Sin embargo, se pueden crear macros de descubrimiento de bajo nivel personalizadas en la pestaña Macros de LLD de una regla de descubrimiento usando JSONPath, por ejemplo:
Ahora esta macro {#HOST} puede usarse en prototipos de ítem: