Cómo explotar las métricas de Traefik 2.2 con InfluxDB y Grafana

En este artículo, te voy a mostrar cómo configurar Traefik e InfluxDB para explotar métricas desde Grafana.

Los datos son hermosos, nos dan visibilidad y nos permite tomar decisiones que eventualmente nos permitirán mejorar o ajustar nuestros sistemas, creo que nadie por estos días lo discute. En mi opinión, no podemos mejorar algo que no podemos medir.

En este caso, si quiero mejorar como Traefik funciona, tengo que medir qué tal está performando y para eso, en este caso, voy a usar la combinación de InfluxDB y Grafana.

Empecemos a configurar

Por si no lo sabías, Traefik es capaz de generar información sobre los requests que se hacen a los EntryPoints, así como también medir los códigos y tiempos de respuesta de nuestros contenedores. Esa información que se generá, se necesita almacenarse y una de las opciones para hacerlo y que vamos a usar en este artículo es InfluxDB.

Pero, vamos por parte, veamos el docker-compose.yml con el que vamos a trabajar:

version: "3.3"

services:
  traefik:
    container_name: traefik
    image: "traefik:v2.2"
    command:
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --providers.docker
      - --api
      - --api.dashboard=true
      - --log.level=DEBUG
      - --metrics=true
      - --metrics.influxdb=true
      - --metrics.influxdb.address=http://influxdb:8086
      - --metrics.influxdb.protocol=http
      - --metrics.influxdb.database=traefik
      - --metrics.influxdb.username=traefik
      - --metrics.influxdb.password=traefik
      - --accesslog=true
      - --accesslog.filepath=.logs
      - --accesslog.format=json
      - --accesslog.filters.statuscodes=200,300-302
      - --accesslog.filters.retryattempts
      - --accesslog.filters.minduration=10ms
      - --certificatesresolvers.leresolver.acme.httpchallenge=true
      - --certificatesresolvers.leresolver.acme.email=tuemail
      - --certificatesresolvers.leresolver.acme.storage=.acme/acme.json
      - -- certificatesresolvers.leresolver.acme.httpchallenge.entrypoint=web
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ".logs:/var/log"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - ".acme/acme.json:/acme.json"
    labels:
      # global redirect to https
      - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
      - "traefik.http.routers.http-catchall.entrypoints=websecure"
      - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"

      # triying to make work dashboard
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`dashboard`)"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.tls.certresolver=leresolver"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.middlewares=authtraefik"
      - "traefik.http.middlewares.authtraefik.basicauth.users=httpd:user

      # middleware redirect
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

    networks:
      - "traefik-public"
      - "monitoring"
  
  influxdb:
    container_name: influxdb
    image: influxdb:latest
    volumes:
      - ./influxdb:/var/lib/influxdb
    labels:
      - "traefik.http.routers.influxdb.rule=Host(`influxdb`)"
      - "traefik.enable=true"
      - "traefik.http.routers.influxdb.entrypoints=web"
      - traefik.http.services.influxdb.loadbalancer.server.port=8086
    networks:
      - "monitoring"
      
  grafana:
    container_name: grafana
    image: grafana/grafana
    labels:
      - "traefik.http.routers.grafana.rule=Host(`mihost`)"
      - "traefik.enable=true"
      - "traefik.http.routers.grafana.tls.certresolver=leresolver"
      - "traefik.http.routers.grafana.entrypoints=websecure"
      - traefik.http.services.grafana.loadbalancer.server.port=3000
    volumes:
      - grafana:/var/lib/grafana
    networks:
      - "monitoring"

volumes:
  influxdb:
  grafana:

networks:
  monitoring:

  traefik-public:
   external: true

Observen, que estamos especificando volúmenes, en concreto quiero que miren los del contenedor InfluxDB y Grafana. Hacer persistente la información es clave para tener un historial de las métricas y la configuración de nuestros dashboard. Así que vamos a crear algunas redes y volúmenes.

Desde la cli de Docker. Vamos a ejecutar lo siguiente:

docker volume create grafana
docker volume create influxdb

Ahora vamos a crear la red "monitoring"

docker network create monitoring

En el caso de que estés configurando Traefik por primera vez, es bueno crear una red llamada "traefik-public"

docker network create traefik-public

Una vez creadas estas redes y volúmenes, volvamos al docker-compose.yml, miremos los argumentos del Traefik que nos van a servir para habilitar estás métricas, vamos a decirle que las mismas serán volcadas en una InfluxDB y los datos de cómo nos vamos a conectar a ella, así como también la especificación de la base de datos donde la info se va a almacenar, el usuario y contraseña y el protocolo que vamos a usar.

      - --metrics=true
      - --metrics.influxdb=true
      - --metrics.influxdb.address=http://influxdb:8086
      - --metrics.influxdb.protocol=http
      - --metrics.influxdb.database=traefik
      - --metrics.influxdb.username=traefik
      - --metrics.influxdb.password=traefik

Una vez que estamos Ok y tenemos todo configurado. Ejecutamos...

docker-compose up -d

Dejamos que la "magia" ocurra y si todo fue bien, veremos tres contenedores corriendo. La cosa se debería ver más o menos así:

daa3fd4c253a        grafana/grafana     "/run.sh"                18 hours ago        Up 18 hours         3000/tcp                                   grafana
a2f8fdaac5ff        traefik:v2.2        "/entrypoint.sh --en…"   18 hours ago        Up 18 hours         0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   traefik
2f0850e85c0e        influxdb:latest     "/entrypoint.sh infl…"   18 hours ago        Up 18 hours         8086/tcp                                   influxdb

Con esta parte ya estamos, ahora, debemos comenzar a configurar nuestro InfluxDB y Grafana.

InfluxDB

Para quien no conoce InfluxDB, les cuento que es un motor de base de datos eficiente y de alto rendimiento para manejar grandes volúmenes de datos de series temporales. Ideal para casos de análisis de métricas, como en este caso.

Ahora bien, lo que necesitamos hacer en el contenedor de InfluxDB es, conectarnos a él, ejecutar la cli/shell de Influx, crear una base de datos, usuario y contraseña y darle permiso a ese usuario sobre esa base.

docker exec -it 2f0850e85c0e bash

Una vez dentro, tipeamos lo siguiente, el mismo nos va a cargar la shell de InfluxDB.

influx

Se debería ver algo así:

Connected to http://localhost:8086 version 1.7.10
InfluxDB shell version: 1.7.10
>

Luego, vamos a crear una base de datos llamada "traefik" (Atención que no es como en MySQL o MariaDB donde debemos terminar los comandos con ";")

create database traefik

Esto no nos va a devolver nada, pero si queremos chequear que la base de datos esté creada, tipeamos lo siguiente:

show databases

Nos debería devolver algo como esto:

name: databases
name
----
traefik
_internal
>

Ahora, vamos a crear el usuario, la sintaxis, es la siguiente:

CREATE USER traefik WITH PASSWORD 'traefik' WITH ALL PRIVILEGES

Y le damos acceso a ese usuario a la base de datos traefik.

> GRANT ALL ON "traefik" TO "traefik"

Y con esto, ya tendríamos configurado InfluxDB, de manera mínima para que empiece a recibir datos desde Traefik.

Para hacer una comprobación rápida, podemos ejecutar en la cli/shell de InfluxDB lo siguiente:

use traefik
show measurements

Nos debería devolver algo como esto, si lo hace, es porque Traefik ya está escribiendo en la base.

name: measurements
name
----
traefik.config.reload.lastSuccessTimestamp
traefik.config.reload.total
traefik.entrypoint.connections.open
traefik.entrypoint.request.duration
traefik.entrypoint.requests.total
traefik.service.connections.open
traefik.service.request.duration
traefik.service.requests.total

Grafana

Ahora, es momento de ver esos datos. Para eso, vamos a configurar Grafana, la herramienta del momento, para todo lo que es observabilidad.

Para acceder al Grafana, deben ir a la URL que configuraron como Label en el docker-compose.yml

- "traefik.http.routers.grafana.rule=Host(`mihost`)"

Nos vamos a encontrar con la pantalla de login de Grafana, el usuario y contraseña por defecto es admin/admin.

Si es la primera vez que te logueas, te va recomendar cambiar la contraseña, como aparece en la siguiente imágen.

Luego, vamos a ir a...

https://<miurl>/datasources/new

O lo que es lo mismo, configuration/datasources y haces un clic sobre Add Data Source. Seleccionamos InfluxDB, como aparece en la imágen.

Rellenamos con la información que especificamos, cuando creamos la base de datos y usuarios en InfluxDB. Si siguen el mismo ejemplo de todo el tutorial, con que lo pongan tal como está en la imágen es suficiente, funcionará sin ningún problema.

Le damos un clic en "Save & Test" y si esta todo bien, nos devolverá algo como esto:

Estamos cada vez más cerca, ahora, vamos a buscar un dashboard de Grafana que sea para Traefik y que sea compatible con InfluxDB. Esto último es crítico porque hay muchos que se hicieron para trabajar con Prometheus. En mi caso particular y para armar este tutorial elegí este:

Traefik v2.0 Metrics dashboard for Grafana
Traefik v2 metrics from Influxdb database originally from floriantales (dashboard 10479)

Para importarlo, solo necesitan copiar el ID de este Dashboard, lo encontrarán a la derecha de la página. Luego vamos a "create/import" tal como aparece en la siguiente imágen:

Y pegamos el número de dashboard (10902) y hacemos un clic en load:

Cuando le demos "load", aparecerá lo siguiente:

Aquí seleccionamos "InfluxDB" tal como aparece en la imágen y le damos un clic en "import". Si todo esta bien, automaticamente, nos llevará a nuestro "dashboard" en el cual ya debemos ver algo de información:

Para ir cerrando

Como podés ver, parecen ser muchos pasos pero es relativamente sencillo. Les dejo por acá el gitlab, en donde está hosteado el docker-compose.yml para que lo bajen de ahí o si ven que lo pueden mejorar, pueden hacer un Pull Request en cualquier momento.

metrics-traefik-influxdb-grafana · master · Ignacio Van Droogenbroeck / Docker Recipes
GitLab.com

También les dejo el enlace donde van a tener información sobre Métricas en Traefik:

Overview - Traefik
Traefik Documentation

Si tienen dudas o comentarios sobre este artículo pueden hacerlo abajo en los comentarios y lo vamos viendo. Sin ningún problema. Espero les haya servido para aprender un poco más sobre estas excelentes herramientas y no te olvides de que si podés #QuedateEnCasa.