Files
tia-love/internal/sysinfo/sysinfo.go
T

62 lines
1.2 KiB
Go

// Package sysinfo — metrik host ringan untuk dashboard (F-027).
// Linux: baca /proc. OS lain: nilai nol (degrade anggun, tidak pernah panic).
package sysinfo
import (
"os"
"strconv"
"strings"
)
type Stats struct {
MemTotal uint64 // KB
MemAvail uint64 // KB
Load1 float64 // load average 1 menit
Uptime float64 // detik
}
func Read() Stats {
var s Stats
if b, err := os.ReadFile("/proc/meminfo"); err == nil {
parseMeminfo(string(b), &s)
}
if b, err := os.ReadFile("/proc/loadavg"); err == nil {
parseLoadavg(string(b), &s)
}
if b, err := os.ReadFile("/proc/uptime"); err == nil {
parseUptime(string(b), &s)
}
return s
}
func parseMeminfo(s string, st *Stats) {
for _, ln := range strings.Split(s, "\n") {
f := strings.Fields(ln)
if len(f) < 2 {
continue
}
v, err := strconv.ParseUint(f[1], 10, 64)
if err != nil {
continue
}
switch f[0] {
case "MemTotal:":
st.MemTotal = v
case "MemAvailable:":
st.MemAvail = v
}
}
}
func parseLoadavg(s string, st *Stats) {
if f := strings.Fields(s); len(f) > 0 {
st.Load1, _ = strconv.ParseFloat(f[0], 64)
}
}
func parseUptime(s string, st *Stats) {
if f := strings.Fields(s); len(f) > 0 {
st.Uptime, _ = strconv.ParseFloat(f[0], 64)
}
}