You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.0 KiB
79 lines
2.0 KiB
package core
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"fmt"
|
|
"scagnet/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/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
|
|
}
|
|
// 磁盘空间占用
|
|
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
|
|
|
|
}
|
|
// 获取系统进程信息 (只获取前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
|
|
}
|
|
|