statsinfo.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package sessdata
  2. import (
  3. "encoding/json"
  4. "time"
  5. "github.com/bjdgyc/anylink/dbdata"
  6. "github.com/shirou/gopsutil/cpu"
  7. "github.com/shirou/gopsutil/mem"
  8. )
  9. const (
  10. StatsCycleSec = 10 // 统计周期(秒)
  11. AddCycleSec = 60 // 记录到数据表周期(秒)
  12. )
  13. func saveStatsInfo() {
  14. go func() {
  15. tick := time.NewTicker(time.Second * StatsCycleSec)
  16. count := 0
  17. for range tick.C {
  18. up := uint32(0)
  19. down := uint32(0)
  20. upGroups := make(map[int]uint32)
  21. downGroups := make(map[int]uint32)
  22. numGroups := make(map[int]int)
  23. onlineNum := 0
  24. sessMux.Lock()
  25. for _, v := range sessions {
  26. v.mux.Lock()
  27. if v.IsActive {
  28. // 在线人数
  29. onlineNum += 1
  30. numGroups[v.CSess.Group.Id] += 1
  31. // 网络吞吐
  32. userUp := v.CSess.BandwidthUpPeriod.Load()
  33. userDown := v.CSess.BandwidthDownPeriod.Load()
  34. if userUp > 0 {
  35. upGroups[v.CSess.Group.Id] += userUp
  36. }
  37. if userDown > 0 {
  38. downGroups[v.CSess.Group.Id] += userDown
  39. }
  40. up += userUp
  41. down += userDown
  42. }
  43. v.mux.Unlock()
  44. }
  45. sessMux.Unlock()
  46. tNow := time.Now()
  47. // online
  48. numData, _ := json.Marshal(numGroups)
  49. so := dbdata.StatsOnline{Num: onlineNum, NumGroups: string(numData), CreatedAt: tNow}
  50. // network
  51. upData, _ := json.Marshal(upGroups)
  52. downData, _ := json.Marshal(downGroups)
  53. sn := dbdata.StatsNetwork{Up: up, Down: down, UpGroups: string(upData), DownGroups: string(downData), CreatedAt: tNow}
  54. // cpu
  55. sc := dbdata.StatsCpu{Percent: getCpuPercent(), CreatedAt: tNow}
  56. // mem
  57. sm := dbdata.StatsMem{Percent: getMemPercent(), CreatedAt: tNow}
  58. count++
  59. // 是否保存至数据库
  60. save := count*StatsCycleSec >= AddCycleSec
  61. // 历史数据
  62. if save {
  63. count = 0
  64. }
  65. // 设置统计数据
  66. setStatsData(save, so, sn, sc, sm)
  67. }
  68. }()
  69. }
  70. func setStatsData(save bool, so dbdata.StatsOnline, sn dbdata.StatsNetwork, sc dbdata.StatsCpu, sm dbdata.StatsMem) {
  71. // 实时数据
  72. dbdata.StatsInfoIns.SetRealTime("online", so)
  73. dbdata.StatsInfoIns.SetRealTime("network", sn)
  74. dbdata.StatsInfoIns.SetRealTime("cpu", sc)
  75. dbdata.StatsInfoIns.SetRealTime("mem", sm)
  76. if !save {
  77. return
  78. }
  79. dbdata.StatsInfoIns.SaveStatsInfo(so, sn, sc, sm)
  80. }
  81. func getCpuPercent() float64 {
  82. cpuUsedPercent, _ := cpu.Percent(0, false)
  83. percent := cpuUsedPercent[0]
  84. if percent == 0 {
  85. percent = 1
  86. }
  87. return decimal(percent)
  88. }
  89. func getMemPercent() float64 {
  90. m, _ := mem.VirtualMemory()
  91. return decimal(m.UsedPercent)
  92. }
  93. func decimal(f float64) float64 {
  94. i := int(f * 100)
  95. return float64(i) / 100
  96. }