in below/model/src/collector.rs [299:363]
fn collect_cgroup_sample(
reader: &cgroupfs::CgroupReader,
collect_io_stat: bool,
logger: &slog::Logger,
cgroup_re: &Option<Regex>,
) -> Result<CgroupSample> {
let io_stat = if collect_io_stat {
io_stat_wrap(reader.read_io_stat())?
} else {
None
};
Ok(CgroupSample {
cpu_stat: wrap(reader.read_cpu_stat())?.map(Into::into),
io_stat: io_stat.map(|m| m.into_iter().map(|(k, v)| (k, v.into())).collect()),
memory_current: wrap(reader.read_memory_current().map(|v| v as i64))?,
memory_stat: wrap(reader.read_memory_stat())?.map(Into::into),
pressure: wrap(reader.read_pressure())?.map(Into::into),
// We transpose at the end here to convert the
// Option<Result<BTreeMap... into Result<Option<BTreeMap and
// then bail any errors with `?` - leaving us with the
// Option<BTreeMap...
//
// The only case this can be None is if the cgroup no longer
// exists - this is consistent with the above members
children: wrap(reader.child_cgroup_iter())
.context("Failed to get iterator over cgroup children")?
.map(|child_iter| {
child_iter
.filter(|child| {
if let Some(cgroup_re) = cgroup_re.as_ref() {
!cgroup_re.is_match(&child.name().to_string_lossy())
} else {
true
}
})
.map(|child| {
collect_cgroup_sample(&child, collect_io_stat, logger, cgroup_re).map(
|child_sample| {
(
child
.name()
.file_name()
.expect("Unexpected .. in cgroup path")
.to_string_lossy()
.to_string(),
child_sample,
)
},
)
})
.collect::<Result<BTreeMap<String, CgroupSample>>>()
})
.transpose()?,
memory_swap_current: wrap(reader.read_memory_swap_current().map(|v| v as i64))?,
memory_high: reader.read_memory_high()?.map(Into::into),
memory_events: wrap(reader.read_memory_events())?.map(Into::into),
inode_number: match reader.read_inode_number() {
Ok(st_ino) => Some(st_ino as i64),
Err(e) => {
error!(logger, "Fail to collect inode number: {:#}", e);
None
}
},
})
}