LicenseManger/internal/service/monitor.go

367 lines
5.2 KiB
Go
Raw Permalink Normal View History

2024-11-14 14:55:43 +00:00
package service
import (
"licserver/internal/model"
"runtime"
"time"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/host"
"github.com/shirou/gopsutil/v3/mem"
"github.com/shirou/gopsutil/v3/net"
"github.com/shirou/gopsutil/v3/process"
"gorm.io/gorm"
)
type MonitorService struct {
db *gorm.DB
startTime time.Time
}
func NewMonitorService(db *gorm.DB) *MonitorService {
return &MonitorService{
db: db,
startTime: time.Now(),
}
}
func (s *MonitorService) GetSystemStatus() (*model.SystemStatus, error) {
status := &model.SystemStatus{}
// CPU信息
if err := s.getCPUInfo(status); err != nil {
return nil, err
}
// 内存信息
if err := s.getMemoryInfo(status); err != nil {
return nil, err
}
// 磁盘信息
if err := s.getDiskInfo(status); err != nil {
return nil, err
}
// 网络信息
if err := s.getNetworkInfo(status); err != nil {
return nil, err
}
// 进程信息
if err := s.getProcessInfo(status); err != nil {
return nil, err
}
// 主机信息
if err := s.getHostInfo(status); err != nil {
return nil, err
}
// 系统信息
s.getSystemInfo(status)
return status, nil
}
func (s *MonitorService) getCPUInfo(status *model.SystemStatus) error {
cpuPercent, err := cpu.Percent(time.Second, false)
if err != nil {
return err
}
// Windows 系统不支持 LoadAvg设置为默认值
status.CPU.LoadAvg = []float64{0, 0, 0}
cpuInfo, err := cpu.Info()
if err != nil {
return err
}
status.CPU.Usage = cpuPercent[0]
status.CPU.CoreCount = runtime.NumCPU()
if len(cpuInfo) > 0 {
status.CPU.ModelName = cpuInfo[0].ModelName
status.CPU.MHz = cpuInfo[0].Mhz
}
return nil
}
func (s *MonitorService) getMemoryInfo(status *model.SystemStatus) error {
memInfo, err := mem.VirtualMemory()
if err != nil {
return err
}
swapInfo, err := mem.SwapMemory()
if err != nil {
return err
}
status.Memory.Total = memInfo.Total
status.Memory.Used = memInfo.Used
status.Memory.Free = memInfo.Free
status.Memory.UsageRate = memInfo.UsedPercent
status.Memory.SwapTotal = swapInfo.Total
status.Memory.SwapUsed = swapInfo.Used
status.Memory.SwapFree = swapInfo.Free
status.Memory.SwapUsageRate = swapInfo.UsedPercent
return nil
}
func (s *MonitorService) getDiskInfo(status *model.SystemStatus) error {
partitions, err := disk.Partitions(true)
if err != nil {
return err
}
status.Disk.Partitions = make([]model.DiskPartition, 0)
for _, partition := range partitions {
usage, err := disk.Usage(partition.Mountpoint)
if err != nil {
continue
}
status.Disk.Partitions = append(status.Disk.Partitions, model.DiskPartition{
2024-11-14 15:32:08 +00:00
Device: partition.Device,
2024-11-14 14:55:43 +00:00
Mountpoint: partition.Mountpoint,
2024-11-14 15:32:08 +00:00
Fstype: partition.Fstype,
Total: usage.Total,
Used: usage.Used,
Free: usage.Free,
UsageRate: usage.UsedPercent,
2024-11-14 14:55:43 +00:00
})
}
return nil
}
func (s *MonitorService) getNetworkInfo(status *model.SystemStatus) error {
interfaces, err := net.Interfaces()
if err != nil {
return err
}
ioCounters, err := net.IOCounters(true)
if err != nil {
return err
}
status.Network.Interfaces = make([]model.NetworkInterface, 0)
for _, iface := range interfaces {
var counter net.IOCountersStat
for _, io := range ioCounters {
if io.Name == iface.Name {
counter = io
break
}
}
// 获取接口的地址列表
addrs := make([]string, 0)
for _, addr := range iface.Addrs {
addrs = append(addrs, addr.String())
}
status.Network.Interfaces = append(status.Network.Interfaces, model.NetworkInterface{
Name: iface.Name,
BytesSent: counter.BytesSent,
BytesRecv: counter.BytesRecv,
PacketsSent: counter.PacketsSent,
PacketsRecv: counter.PacketsRecv,
Addrs: addrs,
})
}
return nil
}
func (s *MonitorService) getProcessInfo(status *model.SystemStatus) error {
processes, err := process.Processes()
if err != nil {
return err
}
status.Process.Total = len(processes)
status.Process.List = make([]model.ProcessInfo, 0)
for i := 0; i < 10 && i < len(processes); i++ {
p := processes[i]
name, _ := p.Name()
cpu, _ := p.CPUPercent()
mem, _ := p.MemoryPercent()
created, _ := p.CreateTime()
status.Process.List = append(status.Process.List, model.ProcessInfo{
PID: int(p.Pid),
Name: name,
CPU: cpu,
Memory: float64(mem),
Created: created,
})
}
return nil
}
func (s *MonitorService) getHostInfo(status *model.SystemStatus) error {
info, err := host.Info()
if err != nil {
return err
}
status.Host.Hostname = info.Hostname
status.Host.OS = info.OS
status.Host.Platform = info.Platform
status.Host.PlatformVersion = info.PlatformVersion
status.Host.KernelVersion = info.KernelVersion
status.Host.BootTime = time.Unix(int64(info.BootTime), 0)
return nil
}
func (s *MonitorService) getSystemInfo(status *model.SystemStatus) {
status.System.Uptime = time.Since(s.startTime)
status.System.CurrentTime = time.Now()
var activeUsers int64
s.db.Model(&model.User{}).Count(&activeUsers)
status.System.ActiveUsers = int(activeUsers)
var totalDevices int64
s.db.Model(&model.Device{}).Count(&totalDevices)
status.System.TotalDevices = int(totalDevices)
}