82 lines
1.6 KiB
Go
82 lines
1.6 KiB
Go
package common
|
|
|
|
import (
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"github.com/shirou/gopsutil/cpu"
|
|
"github.com/shirou/gopsutil/mem"
|
|
)
|
|
|
|
// DiskSpaceInfo 磁盘空间信息
|
|
type DiskSpaceInfo struct {
|
|
// 总空间(字节)
|
|
Total uint64 `json:"total"`
|
|
// 可用空间(字节)
|
|
Free uint64 `json:"free"`
|
|
// 已用空间(字节)
|
|
Used uint64 `json:"used"`
|
|
// 使用百分比
|
|
UsedPercent float64 `json:"used_percent"`
|
|
}
|
|
|
|
// SystemStatus 系统状态信息
|
|
type SystemStatus struct {
|
|
CPUUsage float64
|
|
MemoryUsage float64
|
|
DiskUsage float64
|
|
}
|
|
|
|
var latestSystemStatus atomic.Value
|
|
|
|
func init() {
|
|
latestSystemStatus.Store(SystemStatus{})
|
|
}
|
|
|
|
// StartSystemMonitor 启动系统监控
|
|
func StartSystemMonitor() {
|
|
go func() {
|
|
for {
|
|
config := GetPerformanceMonitorConfig()
|
|
if !config.Enabled {
|
|
time.Sleep(30 * time.Second)
|
|
continue
|
|
}
|
|
|
|
updateSystemStatus()
|
|
time.Sleep(5 * time.Second)
|
|
}
|
|
}()
|
|
}
|
|
|
|
func updateSystemStatus() {
|
|
var status SystemStatus
|
|
|
|
// CPU
|
|
// 注意:cpu.Percent(0, false) 返回自上次调用以来的 CPU 使用率
|
|
// 如果是第一次调用,可能会返回错误或不准确的值,但在循环中会逐渐正常
|
|
percents, err := cpu.Percent(0, false)
|
|
if err == nil && len(percents) > 0 {
|
|
status.CPUUsage = percents[0]
|
|
}
|
|
|
|
// Memory
|
|
memInfo, err := mem.VirtualMemory()
|
|
if err == nil {
|
|
status.MemoryUsage = memInfo.UsedPercent
|
|
}
|
|
|
|
// Disk
|
|
diskInfo := GetDiskSpaceInfo()
|
|
if diskInfo.Total > 0 {
|
|
status.DiskUsage = diskInfo.UsedPercent
|
|
}
|
|
|
|
latestSystemStatus.Store(status)
|
|
}
|
|
|
|
// GetSystemStatus 获取当前系统状态
|
|
func GetSystemStatus() SystemStatus {
|
|
return latestSystemStatus.Load().(SystemStatus)
|
|
}
|