package metrics import ( "os" "runtime" "strconv" "strings" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/load" "github.com/shirou/gopsutil/v3/mem" "github.com/shirou/gopsutil/v3/host" ) type Snapshot struct { CPUPercent float64 MemoryPercent float64 MemoryUsed uint64 MemoryTotal uint64 DiskPercent float64 DiskUsed uint64 DiskTotal uint64 Load1 float64 Load5 float64 Load15 float64 UptimeSeconds uint64 } func Collect() (*Snapshot, error) { s := &Snapshot{} if percents, err := cpu.Percent(0, false); err == nil && len(percents) > 0 { s.CPUPercent = percents[0] } if v, err := mem.VirtualMemory(); err == nil { s.MemoryPercent = v.UsedPercent s.MemoryUsed = v.Used s.MemoryTotal = v.Total } if d, err := disk.Usage("/"); err == nil { s.DiskPercent = d.UsedPercent s.DiskUsed = d.Used s.DiskTotal = d.Total } if avg, err := load.Avg(); err == nil { s.Load1 = avg.Load1 s.Load5 = avg.Load5 s.Load15 = avg.Load15 } if up, err := host.Uptime(); err == nil { s.UptimeSeconds = up } if runtime.GOOS == "linux" { if data, err := os.ReadFile("/proc/loadavg"); err == nil { fields := strings.Fields(string(data)) if len(fields) >= 3 { s.Load1, _ = strconv.ParseFloat(fields[0], 64) s.Load5, _ = strconv.ParseFloat(fields[1], 64) s.Load15, _ = strconv.ParseFloat(fields[2], 64) } } } return s, nil }