Files
mengyamonitor/mengyamonitor-backend/collector.go
2025-12-14 15:25:31 +08:00

104 lines
2.0 KiB
Go

package main
import (
"bufio"
"os"
"runtime"
"strconv"
"strings"
"time"
)
// CollectMetrics 收集所有系统监控指标
func CollectMetrics() (*Metrics, error) {
hostname, _ := os.Hostname()
cpuModel := firstMatchInFile("/proc/cpuinfo", "model name")
cpuUsage, err := readCPUUsage()
if err != nil {
return nil, err
}
cpuTemp := readCPUTemperature()
perCoreUsage := readPerCoreUsage()
mem, err := readMemory()
if err != nil {
return nil, err
}
storage, err := readAllStorage()
if err != nil {
return nil, err
}
gpu := readGPU()
network := readNetworkInterfaces()
systemStats := readSystemStats()
systemStats.DockerStats = readDockerStats()
osInfo := readOSInfo()
uptime := readUptime()
loads := readLoadAverages()
return &Metrics{
Hostname: hostname,
Timestamp: time.Now().UTC(),
CPU: CPUMetrics{
Model: cpuModel,
Cores: runtime.NumCPU(),
UsagePercent: round(cpuUsage, 2),
LoadAverages: loads,
Temperature: cpuTemp,
PerCoreUsage: perCoreUsage,
},
Memory: mem,
Storage: storage,
GPU: gpu,
Network: network,
System: systemStats,
OS: osInfo,
UptimeSeconds: uptime,
}, nil
}
func readOSInfo() OSInfo {
distro := readOSRelease()
kernel := strings.TrimSpace(readFirstLine("/proc/version"))
arch := runtime.GOARCH
return OSInfo{
Kernel: kernel,
Distro: distro,
Architecture: arch,
}
}
func readOSRelease() string {
f, err := os.Open("/etc/os-release")
if err != nil {
return runtime.GOOS
}
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, "PRETTY_NAME=") {
return strings.Trim(line[len("PRETTY_NAME="):], "\"")
}
}
return runtime.GOOS
}
func readUptime() float64 {
line := readFirstLine("/proc/uptime")
fields := strings.Fields(line)
if len(fields) == 0 {
return 0
}
v, err := strconv.ParseFloat(fields[0], 64)
if err != nil {
return 0
}
return v
}