use std::sync::RwLock;
use tdigest::TDigest;
pub struct LatencyDigest {
digest: RwLock<TDigest>,
#[allow(dead_code)]
compression: usize,
}
impl LatencyDigest {
pub fn new(compression: usize) -> Self {
Self {
digest: RwLock::new(TDigest::new_with_size(compression)),
compression,
}
}
pub fn record(&self, latency_us: f64) {
let mut d = match self.digest.write() {
Ok(guard) => guard,
Err(poisoned) => poisoned.into_inner(),
};
*d = d.merge_unsorted(vec![latency_us]);
}
pub fn percentile(&self, q: f64) -> f64 {
let d = match self.digest.read() {
Ok(guard) => guard,
Err(poisoned) => poisoned.into_inner(),
};
d.estimate_quantile(q / 100.0)
}
}