Files
finally-a-monolithic-linux-…/app/mem/drivers/meminfo.go
T
2026-08-06 11:58:34 -07:00

64 lines
1.1 KiB
Go

package drivers
import (
"bufio"
"os"
"strconv"
"strings"
)
type MemInfoDriver struct{}
func NewMemInfoDriver() *MemInfoDriver {
return &MemInfoDriver{}
}
// Read /proc/meminfo for active system memory statistics
func (r *MemInfoDriver) ReadUsageSensors() (MemoryUsage, error) {
usage := MemoryUsage{}
file, err := os.Open("/proc/meminfo")
if err != nil {
return usage, err
}
defer file.Close()
var memTotal, memAvailable float64
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
fields := strings.Fields(line)
if len(fields) < 2 {
continue
}
val, err := strconv.ParseFloat(fields[1], 64)
if err != nil {
continue
}
switch fields[0] {
case "MemTotal:":
memTotal = val // stored in kB
case "MemAvailable:":
memAvailable = val // stored in kB
}
}
if err := scanner.Err(); err != nil {
return usage, err
}
used := memTotal - memAvailable
usedPct := (used / memTotal) * 100
usage = MemoryUsage{
TotalGB: memTotal / (1024 * 1024),
AvailableGB: memAvailable / (1024 * 1024),
UsedGB: used / (1024 * 1024),
UsedPercent: usedPct,
}
return usage, nil
}