From 152f4dd910dbb678fb93ea7233b313f8b382fae7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bartosz=20R=C3=B3=C5=BCa=C5=84ski?= <bartek.roza@gmail.com>
Date: Mon, 6 Nov 2023 10:12:49 +0100
Subject: [PATCH] Serve metrics on different port

---
 certifier/src/configuration.rs |  5 +++--
 certifier/src/main.rs          | 14 +++++++-------
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/certifier/src/configuration.rs b/certifier/src/configuration.rs
index 5f78c12d..f34bafa2 100644
--- a/certifier/src/configuration.rs
+++ b/certifier/src/configuration.rs
@@ -15,8 +15,9 @@ pub struct Config {
     pub post_cfg: post::config::ProofConfig,
     pub init_cfg: post::config::InitConfig,
 
-    /// Whether to enable metrics on /metrics.
-    pub metrics: bool,
+    /// Address to expose metrics on.
+    /// Metrics are disabled if not configured.
+    pub metrics: Option<std::net::SocketAddr>,
 }
 
 pub fn get_configuration(config_path: &Path) -> Result<Config, config::ConfigError> {
diff --git a/certifier/src/main.rs b/certifier/src/main.rs
index 0b597335..9f228c59 100644
--- a/certifier/src/main.rs
+++ b/certifier/src/main.rs
@@ -76,16 +76,16 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
 
     let mut app = certifier::certifier::new(config.post_cfg, config.init_cfg, signer);
 
-    if config.metrics {
-        info!("metrics on: {}/metrics", config.listen.to_string());
-        let (metric_layer, metric_handle) = PrometheusMetricLayerBuilder::new()
+    if let Some(addr) = config.metrics {
+        info!("metrics enabled on: http://{addr:?}/metrics");
+        let (layer, handle) = PrometheusMetricLayerBuilder::new()
             .with_prefix("certifier")
-            .with_ignore_patterns(&["/metrics"])
             .with_default_metrics()
             .build_pair();
-        app = app
-            .route("/metrics", get(|| async move { metric_handle.render() }))
-            .layer(metric_layer);
+
+        app = app.layer(layer);
+        let metrics = axum::Router::new().route("/metrics", get(|| async move { handle.render() }));
+        tokio::spawn(axum::Server::bind(&addr).serve(metrics.into_make_service()));
     }
 
     axum::Server::bind(&config.listen)