Prometheus +Grafana + Webhook
Automatización de procesos con Prometheus, Grafana y WebHook: resolución autónoma de incidentes
Ideas para construir un stack completo de analítica y monitorización de infraestructuras con respuesta automatizada ante eventos a partir de herramientas open source.
En esta primera entrega de una serie de tres publicaciones vamos a introducir los componentes de la solución y exponer un caso de uso básico. A partir de un ejemplo, entenderemos mejor el rol que ejerce cada elemento y sobre todo, las potenciales posibilidades de la solución. En próximas publicaciones iremos desgranando los aspectos técnicos fundamentales de esta integración.
Componentes fundamentales

A continuación describo brevemente los cuatro componentes principales de la solución:
Prometheus, un kit de herramientas de monitorización de código abierto originalmente creado en SoundCloud. Como características principales, destacaríamos su modelo de datos multidimensional orientado a series temporales, métricas y pares de clave/valor, además de su modelo de extracción de datos ligero por HTTP.
node_exporter es el exportador específico de Prometheus para métricas de hardware y sistemas operativos de kernels *NIX y que utilizaremos en este caso paramonitorizar el estado de determinados servicios y recursos en un servidor virtual con CentOS 7. Existe una amplia lista de exporters específicos para diferentes tipos de componentes; bases de datos, aplicaciones, hardware,servicios cloud.
Grafana es un software de análisis y visualización de datos, metricas, logs, trazas. Permite la consulta,visualización, generación de alertas y correlado de datos provenientes de tus componentes de infraestructuras. Posee un amplio soporte para muchas de las bases de datos de series temporales más populares en estos momentos como Graphite,Prometheus, Elasticsearch, OpenTSDB e InfluxDB. Ofrece además un potente motor de visualización en comparación con otras alternativas del mercado.
Por último, el cuarto elemento de este stack es Webhook. Un servidor ligero para webhooks entrantes que nos permite crear endpoints HTTP para disparar comandos/scripts previamente configurados. Pudiendo a su vez pasar los datos entrantes o respuestas de las solicitudes (cabeceras, payloads o queryvariables) a dichos comandos/scripts y especificar reglas o condiciones que deben cumplirse para que se disparen.
No nos detendremos en explicar cómo instalar estas cuatro herramientas y partiremos ya de un entorno operativo en el cual dispondremos de un servidor Prometheus, otro Grafana, una instancia Webhook y al menos un componente de infraestructuras, servidor o máquina virtual, con prometheus/node_exporter desplegado. En la documentación de cada herramienta podréis encontrar manuales de instalación perfectamente detallados.
Caso de uso práctico
Para entenderlo un poco mejor, entre numerosos posibles casos de uso, nos vamos a quedar con un ejemplo básico de alertado ante parada de un servicio y reinicio automatizado del mismo para entender mejor los elementos fundamentales de esta solución.
En el siguiente diagrama se puede identificar el rol que ejerce cada componente en la secuencia de eventos que transcurre desde la recolección de datos hasta la toma de una acción, en este caso, el arranque automatizado de un servicio que se ha detenido:

Estaremos de acuerdo en que el uso generalizado de Grafana gira en torno a la visualización, alertado y correlado de datos provenientes de distintas fuentes o elementos de infraestructuras. En mi caso,después de haber profundizado en las capacidades de este tipo de herramientas,tras distintos proyectos y experimentos, echaba en falta poder ir un paso más allá, enriqueciendo esa analítica y visualización de datos con cierto grado de automatización de procesos. Basicamente, la idea que me rondaba la cabeza era,a partir de los datos analizados, poder realizar acciones automatizadas sobrelos elementos de infraestructuras.
Una de los factores clave sobre los que se apoya este concepto, base fundamental para idear y desarrollar esta funcionabilidad de automatización de procesos, han sido los notificadores para las alertas en Grafana. Dentro del amplio listado de notificadores soportados localizamos el tipo webhook, un método de notificación a travésde peticiones HTTP y en el que la información o respuesta normalmente se expone de manera estructurada en formato JSON.
Aquí tenéis un ejemplo denotificación de tipo webhook emitida por una alerta de Grafana:

Prestemos especial atención a los siguientes pares clave/valor del ejemplo:

En la segunda publicación de esta serie de artículos trataremos con más detalle la integración de prometheus/node_exporter con las alertas de Grafana. Para esta primera introducción, nos basta con saber que con estos tres pares clave/valor de los que Grafana emite en su alerta, tenemos recopilada de una forma estructurada toda la información necesaria para posteriores operaciones: el elemento que reporta la alerta (“ 192.168.1.11”), el servicio afectado (“ crond.service”)y el tag/motivo en caso de haberlo (“ maintenance”).
Ahora ya solo nos faltaría una pieza para terminar de dar sentido a esta solución: el elemento que interactúe con esas peticiones HTTP, procese la información y ejecute comandos o scripts en base a la lógica, reglas o condiciones que definamos. Este esnuestro servidor ligero Webhook. El nombre no es muy original y puede dar lugara confusión con el propio método de notificación ( webhook) que hemos comentado antes.

Llegados a este punto detengámonos un instante, imaginad las posibilidades, distintos tipos de alertas apuntando a sus end points específicos que a su vez disparan los scripts predeterminados para cada tipo de acción.
A continuación tenéis un extracto de un fichero de configuración “ hooks.json” de Webhook para un endpoint en concreto, en este caso elque nos servirá como ejemplo para el reinicio automatizado de un servicio previamente detenido. Entre otras muchas cosas, en dicho fichero se describen los argumentos para procesar la informacion entrante:

Ya nos detendremos en la tercera publicación de esta serie en la integración de Webhook y sus posibilidades de parametrización para tratar la información entrante o definir las reglas y condiciones para la posterior ejecución de scripts. Por ahora, y siguiendo con nuestro ejemplo, en el caso de que dentro del cuerpo del mensaje de alerta, para el parámetro “ tags.reason” el valor sea igual a “ maintenance” la condición no se cumplirá y no se ejecutará el script indicado (“execute-command”:“/var/scripts/test-hook.sh”):
Extracto del fichero deconfiguración hooks.json de Webhook con su trigger-rule definida para que se ejecute el comando o script en función de la condición deseada:

Siempre que el valor delparámetro “ tags.reason” no sea igual a “ maintenance”, se ejecutará el script definido para levantar un servicio ( test-hook.sh), pasándole las variables instancia y nombre-servicio:

Como habéis podido observar, las posibilidades de la solución son muy amplias, tratamiento reactivo ante eventos sobre elementos de infraestructuras, pero con capacidad para el desarrollo de funciones más avanzadas de automatización proactiva o incluso intervención predictiva.
Por último, a continuación tenéis un breve video donde se puede ver en tiempo real el caso de uso comentado: forzaremos la detención de un servicio en el componente monitorizado sin incluir ningún tipo de información/tag en la alerta, de forma que simularemos una supuesta detención inesperada del servicio para ver como se comporta el automatismo de respuesta ante incidentes que hemos explicado:
En el segundo video incluimos el valor “ maintenance” en el parámetro“ tags.reason” de la alerta de Grafana y procedemos a forzar la detención del servicio tal y como hemos realizado en la prueba anterior. En este caso sepuede observar que no se inicia el servicio de forma autónoma ya que se recibe la condición definida para la no ejecución del script:
Hasta aquí esta primera entrega, espero que os pueda servir de utilidad.
Como he comentado ya, en próximas publicaciones desgranaremos los aspectos técnicos fundamentales de esta integración (Prometheus-Grafana y Grafana-Webhook).