aboutsummaryrefslogtreecommitdiff
path: root/internal/monitor/scheduler.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/monitor/scheduler.go')
-rw-r--r--internal/monitor/scheduler.go53
1 files changed, 42 insertions, 11 deletions
diff --git a/internal/monitor/scheduler.go b/internal/monitor/scheduler.go
index 5a7e817..1478732 100644
--- a/internal/monitor/scheduler.go
+++ b/internal/monitor/scheduler.go
@@ -12,23 +12,27 @@ import (
// Scheduler manages and runs all monitors
type Scheduler struct {
- monitors []Monitor
- storage *storage.Storage
- logger *slog.Logger
- wg sync.WaitGroup
- ctx context.Context
- cancel context.CancelFunc
+ monitors []Monitor
+ monitorCfg map[string]config.MonitorConfig // Monitor configs by name for reset flag checks
+ configPath string
+ storage *storage.Storage
+ logger *slog.Logger
+ wg sync.WaitGroup
+ ctx context.Context
+ cancel context.CancelFunc
}
// NewScheduler creates a new monitor scheduler
-func NewScheduler(cfg *config.Config, store *storage.Storage, logger *slog.Logger) (*Scheduler, error) {
+func NewScheduler(cfg *config.Config, store *storage.Storage, logger *slog.Logger, configPath string) (*Scheduler, error) {
ctx, cancel := context.WithCancel(context.Background())
s := &Scheduler{
- storage: store,
- logger: logger,
- ctx: ctx,
- cancel: cancel,
+ monitorCfg: make(map[string]config.MonitorConfig),
+ configPath: configPath,
+ storage: store,
+ logger: logger,
+ ctx: ctx,
+ cancel: cancel,
}
// Create monitors from configuration
@@ -40,6 +44,7 @@ func NewScheduler(cfg *config.Config, store *storage.Storage, logger *slog.Logge
return nil, err
}
s.monitors = append(s.monitors, mon)
+ s.monitorCfg[monCfg.Name] = monCfg // Store config for reset flag checks
logger.Info("registered monitor",
"name", mon.Name(),
"type", mon.Type(),
@@ -96,6 +101,32 @@ func (s *Scheduler) runMonitor(mon Monitor) {
// executeCheck performs a single check and saves the result
func (s *Scheduler) executeCheck(mon Monitor) {
+ // Check if reset flag is set for this monitor
+ if monCfg, exists := s.monitorCfg[mon.Name()]; exists && monCfg.ResetOnNextCheck {
+ s.logger.Info("resetting monitor data", "name", mon.Name())
+
+ // Delete all historical data for this monitor
+ if err := s.storage.ResetMonitorData(s.ctx, mon.Name()); err != nil {
+ s.logger.Error("failed to reset monitor data",
+ "name", mon.Name(),
+ "error", err)
+ } else {
+ s.logger.Info("monitor data reset complete", "name", mon.Name())
+
+ // Flip the reset flag to false in the config file
+ if err := config.UpdateResetFlag(s.configPath, mon.Name(), false); err != nil {
+ s.logger.Error("failed to update reset flag in config",
+ "name", mon.Name(),
+ "error", err)
+ } else {
+ // Update in-memory config
+ monCfg.ResetOnNextCheck = false
+ s.monitorCfg[mon.Name()] = monCfg
+ s.logger.Info("reset flag cleared in config", "name", mon.Name())
+ }
+ }
+ }
+
// Create a context with timeout for this check
checkCtx, cancel := context.WithTimeout(s.ctx, mon.Interval())
defer cancel()