hotgo/server/internal/logic/admin/monitor.go

93 lines
2.3 KiB
Go

package admin
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcron"
"github.com/gogf/gf/v2/os/gtime"
"github.com/shirou/gopsutil/v3/load"
"github.com/shirou/gopsutil/v3/net"
"hotgo/internal/library/location"
"hotgo/internal/model"
"hotgo/internal/service"
"hotgo/utility/format"
"hotgo/utility/simple"
"runtime"
"sync"
)
type sAdminMonitor struct {
data *model.MonitorData
sync.RWMutex
}
func NewAdminMonitor() *sAdminMonitor {
return &sAdminMonitor{
data: new(model.MonitorData),
}
}
func init() {
service.RegisterAdminMonitor(NewAdminMonitor())
}
// StartMonitor 启动服务监控
func (s *sAdminMonitor) StartMonitor(ctx context.Context) {
simple.SafeGo(ctx, func(ctx context.Context) {
s.data.STartTime = gtime.Now().Timestamp()
s.data.IntranetIP, _ = location.GetLocalIP()
s.data.PublicIP, _ = location.GetPublicIP(ctx)
_, err := gcron.Add(ctx, "@every 1s", func(ctx context.Context) {
s.Lock()
defer s.Unlock()
s.netIO()
s.loadAvg()
}, "AdminMonitorCronJob")
if err != nil {
g.Log().Warningf(ctx, "StartMonitor CronJob err:%+v", err)
}
})
}
// GetMeta 获取监控元数据
func (s *sAdminMonitor) GetMeta(ctx context.Context) *model.MonitorData {
return s.data
}
func (s *sAdminMonitor) loadAvg() {
pl, _ := load.Avg()
counter := model.LoadAvgStats{
Time: gtime.Now(),
Avg: pl.Load1,
Ratio: pl.Load1 / (float64(runtime.NumCPU()) * 2) * 100,
}
s.data.LoadAvg = append(s.data.LoadAvg, &counter)
if len(s.data.LoadAvg) > 10 {
s.data.LoadAvg = append(s.data.LoadAvg[:0], s.data.LoadAvg[(1):]...)
}
}
func (s *sAdminMonitor) netIO() {
var counter model.NetIOCounters
ni, _ := net.IOCounters(true)
counter.Time = gtime.Now()
for _, v := range ni {
counter.BytesSent += v.BytesSent
counter.BytesRecv += v.BytesRecv
}
if len(s.data.NetIO) > 0 {
lastNetIO := s.data.NetIO[len(s.data.NetIO)-1]
sub := counter.Time.Sub(lastNetIO.Time).Seconds()
counter.Down = format.Round2Float64((float64(counter.BytesRecv - lastNetIO.BytesRecv)) / sub)
counter.UP = format.Round2Float64((float64(counter.BytesSent - lastNetIO.BytesSent)) / sub)
}
s.data.NetIO = append(s.data.NetIO, &counter)
if len(s.data.NetIO) > 10 {
s.data.NetIO = append(s.data.NetIO[:0], s.data.NetIO[(1):]...)
}
}