Reprend l'amorce de la PR 164 et l'intègre à la stack : service `garage` (dxflrs/garage v2.4.1, `--single-node --default-bucket`) dans docker-compose.yml, garage.toml versionné sans secret, ports sur 127.0.0.1 décalés par environnement dans provision-host.sh, garde des six clés GARAGE_* dans le Makefile, cible Prometheus avec jeton, tests de fumée déplacés dans tests/garage et joués par le job compose d'infra.yml contre le vrai conteneur, SSE-C compris. Variables APP_S3_* et APP_READING_RETENTION_DAYS posées sur airflow-scheduler pour le DAG `retention`. ADR 0019. Closes #24
Supervision
Prometheus, Alertmanager, Grafana et trois exporteurs, sous le profil Compose monitoring.
Issue #26, décisions dans l'ADR 0016, vue d'architecture dans
docs/architecture/60-observabilite.md.
| Service | Image | Rôle | Accès |
|---|---|---|---|
prometheus |
prom/prometheus |
Collecte toutes les 15 s, évalue les règles, garde 15 jours (1 Go au plus) | 127.0.0.1:${PROMETHEUS_PORT:-9090} |
alertmanager |
prom/alertmanager |
Groupe les alertes et les envoie par courriel à Mailpit | 127.0.0.1:${ALERTMANAGER_PORT:-9093} |
grafana |
grafana/grafana |
Trois tableaux de bord provisionnés, dossier « EnerVision » | 127.0.0.1:${GRAFANA_PORT:-3001} |
postgres-exporter |
prometheuscommunity/postgres-exporter |
Connexions, transactions, taille des bases | réseau interne |
node-exporter |
prom/node-exporter |
Processeur, mémoire et disque de l'hôte | réseau interne |
cadvisor |
gcr.io/cadvisor/cadvisor |
Mémoire et processeur par conteneur | réseau interne |
garage (cible) |
service de la stack | Requêtes S3, octets lus et écrits, disque local, santé du nœud, sur garage:3903/metrics avec GARAGE_METRICS_TOKEN |
réseau interne |
Les interfaces n'écoutent que sur 127.0.0.1. Depuis un poste, on passe par un tunnel SSH,
comme pour Airflow :
ssh -L 3001:127.0.0.1:3001 -L 9090:127.0.0.1:9090 enervision@10.101.200.37
Démarrer
- Prod.
COMPOSE_PROFILES=monitoringdans le.env:make stack-up, donc chaque déploiement, démarre la supervision et pose le rôlesupervisionaprès les migrations. - Recette et poste. À la demande, sur une stack déjà démarrée :
make monitoring-up. Les services partent en--no-deps, sans toucher aux autres.
Quatre secrets sont requis, et make stack-up comme make monitoring-up refusent de démarrer
s'il en manque un. scripts/provision-host.sh les génère pour un nouvel environnement.
| Variable | Rôle |
|---|---|
APP_METRICS_TOKEN |
Jeton que Prometheus présente sur /metrics, et que l'API exige dès qu'il est posé |
GRAFANA_ADMIN_PASSWORD |
Compte admin de Grafana. Sans lui, le conteneur refuse de démarrer |
SUPERVISION_DB_PASSWORD |
Rôle PostgreSQL supervision, en lecture seule (db/roles/supervision.sql) |
GARAGE_METRICS_TOKEN |
Jeton que Prometheus présente sur /metrics de Garage (ADR 0019), passé en secret Compose |
L'API doit tourner en conteneur (make stack-up, ou docker compose up -d backend) :
Prometheus la joint en backend:8000, sur le réseau du projet. Une API lancée par make dev
sur l'hôte reste hors de sa portée, et l'alerte ApiIndisponible le signale.
Tableaux de bord
| Tableau | Source | Contenu |
|---|---|---|
| EnerVision · API | Prometheus | Débit, erreurs 5xx, latences p50/p95/p99, globales et par route. C'est lui qu'on regarde pendant un tir k6 |
| EnerVision · Données et modèle | TimescaleDB | Fraîcheur des relevés par site, relevés ingérés, alertes par sévérité, dérive du modèle (drift_report) |
| EnerVision · Infrastructure | Prometheus | Hôte, mémoire et processeur par conteneur (recette et prod comprises), PostgreSQL |
Les fichiers JSON de grafana/dashboards sont la source : Grafana les recharge et refuse de
les modifier depuis l'interface. Pour changer un tableau, l'exporter en JSON depuis Grafana et
remplacer le fichier.
Alertes
prometheus/rules/enervision.yml définit les règles, et prometheus/tests/enervision.test.yml
porte un cas par règle, joué par promtool test rules.
| Alerte | Condition | Sévérité |
|---|---|---|
ApiIndisponible |
/metrics injoignable pendant 2 min |
critical |
ApiErreursServeur |
Plus de 5 % de 5xx sur 5 min | critical |
ApiLatenceElevee |
p95 au-delà d'une seconde pendant 10 min | warning |
BaseIndisponible |
Exportateur sans connexion pendant 2 min | critical |
BaseConnexionsSaturees |
Plus de 80 % de max_connections |
warning |
HoteMemoireSaturee |
Mémoire au-delà de 90 % pendant 10 min | warning |
HoteDisquePlein |
Moins de 10 % libres sur / |
critical |
HoteCpuSature |
Processeur au-delà de 90 % pendant 15 min | warning |
CibleInjoignable |
Un exporteur muet pendant 5 min | warning |
Alertmanager envoie les courriels à supervision@enervision.fr via Mailpit, qui les capture :
ils se lisent dans son interface. Un critical masque le warning de la même cible.
Vérifier la configuration
make monitoring-check # promtool check config et test rules, amtool check-config, JSON des tableaux
La CI joue les mêmes commandes (job « Validation des fichiers Compose et de la supervision »)
dès que monitoring/ ou un fichier Compose change.