TIG, le trio Telegraf + InfluxDB + Grafana pour surveiller vos équipements

Comment vérifier l'utilisation des ressources système de vos serveurs / conteneurs ? Que se passe-t-il si un conteneur consomme trop de CPU ou de RAM ? Nous allons essayer de répondre à ces questions avec cet article.

TIG, le trio Telegraf + InfluxDB + Grafana pour surveiller vos équipements

Dans cet article, nous allons aborder un élément très important au sein d'une infrastructure : la supervision des performances.

Commençons par définir ce que la supervision :

Le monitoring ou surpervision est une activité de surveillance et de mesure d’une activité informatique. Ces mesures permettent de construire des graphes afin de visualiser les performances et de voir les tendances, de détecter voire d’anticiper des anomalies ou des pannes et d’alerter en cas de dysfonctionnement.

Le monitoring préventif permet, en surveillant des métriques spécifiques comme l'utilisation CPU, la consommation mémoire, ou encore l'utilisation de l'espace disque, d'agir en avance par rapport à la survenance d'un problème sur votre infrastructure, et d'éviter une indisponibilité des services que vous hébergez.

Les éléments qui vont constituer notre ensemble de supervision sont les suivants :

  • Telegraf, créé par InfluxData, les créateurs d'InfluxDB, permet de collecter aussi bien des données systèmes (CPU, mémoire, disque, I/O, ...) que des données liées à vos conteneurs Docker. De nombreux plugins lui ajoutent des entrées pour collecter des données et des sorties pour les stocker.
  • InfluxDB, qui sera utilisée en plugin de sortie Telegraf, est une base de données orientée séries temporelles hautes performances, écrit avec le langage de programmation Go et spécialisée dans le stockage de métriques et d’événements.
  • Grafana, qui est une référence pour la visualisation et la mise en forme des données métriques. Il permet de réaliser des tableaux de bord et des graphiques à partir d’une multitude de sources de données, dont InfluxDB, et permet également de vous alerter en fonction de seuils définis, et ce à travers différents canaux (Slack, email, Telegram, ...).

Ces 3 éléments forment la stack communément appelée TIG.

Rentrons maintenant dans le vif du sujet, avec l'installation et la configuration de TIG, en l'hébergeant comme à notre habitude sous forme de services Docker, au sein d'une stack Docker-Compose.

Pour rappel, voici les articles vous permettant de mettre en place Docker et Docker-Compose :

Docker, Build, Ship and Run Any App, Anywhere
Docker [https://www.docker.com/], si vous n’en avez jamais entendu parler (cequi n’est pas possible si vous lisez mon blog !), est un logiciel open sourcepermettant d’embarquer une application dans un ou plusieurs conteneurslogiciels, qui pourra s’exécuter sur n’importe quel serveur, qu’il soit p…
Docker-compose, un outil pour déployer plusieurs conteneurs en même temps
Docker-Compose permet d’orchestrer vos conteneurs en tant que services, et ainsi de simplifier vos déploiements sur de multiples environnements.

Mise en place de l'environnement et installation


Commençons par télécharger les différentes images que nous allons utiliser :
(cette étape n'est pas obligatoire, mais permet de gagner du temps au premier lancement de notre stack)

docker pull telegraf
docker pull influxdb
docker pull grafana/grafana

Créons ensuite l'arborescence de notre stack :

mkdir -p tig/{telegraf,influxdb,grafana}

Rendez-vous dans le répertoire tig tout juste créé et procédons maintenant à la création du fichier docker-compose.yml, qui définira l'ensemble de notre stack. Voici la stack que j'utilise, commentée pour expliquer l'usage des différentes informations.

version: "3.8"
services:
  influxdb:
    image: influxdb
    container_name: influxdb
    restart: always
    hostname: influxdb
    environment:
      INFLUX_DB: $INFLUX_DB  # nom de la base de données créée à l'initialisation d'InfluxDB
      INFLUXDB_USER: $INFLUXDB_USER  # nom de l'utilisateur pour gérer cette base de données
      INFLUXDB_USER_PASSWORD: $INFLUXDB_USER_PASSWORD  # mot de passe de l'utilisateur pour gérer cette base de données
    volumes:
      - ./influxdb:/var/lib/influxdb  # volume pour stocker la base de données InfluxDB

  telegraf:
    image: telegraf
    depends_on:
      - influxdb  # indique que le service influxdb est nécessaire
    container_name: telegraf
    restart: always
    links:
      - influxdb:influxdb
    tty: true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock  # nécessaire pour remonter les données du démon Docker
      - ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf  # fichier de configuration de Telegraf

  grafana:
    image: grafana/grafana
    depends_on:
      - influxdb  # indique que le service influxdb est nécessaire
    container_name: grafana
    restart: always
    ports:
      - 3000:3000  # port pour accéder à l'interface web de Grafana
    links:
      - influxdb:influxdb
    environment:
      GF_INSTALL_PLUGINS: "grafana-clock-panel,\
                          grafana-influxdb-08-datasource,\
                          grafana-kairosdb-datasource,\
                          grafana-piechart-panel,\
                          grafana-simple-json-datasource,\
                          grafana-worldmap-panel"
      GF_SECURITY_ADMIN_USER: $GF_SECURITY_ADMIN_USER  # nom de l'utilisateur créé par défaut pour accéder à Grafana
      GF_SECURITY_ADMIN_PASSWORD: $GF_SECURITY_ADMIN_PASSWORD  # mot de passe de l'utilisateur créé par défaut pour accéder à Grafana
    volumes:
      - ./grafana:/var/lib/grafana

Vous pouvez remarquer que j'ai utilisé des variables pour définir le nom de la base de données Telegraf dans InfluxDB, l'utilisateur correspondant et son mot de passe, ainsi que l'utilisateur administrateur de Grafana et son mot de passe.
Ces variables sont à définir dans un fichier .env, utilisé par défaut par Docker quand il est disponible dans le répertoire de votre stack.

Son contenu est le suivant :

INFLUX_DB=telegraf
INFLUXDB_USER=telegraf_user
INFLUXDB_USER_PASSWORD=telegraf_password
GF_SECURITY_ADMIN_USER=grafana_user
GF_SECURITY_ADMIN_PASSWORD=grafana_password
Attention !

Pour ceux qui utilisent Portainer pour gérer leurs stacks, vous devrez vous passer du fichier .env, non supporté, il vous faudra donc préciser directement les valeurs définies et non faire référence à des variables.

Enfin, pour le service "telegraf", vous devrez indiquer le chemin précis du fichier telegraf.conf que nous allons générer (par exemple /home/guillaume/telegraf.conf:/etc/telegraf/telegraf.conf).

Ne lancez pas la stack, attendez d'abord de réaliser la prochaine étape !

Nous avons besoin de générer un fichier de configuration initial pour Telegraf, à l'aide de la commande suivante :

docker run --rm telegraf telegraf config > telegraf/telegraf.conf

Nous obtiendrons au final l'organisation suivante :

/docker/tig
├── grafana/
├── influxdb/
├── telegraf/
|   └── telegraf.conf
├── .env
└── docker-compose.yml

Avant de lancer notre stack, il faut modifier quelques informations dans le fichier de configuration telegraf.conf :

  • hostname = "telegraf" : cela permettra d’identifier dans Grafana la provenance des métriques relevées par Telegraf.
  • urls = ["http://influxdb:8086"] : cela correspond à la valeur du hostname déclaré dans le fichier docker-compose.yml pour le container influxdb. Le port d’écoute par défaut d’InfluxDB est le 8086.
  • database = "telegraf" : le nom de la base données déclarée dans le fichier docker-compose.yml et son fichier .env pour le container influxdb.
  • username = "telegraf_user" : le nom de l'utilisateur ayant les droits sur la base de données telegraf, déclaré dans le fichier docker-compose.yml et son fichier .env pour le container influxdb.
  • password = "telegraf_password" : le mot de passe de l'utilisateur telegraf_user déclaré dans le fichier docker-compose.yml et son fichier .env pour le container influxdb.
  • [[inputs.docker]] : décommentez cette ligne pour activer et lire les métriques liés à vos containers Docker.
  • endpoint = "unix:///var/run/docker.sock" : décommentez cette ligne pour préciser le socket d’écoute de votre processus Docker.

Ca y est, c'est terminé, on peut lancer notre stack !

docker-compose up -d

Creating network "tig_default" with the default driver
Creating influxdb ... done
Creating grafana  ... done
Creating telegraf ... done

On vérifie que les conteneurs sont bien lancés :

docker-compose ps

  Name             Command           State              Ports
-------------------------------------------------------------------------
grafana    /run.sh                   Up      0.0.0.0:3000->3000/tcp
influxdb   /entrypoint.sh influxd    Up      8086/tcp
telegraf   /entrypoint.sh telegraf   Up      8092/udp, 8094/tcp, 8125/udp

Vous pouvez maintenant accéder à Grafana avec votre navigateur depuis l'url http://<IP.DE.VOTRE.DOCKER>:3000. Les identifiants de connexion sont ceux que vous avez définis dans le fichier .env.


Configuration de Grafana


Maintenant que notre stack TIG est lancée, nous allons passer à la configuration qui nous permettra de surveiller nos équipements, dont la machine hôte Docker.

Une fois connectés à l'interface Grafana, il faut ajouter une source de données, en cliquant sur "Add Data Source" et en choisissant le type de base de données InfluxDB.

Donnez un nom au "Data Source", indiquez l'URL pour se connecter à votre base de données InfluxDB et laissez la sélection de l'accès sur "Server". Renseignez le nom de la base de données créée, ainsi que les noms d'utilisateur et mot de passe pour y accéder, que vous aviez définis dans le fichier .env.

En sauvegardant, vous devriez être récompensés par un message disant que le "Data Source" est correctement configuré.


La visualisation des données


Une fois que la source de données est configurée dans Grafana, nous allons voir quelles données peuvent être affichées au travers des Dashboard. Ici, 2 possibilités s'offrent à vous, créer votre propre dashboard  (ce qui peut être assez compliqué au départ), utiliser des dashboard mis à disposition par la communauté sur le site de Grafana. Dans ce cas, attention à bien choisir un dashboard avec une source de données de type InfluxDB et des collecteurs de type Telegraf.

Grafana Dashboards - discover and share dashboards for Grafana.
Grafana.com provides a central repository where the community can come together to discover and share dashboards.

Dans notre cas, nous allons nous orienter vers un dashboard permettant d'afficher des statistiques sur l'hôte Docker : Docker Dashboard.

Dans le menu situé à gauche de Grafana, choisissez "Dashboards", "Manage" et cliquez sur "Import". Indiquez l'identifiant du dashboard sur le site de Grafana (10585 dans notre cas), et cliquez sur "Load". Sélectionnez la source de données à utiliser et cliquez sur "Import".

Le dashboard est importé depuis le site de Grafana et automatiquement peuplé des données contenues dans la base de données telegraf que nous avons créé précédemment.

Voici quelques autres exemples de dashbord que vous pouvez obtenir :

Ces dashboards permettent de surveiller en temps réel et de comparer les performances de votre système au cours du temps. Constater une dérive des performances est une bonne chose, mais il faut pour cela consulter régulièrement les données récoltées. Le mieux est de mettre en place un système d'alertes automatiques, pour être sûr de ne pas passer à côté d'un problème quelconque.


Conclusion


Cet article vous a présenté la stack TIG, de sa mise en place à la visualisation de dashboards complets, vous permettant de surveiller les statistiques et performances de votre système.
J'espère que vous allez pouvoir mettre en pratique ce tutoriel, n'hésitez pas à laisser des commentaires ou même venir échanger avec nous sur notre groupe Telegram.

Dans un prochain article, nous verrons comment intégrer les données issues de nos capteurs domotiques, dans le but d'avoir des statistiques précises et qui vous aideront à améliorer la gestion de votre domicile.

Merci pour votre attention et à bientôt pour de nouveaux articles !