Prometheus Grafana – Superviser vos serveurs


Présentation


Dans ce tutoriel, nous allons installer et configurer Prometheus ainsi que Grafana pour superviser notre infrastructure.
Prometheus est un outil qui collecte et stocke des métriques à intervalles réguliers afin de superviser les performances et l’état des systèmes.
Grafana est un autre outil qui permet de visualiser et d’analyser ces métriques à travers des tableaux de bord interactifs.
En somme, Prometheus collecte les données et Grafana les exploite pour en proposer une représentation graphique.


1) Objectifs

1.1) Présentation

Nous souhaitons superviser les serveurs de notre infrastructure afin de connaître leur état en temps réel (utilisation des ressources, disponibilité des services, etc.), mais aussi de pouvoir revenir plusieurs heures ou plusieurs jours en arrière pour observer l’état de l’infrastructure à une date précise.
Nous souhaitons également être alerté si une ressource dépasse un seuil par exemple.

1.2) Infrastructure existante

L’infrastructure existante est composée de 2 serveurs :

  • srv1 : VM hébergeant une application web (ici : Nextcloud).
  • srv2 : VM hébergeant Docker pour faire tourner des containers.

1.3) Infrastructure cible (Non-exhaustive)

  • Ajout d’un nouveau serveur monitoring sous Debian 12 :
    • Il hébergera la solution de supervision : Prometheus, Grafana etc…
    • La solution sera déployée à l’aide de Docker afin de simplifier son implémentation et ses futures mises à jour.
  • Ajout d’exporters (sortes d’agents) sur les serveurs à superviser :
    • node_exporter : Met à disposition les métriques système d’un serveur. Il sera installé en tant que service systemd, afin d’éviter l’installation de Docker sur des serveurs n’en ayant pas l’utilité.
    • cAdvisor : Met à disposition les métriques des containers. Il sera déployé en tant que container en utilisant l’hôte Docker déjà présent.
    • Et bien d’autres que nous verrons un peu plus tard dans le tutoriel.


2) Préparation de l’environnement

Remarque 1 : Opérations à réaliser sur tous les serveurs.
Remarque 2 : Le paquet sudo doit être installé.

2.1) Mettre à jour tous les paquets


3) Prérequis

Remarque : Opérations à réaliser sur le serveur monitoring.

3.1) Installer Docker

Vous pouvez suivre le tutoriel d’installation de Docker (Moins de 10 minutes)


4) Déploiement de Prometheus et Grafana

Remarque : Opérations à réaliser sur le serveur monitoring.

4.1) Créer un répertoire monitoring

Le répertoire /monitoring centralise tout ce qui concerne la solution de supervision.

4.2) Créer un fichier docker-compose.yml

Le fichier /monitoring/docker-compose.yml contient la description de la solution de supervision.

Contenu :

Important :

  • --storage.tsdb.retention.time : Durée de rétention des données (par défaut : 15 jours).
  • --web.external-url : Url à laquelle Prometheus sera accessible depuis un navigateur client.
  • --GF_SECURITY_ADMIN_USER : Utilisateur admin de Grafana.
  • --GF_SECURITY_ADMIN_PASSWORD : Mot de passe de l’admin de Grafana (à remplacer).

4.3) Créer les répertoires de configuration pour Prometheus

Ces répertoires contiendront les fichiers de configuration de Prometheus.

4.4) Créer un mot de passe pour sécuriser l’API de Prometheus

Installer python3-bcrypt si ce n’est pas déjà fait :

Générer le hash du mot de passe de l’utilisateur admin de Prometheus :

4.5) Créer un fichier de configuration pour l’API de Prometheus

Contenu :

Important : Remplacer $2b$12... par le hash du mot de passe généré précédemment.

4.6) Créer un fichier pour la configuration générale de Prometheus

Le fichier de configuration de Prometheus contient une liste de jobs.
Chaque job contient une liste de targets à cibler.

Contenu :

Remarque : password: Ch@ngeThisPassw0rd, le mot de passe de l’admin Prometheus en clair (non haché).

La configuration précédente comporte 2 jobs :

  • prometheus : Pour récolter les métriques des serveurs Prometheus.
  • cadvisor : Pour récolter les métriques des containers sur les serveurs Docker. Le nom de serveur cadvisor fait référence au nom du service de même nom défini dans le fichier docker-compose.yml.

4.7) Déployer Prometheus et Grafana

Se déplacer dans le répertoire contenant le fichier docker-compose.yml :

Lancer le déploiement :

4.8) Vérifier l’état des containers

Important : L’état de chaque container doit être Up.

4.9) Tester la connexion à l’API Prometheus

Remarque : -u admin pour s’authentifier avec l’utilisateur admin.


5) Interfaces webs Prometheus et Grafana

5.1) Lancer l’interface web de Prometheus

Se rendre sur l’interface web de Prometheus à l’adresse http://IPouNomServeur:9090

Remarque : Une authentification sera demandée si vous l’avez configurée précédemment.

Cliquer sur Status puis Target health.
L’état de tous les jobs doit être UP.

5.2) Lancer l’interface web de Grafana

Se rendre sur l’interface web de Grafana à l’adresse http://IPouNomServeur:3000

Se connecter avec l’utilisateur et le mot de passe définis dans le fichier docker-compose.yaml un peu plus tôt.
Interface web de Grafana.

Remarque : Nous reviendrons plus tard dans Grafana pour le configurer.


6) Déploiement de node_exporter

Remarque 1 : Opérations à réaliser sur chaque serveur à superviser.
Remarque 2 : Il est possible de déployer node_exporter via ansible en utilisant la collection ansible officielle de Prometheus. Dans ce cas, vous pourrez passer ce chapitre.

6.1) Installer curl si nécessaire

6.2) Télécharger la dernière version de node_exporter

6.3) Vérifier le téléchargement

6.4) Extraire node_exporter dans le répertoire /usr/local/bin

Remarque : Remplacer le numéro de version 1.9.1 par la version téléchargée précédemment.

6.5) Vérifier l’extraction de node_exporter

6.6) Créer un utilisateur pour le service node_exporter

Utilisateur node-exp qui lancera le service systemd node_exporter.

6.7) Créer le service node_exporter

Contenu :

On retrouve bien l’utilisateur créé précédemment ainsi que le groupe du même nom.

6.8) Recharger la configuration de systemd

6.9) Démarrer et activer le service node_exporter

6.10) Vérifier l’état du service node_exporter

6.11) Vérifier le fonctionnement node_exporter

Appeler le node_exporter en local et à partir du serveur monitoring pour valider son bon fonctionnement.

6.12) Configurer Prometheus pour récupérer les metriques de node_exporter

Remarque : Opérations à réaliser sur le serveur monitoring.

Ajouter la configuration suivante :

Remarque : Remplacer le nom du serveur pour chaque targets.

6.13) Redémarrer les containers

Remarque : Opérations à réaliser sur le serveur monitoring.

Commande à exécuter dans le répertoire contenant le fichier docker-compose.yml.

6.14) Vérifier nouveau job dans prometheus

Se rendre sur l’interface web de Prometheus à l’adresse http://IPouNomServeur:9090 puis Status, target health.

L’état de tous les Endpoints du job node_exporter ajouté précédemment doit être UP.


7) Configuration de Grafana

7.1) Ajouter une source de données

Il faut créer et configurer une source de données (Data Source) de type Prometheus pour que Grafana puisse exploiter les métriques récoltées par notre serveur Prometheus.

Cliquer sur Connections, Data sources, Add data source puis Prometheus.
Saisir les informations de la source de données.

Remarque : Le nom de serveur prometheus dans Prometheus server URL correspond au nom du service de même nom dans le fichier docker-compose.yml

Se rendre à la fin du formulaire puis valider la création de la source de données en cliquant sur Save & test.
Ce message devrait s’afficher indiquant que tout est OK.

7.2) Import d’un tableau de bord pour node_exporter

La communauté de Grafana partage des Dashboard (Tableaux de bord) ce qui est très utile pour gagner du temps et pouvoir exploiter rapidement les métriques de Prometheus dans Grafana.
Nous utiliserons le tableau de bord 1860 Node Exporter Full pour visualiser les métriques provenant des nodes_exporter.

Cliquer sur le « + » en haut à droite puis Import dashboard.
Saisir l’id du dashboard à importer puis cliquer sur Load.
Ne pas oublier de sélectionner la source de données, dans notre cas : prometheus.
Les données arrivent progressivement.


8) Déploiement de cAdvisor

cAdvisor est un outil open source qui collecte et expose des métriques sur l’utilisation des ressources des containers en temps réel. La solution la plus simple consiste à le déployer en tant que container directement sur l’hôte Docker que l’on souhaite superviser.

Remarque : cAdvisor a déjà été déployé précédemment sur le serveur monitoring grâce au service de même nom dans le fichier docker-compose.yml. Nous l’installerons donc sur les autres serveurs docker de notre infrastructure dans notre cas srv2.

Aperçu :

8.1) Créer un répertoire cadvisor

8.2) Créer un fichier docker-compose.yml

Contenu :

Remarque : Modifier le port 8080:8080 côté hôte si 8080 est déjà utilisé.

8.3) Déployer cAdvisor

Se déplacer dans le répertoire contenant le fichier docker-compose.yml :

Lancer le déploiement de cadvisor :

8.4) Vérifier le déploiement de cAdvisor

L’état du container cadvisor doit être UP.

8.5) Ajouter une nouvelle cible pour le job cadvisor dans Prometheus

Remarque : Opérations à réaliser sur le serveur monitoring.

Aperçu :

Dans notre cas, le job cadvisor a déjà été créé précédemment.
Nous avons donc ajouté une nouvelle cible à targets pour cibler le cadvisor déployé sur srv2.

8.6) Redémarrer les containers

Remarque : Commande à exécuter dans le répertoire contenant le fichier docker-compose.yml.

8.7) Tester l’exporter cadvisor

Vérifier l’accès aux metrics de cadvisor en local et depuis le serveur monitoring.

Vérifier dans l’interface web :

Une nouvelle cible (target) est maintenant visible et UP dans Prometheus.

8.8) Tableau de bord pour cAdvisor dans Grafana

Il existe de nombreux tableaux de bord pour exploiter les métriques provenant de cAdvisor.
Nous utiliserons le tableaux de bord 13946 Docker-cAdvisor.


9) Déploiement de process_exporter

process_exporter est un outil Prometheus qui collecte des métriques détaillées sur les processus système, comme l’utilisation CPU, mémoire et le nombre de threads, pour superviser les applications et services en profondeur.

9.1) Télécharger la dernière version de process_exporter

Remarque : Opérations à réaliser sur les serveurs pour lesquels ont souhaite observer les processus.

9.2) Installer process_exporter

Remarque : Remplacer le numéro de version 0.8.7 par la version téléchargée précédemment.

9.3) Vérifier l’état du service de process_exporter

9.4) Vérifier l’accès aux métriques de process_exporter

Tester la récupération des métriques en local et depuis le serveur monitoring.

9.5) Ajouter d’un job process_exporter dans Prometheus

Remarque : Opérations à réaliser sur les serveurs monitoring.

Contenu :

9.6) Redémarrer et vérifier le job process_exporter dans Prometheus

Se déplacer dans le répertoire contenant le fichier docker-compose.yml :

Redémarrer les containers :

Nouveau job process_exporter visible dans Prometheus :

L’état de chaque cible est UP.

9.7) Tableau de bord pour process_exporter dans Grafana

Il existe de nombreux tableaux de bord pour exploiter les métriques provenant de process_exporter.
Nous utiliserons le tableaux de bord 22161 process-exporter-dashboard.

Remarque : Ce tableau de bord utilise conjointement node_exporter pour travailler les métriques. Il faudra lui spécifier le port de node_exporter sur les machines cibles.

Aperçu :

9.8) Filtrer les processus surveillés par process_exporter

Il est possible de filtrer les processus surveillés par process_exporter afin d’éviter de collecter trop de métriques et de surcharger Prometheus.
Pour aller plus loin : configuration and group naming


10) Déploiement de blackbox_exporter

blackbox_exporter est un outil de Prometheus qui permet de vérifier la disponibilité et la performance de services réseau (HTTP, DNS, TCP, ICMP, etc.) en effectuant des tests externes, comme un “blackbox”, sans accéder directement à l’intérieur des systèmes.

Remarque : Contrairement aux autres exporters, blackbox_exporter se déploie à un seul endroit et teste les services à distance, sans installation sur les serveurs cibles. Nous l’ajouterons donc en tant que service dans le fichier docker-compose.yml du serveur monitoring.

10.1) Ajouter un service blackbox_exporter au fichier docker-compose.yml

Remarque : Opérations à réaliser sur le serveur monitoring.

Ajouter le service suivant :

10.2) Créer d’un répertoire blackbox_exporter

10.3) Créer un fichier de configuration pour blackbox_exporter

Contenu :

Le fichier définit des modules, qui sont des modèles de requêtes réutilisables par Prometheus dans ses jobs.
Par exemple, le module http_2xx effectue une requête GET et évalue son succès selon la configuration : le code de retour doit être 2xx et le corps de la réponse ne doit pas contenir la chaîne Could not connect to database.

10.4) Ajouter un job blackbox_exporter dans Prometheus

Contenu :

Job blackbox  : Teste la disponibilité des services web spécifiés dans targets en utilisant le module http_2xx. Chaque URL est sondée par le Blackbox Exporter central, qui détermine le succès selon le code HTTP et le contenu de la réponse. Il permet de vérifier que les services sont joignables et répondent correctement.
Job blackbox_exporter  : Collecte les métriques opérationnelles du Blackbox Exporter lui-même, comme son état et ses performances internes.

Remarque 1 : Remplacez url1, url2 et url3 par les URLs que vous souhaitez réellement tester.
Remarque 2  : Remplacez ip_or_servername par l’adresse IP ou le nom DNS de votre serveur monitoring.

10.5) Redéploiement de la solution de monitoring

Commande à lancer dans le répertoire contenant le fichier docker-compose.yml.
docker compose restart ne suffira pas car nous avons modifier la définition du déploiement.

Les jobs blackbox et blackbox_exporter sont bien UP.
Remarque  : Un statut UP indique que la sonde (probe) a fonctionné correctement, mais ne garantit pas que le service cible est opérationnel. Pour connaître l’état réel du service, il faut consulter la métrique probe_success de la sonde.

10.6) Ajouter un tableau de bord pour blackbox_exporter dans Grafana

Il existe de nombreux tableaux de bord pour exploiter les métriques provenant de blackbox_exporter.
Nous utiliserons le tableaux de bord 18538 BlackBox Exporter.

Aperçu :

Ce tableau de bord permet de visualiser rapidement les services qui ne répondent plus.


11) Déploiement d’Alert Manager

Alertmanager est un outil qui reçoit les alertes de Prometheus, les regroupe, les filtre et les envoie vers des canaux de notification (email, Slack, etc.).

Remarque : Nous déploierons Alert Manager en tant que container sur le serveur monitoring.

11.1) Créer un répertoire alertmanager

11.2) Créer un fichier de configuration pour Alertmanager

Le fichier alertmanager.yml définit les destinataires des alertes, les routes de notification et les règles de regroupement des alertes envoyées par Prometheus.

Contenu :

Remplacer la configuration mail en fonction de votre service de messagerie.

Remarque : require_tls: false ne signifie pas que la connexion n’est pas chiffrée. Cela indique à Alertmanager de ne pas utiliser STARTTLS, qui n’est pas disponible avec SMTPS (port 465) car la connexion est déjà chiffrée dès le départ.

11.3) Configurer Prometheus pour envoyer les alertes à Alert Manager

Ajouter la configuration suivante :

alerting : Section qui indique à Prometheus où envoyer les alertes.
Remarque : Le nom de serveur alertmanager fait référence au service de même nom dans le fichier docker-compose.yml.

Aperçu :

11.4) Déployer Altermanager

Ajouter la définition du service alertmanager dans le fichier docker-compose.yml.

Contenu :

Redéployer la solution en prenant en compte l’ajout du nouveau service altermanager :

Remarque : Commande à lancer dans le répertoire contenant le fichier docker-compose.yml.

11.5) Vérifier le déploiement

Remarque : Commandes à lancer dans le répertoire contenant le fichier docker-compose.yml.

11.6) Vérifier fonctionnement Alertmanager

Se rendre sur l’interface web d’Alertmanager à l’adresse http://IPouNomServeur:9093


12) Création d’alertes dans Prometheus

Important : Les seuils d’alertes définis ici ne sont pas forcemment adaptés à votre infrastructure. Libre à vous de les modifier à votre convenance.

Remarque : Nous déploierons Alert Manager en tant que container sur le serveur monitoring.

12.1) Créer un répertoire pour les règles Prometheus

12.2) Créer des alertes CPU

Contenu :

Cette configuration indique à Prometheus de surveiller l’utilisation CPU des instances :

  • cpu_saturated : Déclenche une alerte critical si le CPU dépasse 80% pendant 3 minutes.
  • cpu_high : Déclenche une alerte warning si le CPU dépasse 50% pendant 5 minutes.

12.3) Créer des alertes Mémoire

Contenu :

Cette configuration indique à Prometheus de surveiller l’utilisation mémoire des instances :

  • memory_saturated : Déclenche une alerte critical si la Mémoire dépasse 85% pendant 3 minutes.
  • memory_high : Déclenche une alerte warning si la Mémoire dépasse 70% pendant 5 minutes.

12.4) Créer une règle de surveillance des disques

Contenu :

Cette configuration indique à Prometheus de surveiller l’utilisation mémoire des instances :

  • disk_saturated : Déclenche une alerte critical si l’espace disque disponible est inférieur à 10% pendant 5 minutes.
  • disk_low_free_space : Déclenche une alerte warning si l’espace disque disponible est inférieur à 20% pendant 10 minutes.

12.5) Créer des alertes pour les machines injoignables

Contenu :

  • node_down : Déclenche une alerte critical si la machine est injoignable pendant 1 minute.

12.6) Redémarrer les containers

Remarque : Commande à lancer dans le répertoire contenant le fichier docker-compose.yml.

12.7) Vérifier règles dans Prometheus

12.8) Provoquer des alertes

Pour déclencher une alerte « serveur injoignable », vous pouvez par exemple stoper le service node_exporter sur une machine supervisée.

Pour déclencher une alerte CPU, vous pouvez par exemple lancer la commande suivante qui fera monter le CPU et/ou réduire les seuils CPU pour déclencher l’alerte plus rapidement.

12.9) Constater que la cible est injoignable dans Prometheus

12.10) Constater l’alerte dans Prometheus

Dans un premier temps à l’état PENDING :

Puis à l’état FIRING après 1 minutes (comme indiqué dans l’alerte) :

A ce stade, Prometheus a envoyé l’alerte à Alert Manager.

12.11) Constater l’alerte dans Alert Manager

12.12) Constater l’envoi du mail par Alert Manager

Si votre configuration mail est correcte, vous devriez recevoir un mail avec l’alerte.


C’est terminé !

Vous avez enfin créé votre serveur de supervision à l’aide de Prometheus et Grafana.
Il ne reste plus qu’à :

  • Déployer d’autres types d’exporter en fonction de votre infrastructure.
  • S’amuser avec les tableaux de bord partagés par la communauté.
  • Ajouter de nouvelles alertes dans Prometheus.
  • Visiter les pages des documentations de Prometheus et de Grafana pour aller encore plus loin.
  • Utiliser la section commentaires pour me faire part de vos remarques ou problèmes rencontrés.
  • Faire un don pour participer à la maintenance de ce blog si cette article vous a plu.


En savoir plus sur Jj World

Subscribe to get the latest posts sent to your email.

Laisser un commentaire