TIG: Graficar métricas de hosts y docker con Telegraf, InfluxDB y Grafana

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.

Resultado de imagen de grafana influxdb

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

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *