dockerfiles/anylink/server/sessdata/statsinfo.go

106 lines
2.5 KiB
Go

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
}