PrometheusGrafanaObservabilitéDevOps

Prometheus & Grafana : par où commencer son observabilité

7 avril 2026 · Sphinx-Digital

Mettre en place Prometheus et Grafana de zéro peut sembler intimidant face à la quantité de documentation disponible. Voici le chemin le plus court vers une observabilité qui fonctionne.

L’architecture en 3 composants

Applications/infra → Prometheus → Grafana (dashboards)

                   Alertmanager → Slack/PagerDuty

Prometheus scrape des métriques depuis des endpoints HTTP /metrics toutes les 15-30 secondes et les stocke dans son TSDB.

Exporters exposent des métriques de systèmes qui n’en ont pas nativement : node_exporter pour Linux, blackbox_exporter pour les URLs, postgres_exporter pour PostgreSQL.

Grafana requête Prometheus (et d’autres sources) pour afficher des dashboards.

Démarrer avec Docker Compose

version: '3.8'
services:
  prometheus:
    image: prom/prometheus:v2.51.0
    ports: ["9090:9090"]
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=15d'

  grafana:
    image: grafana/grafana:10.3.0
    ports: ["3000:3000"]
    environment:
      GF_SECURITY_ADMIN_PASSWORD: admin
    volumes:
      - grafana_data:/var/lib/grafana

  node-exporter:
    image: prom/node-exporter:v1.7.0
    ports: ["9100:9100"]
    pid: host
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'

volumes:
  prometheus_data:
  grafana_data:
# prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['node-exporter:9100']

  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

Exposer des métriques depuis votre application

from prometheus_client import Counter, Histogram, Gauge, start_http_server
import time

# Compteur : ne peut qu'augmenter
REQUEST_COUNT = Counter('http_requests_total',
    'Total HTTP requests', ['method', 'endpoint', 'status'])

# Histogramme : pour les latences
REQUEST_LATENCY = Histogram('http_request_duration_seconds',
    'HTTP request latency',
    buckets=[0.01, 0.05, 0.1, 0.5, 1.0, 5.0])

# Gauge : peut monter et descendre
ACTIVE_CONNECTIONS = Gauge('active_connections', 'Active connections')

@app.route('/api/orders')
def get_orders():
    start = time.time()
    ACTIVE_CONNECTIONS.inc()

    try:
        result = fetch_orders()
        REQUEST_COUNT.labels(method='GET', endpoint='/api/orders', status='200').inc()
        return result
    except Exception as e:
        REQUEST_COUNT.labels(method='GET', endpoint='/api/orders', status='500').inc()
        raise
    finally:
        REQUEST_LATENCY.observe(time.time() - start)
        ACTIVE_CONNECTIONS.dec()

# Exposer /metrics
start_http_server(8000)

PromQL : les requêtes essentielles

# Taux de requêtes par seconde sur 5 minutes
rate(http_requests_total[5m])

# Taux d'erreur (codes 5xx)
rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])

# Latence p99
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

# CPU utilisation par instance
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# Mémoire disponible en %
(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

Premier dashboard Grafana

  1. Accédez à http://localhost:3000, login admin/admin
  2. Connections → Data sources → Add → Prometheus → URL : http://prometheus:9090
  3. Dashboards → Import → ID 1860 (Node Exporter Full) — dashboard complet prêt en 30 secondes

Pour vos métriques custom, créez un nouveau dashboard et ajoutez des panels avec vos requêtes PromQL.

Alerting : la règle minimale

# prometheus-rules.yml
groups:
  - name: basic
    rules:
      - alert: HighErrorRate
        expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Taux d'erreur > 5% depuis 2 minutes sur {{ $labels.instance }}"

Notre formation Grafana & Prometheus approfondit tous ces aspects avec des ateliers sur des environnements réels.