Files
fleetforge/agents/forge-agent/internal/metrics/metrics.go
T

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
}