Aller au contenu

Monitoring Stack : Prometheus + Grafana

La Monitoring Stack assure l’observabilité de toute l’infrastructure. Elle collecte les métriques système et applicatives, les visualise via des dashboards, et déclenche des alertes en cas d’anomalie.

ServicePortRôle
Prometheus9090Collecte et stockage des métriques (mode pull)
Grafana3000Visualisation et dashboards
Alertmanager9093Routage et groupement des alertes
Node Exporter9100Métriques système (CPU, RAM, disque)
cAdvisor8080Métriques conteneurs Docker
OTEL Collector4317, 8889Agrégation télémétrie (Claude Code)
┌─────────────────────────────────────────────────────────────┐
│ Scrape Targets │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ Node Exporter│ │ cAdvisor │ │ OTEL Collector │ │
│ │ (host:9100) │ │ (host:8080) │ │ (host:8889) │ │
│ └──────┬───────┘ └──────┬───────┘ └────────┬─────────┘ │
└─────────┼─────────────────┼────────────────────┼─────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────┐
│ Prometheus (port 9090) │
│ ├─ Scrape toutes les 15s │
│ ├─ Évalue les règles d'alerte │
│ └─ Stocke 15 jours / 5 GB max │
└─────────────────┬───────────────────────────────┘
┌───────────┴───────────┐
▼ ▼
┌──────────────────┐ ┌──────────────────────┐
│ Alertmanager │ │ Grafana (port 3000) │
│ (port 9093) │ │ ├─ Linux System │
│ ├─ Groupe alerts │ │ ├─ Docker Containers │
│ └─ Route → N8N │ │ └─ Claude Code │
└────────┬─────────┘ └──────────────────────┘
N8N webhook: /webhook/prometheus/alert
→ Notification Hub → Telegram

ProblèmeSans monitoringAvec monitoring
Container crashDécouvert par un utilisateurAlerte immédiate
Disque pleinService inaccessibleAnticipé avant saturation
Fuite mémoireOOM killer aléatoireTendance visible, action préventive
Coûts ClaudeSurprise en fin de moisSuivi en temps réel
AlerteDéclenchéeUtilité constatée
ContainerDownService crashDétection rapide, restart manuel ou auto
Claude Code telemetrySessions ClaudeSuivi du temps passé et des tokens utilisés
DiskSpaceLowEspace disque < 15%Prévention avant incident
HighMemoryUsageRAM > 85%Non encore déclenchée (marge suffisante)

prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
- job_name: 'otel-collector'
static_configs:
- targets: ['otel-collector:8889']
# Dans docker-compose.yaml, commande Prometheus
command:
- '--storage.tsdb.retention.time=15d'
- '--storage.tsdb.retention.size=5GB'
prometheus/alerts.yml
groups:
- name: infrastructure
rules:
- alert: HighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "Mémoire haute sur {{ $labels.instance }}"
description: "Usage mémoire: {{ $value | printf \"%.1f\" }}%"
- alert: HighCPUUsage
expr: 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
- alert: DiskSpaceLow
expr: (1 - (node_filesystem_avail_bytes{fstype!="tmpfs"} / node_filesystem_size_bytes)) * 100 > 85
for: 5m
labels:
severity: critical
- alert: ContainerDown
expr: absent(container_last_seen{name!=""})
for: 1m
labels:
severity: critical
- alert: ServiceDown
expr: up == 0
for: 1m
labels:
severity: critical
alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
route:
receiver: 'n8n'
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: 'n8n'
webhook_configs:
- url: 'http://n8n:5678/webhook/prometheus/alert'
send_resolved: true

Le Notification Hub analyse la sévérité pour router les alertes : critiques → Telegram immédiat, warnings → regroupés.

Configuration Claude Code pour exporter la télémétrie :

~/.claude/settings.json
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_LOGS_EXPORTER": "otlp",
"OTEL_EXPORTER_OTLP_PROTOCOL": "http/protobuf",
"OTEL_EXPORTER_OTLP_ENDPOINT": "http://localhost:4318",
"OTEL_SERVICE_NAME": "claude-code"
}
}
MétriqueDescription
claude_code_token_usage_tokens_totalTokens par modèle et type
claude_code_cost_usage_USD_totalCoût cumulé en USD
claude_code_active_time_seconds_totalTemps actif
claude_code_lines_of_code_count_totalLignes modifiées
# CPU usage percentage
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Memory usage percentage
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
# Disk usage percentage
(1 - (node_filesystem_avail_bytes{fstype!="tmpfs"} / node_filesystem_size_bytes)) * 100
# Container memory usage (top 5)
topk(5, container_memory_usage_bytes{name!=""})
# Claude Code tokens total by model
sum(claude_code_token_usage_tokens_total) by (model)
# Claude Code cost USD
sum(claude_code_cost_usage_USD_total)
DashboardMétriques
Linux SystemCPU, RAM, disque, réseau, load average
Docker ContainersCPU/RAM par conteneur, I/O, restarts
Claude CodeTokens, coûts, temps actif, lignes de code

Symptômes :

  • Aucune métrique container_* dans Prometheus
  • Erreurs Failed to identify the read-write layer ID dans les logs
  • Dashboard “Docker Containers” vide

Workaround : Utiliser docker-exporter ou une version spécifique de cAdvisor compatible.

LimiteImpactMitigation
Rétention 15 joursPas d’historique long termeExporter vers S3/Thanos si besoin
Pas de tracingDebugging workflows limitéConsidérer Jaeger si besoin
OTEL Collector singleSPOF pour la télémétrieAcceptable pour usage personnel

Si besoin d’historique > 15 jours :

  • Déployer Thanos pour le stockage long terme
  • Ou exporter des snapshots vers S3

Si besoin de tracer les workflows N8N :

  • Ajouter Jaeger ou Tempo
  • Instrumenter N8N avec OTEL traces

Si le volume de métriques explose :

  • Augmenter la rétention de Prometheus
  • Considérer Victoria Metrics (plus performant)
Fenêtre de terminal
# Vérifier les targets Prometheus
curl http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | {job: .labels.job, health: .health}'
# Tester la connectivité exporter
docker exec prometheus wget -qO- http://node-exporter:9100/metrics | head
# Vérifier les alertes actives
curl http://localhost:9093/api/v1/alerts
# Tester le webhook N8N
curl -X POST http://n8n:5678/webhook/prometheus/alert \
-H "Content-Type: application/json" \
-d '{"alerts":[{"labels":{"alertname":"test"}}]}'

  • Glossaire — Prometheus, PromQL, OTEL, Scrape