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