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