Supervision avec Prometheus et Grafana

Cet article est un complément à l’article dockerisation d’un cluster spark et a pour but d’ajouter une solution de monitoring des conteneurs en utilisant la synergie Prometheus x Grafana.

1 - Structure du projet

Dans notre projet il va nous falloir ajouter quelques dossiers ( etc et dans data) tels que :

project-root/
│
├── docker-compose.yml
│
├── data
│   └── flights.csv
├── docker-compose.yml
├── etc
│   ├── grafana
│   └── prometheus
│       └── prometheus.yml
│
├── data/
│   ├── grafana
│   ├── prometheus
│   ├── example_data.csv
│   └── ...
│
├── ScriptsPy/
│   ├── example_script.py
│   └── ...
│
├── models/
    ├── example_model.pkl
    └── ...

Le fichier prometheus.yml doit contenir les lignes suivantes :

global:
  scrape_interval: 5s  # Intervalle de récupération des métriques (scrape) par Prometheus. Ici, il est défini à 5 secondes.
  evaluation_interval: 5s  # Intervalle d'évaluation des règles. Prometheus évalue les règles toutes les 5 secondes.
  # scrape_timeout est défini par défaut à 10 secondes (scrape_timeout par défaut).

  # Attache ces étiquettes à toute série temporelle ou alerte lors de la communication avec
  # des systèmes externes (fédération, stockage à distance, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'  # Étiquette externe "monitor" définie comme 'codelab-monitor'.

# Charge les règles une fois et les évalue périodiquement selon 'evaluation_interval' global.
rule_files:
  # - "first.rules"  # Fichier de règles à charger (commenté).
  # - "second.rules" # Autre fichier de règles à charger (commenté).

# Une configuration de récupération (scrape) contenant exactement un point de terminaison à interroger :
# Ici, c'est Prometheus lui-même.
scrape_configs:
- job_name: 'node'  # Nom du job de scrape, ici c'est "node".
  static_configs:
  - targets: ['192.168.1.26:9100']  # La cible à interroger (l'adresse IP et le port où les métriques sont disponibles).
  • global : Cette section définit les paramètres globaux pour Prometheus, comme l’intervalle entre chaque collecte de métriques (scrape_interval) et l’intervalle entre chaque évaluation des règles (evaluation_interval).

  • external_labels : Ce sont des étiquettes ajoutées à chaque série temporelle et alerte avant de les envoyer à des systèmes externes. Ici, on ajoute l’étiquette monitor avec la valeur codelab-monitor.

  • rule_files : Cette section permet de spécifier les fichiers de règles (fichiers .rules) que Prometheus doit charger. Les règles permettent de générer des alertes ou de créer de nouvelles séries temporelles basées sur les séries existantes. Les deux lignes sont commentées ici, donc aucun fichier de règles n’est chargé.

  • scrape_configs : Cette section définit les configurations de collecte des métriques. Dans cet exemple, il y a un seul job nommé node qui interroge l’adresse ip_machine_hôte:9100 pour collecter des données. Cette IP est celle du node exporteur (cf paragraphe suivant). Comme Prometheus est exécuté dans un conteneur Docker  utiliser localhost dans la configuration de Prometheus ne fonctionnera pas. Il faut spécifier l’adresse IP de la machine où Node Exporter est réellement en cours d’exécution. Pour récupérer cette ip : 

ip addr show

Ainsi, cette configuration permet à Prometheus de collecter des métriques toutes les 5 secondes depuis une cible spécifique et d’évaluer les règles (s’il y en avait) toutes les 5 secondes également. Les étiquettes externes sont appliquées à toutes les séries et alertes pour identifier la source des données.

Pas besoin de mettre nos conteneurs sur le réseau host de docker, bridge suffit.  En effet par défaut, Docker crée un réseau bridge dans lequel les conteneurs connectés peuvent accéder à l’adresse IP de l’hôte via l’adresse IP assignée à l’hôte sur le réseau local.

2 - Node Exporter

Un Node Exporter est un composant essentiel dans l’écosystème Prometheus. Son rôle principal est de collecter et d’exposer des métriques concernant l’état du système d’exploitation et de la machine hôte sur laquelle il est déployé. 

Nous allons donc télécharger le node exporter sur notre machine hôte :

wget/curl -o https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
# remarque : ici soit wget, soit curl -o
# Télécharge l'archive du Node Exporter version 0.18.1 pour Linux (architecture amd64) depuis le dépôt GitHub de Prometheus.

sudo tar -xzvf node_exporter-0.18.1.linux-amd64.tar.gz -C /usr/local/bin
# Décompresse l'archive téléchargée dans le répertoire '/usr/local/bin'. 
# L'option '-x' extrait les fichiers, '-z' gère la compression gzip, '-v' affiche les fichiers extraits, et '-f' spécifie l'archive à décompresser.

cd /usr/local/bin/node_exporter-0.18.1.linux-amd64/
./node-exporter
# Lance le Node Exporter en exécutant le binaire décompressé à l'étape précédente.
# Cela démarre le service qui commence à collecter et exposer les métriques système.

Le terminal devrait alors ressembler à ça :

On expose bien les données récoltées sur localhost:9100 (ou ip_machine_hote:9100).

Remarque :  pour arrêter le node exporter soit on fait un ctrl + C, soit :

pgrep node_exporter
# renvoi un PID
kill -9 <PID_du_processus>

3 - Docker-Compose

On reprend le docker-compose.yaml du precédent article on y ajoute nos conteneurs prometheus et grafana. Le docker-compose complet, en suivant le projet précédent, devrait ressembler à cela :

version: '3.7'

services:
  spark-master:
    image: bitnami/spark:latest
    command: bash -c "pip install numpy && bin/spark-class org.apache.spark.deploy.master.Master"
    ports:
      - "9090:8080"
      - "7077:7077"
    volumes:
      - ./data:/opt/bitnami/spark/data
      - ./ScriptsPy:/opt/bitnami/spark/ScriptsPy
      - ./models:/opt/bitnami/spark/models

  spark-worker-1:
    image: bitnami/spark:latest
    command: bash -c "pip install numpy && bin/spark-class org.apache.spark.deploy.worker.Worker spark://spark-master:7077"
    volumes:
      - ./data:/opt/bitnami/spark/data
      - ./models:/opt/bitnami/spark/models
    depends_on:
      - spark-master
    environment:
      SPARK_MODE: worker
      SPARK_WORKER_CORES: 2
      SPARK_WORKER_MEMORY: 2g
      SPARK_MASTER_URL: spark://spark-master:7077

  spark-worker-2:
    image: bitnami/spark:latest
    command: bash -c "pip install numpy && bin/spark-class org.apache.spark.deploy.worker.Worker spark://spark-master:7077"
    volumes:
      - ./data:/opt/bitnami/spark/data
      - ./models:/opt/bitnami/spark/models
    depends_on:
      - spark-master
    environment:
      SPARK_MODE: worker
      SPARK_WORKER_CORES: 2
      SPARK_WORKER_MEMORY: 2g
      SPARK_MASTER_URL: spark://spark-master:7077
      
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    ports:
      - "9091:9090"
    volumes:
      - ./etc/prometheus:/etc/prometheus
      - ./data/prometheus:/prometheus/
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
      
  grafana:
    user: root
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    volumes:
      - ./data/grafana:/var/lib/grafana
      - ./etc/grafana/:/etc/grafana/provisioning
    depends_on:
      - prometheus

On lance le tout :

docker compose up -d

4 - Prometheus et Grafana

Prometheus

Sur notre localhost:9091 dans le menu Status>Target on retrouve bien notre node exporteur qui renvoie les fameuses « metrics » :

Grafana

Sur notre localhost:3000 on se connecte à Grafana avec:

  • user: admin
  • mdp: admin

On est alors invités à changer de mot de passe. On peut cliquer sur Skip pour passer directement à l’IHM de Grafana.

Dashboard > + Create Dashboard

+ Add Visualization

Configure a New Data Source > Prometheus

On met l’adresse de notre conteneur puis Save & test

Rappel : on remplace localhost par la réelle ip de la machine hôte

On clique sur building a dashboard et c’est parti ! Il n’ a plus qu’a trouver un tuto Grafana pour monitorer tout ça !

Petite vidéo complémentaire !

Publications similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *