diff --git a/lading/src/observer/linux/procfs.rs b/lading/src/observer/linux/procfs.rs index 7add18441..98402ab8c 100644 --- a/lading/src/observer/linux/procfs.rs +++ b/lading/src/observer/linux/procfs.rs @@ -311,18 +311,11 @@ impl Sampler { ("comm", comm.clone()), ("pathname", pathname), ]; - if let Some(m) = measures.rss { - gauge!("smaps.rss.by_pathname", &labels).set(m as f64); - } - if let Some(m) = measures.pss { - gauge!("smaps.pss.by_pathname", &labels).set(m as f64); - } - if let Some(m) = measures.size { - gauge!("smaps.size.by_pathname", &labels).set(m as f64); - } - if let Some(m) = measures.swap { - gauge!("smaps.swap.by_pathname", &labels).set(m as f64); - } + gauge!("smaps.rss.by_pathname", &labels).set(measures.rss as f64); + gauge!("smaps.pss.by_pathname", &labels).set(measures.pss as f64); + gauge!("smaps.swap.by_pathname", &labels).set(measures.swap as f64); + gauge!("smaps.size.by_pathname", &labels).set(measures.size as f64); + if let Some(m) = measures.private_clean { gauge!("smaps.private_clean.by_pathname", &labels).set(m as f64); } diff --git a/lading/src/observer/linux/procfs/memory/smaps.rs b/lading/src/observer/linux/procfs/memory/smaps.rs index eaad1b0ed..aaee3e2e0 100644 --- a/lading/src/observer/linux/procfs/memory/smaps.rs +++ b/lading/src/observer/linux/procfs/memory/smaps.rs @@ -25,11 +25,11 @@ struct Region { // empty string indicates no pathname pub(crate) pathname: String, - // Values (all in bytes) - Made Optional - pub(crate) size: Option, - pub(crate) pss: Option, - pub(crate) swap: Option, - pub(crate) rss: Option, + // Values (all in bytes) + pub(crate) size: u64, + pub(crate) pss: u64, + pub(crate) swap: u64, + pub(crate) rss: u64, pub(crate) pss_dirty: Option, // only present in 6.0+ pub(crate) shared_clean: Option, pub(crate) shared_dirty: Option, @@ -103,7 +103,6 @@ impl Region { pathname }; - // Initialize optional fields let mut size: Option = None; let mut pss: Option = None; let mut rss: Option = None; @@ -210,6 +209,12 @@ impl Region { } } + let (Some(size), Some(pss), Some(rss), Some(swap)) = (size, pss, rss, swap) else { + return Err(Error::Parsing(format!( + "Could not parse all value fields from region: '{contents}'" + ))); + }; + Ok(Region { pathname: pathname.unwrap_or_default(), size, @@ -237,10 +242,10 @@ impl Region { #[derive(Default)] pub(crate) struct AggrMeasure { - pub(crate) size: Option, - pub(crate) pss: Option, - pub(crate) swap: Option, - pub(crate) rss: Option, + pub(crate) size: u64, + pub(crate) pss: u64, + pub(crate) swap: u64, + pub(crate) rss: u64, pub(crate) pss_dirty: Option, pub(crate) shared_clean: Option, pub(crate) shared_dirty: Option, @@ -288,10 +293,10 @@ impl Regions { let pathname = region.pathname.clone(); let entry = map.entry(pathname).or_default(); - aggregate_option(&mut entry.size, region.size); - aggregate_option(&mut entry.pss, region.pss); - aggregate_option(&mut entry.swap, region.swap); - aggregate_option(&mut entry.rss, region.rss); + entry.size += region.size; + entry.pss += region.pss; + entry.swap += region.swap; + entry.rss += region.rss; aggregate_option(&mut entry.pss_dirty, region.pss_dirty); aggregate_option(&mut entry.shared_clean, region.shared_clean); aggregate_option(&mut entry.shared_dirty, region.shared_dirty);