use std::io::Write;
use flate2::Compression;
use flate2::write::GzEncoder;
use pprof::protos::Message;
use crate::PprofError;
pub struct Cpu(pprof::ProfilerGuardBuilder);
impl Cpu {
pub fn new<S: AsRef<str>>(frequency: i32, blocklist: &[S]) -> Self {
Self(
pprof::ProfilerGuardBuilder::default()
.frequency(frequency)
.blocklist(blocklist),
)
}
pub fn capture(&self, duration: std::time::Duration) -> Result<Vec<u8>, PprofError> {
let profiler = self.0.clone().build()?;
std::thread::sleep(duration);
let report = profiler.report().build()?;
let pprof = report.pprof()?;
let mut gz = GzEncoder::new(Vec::new(), Compression::default());
gz.write_all(&pprof.encode_to_vec())?;
Ok(gz.finish()?)
}
}