Monitoring Docker avec Télégraf, InfluxDB et Grafana

Monitoring Docker avec Télégraf, InfluxDB et Grafana

2017-04-05 2 Par seuf

Monitoring Docker avec Télégraf, InfluxDB et Grafana

Un petit post pour parler de Telegraf et InfluxDB (aka TICK stack).

Telegraf

Telegraf est un outil de collecte de métriques écrit en Go qui permet de collecter aussi bien des métriques systèmes (cpu, ram, disques) que des métriques applicatives (apache, nginx, elasticsearch, jmx, etc..)

Pour cela, telegraf collecte des métriques via des plugins « input », les transforme si besoin et les envoie dans des plugins « output ».

Il existe une tonne de plugins input et output, il suffit juste de les paramétrer dans la configuration telegraf.

Ici, j’utilise le plugin Input Docker pour récupérer toutes les statistiques de mon démon docker (nombre de containers, cpu / memory usage par container, etc..).

Voici la configuration telegraf pour le plugin input docker :

# # 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" 
  ## Only collect metrics for these containers, collect all if empty 
  container_names = [] 
  ## Timeout for docker list, info, and stats commands 
  timeout = "5s" 
  ## Whether to report for each container per-device blkio (8:0, 8:1...) and 
  ## network (eth0, eth1, ...) stats or not perdevice = true 
  ## Whether to report for each container total blkio and network stats or not 
  total = false

InfluxDB

Ensuite, je dit a telegraf d’envoyer toutes mes métriques dans une base de données timeseries InfluxDB :

# Configuration for influxdb server to send metrics to
[[outputs.influxdb]]
 ## The full HTTP or UDP endpoint URL for your InfluxDB instance.
 ## Multiple urls can be specified as part of the same cluster,
 ## this means that only ONE of the urls will be written to each interval.
 # urls = ["udp://localhost:8089"] # UDP endpoint example
 urls = ["http://influxdb:8086"] # required
 ## The target database for metrics (telegraf will create it if not exists).
 database = "telegraf" # required
 ## Retention policy to write to. Empty string writes to the default rp.
 retention_policy = ""
 ## Write consistency (clusters only), can be: "any", "one", "quorum", "all"
 write_consistency = "any"
 ## Write timeout (for the InfluxDB client), formatted as a string.
 ## If not provided, will default to 5s. 0s means no timeout (not recommended).
 timeout = "5s"
 # username = "telegraf"
 # password = "metricsmetricsmetricsmetrics"
 ## Set the user agent for HTTP POSTs (can be useful for log differentiation)
 # user_agent = "telegraf"
 ## Set UDP payload size, defaults to InfluxDB UDP Client default (512 bytes)
 # udp_payload = 512

Docker compose

Pour lancer tous ces services, j’utilise docker-compose. J’ai donc rajouté quelques services dans mon fichier docker-compose.yml :

version: '2'
services:
[...]
  telegraf:
    image: telegraf
    hostname: telegraf
    container_name: telegraf
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /data/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf
    labels:
      - "traefik.enable=false"

  influxdb:
    image: influxdb
    hostname: influxdb
    container_name: influxdb
    volumes:
      - /data/influxdb:/var/lib/influxdb
    labels:
      - "traefik.enable=false"
 
  grafana:
    hostname: grafana
    container_name: grafana
    image: grafana/grafana
    expose:
      - 3000
    volumes:
      - /data/grafana:/var/lib/grafana

maintenant, il ne reste plus qu’a lancer les services avec un petit :

docker-compose up -d

Grafana

Maintenant que les métriques docker remontent dans une base influxDB, il ne reste plus qu’à grapher tout ça avec un grafana

J’ai juste importé quelques templates disponibles dans le catalogue grafana et je peux maintenant visualiser en live l’état de mes conteneurs.