2026-01-18 19:21:16 +00:00
|
|
|
package agent
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"log"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"bugs.watch/agent/internal/aggregate"
|
|
|
|
|
"bugs.watch/agent/internal/collectors"
|
|
|
|
|
"bugs.watch/agent/internal/collectors/cpu"
|
|
|
|
|
"bugs.watch/agent/internal/collectors/disk"
|
|
|
|
|
"bugs.watch/agent/internal/collectors/memory"
|
|
|
|
|
"bugs.watch/agent/internal/collectors/uptime"
|
2026-06-15 17:29:53 +01:00
|
|
|
"bugs.watch/agent/internal/config"
|
|
|
|
|
"bugs.watch/agent/internal/dbmanager"
|
2026-01-18 19:21:16 +00:00
|
|
|
"bugs.watch/agent/internal/sender"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
sampleInterval = 5 * time.Second
|
|
|
|
|
windowDuration = 60 * time.Second
|
|
|
|
|
)
|
|
|
|
|
|
2026-06-15 17:29:53 +01:00
|
|
|
func Run(ctx context.Context, cfg config.Config) {
|
2026-01-18 19:21:16 +00:00
|
|
|
log.Println("bugswatch agent starting")
|
2026-06-15 17:29:53 +01:00
|
|
|
log.Printf("db config: %s", cfg.DBConfigPath)
|
2026-01-18 19:21:16 +00:00
|
|
|
|
|
|
|
|
window := aggregate.NewWindow()
|
|
|
|
|
|
|
|
|
|
cols := []collectors.Collector{
|
|
|
|
|
uptime.New(),
|
|
|
|
|
cpu.New(),
|
|
|
|
|
memory.New(),
|
|
|
|
|
disk.New(),
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-15 17:29:53 +01:00
|
|
|
mgr := dbmanager.New(cfg.DBConfigPath)
|
|
|
|
|
go mgr.Watch(ctx)
|
|
|
|
|
|
|
|
|
|
snd := sender.NewHTTPSender(cfg)
|
2026-01-18 19:21:16 +00:00
|
|
|
|
|
|
|
|
ticker := time.NewTicker(sampleInterval)
|
|
|
|
|
defer ticker.Stop()
|
|
|
|
|
|
|
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
log.Println("bugswatch agent shutting down")
|
|
|
|
|
shutdownCtx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
|
|
|
|
defer cancel()
|
2026-06-15 17:29:53 +01:00
|
|
|
emitSnapshot(shutdownCtx, snd, window, mgr)
|
2026-01-18 19:21:16 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
|
|
case <-ticker.C:
|
|
|
|
|
for _, c := range cols {
|
|
|
|
|
c.Collect(window)
|
|
|
|
|
}
|
2026-06-15 17:29:53 +01:00
|
|
|
mgr.Collect(window)
|
2026-01-18 19:21:16 +00:00
|
|
|
|
|
|
|
|
if window.Ready(windowDuration) {
|
2026-06-15 17:29:53 +01:00
|
|
|
emitSnapshot(ctx, snd, window, mgr)
|
2026-01-18 19:21:16 +00:00
|
|
|
window = aggregate.NewWindow()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func emitSnapshot(
|
|
|
|
|
ctx context.Context,
|
|
|
|
|
snd sender.Sender,
|
|
|
|
|
window *aggregate.Window,
|
2026-06-15 17:29:53 +01:00
|
|
|
mgr *dbmanager.Manager,
|
2026-01-18 19:21:16 +00:00
|
|
|
) {
|
|
|
|
|
snap := window.Snapshot()
|
|
|
|
|
_ = snd.Send(ctx, snap)
|
|
|
|
|
}
|