Monitoreando Docker con Telegraf, InfluxDB y Grafana
Esta semana estamos full observabilidad y para cerrar, te voy a mostrar cómo monitorear Docker, usando Telegraf, InfluxDB y Grafana.
Como dije en el artículo anterior, la data es hermosa y tener una práctica de observabilidad nos permite tomar mejores decisiones y de manera fundamentada. Esto se hace clave cuando debemos hacer "Capacity Planning" o entender porque nuestro ambiente está performando como lo hace.
En este caso, te voy a mostrar cómo monitorear nuestros contenedores que corren en un Docker Engine. Para esto, vamos a usar Telegraf, que el que se instala en nuestros servidores y sirve para recolectar la información de lo que queramos monitorear y la envía a una base de datos como InfluxDB y luego, esa misma, la podemos explotar con Grafana y con otras herramientas como Chronograf, la cual ya les comentaré en otro artículo.
Este artículo, me voy a "saltar" la instalación de InfluxDB y de Grafana, ya que la misma la vimos en el artículo anterior. Si te lo perdiste, te dejo el enlace acá abajo.
Monitorear Docker con Telegraf se puede "hacer" de dos maneras y todo depende del sistema operativo que estemos usando para correr Docker.
Si por ejemplo, usas un sistema operativo, como por ejemplo, Ubuntu, CentOS, Debian, Red Hat Enterprise Linux, MacOS, Windows (?) o cualquier otra distribución de Linux, te recomiendo usar los clientes instalables que se pueden descargar desde acá.
Si en cambio, usas un sistema operativo que está destinado a correr contenedores, como puede ser K3S, RancherOS, CoreOS o cualquier otro que no tiene más que Docker Engine, entonces la recomendación es que montés un contenedor de Telegraf.
De cualquier cosa, en este artículo, cubriré las dos maneras. La configuración per se, de Telegraf es igual, así que primero veremos cómo instalarlo en ambos escenarios y luego seguiré con la configuración.
Instalando Telegraf en Ubuntu Server
Voy a usar como ejemplo a Ubuntu Server porque, es con el que más familiarizado en cantidad de horas estoy, pero, exceptuando las diferencias para manejar paquetes de cada sistema operativo, la instalación es idéntica.
Vamos a comenzar con la descarga:
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.0-1_amd64.deb
Luego, vamos a desempaquetarlo e instalarlo:
sudo dpkg -i telegraf_1.14.0-1_amd64.deb
Listo. Naaa, mentira. Ahora lo que debemos hacer es agregar el usuario "telegraf" dentro del grupo Docker, esto, para que pueda leer el socket de Docker y pueda reportar a InfluxDB sobre los mismos.
sudo usermod -aG docker telegraf
Ahora vamos a ver como instalarlo en Docker.
Instalando Telegraf en un contenedor
Aquí es bastante sencillo, simplemente debemos correr lo siguiente, pero antes, tenemos que tener en cuenta que, debemos montar un directorio para hacer persistente el archivo de configuración de Telegraf (telegraf.conf), luego debemos exponer el socket de Docker (/var/run/docker.sock) y debemos asegurarnos de que este contenedor corra en la misma red, donde corre el contenedor de InfluxDB.
$ docker run -d --name=telegraf \
--net=influxdb \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro \
telegraf
Configurando Telegraf
Lo siguiente va a ser editar el archivo de configuración del nuestro "collector" en donde especificaremos, como se va a conectar a InfluxDB, dónde va a guardar la información y que es lo que vamos a monitorear, en este caso, Docker. Tengan en cuenta, como comenté, más arriba que a partir de acá, el artículo es igual para los dos escenarios.
Arranquemos, para eso vamos a ejecutar lo siguiente:
sudo vi /etc/telegraf/telegraf.conf
Acá vamos a modificar, solamente las siguientes secciones, las que están a partir de "Output Plugins", buscalas en el archivo.
Lo primero que vamos a especificar es, cómo se va a conectar a InfluxDB, no te olvides que está va a ser la base de datos que va a guardar las métricas que "escupa" Telegraf.
# Configuration for sending metrics to InfluxDB
[[outputs.influxdb]]
## The full HTTP or UDP URL for your InfluxDB instance.
##
## Multiple URLs can be specified for a single cluster, only ONE of the
## urls will be written to each interval.
# urls = ["unix:///var/run/influxdb.sock"]
# urls = ["udp://127.0.0.1:8089"]
urls = ["http://influxdb:8086"]
Si vas a usar la instalación del artículo anterior, te recomiendo que descomentes la última línea, tal cual esta aquí arriba.
Ahora, vamos a definir la base de datos donde vamos a guardar, por defecto y lo recomendable, es que se llame "telegraf", viene por defecto así en el archivo de configuración así que solo debes descomentar.
## The target database for metrics; will be created as needed.
## For UDP url endpoint database needs to be configured on server side.
database = "telegraf"
La siguiente parte, la vas a descomentar si creaste la base de datos a mano en el Influx, si no lo hiciste, déjalo esto con el valor "false" pero si lo hiciste, dejalo como aparece a continuación.
## If true, no CREATE DATABASE queries will be sent. Set to true when using
## Telegraf with a user without permissions to create databases or when the
## database already exists.
skip_database_creation = true
Esta sección, la vamos a usar si activamos la autenticación en InfluxDB (Muy recomendable), si estamos conectándonos de manera local, no es la mejor práctica pero tampoco va a matar nadie, pero si lo hacemos de manera remota, es clave que configuremos autenticación.
## HTTP Basic Auth
username = "<usuario>"
password = "<contraseña>"
Hasta ahora, es lo básico, ahora vamos a ver lo que hay que modificar en el apartado de Docker que está en el mismo archivo.
Esto es lo primero que vamos a modificar y por supuesto, vamos a descomentar. Para que sea capaz de leer el socket de Docker. Por defecto [[inputs.docker]] aparece comentado, así que lo vamos a descomentar también, tal como aparece aquí abajo.
# # Read metrics about docker containers
[[inputs.docker]]
# ## Docker Endpoint
# ## To use TCP, set endpoint = "tcp://[ip]:[port]"
# ## To use environment variables (ie, docker-machine), set endpoint = "ENV"
endpoint = "unix:///var/run/docker.sock"
Si estamos corriendo Docker Swarm, debemos descomentar la siguiente sección y cambiarla de "false" a "true":
# ## Set to true to collect Swarm metrics(desired_replicas, running_replicas)
gather_services = true
El resto lo podemos dejar tal cual esta por defecto.
Ahora bien, guardamos el archivo y procedemos a reiniciar Telegraf para que empiece a tomar el archivo con estos cambios.
En Ubuntu Server / Debian, ejecutamos lo siguiente:
systemctl restart telegraf
En Docker:
docker restart <id-contenedor-telegraf>
Antes de avanzar, podemos hacer un chequeo de que todo este bien.
En ubuntu Server ejecutamos:
systemctl status telegraf
nos debería devolver algo como esto:
● telegraf.service - The plugin-driven server agent for reporting metrics into InfluxDB
Loaded: loaded (/lib/systemd/system/telegraf.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-04-02 23:16:02 -03; 5s ago
Docs: https://github.com/influxdata/telegraf
Main PID: 9912 (telegraf)
Tasks: 10 (limit: 2304)
Memory: 11.1M
CGroup: /system.slice/telegraf.service
└─9912 /usr/bin/telegraf -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d
Apr 02 23:16:02 v0209 systemd[1]: Started The plugin-driven server agent for reporting metrics into InfluxDB.
Apr 02 23:16:02 v0209 telegraf[9912]: 2020-04-03T02:16:02Z I! Starting Telegraf 1.14.0
Apr 02 23:16:02 v0209 telegraf[9912]: 2020-04-03T02:16:02Z I! Loaded inputs: kernel mem processes cpu diskio swap system docker disk
Apr 02 23:16:02 v0209 telegraf[9912]: 2020-04-03T02:16:02Z I! Loaded aggregators:
Apr 02 23:16:02 v0209 telegraf[9912]: 2020-04-03T02:16:02Z I! Loaded processors:
Apr 02 23:16:02 v0209 telegraf[9912]: 2020-04-03T02:16:02Z I! Loaded outputs: influxdb
Apr 02 23:16:02 v0209 telegraf[9912]: 2020-04-03T02:16:02Z I! Tags enabled: host=v0209
Apr 02 23:16:02 v0209 telegraf[9912]: 2020-04-03T02:16:02Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"v0209", Flush Interval:10s
En docker, ejecutamos lo siguiente:
docker logs <id-contenedor-telegraf>
Y nos debería devolver algo parecido a lo que está más arriba.
Vamos con el Grafana
En el último artículo, les mostré la instalación de Grafana y cómo importar un Dashboard. Nuevamente, les dejo el enlace aquí abajo.
La única diferencia es que el dashboard que vamos a importar, no es el de Traefik como en el artículo mencionado, sino que vamos a instalar uno que sea capaz de leer los datos de Docker. Particularmente elegí este:
Una vez que lo importamos, si esta todo bien, debería verse algo así. Deberíamos estar viendo la información de nuestros contenedores.
A partir aquí podemos generar alarmas o comenzar a ver métricas sobre el comportamiento de nuestros contenedores. ¿Esta bueno, no? Cuéntame que te pareció, si pudiste avanzar o si tienes alguna duda o consulta. Buen fin de semana.
Bonus Track: Si querés tenerlo todo en un docker-compose, listo para usar, les dejo el enlace a este repositorio de Gitlab.