| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- 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++
- }
|