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,17 +125,31 @@ 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();
meminfo.read_line(&mut line)?;
if line.is_empty() {
break;
} }
if let Some(line) = line.strip_suffix(" kB\n") {
impl MemorySource {
pub fn new() -> Result<MemorySource> {
Ok(MemorySource {
source: File::open("/proc/meminfo")?,
buff: String::new(),
})
}
}
impl SensorSource for MemorySource {
type Data = Memory;
fn read(&mut self) -> Result<Self::Data> {
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: ") { if let Some(line_total) = line.strip_prefix("MemTotal: ") {
mem.total = line_total.trim().parse::<u64>()? * 1000; mem.total = line_total.trim().parse::<u64>()? * 1000;
} }
@ -147,8 +161,10 @@ pub fn memory() -> Result<Memory> {
} }
} }
} }
Ok(mem) Ok(mem)
} }
}
pub struct CpuTime(f32); pub struct CpuTime(f32);