netstat.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package netstat
  2. import (
  3. "log"
  4. "sync"
  5. "time"
  6. "wartank/pkg/types"
  7. )
  8. /*
  9. Сетевая статистика для сетевого соединения
  10. */
  11. // NetStat -- статистика сетевого соединения
  12. type NetStat struct {
  13. botNet types.ИБотСеть
  14. countByteInterval int // Счётчик байтов в текущем интервале
  15. totalByte int // Сколько всего байт передано
  16. totalMinut int // Сколько всего минут работала передача
  17. countRequestInterval int // Число запросов
  18. countErr int // Число зафиксированных ошибок
  19. chTick chan int // Сигналы времени 1 раз в 5 минут
  20. block sync.Mutex
  21. }
  22. // NewNetStat -- возвращает новый *NetStat
  23. func NewNetStat(botNet types.ИБотСеть) *NetStat {
  24. сам := &NetStat{
  25. botNet: botNet,
  26. chTick: make(chan int, 2),
  27. }
  28. go сам.run()
  29. go сам.makeTick()
  30. return сам
  31. }
  32. // Тикер меток времени 1 раз в 5 минут
  33. func (сам *NetStat) makeTick() {
  34. defer close(сам.chTick)
  35. for {
  36. select {
  37. case <-сам.botNet.Кнт().Done():
  38. return
  39. default:
  40. time.Sleep(time.Second * 5 * 60)
  41. сам.chTick <- 1
  42. }
  43. }
  44. }
  45. // Главный цикл работы статистики
  46. func (сам *NetStat) run() {
  47. fnCalc := func() {
  48. сам.block.Lock()
  49. defer сам.block.Unlock()
  50. сам.totalMinut += 5
  51. mbyte := float32(сам.totalByte) / float32(сам.totalMinut*60) * (3600 * 24 * 30.5) / (1024 * 1024)
  52. log.Printf("INFO NetStat.run().fnCalc(): запросы=%0.2f/сек\tтраф0=%0.2f бит/сек\tтраф1=%0.2f МБ/мес\tошибки=%v\n",
  53. float32(сам.countRequestInterval)/300,
  54. float32(сам.countByteInterval*8)/300,
  55. mbyte,
  56. сам.countErr)
  57. сам.countByteInterval = 0
  58. сам.countRequestInterval = 0
  59. }
  60. for range сам.chTick {
  61. select {
  62. case <-сам.botNet.Кнт().Done():
  63. return
  64. case <-сам.chTick:
  65. fnCalc()
  66. }
  67. }
  68. }
  69. // IncErr -- добавляет ошибку в статистику
  70. func (сам *NetStat) IncErr() {
  71. сам.block.Lock()
  72. defer сам.block.Unlock()
  73. сам.countErr++
  74. }
  75. // AddByte -- увеличивает счётчик запросов и байтов на передачу/приём
  76. func (сам *NetStat) AddByte(val int) {
  77. сам.block.Lock()
  78. defer сам.block.Unlock()
  79. сам.countByteInterval += val
  80. сам.totalByte += val
  81. сам.countRequestInterval++
  82. }