Low Level Discovery

From Zabbix-ES
Jump to navigation Jump to search

Pre Requisitos

- Instalar JQ desde Epel Repository

Crear las funciones que nos ayudaran a gestionar el LLD

- La primera funcion genera el LLD 

Nota: La idea es que el JSON que se genera sea dinámico. Este es el principal beneficio del LLD, que autodescubra los elementos que queremos monitorizar de forma autónoma y cree los items segun el elemnto descubierto. Como vemos en el siguiente script, una host puede tener 1 HDD o N, pero sea cual sea el numero de discos, los queremos tener monitorizados a todos. Si no queremos que todo lo autodescubierto se monitorice podemos aplicar filtros al autodiscover creando expresiones regulares generales (Administration -> General -> Regular Expressions).

UserParameter=lld.disk, /usr/bin/iostat -y 2>/dev/null | /usr/bin/sed -n '/Device/,$p' |  /usr/bin/awk 'BEGIN{sep="";print "{\"data\":["} NR!=1 { if($1) { print sep"{\"{#DEV}\":\""$1"\"}" } sep=","}END{print "]}"}'
Nota: Este script genera una salida con el formato que espera Zabbix
{
  "data": [
    {
      "{#DEV}": "sda"
    },
    {
      "{#DEV}": "dm-0"
    },
    {
      "{#DEV}": "dm-1"
    },
    {
      "{#DEV}": "dm-2"
    }
  ]
}
- La segunda funcion la utilizaremos dentro de un item prototype para recuperar el estado de cada dispositivo
UserParameter=dev.putilization[*], /usr/bin/iostat -yx 1 2 $1 | /usr/bin/tail -2 | /usr/bin/head -1 | /usr/bin/awk '{print $NF}'  
Nota: Se pasa a la funcion el DEVICE para el cual queremos recuperar el % de Utilizacion.

Creamos un Template en el cual utilizaremos lo que definimos anteriormente

Configuration -> Template -> Create Template

Template name: Template DEMO LLD
Groups: Templates
<<ADD>>

- Seleccionamos y vamos Discovery rules -> Create Discovery rules
Name: LLD Devices
Type: Zabbix Agent
Key : lld.disk <- ES LA KEY definida en el userparameter del agente
<<ADD>>
- Dentro del LLD que creamos "LLD Devices" creamos un Item Prototype
Item prototypes -> Create Item Prototype

Name: % Utilization
Type: Zabbix Agent
Key : dev.putilization["{#DEV}"] <- ES LA KEY definida en el userparameter del agente que se le pasa como parámetro la macro del LLD
Type of information: Numeric Unsigned
Units: %
<<ADD>>

Creamos el userparameterdemo.conf

# vi /etc/zabbix/zabbix_agentd.d/userparameterdemo.conf
UserParameter=lld.disk, /usr/bin/iostat -y 2>/dev/null | /usr/bin/sed -n '/Device/,$p' |  /usr/bin/awk 'BEGIN{sep="";print "{\"data\":["} NR!=1 { if($1) { print sep"{\"{#DEV}\":\""$1"\"}" } sep=","}END{print "]}"}'
UserParameter=dev.putilization[*], /usr/bin/iostat -yx 1 2 $1 | /usr/bin/tail -2 | /usr/bin/head -1 | /usr/bin/awk '{print $NF}'

# systemctl restart zabbix-agent.service

Creamos un Trigger Prototype para que genere una alerta

Trigger prototypes -> Create Trigger prototype

Name: {HOST.NAME} - {#DEV} High % Usage
Severity: Hight
Expression: {Template DEMO LLD:dev.putilization["{#DEV}"].max(#3)}>50 or {Template DEMO LLD:dev.putilization["{#DEV}"].nodata(5m)}=1
Nota: Si el valor supera el 50% o no hay datos recolectados en 5m salta la alarma
# zabbix_server -R config_cache_reload

Ejemplo

2019-03-24 14-56-38.png 2019-03-24 14-56-50.png 2019-03-24 14-57-09.png 2019-03-24 15-01-56.png 2019-03-24 14-57-34.png

- Generamos un poco de carga y vemos como se comporta el nuevo Trigger
# dd if=/dev/sda of=/dev/null bs=1024

2019-03-24 15-00-47.png 2019-03-24 14-59-47.png