in src/data/flamegraphs.rs [51:109]
fn after_data_collection(&mut self, params: &CollectorParams) -> Result<()> {
let data_dir = PathBuf::from(¶ms.data_dir);
let file_pathbuf = data_dir.join(get_file_name(
params.data_dir.display().to_string(),
"perf_profile".to_string(),
)?);
let perf_jit_loc = data_dir.join("perf.data.jit");
trace!("Running Perf inject...");
let out_jit = Command::new("perf")
.args([
"inject",
"-j",
"-i",
file_pathbuf.to_str().unwrap(),
"-o",
perf_jit_loc.to_str().unwrap(),
])
.status();
let fg_out = File::create(data_dir.join(format!("{}-flamegraph.svg", params.run_name)))?;
match out_jit {
Err(e) => {
let out = format!("Skip processing profiling data due to: {}", e);
error!("{}", out);
write_msg_to_svg(fg_out, out)?;
}
Ok(_) => {
info!("Creating flamegraph...");
let script_loc = data_dir.join("script.out");
let out = Command::new("perf")
.stdout(File::create(&script_loc)?)
.args(["script", "-f", "-i", perf_jit_loc.to_str().unwrap()])
.output();
match out {
Err(e) => {
let out = format!("Did not process profiling data due to: {}", e);
error!("{}", out);
write_msg_to_svg(fg_out, out)?;
}
Ok(_) => {
let collapse_loc = data_dir.join("collapse.out");
Folder::default()
.collapse_file(Some(script_loc), File::create(&collapse_loc)?)?;
flamegraph::from_files(
&mut Options::default(),
&[collapse_loc.to_path_buf()],
fg_out,
)?;
}
}
}
}
Ok(())
}