FEAT: Purge des logs agents — job Hangfire récurrent + rétention configurable #53

Closed
opened 2026-08-11 17:17:28 +02:00 by nonobis · 0 comments
Owner

Contexte

Les logs agents remontés au central ne doivent pas s'accumuler indéfiniment en base (volume : 1 agent × niveau Warning ≈ centaines d'entrées/jour ; Information = milliers). Un système de purge est exigé dès la mise en place (ticket FEAT stockage). Complémentaire du ticket #8 (jobs rétention/cleanup) qui ne couvre pas les logs.

Référence spec

S'inscrit dans l'étape 6 (ops/maintenance) ; la spec impose la rétention/cleanup pour les données volumineuses (cf. #8, #15). Pas de table de logs dans la spec → politique de rétention à définir avec valeurs par défaut raisonnables.

État actuel

  • JobSetup.ConfigureRecurringJobs : heartbeat-monitor, agent-failover, daily-digest, weekly-digest — pas de job de purge des logs
  • Aucun paramètre de rétention dans Settings (SettingsController : heartbeat.interval.seconds déjà appliqué live par l'agent)
  • Ticket #8 : RetentionCheck/S3Cleanup/CleanupFaces/Plates/DatabaseMaintenance absents de JobSetup — à ne pas confondre

À faire

  1. Paramètres de rétention : AgentLogs.RetentionDays (défaut 7 jours) + optionnellement AgentLogs.MaxEntriesPerAgent (défaut 50 000) — stockés dans la table Settings existante (pattern heartbeat.interval.seconds)
  2. Job Hangfire AgentLogCleanupJob (nouveau, src/Heimdall.Infrastructure/Jobs/) : DELETE en batch par âge (TimestampUtc < cutoff), par agent si MaxEntries dépassé, en lots bornés (ex. 10 000/lot) pour limiter la charge ; log du nombre d'entrées purgées
  3. Enregistrement dans JobSetup : agent-log-cleanup, cron quotidien 0 3 * * * (3h, creux)
  4. Index existant (AgentId, TimestampUtc) suffit pour le DELETE par âge ; vérifier le plan avec EXPLAIN si volume réel
  5. UI : mention de la rétention dans l'onglet Logs (help text « Purge quotidienne, rétention 7 j ») + settings modifiables par un admin (SettingsPage)

Critères d'acceptation

  • Le job agent-log-cleanup supprime les entrées plus vieilles que RetentionDays
  • La rétention est modifiable via les settings (pas de hardcode)
  • Le job tourne en lots et ne bloque pas la DB (pas de DELETE monolithique)
  • Test d'intégration : insertion d'entrées âgées + exécution du job → seules les entrées récentes restent
  • Les logs de purge apparaissent dans le job Hangfire (visibilité ops)

Fichiers concernés

  • src/Heimdall.Infrastructure/Jobs/AgentLogCleanupJob.cs (nouveau)
  • src/Heimdall.Infrastructure/BackgroundJobs/JobSetup.cs
  • Settings : src/Heimdall.Infrastructure/ (pattern settings existant) + src/Heimdall.Web/Controllers/SettingsController.cs si exposition API
  • Tests : tests/Heimdall.Integration.Tests/
## Contexte Les logs agents remontés au central ne doivent pas s'accumuler indéfiniment en base (volume : 1 agent × niveau Warning ≈ centaines d'entrées/jour ; Information = milliers). Un système de purge est exigé dès la mise en place (ticket FEAT stockage). Complémentaire du ticket #8 (jobs rétention/cleanup) qui ne couvre pas les logs. ## Référence spec S'inscrit dans l'étape 6 (ops/maintenance) ; la spec impose la rétention/cleanup pour les données volumineuses (cf. #8, #15). Pas de table de logs dans la spec → politique de rétention à définir avec valeurs par défaut raisonnables. ## État actuel - `JobSetup.ConfigureRecurringJobs` : heartbeat-monitor, agent-failover, daily-digest, weekly-digest — **pas de job de purge des logs** - Aucun paramètre de rétention dans `Settings` (SettingsController : heartbeat.interval.seconds déjà appliqué live par l'agent) - Ticket #8 : RetentionCheck/S3Cleanup/CleanupFaces/Plates/DatabaseMaintenance absents de JobSetup — à ne pas confondre ## À faire 1. Paramètres de rétention : `AgentLogs.RetentionDays` (défaut **7 jours**) + optionnellement `AgentLogs.MaxEntriesPerAgent` (défaut 50 000) — stockés dans la table Settings existante (pattern `heartbeat.interval.seconds`) 2. Job Hangfire `AgentLogCleanupJob` (nouveau, `src/Heimdall.Infrastructure/Jobs/`) : DELETE en batch par âge (`TimestampUtc < cutoff`), par agent si MaxEntries dépassé, en lots bornés (ex. 10 000/lot) pour limiter la charge ; log du nombre d'entrées purgées 3. Enregistrement dans `JobSetup` : `agent-log-cleanup`, cron quotidien `0 3 * * *` (3h, creux) 4. Index existant (`AgentId`, `TimestampUtc`) suffit pour le DELETE par âge ; vérifier le plan avec EXPLAIN si volume réel 5. UI : mention de la rétention dans l'onglet Logs (help text « Purge quotidienne, rétention 7 j ») + settings modifiables par un admin (SettingsPage) ## Critères d'acceptation - [ ] Le job `agent-log-cleanup` supprime les entrées plus vieilles que `RetentionDays` - [ ] La rétention est modifiable via les settings (pas de hardcode) - [ ] Le job tourne en lots et ne bloque pas la DB (pas de DELETE monolithique) - [ ] Test d'intégration : insertion d'entrées âgées + exécution du job → seules les entrées récentes restent - [ ] Les logs de purge apparaissent dans le job Hangfire (visibilité ops) ## Fichiers concernés - `src/Heimdall.Infrastructure/Jobs/AgentLogCleanupJob.cs` (nouveau) - `src/Heimdall.Infrastructure/BackgroundJobs/JobSetup.cs` - Settings : `src/Heimdall.Infrastructure/` (pattern settings existant) + `src/Heimdall.Web/Controllers/SettingsController.cs` si exposition API - Tests : `tests/Heimdall.Integration.Tests/`
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall#53
No description provided.