| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- package sessdata
- import (
- "encoding/json"
- "time"
- "github.com/bjdgyc/anylink/dbdata"
- "github.com/shirou/gopsutil/cpu"
- "github.com/shirou/gopsutil/mem"
- )
- const (
- StatsCycleSec = 10 // 统计周期(秒)
- AddCycleSec = 60 // 记录到数据表周期(秒)
- )
- func saveStatsInfo() {
- go func() {
- tick := time.NewTicker(time.Second * StatsCycleSec)
- count := 0
- for range tick.C {
- up := uint32(0)
- down := uint32(0)
- upGroups := make(map[int]uint32)
- downGroups := make(map[int]uint32)
- numGroups := make(map[int]int)
- onlineNum := 0
- sessMux.Lock()
- for _, v := range sessions {
- v.mux.Lock()
- if v.IsActive {
- // 在线人数
- onlineNum += 1
- numGroups[v.CSess.Group.Id] += 1
- // 网络吞吐
- userUp := v.CSess.BandwidthUpPeriod.Load()
- userDown := v.CSess.BandwidthDownPeriod.Load()
- if userUp > 0 {
- upGroups[v.CSess.Group.Id] += userUp
- }
- if userDown > 0 {
- downGroups[v.CSess.Group.Id] += userDown
- }
- up += userUp
- down += userDown
- }
- v.mux.Unlock()
- }
- sessMux.Unlock()
- tNow := time.Now()
- // online
- numData, _ := json.Marshal(numGroups)
- so := dbdata.StatsOnline{Num: onlineNum, NumGroups: string(numData), CreatedAt: tNow}
- // network
- upData, _ := json.Marshal(upGroups)
- downData, _ := json.Marshal(downGroups)
- sn := dbdata.StatsNetwork{Up: up, Down: down, UpGroups: string(upData), DownGroups: string(downData), CreatedAt: tNow}
- // cpu
- sc := dbdata.StatsCpu{Percent: getCpuPercent(), CreatedAt: tNow}
- // mem
- sm := dbdata.StatsMem{Percent: getMemPercent(), CreatedAt: tNow}
- count++
- // 是否保存至数据库
- save := count*StatsCycleSec >= AddCycleSec
- // 历史数据
- if save {
- count = 0
- }
- // 设置统计数据
- setStatsData(save, so, sn, sc, sm)
- }
- }()
- }
- func setStatsData(save bool, so dbdata.StatsOnline, sn dbdata.StatsNetwork, sc dbdata.StatsCpu, sm dbdata.StatsMem) {
- // 实时数据
- dbdata.StatsInfoIns.SetRealTime("online", so)
- dbdata.StatsInfoIns.SetRealTime("network", sn)
- dbdata.StatsInfoIns.SetRealTime("cpu", sc)
- dbdata.StatsInfoIns.SetRealTime("mem", sm)
- if !save {
- return
- }
- dbdata.StatsInfoIns.SaveStatsInfo(so, sn, sc, sm)
- }
- func getCpuPercent() float64 {
- cpuUsedPercent, _ := cpu.Percent(0, false)
- percent := cpuUsedPercent[0]
- if percent == 0 {
- percent = 1
- }
- return decimal(percent)
- }
- func getMemPercent() float64 {
- m, _ := mem.VirtualMemory()
- return decimal(m.UsedPercent)
- }
- func decimal(f float64) float64 {
- i := int(f * 100)
- return float64(i) / 100
- }
|