use crate::error::{Error, Result};
use std::time::Duration;
#[derive(Debug)]
pub struct Profiling {
duration: Duration,
frequency: i32,
}
impl Profiling {
pub fn new(duration: Duration, frequency: i32) -> Self {
Self {
duration,
frequency,
}
}
pub async fn report(&self) -> Result<pprof::Report> {
let guard = pprof::ProfilerGuardBuilder::default()
.frequency(self.frequency)
.blocklist(&["libc", "libgcc", "pthread", "vdso"])
.build()?;
actix_web::rt::time::sleep(self.duration).await;
guard.report().build().map_err(Error::from)
}
pub async fn dump_text(&self) -> Result<String> {
let report = self.report().await?;
let text = format!("{report:?}");
Ok(text)
}
pub async fn dump_flamegraph(&self) -> Result<Vec<u8>> {
let report = self.report().await?;
let mut body: Vec<u8> = Vec::new();
report.flamegraph(&mut body)?;
Ok(body)
}
}