package netstat import ( "log" "sync" "time" "wartank/pkg/types" ) /* Сетевая статистика для сетевого соединения */ // NetStat -- статистика сетевого соединения type NetStat struct { botNet types.ИБотСеть countByteInterval int // Счётчик байтов в текущем интервале totalByte int // Сколько всего байт передано totalMinut int // Сколько всего минут работала передача countRequestInterval int // Число запросов countErr int // Число зафиксированных ошибок chTick chan int // Сигналы времени 1 раз в 5 минут block sync.Mutex } // NewNetStat -- возвращает новый *NetStat func NewNetStat(botNet types.ИБотСеть) *NetStat { сам := &NetStat{ botNet: botNet, chTick: make(chan int, 2), } go сам.run() go сам.makeTick() return сам } // Тикер меток времени 1 раз в 5 минут func (сам *NetStat) makeTick() { defer close(сам.chTick) for { select { case <-сам.botNet.Кнт().Done(): return default: time.Sleep(time.Second * 5 * 60) сам.chTick <- 1 } } } // Главный цикл работы статистики func (сам *NetStat) run() { fnCalc := func() { сам.block.Lock() defer сам.block.Unlock() сам.totalMinut += 5 mbyte := float32(сам.totalByte) / float32(сам.totalMinut*60) * (3600 * 24 * 30.5) / (1024 * 1024) log.Printf("INFO NetStat.run().fnCalc(): запросы=%0.2f/сек\tтраф0=%0.2f бит/сек\tтраф1=%0.2f МБ/мес\tошибки=%v\n", float32(сам.countRequestInterval)/300, float32(сам.countByteInterval*8)/300, mbyte, сам.countErr) сам.countByteInterval = 0 сам.countRequestInterval = 0 } for range сам.chTick { select { case <-сам.botNet.Кнт().Done(): return case <-сам.chTick: fnCalc() } } } // IncErr -- добавляет ошибку в статистику func (сам *NetStat) IncErr() { сам.block.Lock() defer сам.block.Unlock() сам.countErr++ } // AddByte -- увеличивает счётчик запросов и байтов на передачу/приём func (сам *NetStat) AddByte(val int) { сам.block.Lock() defer сам.block.Unlock() сам.countByteInterval += val сам.totalByte += val сам.countRequestInterval++ }