diff options
author | Valentin Brandl <mail+github@vbrandl.net> | 2022-10-08 01:28:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-08 01:28:32 +0200 |
commit | ee0b71a4accfc42929fdfaf1664c0fb96b62b24a (patch) | |
tree | 9800e1ebdcdd8c484d948449f7c6117f7fc99dae /examples | |
parent | a7d89541786167e990d095a03ac7bdba68d7a55a (diff) |
Start second server on different port for metrics endpoint (#1444)
* Start second server on different port for metrics endpoint
* Don't track metrics on metrics server
Diffstat (limited to 'examples')
-rw-r--r-- | examples/prometheus-metrics/src/main.rs | 53 |
1 files changed, 39 insertions, 14 deletions
diff --git a/examples/prometheus-metrics/src/main.rs b/examples/prometheus-metrics/src/main.rs index 1152b3c7..5ab3fbdd 100644 --- a/examples/prometheus-metrics/src/main.rs +++ b/examples/prometheus-metrics/src/main.rs @@ -23,19 +23,13 @@ use std::{ }; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; -#[tokio::main] -async fn main() { - tracing_subscriber::registry() - .with(tracing_subscriber::EnvFilter::new( - std::env::var("RUST_LOG") - .unwrap_or_else(|_| "example_todos=debug,tower_http=debug".into()), - )) - .with(tracing_subscriber::fmt::layer()) - .init(); - +fn metrics_app() -> Router { let recorder_handle = setup_metrics_recorder(); + Router::new().route("/metrics", get(move || ready(recorder_handle.render()))) +} - let app = Router::new() +fn main_app() -> Router { + Router::new() .route("/fast", get(|| async {})) .route( "/slow", @@ -43,15 +37,46 @@ async fn main() { tokio::time::sleep(Duration::from_secs(1)).await; }), ) - .route("/metrics", get(move || ready(recorder_handle.render()))) - .route_layer(middleware::from_fn(track_metrics)); + .route_layer(middleware::from_fn(track_metrics)) +} + +async fn start_main_server() { + let app = main_app(); let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); tracing::debug!("listening on {}", addr); axum::Server::bind(&addr) .serve(app.into_make_service()) .await - .unwrap(); + .unwrap() +} + +async fn start_metrics_server() { + let app = metrics_app(); + + // NOTE: expose metrics enpoint on a different port + let addr = SocketAddr::from(([127, 0, 0, 1], 3001)); + tracing::debug!("listening on {}", addr); + axum::Server::bind(&addr) + .serve(app.into_make_service()) + .await + .unwrap() +} + +#[tokio::main] +async fn main() { + tracing_subscriber::registry() + .with(tracing_subscriber::EnvFilter::new( + std::env::var("RUST_LOG") + .unwrap_or_else(|_| "example_todos=debug,tower_http=debug".into()), + )) + .with(tracing_subscriber::fmt::layer()) + .init(); + + // The `/metrics` endpoint should not be publicly available. If behind a reverse proxy, this + // can be achieved by rejecting requests to `/metrics`. In this example, a second server is + // started on another port to expose `/metrics`. + let (_main_server, _metrics_server) = tokio::join!(start_main_server(), start_metrics_server()); } fn setup_metrics_recorder() -> PrometheusHandle { |