package agent import "sync" // FailureTracker — скользящее окно для расчёта call_failure_rate. // Хранит последние N результатов звонков (success/failure), // вычисляет процент неудачных звонков в реальном времени. type FailureTracker struct { mu sync.Mutex window []bool // true=success, false=failure position int // позиция следующей записи size int // текущий размер окна capacity int // максимальный размер окна } // NewFailureTracker создаёт трекер с окном заданного размера. func NewFailureTracker(capacity int) *FailureTracker { return &FailureTracker{ window: make([]bool, capacity), capacity: capacity, } } // Record записывает результат звонка (true=success, false=failure). func (ft *FailureTracker) Record(success bool) { ft.mu.Lock() defer ft.mu.Unlock() ft.window[ft.position] = success ft.position = (ft.position + 1) % ft.capacity if ft.size < ft.capacity { ft.size++ } } // Rate возвращает процент неудачных звонков (0.0..100.0). func (ft *FailureTracker) Rate() float64 { ft.mu.Lock() defer ft.mu.Unlock() if ft.size == 0 { return 0 } failures := 0 for i := 0; i < ft.size; i++ { if !ft.window[i] { failures++ } } return float64(failures) / float64(ft.size) * 100.0 }