Skip to content
Learni
Voir tous les tutoriels
Observabilité

Comment déployer Grafana avec Prometheus et Loki en 2026

Read in English

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

docker-compose.yml
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

prometheus.yml
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: 30s

Ce 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

grafana/provisioning/datasources/prometheus.yml
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

grafana/provisioning/datasources/loki.yml
apiVersion: 1

datasources:
  - name: Loki
    type: loki
    access: proxy
    orgId: 1
    url: http://loki:3100
    basicAuth: false
    isDefault: false
    editable: true
    jsonData:
      maxLines: 1000

Provisionning 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

grafana/provisioning/dashboards/stack.json
{"__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

alert.rules.yml
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

generate-logs.sh
#!/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.