use metrics_exporter_prometheus::{Matcher, PrometheusBuilder}; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::time::Duration; #[derive(Debug, Clone)] pub struct PrometheusConfig { pub port: u16, pub host: String, } impl Default for PrometheusConfig { fn default() -> Self { Self { port: 29000, host: "0.0.0.0".to_string(), } } } pub fn start_prometheus(config: PrometheusConfig) { let duration_matcher = Matcher::Suffix(String::from("duration")); let duration_bucket = [ 0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, 15.0, 30.0, 45.0, 60.0, 90.0, 120.0, 180.0, 240.0, ]; let ip_addr: IpAddr = config .host .parse() .unwrap_or(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))); let socket_addr = SocketAddr::new(ip_addr, config.port); PrometheusBuilder::new() .with_http_listener(socket_addr) .upkeep_timeout(Duration::from_secs(5 * 60)) .set_buckets_for_metric(duration_matcher, &duration_bucket) .expect("failed to set duration bucket") .install() .expect("failed to install Prometheus metrics exporter"); }