package logger import ( "sync" "time" ) // Monitor — watchdog потока данных: PipeReader отмечает каждую запись через // RecordWrite, фоновый цикл сравнивает длительность тишины с порогами и пишет // события ТИШИНА_5МИН/ТИШИНА_10МИН. type Monitor struct { eventLogger *EventLogger lastWrite time.Time mu sync.RWMutex silence5Min time.Duration silence10Min time.Duration watchdogInterval time.Duration } // NewMonitor создаёт watchdog с порогами из config и сразу запускает фоновый цикл. func NewMonitor(eventLogger *EventLogger, config *Config) *Monitor { m := &Monitor{ eventLogger: eventLogger, lastWrite: time.Now(), silence5Min: config.Silence5Min, silence10Min: config.Silence10Min, watchdogInterval: config.WatchdogIntervalMin, } go m.watchdogLoop() return m } // SetSilenceThresholds позволяет изменить пороги тишины после создания func (m *Monitor) SetSilenceThresholds(silence5Min, silence10Min time.Duration) { m.mu.Lock() defer m.mu.Unlock() m.silence5Min = silence5Min m.silence10Min = silence10Min } // RecordWrite отмечает факт приёма данных (сбрасывает отсчёт тишины). func (m *Monitor) RecordWrite() { m.mu.Lock() m.lastWrite = time.Now() m.mu.Unlock() } func (m *Monitor) watchdogLoop() { ticker := time.NewTicker(m.watchdogInterval) defer ticker.Stop() for range ticker.C { m.mu.RLock() silence := time.Since(m.lastWrite) silence5Min := m.silence5Min silence10Min := m.silence10Min m.mu.RUnlock() if silence > silence10Min { m.eventLogger.Event("ТИШИНА_10МИН") } else if silence > silence5Min { m.eventLogger.Event("ТИШИНА_5МИН") } } }