Monitoreo de contenedores | Telegraf + Prometheus para centralizar métricas

Gerardo Ocampos
5 min readJul 29, 2021

--

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.

By Gerardo Ocampos

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

ejemplo docker stats

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

telegraf-docker.conf

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:

Prometheus

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.

Telegraf Container Overview
Telegraf Container Stats

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.

--

--

Gerardo Ocampos

Red Hat Certified Engineer — Red Hat Certified System Administrator — Red Hat Certified Specialist in Containers and Kubernetes. Asunción, Paraguay