memory source

This commit is contained in:
Robin Appelman 2023-05-03 22:09:36 +02:00
commit 822e0feee5
2 changed files with 39 additions and 21 deletions

View file

@ -50,6 +50,7 @@ pub struct Sensors {
cpu: Mutex<CpuTimeSource>, cpu: Mutex<CpuTimeSource>,
temp: Mutex<TemperatureSource>, temp: Mutex<TemperatureSource>,
net: Mutex<NetworkSource>, net: Mutex<NetworkSource>,
mem: Mutex<MemorySource>,
} }
impl Sensors { impl Sensors {
@ -59,6 +60,7 @@ impl Sensors {
cpu: Mutex::new(CpuTimeSource::new()?), cpu: Mutex::new(CpuTimeSource::new()?),
temp: Mutex::new(TemperatureSource::new()?), temp: Mutex::new(TemperatureSource::new()?),
net: Mutex::new(NetworkSource::new()?), net: Mutex::new(NetworkSource::new()?),
mem: Mutex::new(MemorySource::new()?),
}) })
} }
} }
@ -68,7 +70,7 @@ pub fn get_metrics(sensors: &Sensors) -> Result<String> {
let disk_usage = disk_usage()?; let disk_usage = disk_usage()?;
let disks = disk_stats()?; let disks = disk_stats()?;
let cpu = sensors.cpu.lock().unwrap().read()?; let cpu = sensors.cpu.lock().unwrap().read()?;
let memory = memory()?; let memory = sensors.mem.lock().unwrap().read()?;
let temperatures = sensors.temp.lock().unwrap().read()?; let temperatures = sensors.temp.lock().unwrap().read()?;
let mut net = sensors.net.lock().unwrap(); let mut net = sensors.net.lock().unwrap();
let networks = net.read()?; let networks = net.read()?;

View file

@ -125,29 +125,45 @@ impl SensorSource for TemperatureSource {
} }
} }
pub fn memory() -> Result<Memory> { pub struct MemorySource {
let mut meminfo = BufReader::new(File::open("/proc/meminfo")?); source: File,
let mut mem = Memory::default(); buff: String,
let mut line = String::new(); }
loop {
line.clear(); impl MemorySource {
meminfo.read_line(&mut line)?; pub fn new() -> Result<MemorySource> {
if line.is_empty() { Ok(MemorySource {
break; source: File::open("/proc/meminfo")?,
} buff: String::new(),
if let Some(line) = line.strip_suffix(" kB\n") { })
if let Some(line_total) = line.strip_prefix("MemTotal: ") { }
mem.total = line_total.trim().parse::<u64>()? * 1000; }
}
if let Some(line_free) = line.strip_prefix("MemFree: ") { impl SensorSource for MemorySource {
mem.free = line_free.trim().parse::<u64>()? * 1000; type Data = Memory;
}
if let Some(line_available) = line.strip_prefix("MemAvailable: ") { fn read(&mut self) -> Result<Self::Data> {
mem.available = line_available.trim().parse::<u64>()? * 1000; self.buff.clear();
self.source.rewind()?;
self.source.read_to_string(&mut self.buff)?;
let mut mem = Memory::default();
for line in self.buff.lines() {
if let Some(line) = line.strip_suffix(" kB") {
if let Some(line_total) = line.strip_prefix("MemTotal: ") {
mem.total = line_total.trim().parse::<u64>()? * 1000;
}
if let Some(line_free) = line.strip_prefix("MemFree: ") {
mem.free = line_free.trim().parse::<u64>()? * 1000;
}
if let Some(line_available) = line.strip_prefix("MemAvailable: ") {
mem.available = line_available.trim().parse::<u64>()? * 1000;
}
} }
} }
Ok(mem)
} }
Ok(mem)
} }
pub struct CpuTime(f32); pub struct CpuTime(f32);