mirror of https://github.com/bjdgyc/anylink.git
107 lines
2.6 KiB
Go
107 lines
2.6 KiB
Go
package sessdata
|
|
|
|
import (
|
|
"encoding/json"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"github.com/bjdgyc/anylink/dbdata"
|
|
"github.com/shirou/gopsutil/cpu"
|
|
"github.com/shirou/gopsutil/mem"
|
|
)
|
|
|
|
const (
|
|
StatsCycleSec = 5 // 统计周期(秒)
|
|
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 := atomic.LoadUint32(&v.CSess.BandwidthUpPeriod)
|
|
userDown := atomic.LoadUint32(&v.CSess.BandwidthDownPeriod)
|
|
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
|
|
}
|