summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorValentin Brandl <mail+github@vbrandl.net>2022-10-08 01:28:32 +0200
committerGitHub <noreply@github.com>2022-10-08 01:28:32 +0200
commitee0b71a4accfc42929fdfaf1664c0fb96b62b24a (patch)
tree9800e1ebdcdd8c484d948449f7c6117f7fc99dae /examples
parenta7d89541786167e990d095a03ac7bdba68d7a55a (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.rs53
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 {