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.

ServicePortLimite mémoireRôle
Prometheus90902 GBCollecte et stockage des métriques (mode pull)
Grafana30001 GBVisualisation et dashboards
Alertmanager9093512 MBRoutage et groupement des alertes
Node Exporter9100256 MBMétriques système (CPU, RAM, disque)
Docker Exporter9487256 MBMétriques par container (CPU, RAM, état)
OTEL Collector4317/4318 (in), 8889 (scrape)512 MBIngestion télémétrie Claude Code

Grafana · :3000

Linux System

Docker Containers

Claude Code

Alertmanager · :9093

Groupe alerts

Route → N8N

Prometheus · :9090

Scrape toutes les 15s

Évalue les règles d'alerte

Stocke 15 jours / 5 GB max

Scrape targets

Node Exporter · host:9100

Docker Exporter · host:9487

OTEL Collector · host:8889

Docker Engine · host:9323

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: 'docker-exporter'
static_configs:
- targets: ['docker-exporter:9487']
- job_name: 'docker-engine'
static_configs:
- targets: ['host.docker.internal:9323']
- 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

Le pipeline complet va plus loin que l’observabilité brute : un hook SessionEnd côté machine de dev envoie les métadonnées de session à N8N, qui interroge Prometheus pour récupérer les métriques (tokens, coût, temps actif) et met à jour la tâche Odoo correspondante via XML-RPC.

~/.claude (SessionEnd hook)
▼ POST /webhook/telemetry/session-end
N8N Telemetry workflow
│ Query Prometheus pour la session
▼ XML-RPC vers Odoo
project.task (x_claude_time_total, x_claude_cost_total, …)

Voir Claude Code Telemetry côté workflow.

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