104 lines
2.0 KiB
Go
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
|
|
}
|