use once_cell::sync::{Lazy, OnceCell};
use prometheus::{Gauge, Histogram, HistogramOpts};
use super::prometheus_names::{name_prefix, request_plane};
use crate::MetricsRegistry;
fn request_plane_metric_name(suffix: &str) -> String {
format!("{}_{}", name_prefix::REQUEST_PLANE, suffix)
}
pub static REQUEST_PLANE_QUEUE_SECONDS: Lazy<Histogram> = Lazy::new(|| {
Histogram::with_opts(
HistogramOpts::new(
request_plane_metric_name(request_plane::QUEUE_SECONDS),
"Time from generate() entry to send_request() (seconds)",
)
.buckets(vec![
0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0,
]),
)
.expect("request_plane_queue_seconds histogram")
});
pub static REQUEST_PLANE_SEND_SECONDS: Lazy<Histogram> = Lazy::new(|| {
Histogram::with_opts(
HistogramOpts::new(
request_plane_metric_name(request_plane::SEND_SECONDS),
"Time for send_request() to complete (seconds)",
)
.buckets(vec![
0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0,
]),
)
.expect("request_plane_send_seconds histogram")
});
pub static REQUEST_PLANE_ROUNDTRIP_TTFT_SECONDS: Lazy<Histogram> = Lazy::new(|| {
Histogram::with_opts(
HistogramOpts::new(
request_plane_metric_name(request_plane::ROUNDTRIP_TTFT_SECONDS),
"Time from send_request() to first response item (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,
]),
)
.expect("request_plane_roundtrip_ttft_seconds histogram")
});
pub static REQUEST_PLANE_INFLIGHT: Lazy<Gauge> = Lazy::new(|| {
Gauge::new(
request_plane_metric_name(request_plane::INFLIGHT_REQUESTS),
"Currently in-flight requests at AddressedPushRouter",
)
.expect("request_plane_inflight gauge")
});
static METRICS_REGISTERED: OnceCell<()> = OnceCell::new();
static PROMETHEUS_REGISTERED: OnceCell<Result<(), String>> = OnceCell::new();
pub fn ensure_request_plane_metrics_registered(registry: &MetricsRegistry) {
let _ = METRICS_REGISTERED.get_or_init(|| {
registry.add_metric_or_warn(
Box::new(REQUEST_PLANE_QUEUE_SECONDS.clone()),
"request_plane_queue_seconds",
);
registry.add_metric_or_warn(
Box::new(REQUEST_PLANE_SEND_SECONDS.clone()),
"request_plane_send_seconds",
);
registry.add_metric_or_warn(
Box::new(REQUEST_PLANE_ROUNDTRIP_TTFT_SECONDS.clone()),
"request_plane_roundtrip_ttft_seconds",
);
registry.add_metric_or_warn(
Box::new(REQUEST_PLANE_INFLIGHT.clone()),
"request_plane_inflight",
);
});
}
pub fn ensure_request_plane_metrics_registered_prometheus(
registry: &prometheus::Registry,
) -> Result<(), prometheus::Error> {
PROMETHEUS_REGISTERED
.get_or_init(|| {
(|| -> Result<(), prometheus::Error> {
registry.register(Box::new(REQUEST_PLANE_QUEUE_SECONDS.clone()))?;
registry.register(Box::new(REQUEST_PLANE_SEND_SECONDS.clone()))?;
registry.register(Box::new(REQUEST_PLANE_ROUNDTRIP_TTFT_SECONDS.clone()))?;
registry.register(Box::new(REQUEST_PLANE_INFLIGHT.clone()))?;
Ok(())
})()
.map_err(|e| e.to_string())
})
.as_ref()
.map(|_| ())
.map_err(|e| prometheus::Error::Msg(e.clone()))
}