use once_cell::sync::{Lazy, OnceCell};
use prometheus::{Histogram, HistogramOpts};
use super::prometheus_names::{name_prefix, work_handler};
use crate::MetricsRegistry;
fn work_handler_metric_name(suffix: &str) -> String {
format!("{}_{}", name_prefix::WORK_HANDLER, suffix)
}
pub static WORK_HANDLER_NETWORK_TRANSIT_SECONDS: Lazy<Histogram> = Lazy::new(|| {
Histogram::with_opts(
HistogramOpts::new(
work_handler_metric_name(work_handler::NETWORK_TRANSIT_SECONDS),
"Frontend-to-backend network transit time (cross-process wall-clock, seconds)",
)
.buckets(vec![
0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0,
]),
)
.expect("work_handler_network_transit_seconds histogram")
});
pub static WORK_HANDLER_TIME_TO_FIRST_RESPONSE_SECONDS: Lazy<Histogram> = Lazy::new(|| {
Histogram::with_opts(
HistogramOpts::new(
work_handler_metric_name(work_handler::TIME_TO_FIRST_RESPONSE_SECONDS),
"Backend processing time from handle_payload entry to prologue sent (seconds)",
)
.buckets(vec![
0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, 30.0, 60.0,
]),
)
.expect("work_handler_time_to_first_response_seconds histogram")
});
static METRICS_REGISTERED: OnceCell<()> = OnceCell::new();
static PROMETHEUS_REGISTERED: OnceCell<Result<(), String>> = OnceCell::new();
pub fn ensure_work_handler_perf_metrics_registered(registry: &MetricsRegistry) {
let _ = METRICS_REGISTERED.get_or_init(|| {
registry.add_metric_or_warn(
Box::new(WORK_HANDLER_NETWORK_TRANSIT_SECONDS.clone()),
"work_handler_network_transit_seconds",
);
registry.add_metric_or_warn(
Box::new(WORK_HANDLER_TIME_TO_FIRST_RESPONSE_SECONDS.clone()),
"work_handler_time_to_first_response_seconds",
);
});
}
pub fn ensure_work_handler_perf_metrics_registered_prometheus(
registry: &prometheus::Registry,
) -> Result<(), prometheus::Error> {
PROMETHEUS_REGISTERED
.get_or_init(|| {
(|| -> Result<(), prometheus::Error> {
registry.register(Box::new(WORK_HANDLER_NETWORK_TRANSIT_SECONDS.clone()))?;
registry.register(Box::new(
WORK_HANDLER_TIME_TO_FIRST_RESPONSE_SECONDS.clone(),
))?;
Ok(())
})()
.map_err(|e| e.to_string())
})
.as_ref()
.map(|_| ())
.map_err(|e| prometheus::Error::Msg(e.clone()))
}