11 Descubrimiento mediante consultas SQL ODBC

Descripción general

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.

Clave de artículo

Las consultas SQL se realizan utilizando un tipo de elemento "Monitor de base de datos". Por lo tanto, la mayoría de las instrucciones en ODBC monitoreo la página se aplica en para obtener una regla de descubrimiento de "Monitor de base de datos" que funcione.

Se pueden utilizar dos claves de elementos en las reglas de descubrimiento del "monitor de base de datos":

  • db.odbc.discovery[<corto único descripción>,<dsn>,<cadena de conexión>] - este elemento transforma el resultado de la consulta SQL en una matriz JSON, convirtiendo el nombres de columnas del resultado de la consulta en una macro de descubrimiento de bajo nivel nombres emparejados con los valores de campo descubiertos. Estas macros pueden ser Se utiliza para crear prototipos de elementos, activadores, etc. Ver también: Usando db.odbc.discovery.
  • db.odbc.get[<corto único descripción>,<dsn>,<cadena de conexión>] - este elemento transforma el resultado de la consulta SQL en una matriz JSON, manteniendo el nombres de columnas originales del resultado de la consulta como un nombre de campo en JSON emparejado con los valores descubiertos. En comparación con db.odbc.discovery[], este elemento no crea un descubrimiento de bajo nivel macros en el JSON devuelto, por lo tanto no es necesario comprobar si los nombres de las columnas pueden ser nombres de macro válidos. El descubrimiento de bajo nivel Las macros se pueden definir como un paso adicional según sea necesario, utilizando el LLD personalizado macro funcionalidad con JSONPath apuntando a los valores descubiertos en el JSON devuelto. Consulte también: Usando db.odbc.get.

Usando db.odbc.discovery

Como ejemplo práctico para ilustrar cómo se transforma la consulta SQL. en JSON, consideremos el descubrimiento de bajo nivel de proxies Zabbix mediante realizar una consulta ODBC en la base de datos Zabbix. Esto es útil para creación automática de "zabbix[proxy,<nombre>,lastaccess]" elementos internos para monitorear qué representantes están vivos.

Comencemos con la configuración de la regla de descubrimiento:

lld_rule_odbc.png

Todos los campos de entrada obligatorios están marcados con un asterisco rojo.

Aquí, se utiliza la siguiente consulta directa en la base de datos Zabbix para seleccionar todos los proxies de Zabbix, junto con el número de hosts que son supervisión. El número de hosts se puede utilizar, por ejemplo, para filtrar servidores proxy vacíos:

mysql> SELECCIONE h1.host, CONTAR(h2.host) COMO contar DESDE los hosts h1 IZQUIERDA UNIR los hosts h2 EN h1.hostid = h2.proxy_hostid DONDE h1.status EN (5, 6) GRUPO POR h1.host;
       +---------+-------+
       | anfitrión | contar |
       +---------+-------+
       | Japón 1 |     5 |
       | Japón 2 |    12 |
       | Letonia |     3 |
       +---------+-------+
       3 filas en conjunto (0,01 seg)

Por el funcionamiento interno del elemento "db.odbc.discovery[,{$DSN}]", el El resultado de esta consulta se transforma automáticamente en lo siguiente. JSON:

[
           {
               "{#HOST}": "Japón 1",
               "{#COUNT}": "5"
           },
           {
               "{#HOST}": "Japón 2",
               "{#COUNT}": "12"
           },
           {
               "{#HOST}": "Letonia",
               "{#COUNT}": "3"
           }
       ]

Se puede ver que los nombres de las columnas se convierten en nombres de macros y filas seleccionadas. se convierten en los valores de estas macros.

::: nota clásica Si no es obvio cómo se transformaría el nombre de una columna en un nombre de macro, se sugiere utilizar alias de columna como "COUNT(h2.host) AS count" en el ejemplo anterior.

En caso de que un nombre de columna no se pueda convertir en un nombre de macro válido, el La regla de descubrimiento deja de ser compatible y el mensaje de error detalla el número de columna infractor. Si se desea ayuda adicional, la obtenida Los nombres de las columnas se proporcionan en DebugLevel=4 en el archivo de registro del servidor Zabbix:

$ grep db.odbc.discovery /tmp/zabbix_server.log
        ...
        23876:20150114:153410.856 En la consulta db_odbc_discovery():'SELECT h1.host, COUNT(h2.host) FROM hosts h1 IZQUIERDA UNIR hosts h2 ON h1.hostid = h2.proxy_hostid DONDE h1.status EN (5, 6) GRUPO POR h1.host;'
        23876:20150114:153410.860 columna db_odbc_discovery()[1]:'host'
        23876:20150114:153410.860 columna db_odbc_discovery()[2]:'COUNT(h2.host)'
        23876:20150114:153410.860 Fin de db_odbc_discovery():NOTSUPPORTED
        23876:20150114:153410.860 Error del elemento [servidor Zabbix:db.odbc.discovery[proxies,{$DSN}]]: no se puede convertir el nombre de la columna n.º 2 en macro.

:::

Ahora que entendemos cómo se transforma una consulta SQL en JSON objeto, podemos usar la macro {#HOST} en prototipos de elementos:

item_prototype_odbc.png

Una vez realizado el descubrimiento, se creará un elemento para cada proxy:

elementos_descubiertos_odbc1.png

Usando db.odbc.get

Usando db.odbc.get[,{$DSN}] y el siguiente ejemplo de SQL:

mysql> SELECCIONE h1.host, CONTAR(h2.host) COMO contar DESDE los hosts h1 IZQUIERDA UNIR los hosts h2 EN h1.hostid = h2.proxy_hostid DONDE h1.status EN (5, 6) GRUPO POR h1.host;
       +---------+-------+
       | anfitrión | contar |
       +---------+-------+
       | Japón 1 |     5 |
       | Japón 2 |    12 |
       | Letonia |     3 |
       +---------+-------+
       3 filas en conjunto (0,01 seg)

se devolverá este JSON:

[
           {
               "host": "Japón 1",
               "cuenta": "5"
           },
           {
               "anfitrión": "Japón 2",
               "cuenta": "12"
           },
           {
               "host": "Letonia",
               "cuenta": "3"
           }
       ]

Como puede ver, allí no hay macros de descubrimiento de bajo nivel. Sin embargo, Se pueden crear macros de descubrimiento personalizadas de bajo nivel en el LLD macros pestaña de un regla de descubrimiento usando JSONPath, por ejemplo:

{#HOST} → $.host

Ahora esta macro {#HOST} se puede utilizar en prototipos de artículos:

item_prototype_odbc.png