Story OP-020: Backend observabilité (Micrometer + health endpoint + MDC)¶
Module: operator-console Slice: Architecture §11 OP-005 + §10 Side: [BACKEND] Version target: V0.1.0 Priority: 21 (dernière story V0) Depends on: OP-003 (campagne send pour metric), OP-004 (recovery) Can develop concurrently with: aucune (story horizontale) Merge order: After V0.0.3 (toute la stack feature stable) Estimated complexity: S PRD User Stories: V0.1.0 envelope (hooks observabilité ARTCI + ops) Wireframe: N/A — backend only
Objective¶
Compléter les hooks d'observabilité de l'arch §10 : métriques Micrometer formalisées, endpoint health dédié OP, enrichissement MDC structuré sur tous les logs OP. Préparation V1 alerting + Datadog.
Backend Scope¶
Service Layer¶
OperatorMetrics:@Componentqui enregistre 7 métriques (extension de l'arch §10.1) :op_campaigns_created_total(Counter) — incrémenté dansCampaignService.createDraft.op_campaigns_sent_total(Counter) — dansCampaignSenderService.sendpost-TX0.op_campaign_contracts_status(Gauge, per-status) — scan périodique 60 s.op_api_request_duration(Timer) — auto via@Timedsur les controllers OP.op_notif_dispatch_latency(Histogram) — entre publish event et UPDATE cc dans le worker.op_link_creation_latency(Histogram) — duration deSignedLinkService.createLinkcôté OP.-
op_dispatch_recovery_lag(Gauge) — déjà émis par OP-004, intégré ici. -
OperatorHealthIndicator:HealthIndicatorqui assemble : - Postgres connectivity (
SELECT 1sur datasource tenant + platform). - Keycloak token validation (decode token signing key).
- NOTIF client availability (ping via
NotificationDispatchService.healthCheck()). - TENANT cache age (≤ TTL).
-
Status
OUT_OF_SERVICEsi une de ces dépendances échoue. -
OperatorHealthController: GET /api/operator/health/ready(RBAC :PLATFORM_ADMIN+ monitoring service account).-
GET /api/operator/health/live(no-auth simple liveness). -
OperatorMdcEnricher:HandlerInterceptorqui ajoute MDC keystenant_id,agency_id,user_id,role,correlation_id,endpointà chaque requête. Cleanup post-request. -
OperatorLoggingConfiguration: logbacklogback.xml(étendu — pas refait) intègre les MDC keys dans le JSON layout existant.
API Endpoints¶
| Method | Path | Request | Response | Auth |
|---|---|---|---|---|
GET |
/api/operator/health/ready |
— | { status, details: {db, keycloak, notif, tenantCache} } |
PLATFORM_ADMIN / monitoring |
GET |
/api/operator/health/live |
— | { status: "UP" } (200) |
no-auth |
Validation Rules¶
N/A.
Multi-Tenant Considerations¶
- Métriques par tenant : étiquette
tenant_idsur les counters/gauges/histograms (haute cardinalité — borné à 1000 tenants en V1). - Health endpoint n'expose pas de données tenant-spécifiques.
Audit & Logging¶
MDCenrichi systématiquement sur tous les logs OP.- Logs structurés JSON (ELK-compatible).
- Émission Prometheus (local) + CloudWatch (staging/prod) — config existante TENANT S0.
Acceptance Criteria¶
AC-001: Métriques émises sur création + envoi + worker
Given un opérateur crée puis envoie une campagne 5 contrats
When je requête /actuator/prometheus
Then op_campaigns_created_total a incrémenté de 1
And op_campaigns_sent_total a incrémenté de 1
And op_notif_dispatch_latency a 5 observations
And op_link_creation_latency a 5 observations.
AC-002: Health endpoint répond UP avec toutes les deps OK
Given Postgres + Keycloak + NOTIF mock OK
When GET /api/operator/health/ready avec token PLATFORM_ADMIN
Then 200 { status: "UP", details: { db: "UP", keycloak: "UP", notif: "UP", tenantCache: "UP" } }.
AC-003: Health endpoint DOWN si NOTIF down
Given NOTIF mock rejette
When GET /health/ready
Then 503 { status: "OUT_OF_SERVICE", details: { notif: "DOWN", ... } }.
AC-004: MDC enrichi sur tous les logs
Given une requête authentifiée
When un controller log un INFO
Then le log JSON contient les 6 MDC keys (tenant_id, agency_id, user_id, role, correlation_id, endpoint).
Compliance Rules¶
- PRD V0 §4 ligne OP V0.1.0 : observabilité ARTCI + ops.
VÉRIFIÉ. - ARTCI traçabilité : MDC
user_id+tenant_idsur tous les logs.VÉRIFIÉ.
Standards & Conventions¶
docs/standards/java-spring-guidelines.md— Micrometer + Actuator.
Testing Requirements¶
Unit Tests¶
OperatorMetricsTest: chaque metric émis sur le bon trigger.OperatorMdcEnricherTest: cleanup post-request (pas de leak).
Integration Tests¶
HealthEndpointITAC-002 + AC-003.MetricsExpositionIT: vérifie endpoint Prometheus contient les 7 metrics.
What QA Will Validate¶
- Curl
/actuator/prometheus→ métriques OP visibles. - Logs JSON dans CloudWatch staging contiennent les MDC keys.
Out of Scope¶
- Alerting CloudWatch (Datadog rules) → infra ops, hors story dev.
- Distributed tracing OpenTelemetry → V1.
- Métriques frontend (Sentry / RUM) → V1.
Definition of Done¶
- [ ] 7 métriques Micrometer émises et exposées sur /actuator/prometheus
- [ ] /health/ready + /health/live opérationnels
- [ ] AC-001..AC-004 passent
- [ ] MDC propagé sur tous les logs OP
- [ ] Documentation
.env.examplemise à jour (variables Actuator) - [ ] Tests intégration verts