diff options
Diffstat (limited to 'internal/monitor/scheduler.go')
| -rw-r--r-- | internal/monitor/scheduler.go | 53 |
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() |