use crate::registered_event;
use metrics::{Histogram, histogram};
use std::time::Duration;
use tracing;
#[derive(Clone, Copy, Debug)]
pub struct AdaptiveConcurrencyLimitData {
pub concurrency: u64,
pub reached_limit: bool,
pub had_back_pressure: bool,
pub current_rtt: Option<Duration>,
pub past_rtt: Duration,
pub past_rtt_deviation: Duration,
}
registered_event! {
AdaptiveConcurrencyLimit => {
limit: Histogram = histogram!("adaptive_concurrency_limit"),
reached_limit: Histogram = histogram!("adaptive_concurrency_reached_limit"),
back_pressure: Histogram = histogram!("adaptive_concurrency_back_pressure"),
past_rtt_mean: Histogram = histogram!("adaptive_concurrency_past_rtt_mean"),
}
fn emit(&self, data: AdaptiveConcurrencyLimitData) {
self.limit.record(data.concurrency as f64);
let reached_limit_val = data.reached_limit.then_some(1.0).unwrap_or_default();
self.reached_limit.record(reached_limit_val);
let back_pressure_val = data.had_back_pressure.then_some(1.0).unwrap_or_default();
self.back_pressure.record(back_pressure_val);
self.past_rtt_mean.record(data.past_rtt);
tracing::info!(
target: "adaptive_concurrency::stats",
concurrency_limit = data.concurrency,
reached_max_limit_this_cycle = data.reached_limit, had_back_pressure_this_cycle = data.had_back_pressure, current_rtt_ms = data.current_rtt.map(|d| d.as_millis()),
past_rtt_ms = data.past_rtt.as_millis(),
past_rtt_deviation_ms = data.past_rtt_deviation.as_millis(),
"Limit Adjusted"
);
}
}
registered_event! {
AdaptiveConcurrencyInFlight => {
in_flight: Histogram = histogram!("adaptive_concurrency_in_flight"),
}
fn emit(&self, in_flight_count: u64) {
self.in_flight.record(in_flight_count as f64);
tracing::debug!(target: "adaptive_concurrency::stats", in_flight = in_flight_count, "In-flight Updated");
}
}
registered_event! {
AdaptiveConcurrencyObservedRtt => {
observed_rtt: Histogram = histogram!("adaptive_concurrency_observed_rtt"),
}
fn emit(&self, rtt: Duration) {
self.observed_rtt.record(rtt);
tracing::trace!(target: "adaptive_concurrency::stats", observed_rtt_ms = rtt.as_millis(), "RTT Observed");
}
}
registered_event! {
AdaptiveConcurrencyAveragedRtt => {
averaged_rtt: Histogram = histogram!("adaptive_concurrency_averaged_rtt"),
}
fn emit(&self, rtt: Duration) {
self.averaged_rtt.record(rtt);
tracing::debug!(target: "adaptive_concurrency::stats", averaged_rtt_ms = rtt.as_millis(), "RTT Averaged for Period");
}
}