8f16a09da1
Split monitor.go (1131→350 lines) into alerts.go, checks.go, sites.go, and maintenance.go by concern. Split sqlstore.go (833→470 lines) into sqlstore_alerts.go, sqlstore_history.go, and sqlstore_maintenance.go by domain. Tests move with their implementation. Pure reorganization — no behavioral changes.
71 lines
1.4 KiB
Go
71 lines
1.4 KiB
Go
package monitor
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
func (e *Engine) maintenancePruner(ctx context.Context) {
|
|
ticker := time.NewTicker(maintPruneInterval)
|
|
defer ticker.Stop()
|
|
|
|
e.pruneMaintenanceWindows(ctx)
|
|
|
|
for {
|
|
select {
|
|
case <-ticker.C:
|
|
e.pruneMaintenanceWindows(ctx)
|
|
case <-ctx.Done():
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (e *Engine) pruneMaintenanceWindows(ctx context.Context) {
|
|
pruned, err := e.db.PruneExpiredMaintenanceWindows(ctx, e.maintRetention)
|
|
if err != nil {
|
|
e.AddLog(fmt.Sprintf("Maintenance prune error: %v", err))
|
|
return
|
|
}
|
|
if pruned > 0 {
|
|
e.AddLog(fmt.Sprintf("Pruned %d expired maintenance window(s)", pruned))
|
|
}
|
|
}
|
|
|
|
func (e *Engine) isInMaintenance(monitorID int) bool {
|
|
e.maintCacheMu.RLock()
|
|
defer e.maintCacheMu.RUnlock()
|
|
return e.maintCache[monitorID]
|
|
}
|
|
|
|
func (e *Engine) refreshMaintenanceCache(ctx context.Context) {
|
|
windows, err := e.db.GetActiveMaintenanceWindows(ctx)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
directMaint := make(map[int]bool)
|
|
var globalMaint bool
|
|
for _, w := range windows {
|
|
if w.MonitorID == 0 {
|
|
globalMaint = true
|
|
} else {
|
|
directMaint[w.MonitorID] = true
|
|
}
|
|
}
|
|
|
|
resolved := make(map[int]bool)
|
|
e.mu.RLock()
|
|
for id, site := range e.liveState {
|
|
if globalMaint || directMaint[id] || (site.ParentID > 0 && directMaint[site.ParentID]) {
|
|
resolved[id] = true
|
|
}
|
|
}
|
|
e.mu.RUnlock()
|
|
|
|
e.maintCacheMu.Lock()
|
|
e.maintCache = resolved
|
|
e.maintCacheMu.Unlock()
|
|
}
|