[comment]: # ({36f796e5-dc992d4f})
# 12 Descubrimiento mediante consultas SQL ODBC

[comment]: # ({/36f796e5-dc992d4f})

[comment]: # ({dcf4796a-dcf4796a})
#### Descripción general

Este tipo de 
[descubrimiento](/manual/discovery/low_level_discovery) de bajo nivel se realiza usando 
consultas SQL, cuyos resultados se transforman automáticamente en un objeto JSON
adecuado para descubrimiento de bajo nivel.

[comment]: # ({/dcf4796a-dcf4796a})

[comment]: # ({c1ef39b4-c1ef39b4})
#### Clave de la métrica

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](/manual/config/items/itemtypes/odbc_checks) se aplica en
como 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](#using_dbodbcdiscovery).

```{=html}
<!-- -->
```
- **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 
    emparejado en JSON con los valores descubiertos. En comparación con
    `db.odbc.discovery[]`, este elemento 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](/manual/discovery/low_level_discovery#custom_macros)
     con JSONPath apuntando a los valores descubiertos en el
    JSON devuelto. Consulte también: [Usando db.odbc.get](#using_dbodbcget).

[comment]: # ({/c1ef39b4-c1ef39b4})

[comment]: # ({0f9c9410-0f9c9410})
#### 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
la ejecución de una consulta ODBC en la base de datos Zabbix. Esto es útil para la
creación automática de las
[métricas internas](/manual/config/items/itemtypes/internal) "zabbix\[proxy,<nombre>,lastaccess\]" para monitorear
qué proxies están vivos.

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

![lld\_rule\_odbc.png](../../../../../assets/en/manual/discovery/low_level_discovery/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 equipos que se
supervisan. El número de equipos se puede utilizar, por ejemplo, para filtrar
servidores proxy vacíos:

    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;
    +---------+-------+
    | host | count |
    +---------+-------+
    | Japón 1 | 5 |
    | Japón 2 | 12 |
    | Letonia | 3 |
    +---------+-------+
    3 filas en conjunto (0,01 seg)

Por el funcionamiento interno de la métrica "db.odbc.discovery\[,{$DSN}\]", el
resultado de esta consulta se transforma automáticamente en el siguiente
JSON:

``` {.java}
[
    {
        "{#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 las filas seleccionadas.
se convierten en los valores de estas macros.

::: noteclassic
 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,
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,
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 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status EN (5, 6) GROUP BY 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 un objeto JSON,
podemos usar la macro {\#HOST} en prototipos de métricas:

![item\_prototype\_odbc.png](../../../../../assets/en/manual/discovery/low_level_discovery/item_prototype_odbc.png)

Una vez realizado el descubrimiento, se creará una métrica para cada proxy:

![discovered\_items\_odbc1.png](../../../../../assets/en/manual/discovery/low_level_discovery/discovered_items_odbc1.png)

[comment]: # ({/0f9c9410-0f9c9410})

[comment]: # ({43f8549f-43f8549f})
#### Usando db.odbc.get

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

    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;
    +---------+-------+
    | host | count |
    +---------+-------+
    | Japón 1 | 5 |
    | Japón 2 | 12 |
    | Letonia | 3 |
    +---------+-------+
    3 filas en conjunto (0,01 seg)

se devolverá este JSON:

``` {.java}
[
    {
        "host": "Japón 1",
        "count": "5"
    },
    {
        "host": "Japón 2",
        "count": "12"
    },
    {
        "host": "Letonia",
        "count": "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 la pestaña de 
[macros LLD](/manual/discovery/low_level_discovery#custom_macros) de una
regla de descubrimiento usando JSONPath, por ejemplo:

    {#HOST} → $.host

Ahora esta macro {\#HOST} se puede utilizar en prototipos de métricas:

![item\_prototype\_odbc.png](../../../../../assets/en/manual/discovery/low_level_discovery/item_prototype_odbc.png)

[comment]: # ({/43f8549f-43f8549f})
