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
- Accédez à
http://localhost:3000, loginadmin/admin - Connections → Data sources → Add → Prometheus → URL :
http://prometheus:9090 - 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.