netstat.go 2.2 KB

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