Exercice 06 : Projet Capstone - Stack de Monitoring Complet avec Prometheus et Grafana
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Déployer Prometheus et Grafana avec Docker Compose
- ✅ Configurer le scraping de métriques dans
prometheus.yml - ✅ Écrire des requêtes PromQL de base et avancées
- ✅ Créer un dashboard Grafana avec des panels de métriques
- ✅ Configurer des règles d'alerting et AlertManager
Durée estimée : 1h
Difficulté : ⭐⭐⭐⭐☆ (Avancé)
Prérequis :
- Docker et Docker Compose installés
- Module Monitoring complété (Prometheus, Grafana, alerting, logs)
📖 Contexte
Votre équipe a déployé plusieurs applications et n'a aucune visibilité sur leur état de santé. Vous allez mettre en place le stack d'observabilité complet : Prometheus pour les métriques, Grafana pour la visualisation, AlertManager pour les alertes, et Node Exporter pour les métriques système.
📋 Énoncé
Déployez une stack de monitoring complète avec Prometheus + Grafana + AlertManager + Node Exporter, créez un dashboard, et configurez des alertes.
🧭 Déroulement de l'exercice
Tâche 1 : Déployer la stack avec Docker Compose
Créez un docker-compose.yml pour déployer les services suivants :
- Prometheus (port 9090) avec un volume pour les données et la config
- Grafana (port 3000) avec un volume pour la persistance
- Node Exporter (port 9100) pour les métriques système de l'hôte
- AlertManager (port 9093) pour le routage des alertes
Indice : Node Exporter a besoin d'accéder aux métriques de l'hôte via des mounts :
/proc,/sys, et/en lecture seule.--path.procfs=/host/proc --path.sysfs=/host/sys --collector.filesystem.mount-points-exclude=...
Vérification : docker compose up -d. curl http://localhost:9090/-/healthy retourne Prometheus Server is Healthy. curl http://localhost:9100/metrics | head -20 affiche des métriques.
Tâche 2 : Configurer prometheus.yml
Créez prometheus.yml avec :
global.scrape_interval: 15s- Un scrape job
prometheus(self-monitoring) - Un scrape job
nodepointant versnode-exporter:9100 - Un lien vers les règles d'alerting
alerting_rules.yml
Indice :
`yamlglobal:
scrape_interval: 15s
evaluation_interval: 15s
>
rule_files:
- "alerting_rules.yml"
>
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
>
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ["localhost:9090"]
- job_name: node
static_configs:
- targets: ["node-exporter:9100"]
`
Vérification : Dans Prometheus UI (http://localhost:9090) → Status → Targets, les 2 targets sont UP.
Tâche 3 : Écrire des requêtes PromQL
Dans l'interface Prometheus (http://localhost:9090), écrivez et exécutez les 5 requêtes suivantes :
- CPU usage (%) :
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) - RAM utilisée (GB) :
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Cached_bytes) / 1024^3 - Disque utilisé (%) :
100 - ((node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100) - Uptime système (heures) :
node_time_seconds - node_boot_time_seconds) / 3600 - Nombre de goroutines Prometheus :
go_goroutines{job="prometheus"}
Indice :
irate()calcule le taux instantané.avg()agrège sur toutes les instances. Les accolades{}filtrent par label.[5m]est la fenêtre de temps.
Vérification : Les 5 requêtes retournent des valeurs numériques sans erreur dans Prometheus.
Tâche 4 : Créer un dashboard Grafana
Connectez-vous à Grafana (http://localhost:3000, admin/admin). Créez un nouveau dashboard Monitoring Système avec 4 panels :
- Gauge : Utilisation CPU en % (query de la tâche 3)
- Gauge : Utilisation RAM en %
- Time series : Évolution CPU sur 1 heure
- Stat : Uptime du système
Indice : Dashboard → New → Add panel. Sélectionnez la source Prometheus. Collez la requête PromQL. Le type de visualisation se choisit dans la colonne de droite. Sauvegardez le dashboard avec Ctrl+S.
Vérification : Le dashboard Monitoring Système affiche 4 panels avec des données en temps réel.
Tâche 5 : Créer des règles d'alerting
Créez le fichier alerting_rules.yml avec 2 règles :
- HighCPU : alerte si CPU > 80% pendant 5 minutes
- LowDiskSpace : alerte si espace disque disponible < 10%
Indice :
`yamlgroups:
- name: system_alerts
rules:
- alert: HighCPU
expr: 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "CPU élevé sur {{ $labels.instance }}"
description: "CPU à {{ $value | printf \"%.1f\" }}%"
`
for: 5mattend 5 minutes de condition vraie avant de déclencher l'alerte.
Vérification : Dans Prometheus → Alerts, les 2 règles apparaissent en état Inactive (conditions non atteintes).
Tâche 6 : Configurer AlertManager
Créez alertmanager.yml avec une route de base qui envoie toutes les alertes vers un receiver default. Le receiver simule une notification (pas besoin d'un vrai Slack/email pour cet exercice).
Indice :
`yamlroute:
receiver: default
group_by: [alertname]
group_wait: 10s
group_interval: 5m
repeat_interval: 1h
>
receivers:
- name: default
webhook_configs:
- url: 'http://localhost:5001/webhook'
send_resolved: true
`Sans webhook réel, AlertManager logge les notifications.
docker compose logs alertmanagermontre les alertes déclenchées.
Vérification : curl http://localhost:9093/api/v1/status retourne les informations d'AlertManager. Dans Prometheus → Alerts, les alertes sont bien connectées à AlertManager.
🗂️ Mini-Projet : Stack monitoring complète
Arborescence du projet :
monitoring-stack/
├── docker-compose.yml
├── prometheus.yml
├── alerting_rules.yml
└── alertmanager.ymlTests de validation :
# Démarrer la stack
docker compose up -d
# Attendre le démarrage
sleep 10
# Vérifier les health checks
curl -s http://localhost:9090/-/healthy
curl -s http://localhost:9093/-/healthy
curl -s http://localhost:9100/metrics | grep "node_cpu_seconds_total" | head -3
# Vérifier les targets Prometheus
curl -s http://localhost:9090/api/v1/targets | python3 -m json.tool | grep '"health"'
# Tester une requête PromQL via l'API
curl -s "http://localhost:9090/api/v1/query?query=up" | python3 -m json.tool
# Voir les alertes configurées
curl -s http://localhost:9090/api/v1/rules | python3 -m json.tool
# Grafana accessible
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/loginCheckpoints de validation :
- Tous les services sont
running(docker compose ps) - Prometheus Targets :
nodeetprometheussontUP - Les 5 requêtes PromQL retournent des valeurs
- Le dashboard Grafana affiche 4 panels avec des données
- Les 2 règles d'alerting sont visibles dans Prometheus → Alerts
- AlertManager répond sur http://localhost:9093