Monitorizando Haproxy 2.0 mediante Prometheus y Grafana

By on
Análisis y métrica de resultados

En anteriores posts hemos estado hablado sobre Haproxy como herramienta esencial para proteger y controlar el acceso y el buen funcionamiento de nuestras arquitecturas. Pero cómo tenerlo controlado y de qué manera podemos monitorizar su funcionamiento era una pequeña espina que me quedaba para completar esta serie de posts relacionados con Haproxy.

Una de las características incluidas en las nuevas versiones 2.x de Haproxy es la capacidad de monitorizar el funcionamiento de esta herramienta mediante Prometheus al traer integrado en su código un exportador de métricas compatible con la arquitectura Prometheus.

Prometheus es un sistema open-source de monitorización y alertas inicialmente desarrollado por SoundCloud y que actualmente forma parte como proyecto de la Cloud Native Computing Foundation. De hecho, es el segundo proyecto hospedado en esta fundación después de Kubernetes.

La mayoría de componentes de Prometheus están desarrollados en el lenguaje Go, lo que hace fácil crear binarios estáticos que podamos integrar con nuestras aplicaciones.

Sobre la integración de Haproxy y Prometheus, con la inestimable ayuda de Grafana, hablaremos hoy en este post.

Comencemos.

Desplegando Haproxy

La instalación de Haproxy es bastante fácil, basta agregar los repositorios necesarios para nuestra distribución e instalar el paquete. En caso de utilizar distribuciones basadas en Debian/Ubuntu, como es nuestro caso, el proceso se simplifica accediendo a la url <https://haproxy.debian.net> y seleccionando nuestra distribución y versión de la misma.

Hacemos esto porque las versiones incluidas en Debian/Ubuntu como paquete oficial aún están en la versión 1.8.x y nosotros queremos probar la flamante 2.x que incluye el exportador de métricas de Prometheus.

Siguiendo las instrucciones provistas en la url anterior, tendremos que hacer lo siguiente en consola:

Esto nos dejará instalado el paquete Haproxy 2.0.12 en una Debian 10 que utilizaremos como máquina para este post.

Configurando Haproxy para habilitar el exportador de métricas de Prometheus

Como hablábamos anteriormente, el código de Haproxy en sus versiones 2.x ya trae integrado el exportador de métricas como servicio, así que simplemente tendremos que editar nuestro haproxy.cfg para habilitarlo.

Podemos comprobar si nuestra versión trae integrado el exportador de la siguiente forma:

Y para habilitarlo tenemos que agregar un nuevo frontend a nuestra configuración, como ejemplo:

Esto habilitará en el puerto definido (*:8404) y en el path /metrics nuestro conjunto de métricas de la aplicación. También configurará el path /stats las métricas habituales de Haproxy. Aunque no son objeto de explicación de este post, son también una buena fuente de información acerca del funcionamiento de Haproxy.

Una vez hecho esto, sólo tenemos que consultar la url de nuestro haproxy en ese puerto y los distintos paths expuestos para obtener estadísticas de uso de Haproxy, aunque nuestra fuente de información será ese /metrics que vamos a aprovechar con Prometheus y Grafana.

Pasemos a configurar ambos paquetes.

Desplegando Prometheus y Node exporter

Desplegaremos Prometheus y Grafana en la misma máquina virtual donde está instalado Haproxy en este post. Aunque lo ideal es colocar este conjunto de herramientas en una máquina virtual aparte.

Vamos a desplegar también Node Exporter, que es el agente compatible con Prometheus para métricas básicas del sistema (cpu/disco/memoria/etc) y nos permitirá tener información genérica del funcionamiento tanto de la instalación de Haproxy como la del propio host que hospeda la solución Prometheus/Grafana.

Desplegando Node Exporter

Desplegaremos primero Node Exporter de la siguiente forma:

Desplegando Prometheus

Continuamos con la instalación de Prometheus:

Y pasamos a cambiar la configuración de Prometheus que reside en /etc/prometheus/prometheus.yml:

Hemos agregado dos jobs de Prometheus, uno que chequeará el puerto en el que corre Prometheus (:9090) y otro para el Node Exporter (:9100). Estos dos jobs se chequearán cada 5 segundos. Esa será nuestra resolución de monitorización.

Por último, ajustamos los permisos del fichero mediante el comando: chown prometheus:prometheus /etc/prometheus/prometheus.yml.

Es hora de arrancar Prometheus y comprobar su funcionamiento:

Ahí tenemos nuestro Server is ready to receive web request que esperábamos. Lo que significa que, si visitamos con el navegador la url de nuestro Prometheus (http://172.26.13.251:9090, en nuestro caso), debemos ver su interfaz web.

Interfaz de Prometheus

Interfaz de Prometheus

Ahora tenemos que configurar una Unit de SystemD para que Prometheus arranque con el sistema:

Desplegando Grafana

Grafana es la herramienta de facto para analizar y monitorizar que usaremos junto a Prometheus (almacenaje y recolección de métricas) y así completar nuestro stack de Monitorización.

Para desplegarlo, nos descargaremos el paquete para la distribución Debian de la siguiente forma:

Ya tenemos disponible Grafana corriendo en el puerto :3000 de nuestro host Prometheus. Una vez disponible, nos conectaremos con las credenciales por defecto user: admin y password: admin y cambiaremos la contraseña por una más compleja.

Configurando Prometheus como fuente de datos de Grafana

Nos queda configurar Grafana para que consulte la base de datos de Prometheus en busca de métricas.

Lo haremos agregando un Data Source de tipo Prometheus ubicado en la url http://localhost:9090.

Configurando Prometheus como fuente de datos de Grafana

Configurando Prometheus como fuente de datos de Grafana

Configurando Prometheus como fuente de datos de Grafana (data source)

Configurando Prometheus como fuente de datos de Grafana (data source)

Configurando Prometheus como fuente de datos de Grafana

Configurando Prometheus como fuente de datos de Grafana

Configurando Prometheus como fuente de datos de Grafana

Configurando Prometheus como fuente de datos de Grafana

Agregando Dashboards a nuestro Grafana

Para terminar de completar la instalación de Grafana vamos a agregar un Dashboard con las métricas del propio host que hospeda Prometheus y Grafana. Buscaremos en la web de Grafana Dashboards y el dashboard con id:1860 será el que elegiremos.

Puedes ver cómo queda en nuestra instalación aquí:

Instalación de Node Exporter

Instalación de Node Exporter

Configurando Prometheus para que recoja las métricas de nuestro Haproxy

Todavía no tenemos el trabajo de Prometheus definido que se encargará de ir a por las métricas de Haproxy. Para realizar esta tarea tenemos que modificar el fichero de configuración de Prometheus alojado en /etc/prometheus/prometheus.yml de la siguiente forma:

Y procedemos a agregar el Dashboard relacionado con Haproxy de la web de Grafana Dashboards (o a construir el nuestro propio, según la necesidad que tengamos). El id del dashboard que vamos a utilizar es el 10225.

Para ello nos vamos al Grafana en el icono de “Dashboards” -> “Manage” -> “Import” y ahí colocaremos el ID del dashboard que vamos a usar. También podemos organizarlos por carpetas según nuestra organización.

Podemos ver cómo queda dicho dashboard en la siguiente imagen:

Dashboard de Grafana

Dashboard de Grafana

Como podéis ver en la captura, nos está mostrando el número de frontends que están en estado activo y un montón de métricas más que podremos explorar dentro de nuestro Dashboard.

De esta manera podemos explorar todas las métricas que expone nuestro Haproxy.

Queda para otros posts la gestión de alertas mediante AlertManager o la creación de dashboards personalizados mediante PromQL, el lenguaje de consultas que utiliza internamente Prometheus.