use prometheus::{Counter, Gauge, Histogram, HistogramOpts, Registry};
use std::sync::Arc;
pub struct Metrics {
pub requests_total: Counter,
pub request_duration: Histogram,
pub active_connections: Gauge,
registry: Arc<Registry>,
}
impl Default for Metrics {
fn default() -> Self {
Self::new()
}
}
impl Metrics {
pub fn new() -> Self {
let registry = Arc::new(Registry::new());
let requests_total = Counter::new("requests_total", "Total number of requests")
.expect("Failed to create requests_total counter");
let request_duration_opts =
HistogramOpts::new("request_duration_seconds", "Request duration")
.buckets(vec![0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0]);
let request_duration = Histogram::with_opts(request_duration_opts)
.expect("Failed to create request_duration histogram");
let active_connections = Gauge::new("active_connections", "Active connections")
.expect("Failed to create active_connections gauge");
registry.register(Box::new(requests_total.clone())).unwrap();
registry
.register(Box::new(request_duration.clone()))
.unwrap();
registry
.register(Box::new(active_connections.clone()))
.unwrap();
Self {
requests_total,
request_duration,
active_connections,
registry,
}
}
pub fn registry(&self) -> Arc<Registry> {
self.registry.clone()
}
}