64 lines
1.1 KiB
Go
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
|
|
}
|