- pulse-lets-go-agent: collects metrics from PBX nodes via ESL (FreeSWITCH) or AMI (Asterisk) - AMI client (raw TCP) for Asterisk Manager Interface - Collector interface: collect, connect, subscribe hangup events, close - FreeSWITCH collector: show channels, max_sessions, idle_cpu - Asterisk collector: CoreShowChannels, CoreSettings - System collector: /proc/loadavg, /proc/stat (CPU idle) - Failure tracker: sliding window for call_failure_rate - NATS publisher: pulse.metrics.<node_id> every 5 seconds - Graceful shutdown, retry logic (5 failures → status=down) - Template configs for UC nodes (Asterisk) and ses-sip (FreeSWITCH)
53 lines
1.5 KiB
Go
53 lines
1.5 KiB
Go
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
|
||
}
|