From 15d214e2372308fa1d12b576a675c9e2cbf6cde1 Mon Sep 17 00:00:00 2001 From: Ellie Huxtable Date: Thu, 16 Nov 2023 23:18:13 +0000 Subject: feat: add metrics server and http metrics (#1394) * feat: add metrics server and http metrics * setup metrics * update default config * fix tests --- atuin-server/src/lib.rs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'atuin-server/src/lib.rs') diff --git a/atuin-server/src/lib.rs b/atuin-server/src/lib.rs index 6778b099..2d2a9c78 100644 --- a/atuin-server/src/lib.rs +++ b/atuin-server/src/lib.rs @@ -3,16 +3,20 @@ use std::{future::Future, net::TcpListener}; use atuin_server_database::Database; +use axum::Router; use axum::Server; use eyre::{Context, Result}; mod handlers; +mod metrics; mod router; -mod settings; mod utils; pub use settings::example_config; pub use settings::Settings; + +pub mod settings; + use tokio::signal; #[cfg(target_family = "unix")] @@ -70,3 +74,24 @@ pub async fn launch_with_listener( Ok(()) } + +// The separate listener means it's much easier to ensure metrics are not accidentally exposed to +// the public. +pub async fn launch_metrics_server(host: String, port: u16) -> Result<()> { + let listener = TcpListener::bind((host, port)).context("failed to bind metrics tcp")?; + + let recorder_handle = metrics::setup_metrics_recorder(); + + let router = Router::new().route( + "/metrics", + axum::routing::get(move || std::future::ready(recorder_handle.render())), + ); + + Server::from_tcp(listener) + .context("could not launch server")? + .serve(router.into_make_service()) + .with_graceful_shutdown(shutdown_signal()) + .await?; + + Ok(()) +} -- cgit v1.3.1