72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
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
|
|
}
|