in rd-agent/src/report.rs [181:247]
fn read_cgroup_usage(cgrp: &str, devnr: (u32, u32)) -> Usage {
let mut usage: Usage = Default::default();
if let Ok(cs) = read_cgroup_flat_keyed_file(&(cgrp.to_string() + "/cpu.stat")) {
if let Some(v) = cs.get("usage_usec") {
usage.cpu_busy = *v as f64 / 1_000_000.0;
}
if let Some(v) = cs.get("system_usec") {
usage.cpu_sys = *v as f64 / 1_000_000.0;
}
}
if let Ok(line) = read_one_line(&(cgrp.to_string() + "/memory.current")) {
if let Ok(v) = scan_fmt!(&line, "{}", u64) {
usage.mem_bytes = v;
}
}
if let Ok(line) = read_one_line(&(cgrp.to_string() + "/memory.swap.current")) {
if let Ok(v) = scan_fmt!(&line, "{}", u64) {
usage.swap_bytes = v;
}
}
if let Ok(v) = read_swap_free(cgrp) {
usage.swap_free = v;
}
let mem_stat_path = cgrp.to_string() + "/memory.stat";
usage.mem_stat = match read_stat_file(&mem_stat_path) {
Ok(v) => v,
Err(e) => {
debug!("report: Failed to read {} ({:?})", &mem_stat_path, &e);
Default::default()
}
};
if let Ok(mut is) = read_cgroup_nested_keyed_file(&(cgrp.to_string() + "/io.stat")) {
if let Some(is) = is.remove(&format!("{}:{}", devnr.0, devnr.1)) {
if let Some(val) = is.get("rbytes") {
usage.io_rbytes = scan_fmt!(&val, "{}", u64).unwrap_or(0);
}
if let Some(val) = is.get("wbytes") {
usage.io_wbytes = scan_fmt!(&val, "{}", u64).unwrap_or(0);
}
if let Some(val) = is.get("cost.usage") {
usage.io_usage = scan_fmt!(&val, "{}", u64).unwrap_or(0);
}
usage.io_stat = is
.into_iter()
.map(|(k, v)| (k, v.parse::<f64>().unwrap_or(0.0)))
.collect();
}
}
if let Ok(v) = read_stalls(&(cgrp.to_string() + "/cpu.pressure")) {
usage.cpu_stalls = v;
}
if let Ok(v) = read_stalls(&(cgrp.to_string() + "/memory.pressure")) {
usage.mem_stalls = v;
}
if let Ok(v) = read_stalls(&(cgrp.to_string() + "/io.pressure")) {
usage.io_stalls = v;
}
usage
}