Introduction
Grafana est l'outil de référence pour visualiser des données d'observabilité en 2026, intégrant métriques (Prometheus), logs (Loki) et traces (Tempo). Ce tutoriel expert vous guide dans le déploiement d'un stack complet via Docker Compose, avec provisionning automatique des datasources, dashboards et règles d'alerting. Pourquoi c'est crucial ? Dans un monde DevOps où les systèmes distribués génèrent des pétaoctets de données, une observabilité unifiée réduit les MTTR de 50 % selon les benchmarks CNCF. Nous partons d'un setup minimal pour arriver à une configuration production-ready : authentification, SSL, scaling horizontal et queries avancées PromQL/LogQL. Chaque étape inclut du code fonctionnel, prêt à copier-coller. À la fin, vous aurez un dashboard multi-tenant opérationnel, bookmarqué par tout SRE senior.
Prérequis
- Docker 27+ et Docker Compose 2.29+
- Connaissances avancées en YAML, JSON et PromQL/LogQL
- Serveur Linux avec 4 Go RAM minimum (pour tests locaux)
- Accès root pour les ports < 1024
- Git pour cloner des exemples optionnels
Créer le docker-compose.yml du stack
version: '3.8'
services:
prometheus:
image: prom/prometheus:v2.54.1
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=200h'
- '--web.enable-lifecycle'
ports:
- "9090:9090"
restart: unless-stopped
loki:
image: grafana/loki:3.1.1
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
restart: unless-stopped
grafana:
image: grafana/grafana:11.1.0
user: "472:472"
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=supersecret
- GF_USERS_ALLOW_SIGN_UP=false
ports:
- "3000:3000"
depends_on:
- prometheus
- loki
restart: unless-stopped
volumes:
prometheus_data: {}
grafana_data: {}Ce docker-compose.yml orchestre Prometheus pour les métriques, Loki pour les logs et Grafana pour la visualisation. Les volumes persistent les données ; les commandes avancées de Prometheus optimisent la rétention (200h). Évitez les pièges : toujours spécifier 'user: 472:472' pour Grafana afin d'éviter les permissions root sur les volumes hôtes.
Lancer le stack et vérifier
Sauvegardez le fichier et exécutez docker compose up -d. Vérifiez les logs avec docker compose logs -f. Accédez à Grafana sur http://localhost:3000 (admin/supersecret). Prometheus scrape ses propres métriques ; Loki est prêt pour les ingests. Cette base permet un scaling facile vers Kubernetes.
Configurer prometheus.yml pour scraping
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- "alert.rules.yml"
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'grafana'
static_configs:
- targets: ['grafana:3000']
metrics_path: /metrics
scrape_interval: 30s
- job_name: 'loki'
static_configs:
- targets: ['loki:3100']
metrics_path: /metrics
scrape_interval: 30sCe fichier configure Prometheus pour scraper ses propres métriques, celles de Grafana et Loki. Les jobs 'grafana' et 'loki' exposent /metrics pour une observabilité auto-descriptive. Piège courant : oublier 'metrics_path' pour les endpoints non standards ; testez avec curl localhost:9090/targets.
Provisionner la datasource Prometheus
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
orgId: 1
url: http://prometheus:9090
basicAuth: false
isDefault: true
editable: true
jsonData:
exemplarTraceIdDestinations:
- name: traceIdLabel
value: traceID
httpMethod: POST
secureJsonData:
httpHeaderValue1: ''Ce YAML provisionne automatiquement la datasource Prometheus dans Grafana au démarrage. 'access: proxy' permet les queries server-side sécurisées ; 'isDefault: true' la rend prioritaire. Évitez d'éditer manuellement post-provisionning : redémarrez le conteneur pour reappliquer.
Provisionner la datasource Loki
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
orgId: 1
url: http://loki:3100
basicAuth: false
isDefault: false
editable: true
jsonData:
maxLines: 1000Provisionning Loki pour les logs, avec 'maxLines: 1000' limitant les résultats pour les perfs. Utilisez 'proxy' pour masquer l'IP interne. Piège : sans dossier provisioning/ correct, Grafana ignore les fichiers ; vérifiez les logs pour 'Provisioning datasource'.
Créer un dashboard avancé
Les datasources sont live. Importez maintenant un dashboard JSON via API ou UI. Ce modèle expert combine heatmaps PromQL et Explore Loki, avec variables pour multi-tenant.
Dashboard JSON pour métriques et logs
{"__inputs":[{"name":"DS_PROMETHEUS","label":"Prometheus","description":"","type":"datasource","pluginId":"prometheus","pluginName":"Prometheus"}],"dashboard":{"id":null,"title":"Stack Observabilité","tags":["observability"],"timezone":"browser","panels":[{"id":1,"title":"CPU Usage","type":"stat","targets":[{"expr":"rate(process_cpu_seconds_total[5m])","legendFormat":"CPU"}],"fieldConfig":{"defaults":{"color":{"mode":"thresholds"},"thresholds":{"steps":[{"color":"green","value":null},{"color":"yellow","value":0.7},{"color":"red","value":0.9}]}}},"gridPos":{"h":8,"w":12,"x":0,"y":0}},{"id":2,"title":"Logs Errors","type":"logs","datasource":{"type":"loki","uid":"Loki"},"targets":[{"expr":"{job=~\"grafana|prometheus\"} |= \"error\""}],"gridPos":{"h":8,"w":12,"x":12,"y":0}}],"time":{"from":"now-6h","to":"now"},"timepicker":{},"refresh":"30s","schemaVersion":39,"version":1,"links":[]}}Ce dashboard JSON provisionnable inclut un panel Stat pour CPU Prometheus (avec seuils colorés) et Logs pour erreurs Loki. Variables DS_PROMETHEUS permettent la réutilisabilité. Importez via curl -X POST -H 'Content-Type: application/json' http://localhost:3000/api/dashboards/db ou dossier provisioning/dashboards/*.json.
Règle d'alerting Prometheus
groups:
- name: stack_alerts
rules:
- alert: HighCPU
expr: rate(process_cpu_seconds_total[5m]) > 0.8
for: 2m
labels:
severity: critical
annotations:
summary: "High CPU on {{ $labels.instance }}"
description: "CPU usage is {{ $value }} above 80%"
- alert: GrafanaDown
expr: up{job="grafana"} == 0
for: 1m
labels:
severity: warning
annotations:
summary: "Grafana instance down"Règles d'alerting pour CPU élevé et downtime Grafana, évaluées toutes les 15s. 'for: 2m' évite les faux positifs. Liez à AlertManager (port 9093) pour notifications Slack/Teams ; rechargez Prometheus via /-/reload.
Script bash pour générer des logs de test
#!/bin/bash
for i in {1..100}; do
TIMESTAMP=$(date +%s)
if [ $((i % 10)) -eq 0 ]; then
curl -H "Content-Type: application/json" -X POST -d '{"log":"ERROR: Simulated failure at $TIMESTAMP"}' "http://localhost:3100/loki/api/v1/push" &
else
curl -H "Content-Type: application/json" -X POST -d '{"log":"INFO: Normal operation $i"}' "http://localhost:3100/loki/api/v1/push" &
fi
done
wait
echo "Logs générés. Vérifiez dans Grafana Explore > Loki."Ce script simule 100 logs (10% erreurs) vers Loki via Promtail-like push API. Exécutez chmod +x generate-logs.sh && ./generate-logs.sh. Piège : Loki nécessite un format JSON structuré ; testez la query {job=~"grafana"} |= "error" dans Explore.
Bonnes pratiques
- Toujours provisionner datasources/dashboards pour reproductibilité (CI/CD).
- Utilisez des variables dashboard ($__rate_interval) pour queries adaptatives.
- Sécurisez avec GF_AUTH_ANONYMOUS_DISABLED=true et OAuth (GitHub/Keycloak).
- Scalez Grafana en HA avec PostgreSQL backend et 3+ replicas.
- Monitorez Grafana elle-même via /metrics et sidecar exporter.
Erreurs courantes à éviter
- Ports doublons : Vérifiez netstat avant up ; utilisez 3001 si 3000 pris.
- Volumes non persistants : Sans volumes:, données perdues au restart.
- Queries PromQL invalides : Testez d'abord dans Prometheus UI (/graph).
- Auth Grafana : Changez admin/supersecret immédiatement via UI ou env.
Pour aller plus loin
Approfondissez avec Tempo pour les traces (ajoutez au docker-compose). Explorez les plugins comme 'grafana-clock' ou 'business-intelligence'. Consultez la doc officielle Grafana et nos formations Learni sur l'observabilité. Migrez vers Kubernetes avec Helm charts pour prod.