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:
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.
También les dejo el enlace donde van a tener información sobre Métricas en Traefik:
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.