Aloha a tod@s, en este post voy a explicar como graficar las métricas tanto de hosts, como de contenedores de docker de una forma muy sencilla con las herramientas que están ahora de moda. En este caso va a ser un stack de TIG (Telegraf, InfluxDB, Grafana). Telegraf e InfluxDB son de influxdata, empresa que se dedica a la analítica de datos. Telegraf sería el agente que recoge los datos y se los manda a influxDB, una base de datos orientada a time series escrita en Go muy potente y escalable a la hora de realizar estas operaciones. Por último, entraría en el juego Grafana que es la herramienta para graficar por excelencia de estos tiempos. Muy fácil de configurar y que soporta varios data sources.
Para los que sepan un poco de estas cosas, se preguntarán porque no utilizar prometheus que es la otra herramienta que está pegando fuerte. Prometheus a diferencia de influxDB hace pull de los datos, por lo que si se está detrás de un Firewall, hay que abrir puertos por cada cliente y es mas engorroso. Por eso optamos por esta otra solución.

Despliegue
Montaremos todo el stack sobre docker y lo desplegaremos con docker-compose (as always). Y como proxy web utilizaremos traefik.
vim docker-compose.yml
version: '3.5'
services:
influxdb:
image: influxdb
environment:
- INFLUXDB_DB=telegraf
- INFLUXDB_USER=telegraf
- INFLUXDB_USER_PASSWORD=TelegrafPassword
volumes:
- influxdb:/var/lib/influxdb
ports:
- "8086:8086"
networks:
- backend
labels:
- "traefik.enable=false"
- "container_group=TIG"
telegraf:
image: telegraf
volumes:
- $PWD/conf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
links:
- influxdb
networks:
- backend
labels:
- "traefik.enable=false"
- "container_group=TIG"
grafana:
image: grafana/grafana
environment:
- GF_SERVER_ROOT_URL=https://grafana.example.com
- GF_SECURITY_ADMIN_PASSWORD=GrafanaPassword
- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource,grafana-worldmap-panel,raintank-worldping-app,jdbranham-diagram-panel
- GF_USERS_ALLOW_SIGN_UP=false
- GF_SECURITY_DISABLE_GRAVATAR=true
- GF_SERVER_DOMAIN=example.com
volumes:
- grafana:/var/lib/grafana
networks:
- traefik
- backend
ports:
- 3000:3000
labels:
- "traefik.backend=tick"
- "traefik.frontend.rule=Host:grafana.example.com"
- "traefik.docker.network=traefik"
- "traefik.port=3000"
- "container_group=TIG"
networks:
backend:
traefik:
external:
name: traefik
volumes:
grafana:
influxdb:
Configurar Telegraf
Ahora hay que crear la conf te telegraf. Para esto, crear una carpeta que se llama conf
mkdir conf
Y crear un fichero que sea telegraf.conf. En el caso de que se quiera utilizar la conf por defecto, se puede generar con el siguiente comando. Pero aquí la vamos a personalizar.
Opcional:
run --rm telegraf telegraf config > ./conf/telegraf.conf
vim conf/telegraf.conf
Y añadir la configuración
############################################################################### # CONFIGURATION # ############################################################################### [global_tags] [agent] interval = "10s" round_interval = true metric_batch_size = 1000 metric_buffer_limit = 10000 collection_jitter = "0s" flush_interval = "10s" flush_jitter = "0s" debug = false quiet = false hostname = "" # opcional omit_hostname = false ############################################################################### # OUTPUT PLUGINS # ############################################################################### [[outputs.influxdb]] urls = ["http://influxdb:8086"] database = "telegraf" retention_policy = "" write_consistency = "any" timeout = "5s" username = "telegraf" password = "TelegrafPassword" ############################################################################### # INPUT PLUGINS # ############################################################################### # CPU ###### [[inputs.cpu]] percpu = false totalcpu = true fielddrop = ["time_*"] # DISK ####### [[inputs.disk]] ignore_fs = ["tmpfs", "devtmpfs", "none"] [[inputs.diskio]] # Kernel ######## [[inputs.kernel]] # Memory ######### [[inputs.mem]] # NET ###### [[inputs.net]] interfaces = ["eth0"] # Netstat ######### [[inputs.netstat]] # Processes ############ [[inputs.processes]] # System ######### [[inputs.system]]
Una vez configurado telegraf, solo queda levantar el stack. Para ello:
docker-compose up -d
Configurar Grafana
Con esto, ya estará todo levantado y funcionando. El siguiente paso es acceder a grafana y añadirle InfluxDB como data source. Para eso:
https://grafana.example.com

Ahora queda configurar el data source. Para ello, hay que ir a: Configuration –> data sources y add data source

Y con esto ya podrá realizar las consultas contra InfluxDB.
Dashboards
Para terminar y dejar todo ya perfecto, hay que añadir los dashboards. Esto se puede hacer manualmente creando uno y añadiendo uno a uno los gráficos y estadísticas que queramos, o se puede importar uno desde la web de grafana. Vamos a utilizar el segundo método ya que es mucho mas rápido. Para ello, hay que ir a Create –> Import y pegar el numero de dashboard que queramos. Para la los hosts utilizaremos: 1443 y para docker utilizaremos: 1150

Y automáticamente detectará el dashboard. Seleccionar el data source e importar

Y ya se podrá ver ya el dashboard con las métricas recolectadas.

Y con esto ya estaría. En el caso de que se quiera desplegar telegraf en hosts que no estén en el mismo stack, hay que desplegar solo el contenedor de telegraf y cambiar en la conf la dirección de InfluxDB.

2 comments