aboutsummaryrefslogtreecommitdiffstats
path: root/atuin-server/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'atuin-server/src/lib.rs')
-rw-r--r--atuin-server/src/lib.rs27
1 files changed, 26 insertions, 1 deletions
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<Db: Database>(
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(())
+}