mirror of
https://github.com/bjdgyc/anylink.git
synced 2025-08-07 20:23:03 +08:00
实现后台首页图表(用户在线数、网络吞量量、CPU、内存)
This commit is contained in:
@@ -3,4 +3,5 @@ package sessdata
|
||||
func Start() {
|
||||
initIpPool()
|
||||
checkSession()
|
||||
saveStatsInfo()
|
||||
}
|
||||
|
102
server/sessdata/statsinfo.go
Normal file
102
server/sessdata/statsinfo.go
Normal file
@@ -0,0 +1,102 @@
|
||||
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[string]uint32)
|
||||
downGroups := make(map[string]uint32)
|
||||
numGroups := make(map[string]int)
|
||||
onlineNum := 0
|
||||
sessMux.Lock()
|
||||
for _, v := range sessions {
|
||||
v.mux.Lock()
|
||||
if v.IsActive {
|
||||
// 在线人数
|
||||
onlineNum += 1
|
||||
numGroups[v.Group] += 1
|
||||
// 网络吞吐
|
||||
userUp := atomic.LoadUint32(&v.CSess.BandwidthUpPeriod)
|
||||
userDown := atomic.LoadUint32(&v.CSess.BandwidthDownPeriod)
|
||||
upGroups[v.Group] += userUp
|
||||
downGroups[v.Group] += 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
|
||||
}
|
Reference in New Issue
Block a user