62 lines
1.2 KiB
Go
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)
|
|
}
|
|
}
|