Low Level Discovery utilizando HTTP Agent + JSON

From Zabbix-ES
Jump to navigation Jump to search

En esta guía se muestra como crear una Low Level Discovery extrayendo los datos de un JSON (JavaScript Object Notation) y utilizando el item de tipo HTTP Agent. Ademas utilizaremos la función de preprocessing y la función de Item dependiente.

Una LLD proporciona una forma de crear automáticamente items, triggers y gráficos para diferentes servicios/entidades/elmentos en un host. Por ejemplo, Zabbix puede comenzar automáticamente a monitorear sistemas de archivos o interfaces de red en su máquina, sin la necesidad de crear elementos para cada sistema de archivos o interfaz de red manualmente.

En este ejemplo estamos haciendo una llamada a una API de un Balanceador de carga que devuelve un json con una lista de granjas de servidores con sus respectivos atributos, las cuales posteriormente vamos a consultar para obtener las métricas de cada una de ellas.

Pre requisitos

  • Zabbix Server versión >= 4.4
  • Un JSON estándar que contenga una lista con los datos sobre los que vamos a crear nuestra LLD

Configuración

  • Creamos un nuevo template en nuestro Zabbix Server con el nombre que deseemos.
  • Una vez creado el template, pasaremos a crear una nueva Discovery Rule:
Creacion discovery rule http agent.png
 El resto de campos del item HTTP agent no los discutiremos en esta página. Haré referencia solamente a los que estamos utilizando en este ejemplo.
 He resaltado en rojo 2 campos, el primero es el tipo de Discovery Rule que crearemos, en este caso se trata del tipo HTTP agent pues llamaremos a una URL para obtener los datos que nos harán falta para crear nuestra LLD, el segundo campo resaltado como he comentado es la URL que nos devolverá el JSON con el contenido que nos interesa.
 Como véis en la URL estamos utilizando un macro: "{$IP}" Este macro está heredado del host al que aplicaremos el template con nuestra LLD
 Adicional a esto como mi API cuenta con autenticación en los campos User name y Password utilizo unos macros que he definido a nivel de Host.

Este es el modelo de JSON que devuelve mi API cuando se ejecuta la LLD:

 {
   "SlbNewCfgEnhVirtServerTable": [
       {
           "VirtServerIndex": "GranjaServidores1",
           "VirtServerIpAddress": "192.168.2.10",
           "VirtServerWanlink": "",
           "VirtServerRtSrcMac": 2,
           "VirtServerCreationType": 6
       },
       {
           "VirtServerIndex": "GranjaServidores2",
           "VirtServerIpAddress": "192.168.2.20",
           "VirtServerWanlink": "",
           "VirtServerRtSrcMac": 2,
           "VirtServerCreationType": 1
       }
 }
  • Tenemos que "mapear" los campos de nuestro JSON a un macro de LLD, esto es para poder utilizar los datos que hemos obtenido de nuestra LLD en los Items prototypes, triggers prototypes, etc.. Nos movemos a la tercera pestaña de la LLD "LLD macros"
LLD macros

Esto se traduce en que:

 {#VIRTSERV_NAME} va a equivaler al campo del JSON "VirtServerIndex".
 {#VIRTSERV_IP} va a equivaler al campo del JSON "VirtServerIpAddress".

Hay que hacer esto por cada campo del JSON que queramos transformar en un macro válido para utilizar para crear items, triggers, etc. En este caso utilizaremos solo estos 2 porque en el siguiente paso con esto valores haremos otra llamada a la API que nos devolverá una lista de métricas por cada {#VIRTSERV_IP}.

  • En este ejemplo creamos un Item prototype "maestro" que nos va a devolver las estadísticas de una granja de servidores:
Item prototype lld
 Igual que antes, está resaltado los campos que nos interesan en este ejemplo:
 Como se observa se está utilizando el macro {#VIRTSERV_NAME} para el nombre, key y URL. De esta manera nos aseguramos que se crearán N items únicos por cada granja de servidores exista en nuestro JSON.
 El "Type of ifnormation" es necesario que esté en Text, de esta manera obtenemos el total del JSON, si tenemos el tipo de información en numeric, nos dará un error pues el tipo de dato que recibe no es del tipo numérico. 
 El valor "History storage period" lo marcamos como "Do not keep history". Esto se hace porque no es eficiente guardar todo el texto, los valores los extraeremos más adelante en un item de tipo dependiente.

La llamada a la URL se traduciría a lo siguiente:

 https://192.168.2.99/config/SlbStatEnhVServerTable/GranjaServidores2
  Al igual que la URL se transforma en el valor en cada campo del item donde hayamos empleado el macro.

Este es el modelo de JSON que devuelve mi API cuando se ejecuta el item prototype:

 {
   "SlbStatEnhVServerTable": [
       {
           "Index": "GranjaServidores2",
           "CurrSessions": 19,
           "TotalSessions": 1294,
           "HighestSessions": 252,
           "HCOctetsLow32": 32,
           "HCOctetsHigh32": 14,
           "HeaderHits": 99,
           "HeaderMisses": 11,
           "HeaderTotalSessions": 0,
           "CookieRewrites": 0,
           "CookieInserts": 0,
           "HCOctets": 0,
           "IpAddress": "192.168.2.20",
           "SessionsPerSec": 0,
           "OctetsPerSec": "0",
           "CurrPSessions": 0,
           "TotalPSessions": 0,
           "HighestPSessions": 0
       }
   ]
}
  • Con esto ya tendríamos nuestra LLD funcionando correctamente, pero queremos extraer los datos que nos están devolviendo nuestros items prototypes "maestros":
Creación item prototype dependent
 Igual que antes, está resaltado los campos que nos interesan en este ejemplo:
  Creamos un item del tipo "Dependent item".
  Seleccionamos un "Master Item", de esta forma le decimos de donde va a obtener los datos. Los items dependendientes no se le indica cada cuanto se tienen que ejecutar, dependen de la correcta ejecución del item maestro.
  Aquí si asignamos el tipo de información a "Numeric" porque en este caso, vamos a obtener la sesiones actuales que tiene nuestra granja de servidores.
  • Pasamos a la pestaña de Preprocessing, esta parte es muy importante pues es donde vamos a indicar que campo del JSON vamos a utilizar:
Dependente item preprocessing.png

Asignamos un Preprocessing step de tipo "JSONPath". Con este tipo de preprocesamiento, podemos navegar dentro del JSON:

 $.SlbStatEnhVServerTable.[0].CurrSessions

En el botón de Test, podemos probar nuestra regla si es correcta o no:

Test prepro.png

Como véis ha extraído el valor 19 de nuestro JSON.

Hay que repetir este proceso por cada campo del JSON que queramos monitorizar.