14 Guía práctica: crear una consulta nueva

Este capítulo recorre el proceso completo con un ejemplo: monitorizar en Oracle el número de objetos inválidos de cada esquema.

14.1 Paso 1: escribir y probar el SQL#

Primero se escribe la consulta y se prueba con el mismo usuario que usa Databbix, por ejemplo con SQL*Plus o psql. Hay que comprobar que devuelve una fila por objeto monitorizado y que las columnas tienen alias claros:

select owner as esquema, count(*) as invalidos
from dba_objects
where status = 'INVALID'
group by owner;

14.2 Paso 2: elegir el tipo de consulta#

  • ¿Devuelve siempre una fila? → consulta básica.

  • ¿Devuelve una fila por objeto y se quieren ítems por objeto? → FILTER.

  • ¿El conjunto de valores posibles es enorme y solo interesan unos pocos? → BIND.

  • ¿Se quiere que Zabbix cree los ítems automáticamente? → una consulta discovery más una FILTER.

En el ejemplo, un esquema sin objetos inválidos no aparece en el resultado, así que se usa FILTER con default="0", y un descubrimiento para los esquemas.

14.3 Paso 3: escribir el XML#

Lo más recomendable es crear un fichero propio en lugar de modificar los ficheros de la distribución, que se sobrescriben al actualizar. Se guarda como /etc/databbix/query-local.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Queries engine="Database" query="2.5.0">

<query name="LocalSchemaDiscovery" module="DB" discovery="yes">
    <sql><![CDATA[
        select username as esquema
        from dba_users
        where oracle_maintained = 'N'
        ]]>
    </sql>
    <item name="local.ora.schema.discovery"/>
    <field name="SCHEMA" column="esquema"/>
</query>

<query name="LocalInvalidObjects" module="DB" select="FILTER" maxCache="60">
    <sql><![CDATA[
        select owner as esquema, count(*) as invalidos
        from dba_objects
        where status = 'INVALID'
        group by owner
        ]]>
    </sql>
    <parameter column="esquema" order="1" type="STRING"/>
    <item name="local.ora.invalid" column="invalidos" default="0"/>
    <item name="local.ora.invalid.exectime" built_in="exec_time"/>
</query>

</Queries>

Nombres de ítem.  Los nombres de ítem deben ser únicos en todos los ficheros que carga el monitor. Usar un prefijo propio (local., el nombre de la empresa…) evita conflictos con los ítems de la distribución (tez.*, ts.*).

14.4 Paso 4: añadir el fichero al monitor#

QueryFile en el monitor sustituye a la lista global, así que hay que incluir también el fichero principal:

[General]
Name = ORAPROD
QueryFile = /etc/databbix/query.xml
QueryFile = /etc/databbix/query-local.xml

14.5 Paso 5: probar con queryexplorer#

Antes de crear nada en Zabbix, se prueba la consulta con queryexplorer (capítulo 13), sin tocar el servicio:

sudo -u databbix /opt/trustserver/bin/queryexplorer -l -f oraprod.conf
QueryExplorer> get local.ora.schema.discovery
QueryExplorer> get local.ora.invalid[HR]
QueryExplorer> get local.ora.invalid.exectime[HR]

Si el XML tiene un error, queryexplorer no llega a mostrar el indicador y el mensaje explica qué consulta falla. Si un valor no es el esperado, se repite con -v 9 para ver el SQL y las filas obtenidas. Cuando todo es correcto, se reinicia el servicio para que el monitor cargue el fichero nuevo:

systemctl restart databbix

14.6 Paso 6: crear los ítems en Zabbix#

En el host ORAPROD (o en una plantilla):

  1. Regla de descubrimiento de tipo Zabbix agent (active) con clave:
    local.ora.schema.discovery

  2. Prototipo de ítem numérico de tipo Zabbix agent (active) con clave:
    local.ora.invalid[{#SCHEMA}]

  3. Opcionalmente, un prototipo de disparador, por ejemplo:
    last(/ORAPROD/local.ora.invalid[{#SCHEMA}])>0

Los datos llegan cuando Databbix vuelve a pedir la lista de ítems activos, es decir, en un máximo de Zabbix.Refresh segundos (300 por defecto), o inmediatamente si se reinicia el servicio.