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 }