Supervision avec Telegraf, InfluxDB et Grafana

dim. 01 nov. 2020 by Marmotte

Une partie importante de la gestion d'un parc informatique concerne la supervision des machines. Cela permet d'être prévenu lorsqu'un événement, problématique ou non, intervient et de pouvoir analyser les données pour déterminer les causes de cet événement, même lorsque la machine touchée ne répond plus.

Pour cela, plusieurs éléments sont nécessaires :

  • Un collecteur de données
  • Une base de données pour les stocker
  • Une interface permettant de les afficher
  • Un mécanisme permettant de déclencher des alertes

Dans un précédent article, j'avais présenté Munin 2, qui s'occupe de tous ces aspects à la fois. Cependant, j'ai choisi de mettre d'autres outils en place chez moi, pour plusieurs raisons :

  • J'ai besoin d'intégrer des données depuis plusieurs sources dans mon système de supervision
  • Les options de configuration de Munin 2 sont assez limitées et restrictives
  • L'ergonomie de l'interface ne me convient pas

Les services que j'ai choisis pour le remplacer sont :

  • Collecteur : Telegraf
  • Base de données : InfluxDB
  • Interface utilisateur : Grafana
  • Alertes : Grafana

Telegraf

Telegraf permettra de collecter les données sur chaque machine, et de les envoyer vers la base de données. Il doit donc être installé sur chaque machine à surveiller.

Installation

Telegraf n'est pas disponible dans les dépôts Debian, j'utilise donc le dépôt d'InfluxDB pour l'installer :

$ # Ajout de la clé GPG du dépôt InfluxDB
$ curl https://repos.influxdata.com/influxdb.key | sudo apt-key add -
$ # Ajout du dépôt InfluxDB
$ echo deb http://repos.influxdata.com/debian buster stable | sudo tee /etc/apt/sources.list.d/influxdb.list
$ sudo apt update
$ sudo apt install telegraf

Configuration

La configuration de Telegraf est basée sur un système de plugins. Chaque plugin correspond à une entrée ou une sortie, et possède ses paramètres propres.

Lors de l'installation, un fichier de configuration contenant un exemple pour tous les plugins disponibles par défaut est créé. Je préfère cependant utiliser une multitude de petits fichiers, correspondant chacun à un plugin. Cela me permet de trouver plus facilement la configuration d'un plugin particulier, et présente aussi l'avantage d'être plus simple à gérer par un système de gestion de configuration.

Dans le fichier /etc/telegraf.conf, je ne conserve donc que les sections [global_tags] et [agent]. La configuration par défaut me convenant parfaitement, j'ai conservé les valeurs sans modification.

Configuration des entrées

Une liste complète des plugins d'entrée disponibles par défaut est accessible dans la documentation officielle. Les paramètres spécifiques de chaque plugin y sont clairement détaillés.

Chaque entrée correspond à un aspect du système qui doit être surveillé (processeur, disques, températures, etc.). Je crée donc un fichier pour chaque entrée dans le répertoire /etc/telegraf/telegraf.d/ contenant la déclaration du plugin correspondant, ainsi que ses paramètres éventuels.

Exemples :

Le plugin inputs.cpu est défini dans le fichier /etc/telegraf/telegraf.d/inputs.cpu.conf. La configuration par défaut convient, aucun paramètre n'est donc présent :

[[inputs.cpu]]

Le plugin inputs.disk est défini dans le fichier /etc/telegraf/telegraf.d/inputs.disk.conf. Je précise ici une liste de systèmes de fichiers à ignorer, afin de ne pas stocker de données inutiles :

[[inputs.disk]]
  ignore_fs = ['aufs', 'cifs', 'devfs', 'devtmpfs', 'iso9660', 'nfs', 'overlay', 'squashfs', 'tmpfs', 'udf']

Configuration des sorties

Une liste complète des plugins de sortie disponibles par défaut est accessible dans la documentation officielle. Les paramètres spécifiques de chaque plugin y sont clairement détaillés.

Tout comme les entrées, il est possible de configurer une ou plusieurs sorties. Là aussi, je crée un fichier par sortie à configurer, contenant la déclaration du plugin correspondant avec ses paramètres.

Mon unique sortie permet d'envoyer les données dans InfluxDB. Pour simplifier, je n'ai pas défini d'authentification, je n'ai donc qu'à préciser l'adresse du serveur :

[[outputs.influxdb]]
  urls = ['http://influxdb-server:8086']

InfluxDB

Les données collectées par Telegraf sont envoyées à InfluxdDB, qui est une TSDB (Time Series DataBase) développée spécifiquement pour ce besoin. Il n'est nécessaire de l'installer que sur une unique machine, qui recevra les données de toutes les autres.

Installation

Tout comme Telegraf, InfluxDB n'est pas disponible dans les dépôts Debian, j'utilise donc le dépôt d'InfluxDB pour l'installer :

$ # Ajout de la clé GPG du dépôt InfluxDB
$ curl https://repos.influxdata.com/influxdb.key | sudo apt-key add -
$ # Ajout du dépôt InfluxDB
$ echo deb http://repos.influxdata.com/debian buster stable | sudo tee /etc/apt/sources.list.d/influxdb.list
$ sudo apt update
$ sudo apt install influxdb

Configuration

La configuration d'InfluxDB se situe dans le fichier /etc/influxdb/influxdb.conf. N'ayant pas de besoins particuliers, j'ai conservé toutes les valeurs par défaut.

Note : InfluxDB écoute sur le port 8086 par défaut.

Pour une utilisation basique comme la mienne (surveillance de moins de dix machines), la configuration livrée lors de l'installation convient. Dans le cadre d'une utilisation plus poussée (plusieurs dizaines/centaines de machines), il faudrait configurer au moins des politiques de rétention, afin d'éviter que l'espace disque utilisé n'augmente trop.

Utilisation

Il m'arrive d'avoir besoin d'explorer les données manuellement, pour vérifier ce qui est stocké dans la base de données, par exemple lors du développement d'un script qui y stocke ses données. Pour cela, j'utilise l'interpréteur interactif influx.

Créer une base de données

$ influx -execute 'CREATE DATABASE dbname'

Lire les données d'une table

$ influx -database dbname -execute 'SELECT * FROM measurementname'

Supprimer toutes les séries d'une mesure

$ influx -database dbname -execute 'DROP MEASUREMENT measurementname'

Supprimer quelques séries d'une mesure

$ influx -database dbname -execute "DROP SERIES FROM measurementname WHERE tagname = 'tagvalue'"

Grafana

Pour exploiter les données stockées dans InfluxDB, j'utilise Grafana, qui occupe donc les rôles d'interface utilisateur et de gestion des alertes. Il peut être installé sur n'importe quelle machine, et doit simplement avoir accès au serveur InfluxDB.

Installation

Grafana n'est pas non plus disponible dans les dépôts Debian, j'utilise donc le dépôt de Grafana pour l'installer

$ # Ajout de la clé GPG du dépôt Grafana
$ curl https://packages.grafana.com/gpg.key | sudo apt-key add -
$ # Ajout du dépôt Grafana
$ echo deb http://packages.grafana.com/oss/deb stable main | sudo tee /etc/apt/sources.list.d/grafana.list
$ sudo apt update
$ sudo apt install grafana

Configuration

La configuration de Grafana est située dans le fichier /etc/grafana/grafana.ini.

Les valeurs par défaut qui s'y trouvent me conviennent. J'ai cependant modifié le paramètre domain de la section [server] afin d'y mettre le nom d'hôte de la machine sur laquelle Grafana est installé.

Note : Grafana écoute sur le port 3000 par défaut.

Les éléments manipulés dans l'interface de Grafana sont stockés par défaut dans une base de données SQLite.

Pour permettre l'envoi des emails lorsqu'une alerte apparaît, j'ai aussi modifié la configuration de la section [smtp].

Utilisation

Après l'installation, il est nécessaire de se connecter sur l'interface de Grafana à l'aide d'un navigateur web. Lors de la première connexion, avec l'identifiant admin et le mot de passe admin, il est nécessaire d'indiquer un nouveau mot de passe pour cet utilisateur.

Les étapes suivantes sont :

  • Créer des utilisateurs, afin de donner accès à d'autres personnes.
  • Ajouter une source de données, indiquant l'adresse du serveur InfluxDB.
  • Ajouter un ou plusieurs canaux de notification pour les alertes.
  • Créer ou importer des dashboards, afin d'afficher les données provenant d'InfluxDB.

Bien que l'interface de Grafana soit assez intuitive, il faut la manipuler un peu pour prendre ses marques. Je conseille de commencer par importer un dashboard existant, puis éventuellement de le modifier, ou s'en inspirer pour créer un dashboard personnalisé si celui-ci ne convient pas totalement.