1.9 KiB
1.9 KiB
Hybrid Heartbeat Implementation
Status: Partially Implemented (Simplification Needed)
Problem: Heartbeat mode bypasses regular check-in flow, preventing scheduled scans from running.
Current State:
- Agent in heartbeat mode (every 5 seconds)
- Scheduler loads 0 jobs (because it processes jobs during regular check-ins)
- 4 subsystems configured: enabled=true, auto_run=true, interval=5 minutes
- Jobs are 14+ minutes overdue but not being created
Root Cause: Heartbeat endpoint only updates status, doesn't trigger command creation like regular check-ins.
Changes Made:
- Added scheduler field to AgentHandler struct
- Added scheduler import to agents.go
- Updated NewAgentHandler to accept scheduler parameter
- Added checkAndCreateScheduledCommands() method
- Added createSubsystemCommand() method
- Modified GetCommands to call scheduled commands during heartbeat
- Updated main.go to pass scheduler to AgentHandler
Build Issues:
- Handler initialization order conflicts (agentHandler used before scheduler created)
- Over-engineered implementation violates "less is more" principle
Next Steps: Simplify to use existing GetDueSubsystems() method directly without passing scheduler around.
Key Files Modified:
/aggregator-server/internal/api/handlers/agents.go/aggregator-server/cmd/server/main.go
Logging Format:
[Heartbeat] Created X scheduled commands for agent UUID
[Heartbeat] Failed to create command for subsystem: error
[Heartbeat] Failed to update next run time: error
Design Principles:
- Reuses existing safeguards (backpressure, rate limiting, idempotency)
- Only triggers during heartbeat mode (rapid polling enabled)
- Errors logged but don't fail requests (enhancement, not core functionality)
Implementation follows DEVELOPMENT_ETHOS.md principles - errors logged, security maintained, resilient design.