Logs & monitoring du gateway OCPI
Le gateway est instrumenté à quatre niveaux :
- Logs structurés (Serilog).
- Audit OCPI complet en base (
ocpi.InboundMessages,ocpi.OutboundMessages). - Health checks (
/health,/health/ready,/health/live). - 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
SELECT TOP 1 ReceivedUtc FROM ocpi.InboundMessages ORDER BY ReceivedUtc DESC;< 5 min ?SELECT COUNT(*) FROM ocpi.OutboundMessages WHERE Status IN (0,3);< 100 ?SELECT COUNT(*) FROM ocpi.OutboundMessages WHERE Status = 4;= 0 ?GET /health→200 OK,gireve-versions = Healthy?- Hangfire dashboard (
/hangfiredu Worker) → aucun jobocpi-*é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 > 0gireve-versions = Degradedpendant > 5 min