use axum::{Router, routing::get};
use metrics_exporter_prometheus::{PrometheusBuilder, PrometheusHandle};
use std::net::SocketAddr;
use tokio::net::TcpListener;
#[must_use]
pub fn init_metrics() -> PrometheusHandle {
#[allow(clippy::expect_used)]
let handle = PrometheusBuilder::new()
.install_recorder()
.expect("failed to install Prometheus recorder");
subduction_core::metrics::describe_all();
handle
}
pub async fn start_metrics_server(addr: SocketAddr, handle: PrometheusHandle) -> eyre::Result<()> {
let app = Router::new().route(
"/metrics",
get(move || {
let handle = handle.clone();
async move { handle.render() }
}),
);
let listener = TcpListener::bind(addr).await?;
tracing::info!("Metrics server listening on {}", addr);
tokio::spawn(async move {
if let Err(e) = axum::serve(listener, app).await {
tracing::error!("Metrics server error: {}", e);
}
});
Ok(())
}