Monitoreo de contenedores | Telegraf + Prometheus para centralizar métricas
Exploraremos los medios actuales para controlar, medir y analizar métricas de nuestros servicios que se encuentran corriendo en contenedores, utilizando Prometheus como almacenamiento de datos centralizado.
Existen diferentes formas de medir y supervisar contenedores, iniciando por la línea de comando, que nos ayuda especialmente a validar cualquier tipo de actividad que esté ocurriendo en nuestros servicios.
Algunos ejemplos para verificar las estadísticas mediante línea de comando, podrían ser los siguientes: docker stats / docker ps / docker top
Pero cuando hablamos de un sistema de monitoreo, nos enfocamos en la centralización, es decir un lugar donde podemos visualizar, medir y analizar todo tipo de eventualidad sin la necesidad de estar consultando servicio por servicio de forma independiente.
En el siguiente laboratorio, utilizaremos Prometheus como un almacenamiento centralizado de métricas, de la misma forma implementaremos herramientas que nos ayuda a coleccionar y obtener las estadísticas de cada contenedor.
Prometheus, es una solución de monitoreo flexible que almacena todos sus datos en una base de datos de tipo Time Series (TSDB) y ofrece un modelo de datos multidimensional y un poderoso lenguaje de consulta para generar informes de los recursos monitoreados.
Nota: Puede seguir el siguiente enlace, donde se explica como instalar y configurar un servidor de monitoreo centralizado con Prometheus y Grafana.
Existen diferentes agentes que nos pueden ayudar a coleccionar las estadísticas de los contenedores que se integran con Prometheus. En nuestro caso, configuraremos telegraf como agente colector de métricas.
Telegraf, agente muy liviano que se encarga de recolectar, procesar y enviar las métricas de una máquina que queremos monitorizar a una base de datos Time Series.
Entorno de laboratorio
En nuestro ejemplo utilizaremos un simple servidor Linux con sistema operativo Rocky 8.4 en el cual se encuentra corriendo el servicio Docker con una cantidad de 4 contenedores diferentes.
# listamos los contenedores
sudo docker container ls --format "table {{.ID}} {{.Image}} {{.Names}}"CONTAINER ID IMAGE NAMES
7d0b5085ea09 jenkins/jenkins nostalgic_noyce
08485b2b6a8b mysql db
0b334b748e59 jboss/wildfly app01
b847714c2901 httpd apache-test01
1- Instalación de Telegraf
Para instalar el agente en nuestro servidor, es necesario configurar el siguiente repositorio.
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
Luego procedemos a instalar el agente.
sudo yum install telegraf
Antes de iniciar el servicio, vamos a realizar la configuración necesaria para que publique las métricas de los contenedores en formato válido para Prometheus.
2- Configuración de Telegraf para Contenedores
La configuración del agente instalado por defecto se encuentra en el siguiente path /etc/telegraf/telegraf.conf
Vamos a mover esta configuración original a un backup, luego procedemos a agregar solamente las líneas que nos ayudaran a supervisar los contenedores.
# movemos la configuración original a un backup
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.backup# creamos una nueva configuración en blanco
sudo touch /etc/telegraf/telegraf.conf
El siguiente paso es agregar la configuración personalizada a nuestro archivo
La integración de telegraf y prometheus se realiza en la sección [[outputs.prometheus_client]]
donde especificamos el formato en el cual queremos exponer nuestras métricas, así como también el puerto con el cual se publicara.
Por otra parte, tenemos la sección de [[inputs.docker]]
donde indicaremos el path del cual obtendrá el socket "unix:///var/run/docker.sock"
de nuestro servicio docker y los parámetros que utilizara para coleccionar las estadísticas de los contenedores.
Un paso importante es que el servicio telegraf pueda leer el socket del servicio docker. Para eso, debemos agregar al usuario de servicio telegraf al grupo docker. Ref: https://docs.docker.com/engine/install/linux-postinstall/
Agregamos el usuario de servicio telegraf al grupal docker
sudo groupadd docker
sudo usermod -aG docker telegraf
Finalmente iniciamos el servicio
sudo systemctl start telegraf
Puede consultar todas las métricas que el servicio telegraf expone mediante el puerto 9273
curl http://localhost:9273/metrics
Nota: En el caso de tener iniciado el servicio de firewall, realizar los siguiente para habilitar el puerto mencionado.
sudo firewall-cmd --permanent --add-port=9273/tcp
sudo firewall-cmd --reload
3- Configuración de Prometheus
Dentro de la configuración de Prometheus, debemos agregar un nuevo JOB encargado de realizar scrape
de todas las métricas publicadas.
Agregamos lo siguiente a nuevo archivo prometheus.yml
Nota: Reemplazar la IP 192.168.33.192 por la ip del servidor donde se encuentra instalado telegraf
- job_name: 'telegraf-docker'
static_configs:
- targets:
- 192.168.33.192:9273
Finalmente recargamos la configuración y consultamos las métricas dentro del portal de Prometheus, debería visualizar de la siguiente forma:
El siguiente paso es integrar el servicio de Prometheus con Grafana, de esta forma podremos aprovechar las métricas publicadas para realizar dashboard centralizado de servicios.
Utilizando como Datasource la base de datos Prometheus, dentro del Grafana podemos configurar el siguiente dashboard, que se encuentra disponible en el siguiente enlace para descargar.
Puede ingresar al siguiente repositorio donde se encuentra almacenado todo el código utilizado en este laboratorio, como también una pequeña colección de configuraciones para monitoreo de contenedores.
Si tiene alguna duda, no dude en comunicarse conmigo: