Alertas en Grafana con RaspBerry Pi

Una vez que tienes montado un sistema de monitorización con Grafana, el siguiente paso suele ser crear algunas alertas para que te avise en caso de que se alcancen determinados umbrales. Por ejemplo, si estás monitorizando servidores, es esencial que te avise cuando te estás quedando sin espacio en disco o puede que te interese ser alertado cuando haya un consumo excesivo de memoria o CPU durante un tiempo prolongado.

Características

Para cubrir esa necesidad, existe la creación de alertas en Granfa, que tienen las siguientes características:

  • Las alertas están disponibles desde la versión 4.0 de Grafana, no en versiones anteriores.
  • No se pueden crear alertas para visualizaciones que incluyan variables del dashboard. Es decir, si tienes un dashboard genérico donde una de tus variables es el nombre del host, y utilizas ese mismo dashboard para monitorizar varias máquinas, no podrás crear alertas sobre esas visualizaciones 🙁 La solución pasa por crear Dashboard, o visualizaciones que no incluyan variables.
  • Solo se puede utilizar para visualizaciones de tipo panel, que son las más habituales para graficar recursos o rendimiento, pero no lo podrás utilizar para visualizaciones tipo Gauge, Tablas, Texto, ..
  • Se pueden mostrar las alertas desde la lista de Alert Rules, o añadiendo una visualización con un Panel de Alertas:
  • Las alertas se pueden asociar a Notificaciones, lógicamente. De esta forma, cada vez que se genere una alerta, nos puede enviar una notificación utilizando distintos mecanismos: Email, Telegram, Slack, Hangouts, Teams, Webooks, Discord y muchos otros más.

Crear alertas

Crear una alerta es muy sencillo, una vez que tienes una visualización ya creada, por ejemplo para monitorizar la ocupación de disco de una máquina, en el siguiente ejemplo monitorizo el tanto por ciento de ocupación de dos particiones (/ y /boot). Primero, seleccionas la gráfica y editas su configuración:

Después, pulsas sobre la opción de alertas y Create Alert:

Y después, completamos los campos para definir la alerta en base a nuestras necesidades:

  1. El nombre de la alerta
  2. El periodo de evaluación del umbral. Es decir, cada cuanto tiemp comprobamos si se alcanza el nivel de alerta que definimos después
  3. Durante cuanto tiempo se debe superar el umbral definido, para que se dispare la alerta.
  4. En mi caso, estoy evaluando dos querys que tengo graficadas en esta visualización, y por tanto selecciono el nombre de cada query, en este caso B y C.
  5. El umbral de alerta. En este caso alertará si supera el 90% de ocupación
  6. Cómo notificar esta alerta, luego veremos más detalles sobre esto.

En resumen, esta alerta se disparará si durante 30 minutos, evaluando cada 1 minuto, la ocupación de alguno de esos dos discos se mantiene por encima del 90% de ocupación, y enviará la alerta por correo.

Configurar Notificaciones

Para poder asociar una notificación a una alerta, previamente has debido configurar un canal de notificaciones. Para ello, en el menú izquierdo de Alerting, deberás entrar en el apartado Notification channels:

Desde ahí tienes la opción de crear un nuevo canal de notificaciones:

Y ya desde ahí podrás configurar el detalle de las notificaciones que necesites habilitar. Cada tipo de integración requiere distintos parámetros, por ejemplo la más simple de Email solo requiere que especifiques a qué direcciones de correo quieres enviarlo (previa configuración de SMTP de Grafana, luego lo vemos), mientras que la integración con Microsoft Teams te pedirá la URL de notificaciones Webhooks o para la integración con Telegram necesitarás el BOT API Token y el Chat ID.

En nuestro caso, por ir con la solución más sencilla configuraremos la notificación por correo, y verás que además puedes especificar las siguientes opciones:

  • Nombre
  • Tipo: Email
  • Send on all alerts: por defecto, seleccionará este canal de notificaciones para todas las alertas, no lo podrás excluir de una alerta concreta.
  • Include image: incluir una alerta de la gráfica en la propia notificación. Esto es muy útil, y hablaremos más sobre ello después.
  • Disable Resolve Message: por defecto, te enviará una notificación cuando se dispare una alerta, y también cuando se resuelva la situación que la provocó (ej: que se libere espacio en disco). Esta opción deshabilita el envío de notificación cuando se recupera la alerta.
  • Send reminders: cuando habilitas esta opción y se genera una alerta, envía recordatorios de la alerta mientras siga activada cada X tiempo, que deberás definir: 30m, 6h, …

Para que Grafana pueda enviar mensajes por correo electrónico, tendréis que configurar el servicio SMTP que se va a utilizar para este envío de correos. Si lo tenéis instalado en un servidor propio, podréis utilizar el MTA de la propia máquina que será un Postfix, Exim, Qmail o similar. En caso contrario, si no disponéis de un MTA propio podréis hacer uso de algún relay de Gmail por ejemplo, siguiendo estas instrucciones.

La configuración va en el fichero /etc/grafana/grafana.ini, y consiste en algo como lo siguiente para un servidor MTA corriendo en la misma máquina que Grafana:

[smtp]
enabled = true
host = localhost:25
;user =
# If the password contains # or ; you have to wrap it with trippel quotes. Ex """#password;"""
;password =
;cert_file =
;key_file =
;skip_verify = false
from_address = [email protected]
from_name = Grafana
# EHLO identity in SMTP dialog (defaults to instance_name)
ehlo_identity = tudominio.es

Incluir imagenes en Notificaciones

Como habréis visto, en el título de esta entrada se hace referencia a realizar la configuración de Alertas en Grafana en una Raspberry Pi, pero hasta ahora no hemos dicho nada especial de esta configuración, porque hasta ahora todo ha sido transparente con respecto al tipo de máquina donde Grafana se ejecuta. Pero aquí viene una diferencia, y relevante para la mayoría, que viene a la hora de configurar este apartado que comentábamos antes:

Con esta configuración, le decimos a Grafana que incluya en las notificaciones la gráfica que ha generado la alerta. En el caso del correo, Grafana incrustará una imagen de la gráfica correspondiente en el correo, quedando de esta forma y proporcionándonos una información imprescindible en la propia notificación, sin tener que acudir a Grafana para ver los detalles:

Para poder incluir esta gráfica en la notificación, Grafana tiene que convertir la propia gráfica dinámica en una imagen de tipo png. Este proceso se llama renderizado de imágenes (image rendering), y tiene un requisito importante:

Necesita un mínimo 16GB de RAM!!!

Si, 16GB de RAM, que de inicio suena complicado de conseguir en una Raspberry, pero aún así he tratado de instalarlo para ver si funcionaba, aunque fuera un proceso más lento. Necesita esa cantidad de memoria porque se basa en renderizado que realiza ejecutando un navegador chrome por debajo para realizar esa tarea.

Instalar/configurar renderizado de imagenes

Hay tres formas de instalarlo/configurarlo:

  1. Mediante la instalación del plugin correspondiente
  2. Mediante un contenedor Docker
  3. Mediante un servicio remoto

Vamos a ver cuál de estas tres opciones son válidas para nuestra Raspberry Pi. La primera consiste en instalar el plugin grafana-image-renderer, que de inicio debería ser un proceso sencillo, pero si lo intentáis instalar conseguiréis algo como esto:

[email protected]:~ $ sudo grafana-cli plugins install grafana-image-renderer
Failed to send requesterrorApi returned invalid status: 404 Not Found
Error:  Failed to send request. error: Api returned invalid status: 404 Not Found
NAME:
Grafana cli plugins install - install
USAGE:
Grafana cli plugins install [arguments…]

Es decir, que no encuentra el plugin. ¿Porqué? Pues porque solo está disponible para arquitectura amd64, es decir no hay nada compatible para armv7 que tiene la Raspberry Pi 3+.

Probamos con la siguiente opción, ejecutar un contenedor docker que incluye este servicio. Si ya tenemos Docker funcionando, es tan sencillo como esto:

[email protected]:~ $ docker pull grafana/grafana-image-renderer:latest

Tarda un rato, pero finalmente tenemos nuestra imagen de este contenedor disponible para ejecutar. Pero esto es lo que pasa cuando intentamos ejecutarlo en nuestra RaspBerry Pi:

[email protected]:~ $ docker run -d --net=host grafana/grafana-image-renderer
a83cd8539a9a6e820fbdc8c683dec1e5b88e4718296f7825c871bdccf0f6e8d9
Error response from daemon: Cannot start container a83cd8539a9a6e820fbdc8c683dec1e5b88e4718296f7825c871bdccf0f6e8d9: [8] System error: exec format error

De nuevo, problemas con la arquitectura y el formato de los binarios que acompañan a este contenedor. Le estuve dando vueltas a esta opción, tratando de pelearme con el DockerFile cambiando la imagen base de node con una versión para armv7, peleándome con las versiones e incompatibilidades de yarn, y finalmente de puppeter. Aunque conseguí crear algunas imagenes que llegaban a ejecutarse, la parte de node funcionaba correctamente, pero siempre acababa teniendo algún problema adicional que hacía que el renderizado de la imagen no funcionara.

Finalmente, desistí y pasé a probar la tercera opción. En este caso, fue muy fácil y rápido. Instalé el contenedor de Docker en una máquina virtual Linux con arquitectura amd64, y el servicio se ejecutó y funcionó a la primera. Hay que ejecutar esto en la máquina Linux:

$ docker run -d -p 8081:8081 --name renderer grafana/grafana-image-renderer

Y configurar esto en el fichero de Grafana de la Raspberry Pi:

[rendering]
server_url = http://IP_SERVIDOR_LINUX:8081/render
callback_url = http://IP_SERVIDOR_GRAFANA:3000

Después de reiniciar el servicio de Grafana, el renderizado de imagenes funciona correctamente en este servidor remoto, y el proceso tarda menos de 1-2 segundos, pese a que la máquina virtual no tiene más que 1vCPU y 1GB de RAM.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.