package core import ( "encoding/base64" "fmt" "scagent/proto/pb" "scagent/util" "time" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/mem" "github.com/shirou/gopsutil/v3/net" "github.com/shirou/gopsutil/v3/process" "go.uber.org/zap" "google.golang.org/protobuf/proto" ) // 服务器状态检测 type SysMonitor struct{} // 服务器信息 func (f *SysMonitor) GetSysInfo(args *Args, replay *string) error { logger := util.NewProductionLogger() defer logger.Sync() // 磁盘容量信息 diskInfo, err := disk.Usage("/") if err != nil { logger.Error("获取磁盘信息失败", zap.Error(err)) return err } // 磁盘空间占用 hdtval := fmt.Sprintf("%.2f GB", float64(diskInfo.Total)/1024/1024/1024) hduval := fmt.Sprintf("%.2f GB", float64(diskInfo.Used)/1024/1024/1024) // 获取CPU占用率 (需要等待1秒来计算) cpuPercent, err := cpu.Percent(time.Second, false) if err != nil { logger.Error("获取CPU信息失败", zap.Error(err)) return err } cpuinfo := fmt.Sprintf(" %.2f%%", cpuPercent[0]) // 获取内存占用信息 memInfo, err := mem.VirtualMemory() if err != nil { logger.Error("获取内存信息失败", zap.Error(err)) return err } // 获取网络流量信息 netIO, err := net.IOCounters(false) if err != nil { logger.Error("获取网络信息失败", zap.Error(err)) return err } // 获取系统进程信息 (只获取前5个进程) processes, err := process.Processes() if err != nil { logger.Error("获取进程信息失败", zap.Error(err)) return err } // 统计运行中的进程数量 procnum := int32(len(processes)) //生成proto的内容 hdinfo, err := proto.Marshal(&pb.Hdinfo{ Hdstat: fmt.Sprintf("%v / %v", hduval, hdtval), Procout: fmt.Sprintf(" %d", procnum), Cpustat: cpuinfo, Memstat: fmt.Sprintf(" %.2f%%", memInfo.UsedPercent), Netstat: fmt.Sprintf(" %.2f MB", float64(netIO[0].BytesRecv)/1024/1024), }) if err != nil { logger.Error("生成proto内容失败", zap.Error(err)) return err } // ver:0821 // 输出proto encdata := base64.StdEncoding.EncodeToString(hdinfo) *replay = encdata // 服务器状态检测 return nil }