Monitoring Docker avec Télégraf, InfluxDB et Grafana
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.
Bonjour,
Les volumes ne sont pas des fichiers 😉
– /var/run/docker.sock:/var/run/docker.sock
– /data/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf
Bonjour,
Si le fichier existe déja sur le disque, alors il sera monté comme un fichier ! (j’ai testé, ça marche).
Ici on est obligé de partager la socket docker pour que telegraf puisse requêter les stats docker.