初始化提交
This commit is contained in:
103
mengyamonitor-backend/collector.go
Normal file
103
mengyamonitor-backend/collector.go
Normal file
@@ -0,0 +1,103 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user