FEAT: Stockage + API logs agents côté central (entité AgentLogEntry, POST batch, GET paginé) #51

Closed
opened 2026-08-11 17:17:27 +02:00 by nonobis · 1 comment
Owner

Contexte

Le central doit recevoir, persister et exposer les logs remontés par les agents (voir ticket FEAT « Remontée des logs agents »). Aujourd'hui il ne connaît que les métriques heartbeat (Agent) et l'AuditLog des actions admin — aucune donnée de logs d'agent.

Référence spec

Complète le pattern AuditLog (P0) ; cohérent avec l'étape 6 (observabilité). Règle P1 « Secrets dans logs — sanitized » appliquée côté agent à la source.

État actuel

  • AgentsController : register, heartbeat, discovery, GET {id} — pas d'endpoint logs
  • Entités : Agent (métriques live), AuditLog — pas d'entité de log d'agent
  • JobSetup.ConfigureRecurringJobs : heartbeat-monitor, agent-failover, daily-digest, weekly-digest — pas de cleanup logs

À faire

  1. Entité AgentLogEntry dans Heimdall.Domain/Entities/ : Id (Guid), AgentId (FK), TimestampUtc, Level (enum : Trace/Debug/Information/Warning/Error/Critical), Message, Exception (nullable), Source (nullable, ex. AgentRegistrationService)
  2. Configuration EF (AgentLogEntryConfiguration) : table AgentLogEntries, index composite (AgentId, TimestampUtc) pour les lectures par agent et la purge par âge
  3. Migration EF AddAgentLogEntries
  4. CQRS :
    • SubmitAgentLogsCommand (API Key) — insert batch, validation (taille max du batch, niveau valide, horodatages bornés), rate limit Api existant (200 req/min)
    • GetAgentLogsQuery (JWT, policy SiteRead) — pagination page/pageSize, filtres : level, from, to, search (message), tri desc par TimestampUtc
  5. AgentsController : POST /api/agents/{id}/logs (API Key) + GET /api/agents/{id}/logs (JWT)
  6. Contrainte de volume : taille max par batch (ex. 200 entrées), rejet 400 si dépassement — protège la DB contre un agent mal configuré (niveau Information)

Critères d'acceptation

  • POST /api/agents/{id}/logs avec API Key insère les entrées (agent du même site uniquement)
  • GET /api/agents/{id}/logs (JWT) retourne les entrées paginées, filtrées par niveau/période
  • Requête sans auth → 401 (et non 302, cf. ticket #47)
  • Batch > 200 entrées → 400
  • Tests Integration (PostgreSQL réel) : insert + lecture + filtres + auth — tests/Heimdall.Integration.Tests

Fichiers concernés

  • src/Heimdall.Domain/Entities/AgentLogEntry.cs (nouveau)
  • src/Heimdall.Infrastructure/Data/Configurations/AgentLogEntryConfiguration.cs (nouveau)
  • src/Heimdall.Application/AgentLogs/Commands/SubmitAgentLogsCommand.cs (nouveau)
  • src/Heimdall.Application/AgentLogs/Queries/GetAgentLogsQuery.cs (nouveau)
  • src/Heimdall.Web/Controllers/AgentsController.cs
  • Migration : src/Heimdall.Infrastructure/Migrations/
## Contexte Le central doit recevoir, persister et exposer les logs remontés par les agents (voir ticket FEAT « Remontée des logs agents »). Aujourd'hui il ne connaît que les métriques heartbeat (Agent) et l'AuditLog des actions admin — aucune donnée de logs d'agent. ## Référence spec Complète le pattern AuditLog (P0) ; cohérent avec l'étape 6 (observabilité). Règle P1 « Secrets dans logs — sanitized » appliquée côté agent à la source. ## État actuel - `AgentsController` : `register`, `heartbeat`, `discovery`, `GET {id}` — pas d'endpoint logs - Entités : `Agent` (métriques live), `AuditLog` — pas d'entité de log d'agent - `JobSetup.ConfigureRecurringJobs` : heartbeat-monitor, agent-failover, daily-digest, weekly-digest — pas de cleanup logs ## À faire 1. Entité `AgentLogEntry` dans `Heimdall.Domain/Entities/` : `Id` (Guid), `AgentId` (FK), `TimestampUtc`, `Level` (enum : Trace/Debug/Information/Warning/Error/Critical), `Message`, `Exception` (nullable), `Source` (nullable, ex. `AgentRegistrationService`) 2. Configuration EF (`AgentLogEntryConfiguration`) : table `AgentLogEntries`, index composite **(`AgentId`, `TimestampUtc`)** pour les lectures par agent et la purge par âge 3. Migration EF `AddAgentLogEntries` 4. CQRS : - `SubmitAgentLogsCommand` (API Key) — insert batch, validation (taille max du batch, niveau valide, horodatages bornés), rate limit `Api` existant (200 req/min) - `GetAgentLogsQuery` (JWT, policy `SiteRead`) — pagination page/pageSize, filtres : `level`, `from`, `to`, `search` (message), tri desc par TimestampUtc 5. `AgentsController` : `POST /api/agents/{id}/logs` (API Key) + `GET /api/agents/{id}/logs` (JWT) 6. Contrainte de volume : taille max par batch (ex. 200 entrées), rejet 400 si dépassement — protège la DB contre un agent mal configuré (niveau Information) ## Critères d'acceptation - [ ] `POST /api/agents/{id}/logs` avec API Key insère les entrées (agent du même site uniquement) - [ ] `GET /api/agents/{id}/logs` (JWT) retourne les entrées paginées, filtrées par niveau/période - [ ] Requête sans auth → 401 (et non 302, cf. ticket #47) - [ ] Batch > 200 entrées → 400 - [ ] Tests Integration (PostgreSQL réel) : insert + lecture + filtres + auth — `tests/Heimdall.Integration.Tests` ## Fichiers concernés - `src/Heimdall.Domain/Entities/AgentLogEntry.cs` (nouveau) - `src/Heimdall.Infrastructure/Data/Configurations/AgentLogEntryConfiguration.cs` (nouveau) - `src/Heimdall.Application/AgentLogs/Commands/SubmitAgentLogsCommand.cs` (nouveau) - `src/Heimdall.Application/AgentLogs/Queries/GetAgentLogsQuery.cs` (nouveau) - `src/Heimdall.Web/Controllers/AgentsController.cs` - Migration : `src/Heimdall.Infrastructure/Migrations/`
Author
Owner

Clôturé par le commit 6c5d455 (feat logs agents). Tests : 985 verts (Domain 131, Application 354, Infrastructure 163, Agent 120, Web 217).

Clôturé par le commit 6c5d455 (feat logs agents). Tests : 985 verts (Domain 131, Application 354, Infrastructure 163, Agent 120, Web 217).
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#51
No description provided.