use super::{MemoryError, MemorySample};
use std::time::Instant;
pub fn sample_memory(pid: u32) -> Result<MemorySample, MemoryError> {
let path = format!("/proc/{}/status", pid);
let content = std::fs::read_to_string(&path).map_err(|e| match e.kind() {
std::io::ErrorKind::NotFound => MemoryError::ProcessNotFound(pid),
std::io::ErrorKind::PermissionDenied => MemoryError::PermissionDenied(pid),
_ => MemoryError::Io(e),
})?;
let mut rss_kb = 0u64;
let mut peak_kb = 0u64;
let mut virtual_kb = 0u64;
let mut swap_kb = 0u64;
for line in content.lines() {
let parts: Vec<&str> = line.split_whitespace().collect();
if parts.len() < 2 {
continue;
}
match parts[0] {
"VmRSS:" => rss_kb = parts[1].parse().unwrap_or(0),
"VmHWM:" => peak_kb = parts[1].parse().unwrap_or(0),
"VmSize:" => virtual_kb = parts[1].parse().unwrap_or(0),
"VmSwap:" => swap_kb = parts[1].parse().unwrap_or(0),
_ => {}
}
}
Ok(MemorySample {
timestamp: Instant::now(),
rss_bytes: rss_kb * 1024,
peak_rss_bytes: peak_kb * 1024,
virtual_bytes: virtual_kb * 1024,
swap_bytes: swap_kb * 1024,
})
}