Logs & monitoring du gateway OCPI

Le gateway est instrumenté à quatre niveaux :

  1. Logs structurés (Serilog).
  2. Audit OCPI complet en base (ocpi.InboundMessages, ocpi.OutboundMessages).
  3. Health checks (/health, /health/ready, /health/live).
  4. Compteurs d'outbox lisibles par SQL.

1. Logs (Serilog)

Environnement Destination
Development Console
Staging Console (kubectl logs)
Production Console + sink agrégé (Seq, ELK, Loki) — à ajouter dans Program.cs

Chaque ligne est enrichie par Timestamp, Level, SourceContext, RequestId, CorrelationId (renvoyé aux partenaires via X-Correlation-ID), EnvironmentName, MachineName, ThreadId.

Pistes d'investigation

Symptôme À chercher
Gireve dit qu'il reçoit 401 SourceContext = "OcpiTokenAuthenticationHandler", niveau ≥ WRN
Une session ne remonte pas SourceContext = "OcpiOutboundDispatcherService", messages "failed"
Commande RESERVE_NOW rejetée CommandService + CommandId

Verbosité dynamique

Modifier Serilog:MinimumLevel:Default dans appsettings.{Env}.json (ou variable d'env Serilog__MinimumLevel__Default=Debug) puis redémarrer le pod.

2. Audit en base

Table Rôle
ocpi.InboundMessages Toute requête HTTP reçue de Gireve (méthode, path, body, status, durée)
ocpi.OutboundMessages Outbox : tout ce qu'on envoie à Gireve (état + retry + dernière erreur)
ocpi.CommandLogs Commandes reçues (START_SESSION, etc.) avec payload exact
ocpi.Cdrs, ocpi.Sessions État de push (Pending / Pushed / Failed) par session locale

Requêtes utiles

-- Santé de la file outbox
SELECT Status, COUNT(*) AS Count
FROM ocpi.OutboundMessages
GROUP BY Status;

-- Messages en dead-letter
SELECT *
FROM ocpi.OutboundMessages
WHERE Status = 4
ORDER BY CreatedDate DESC;

-- CDRs en échec récents
SELECT TOP 50 *
FROM ocpi.Cdrs
WHERE PushStatus = 2
ORDER BY LastAttemptUtc DESC;

-- Trafic entrant 24h par module
SELECT Module, COUNT(*) AS Hits, AVG(DurationMs) AS AvgMs
FROM ocpi.InboundMessages
WHERE ReceivedUtc >= DATEADD(HOUR, -24, SYSUTCDATETIME())
GROUP BY Module
ORDER BY Hits DESC;

Rétention

Job Hangfire ocpi-audit-cleanup à créer dans Chargemsi.Worker qui purge les InboundMessages de plus de 90 jours. Ne pas purger CommandLogs / Cdrs — artefacts juridiques/facturation.

3. Health checks

URL Usage
/health/live k8s liveness probe (process up)
/health/ready k8s readiness probe (DB OCPP + DB OCPI + Gireve)
/health dashboard ops
Check Niveau d'erreur si KO
db-ocpp Unhealthy
db-ocpi Unhealthy
gireve-versions Degraded (volontairement : si Gireve tombe, on garde le gateway en vie pour absorber les pushes en outbox)

Sondes Kubernetes

livenessProbe:
  httpGet: { path: /health/live, port: 80 }
  initialDelaySeconds: 10
  periodSeconds: 30

readinessProbe:
  httpGet: { path: /health/ready, port: 80 }
  initialDelaySeconds: 15
  periodSeconds: 10

3 bis. Tableau de bord superadmin (Management Portal)

Depuis la version 1.1 du Management Portal, le module OCPI Administration expose toutes ces informations dans une interface web réservée aux comptes Admin :

Donnée brute SQL Écran portail correspondant
ocpi.OutboundMessages par statut /OcpiAdmin (KPI) + /OcpiAdmin/Outbound
ocpi.InboundMessages /OcpiAdmin/Inbound (filtre fenêtre / module / code HTTP)
ocpi.Cdrs /OcpiAdmin/Cdrs
ocpi.Sessions /OcpiAdmin/Sessions
ocpi.CommandLogs /OcpiAdmin/Commands
ocpi.Partners / Endpoints / Credentials /OcpiAdmin/Partners (avec drill-down)

Le tableau de bord rafraîchit les compteurs toutes les 10 s via l'endpoint /OcpiAdmin/Snapshot. Voir le guide superadmin OCPI pour le détail des procédures.

4. Smoke checklist quotidienne

  1. SELECT TOP 1 ReceivedUtc FROM ocpi.InboundMessages ORDER BY ReceivedUtc DESC; < 5 min ?
  2. SELECT COUNT(*) FROM ocpi.OutboundMessages WHERE Status IN (0,3); < 100 ?
  3. SELECT COUNT(*) FROM ocpi.OutboundMessages WHERE Status = 4; = 0 ?
  4. GET /health200 OK, gireve-versions = Healthy ?
  5. Hangfire dashboard (/hangfire du Worker) → aucun job ocpi-* échoué ?

Si l'un de ces points est KO → ouvrir un incident, regarder en priorité OcpiOutboundDispatcherService dans les logs.

5. Évolutions recommandées

  • Sink Serilog vers Seq ou Application Insights pour la recherche cross-pod.
  • Métriques OpenTelemetry + Prometheus, endpoint /metrics, compteurs par module OCPI.
  • Alertes :
    • file outbox > 1 000 messages pendant > 10 min
    • DeadLetter > 0
    • gireve-versions = Degraded pendant > 5 min