From 0449b214accd0f0fbf7ea3e8f3a8d8b7f99445e4 Mon Sep 17 00:00:00 2001
From: tmpolaczyk <44604217+tmpolaczyk@users.noreply.github.com>
Date: Tue, 19 Nov 2024 10:43:09 +0100
Subject: [PATCH] Fix metrics not shutting down if there are open connections
 (#6220)

Fix prometheus metrics not shutting down if there are open connections.
I fixed the same issue in the past but it broke again after a dependecy
upgrade.

See also:

https://github.com/paritytech/polkadot-sdk/pull/1637
---
 prdoc/pr_6220.prdoc                   | 10 ++++++++++
 substrate/utils/prometheus/Cargo.toml |  2 +-
 substrate/utils/prometheus/src/lib.rs |  2 ++
 3 files changed, 13 insertions(+), 1 deletion(-)
 create mode 100644 prdoc/pr_6220.prdoc

diff --git a/prdoc/pr_6220.prdoc b/prdoc/pr_6220.prdoc
new file mode 100644
index 00000000000..6a5ee4fa59b
--- /dev/null
+++ b/prdoc/pr_6220.prdoc
@@ -0,0 +1,10 @@
+title: Fix metrics not shutting down if there are open connections
+
+doc:
+  - audience: Runtime Dev
+    description: |
+      Fix prometheus metrics not shutting down if there are open connections
+
+crates:
+- name: substrate-prometheus-endpoint
+  bump: patch
diff --git a/substrate/utils/prometheus/Cargo.toml b/substrate/utils/prometheus/Cargo.toml
index 9bdec3cb818..b8dfd6fb2be 100644
--- a/substrate/utils/prometheus/Cargo.toml
+++ b/substrate/utils/prometheus/Cargo.toml
@@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"]
 [dependencies]
 http-body-util = { workspace = true }
 hyper = { features = ["http1", "server"], workspace = true }
-hyper-util = { features = ["server-auto", "tokio"], workspace = true }
+hyper-util = { features = ["server-auto", "server-graceful", "tokio"], workspace = true }
 log = { workspace = true, default-features = true }
 prometheus = { workspace = true }
 thiserror = { workspace = true }
diff --git a/substrate/utils/prometheus/src/lib.rs b/substrate/utils/prometheus/src/lib.rs
index 35597cad03d..5edac2e6650 100644
--- a/substrate/utils/prometheus/src/lib.rs
+++ b/substrate/utils/prometheus/src/lib.rs
@@ -102,6 +102,7 @@ async fn init_prometheus_with_listener(
 	log::info!(target: "prometheus", "〽️ Prometheus exporter started at {}", listener.local_addr()?);
 
 	let server = hyper_util::server::conn::auto::Builder::new(hyper_util::rt::TokioExecutor::new());
+	let graceful = hyper_util::server::graceful::GracefulShutdown::new();
 
 	loop {
 		let io = match listener.accept().await {
@@ -120,6 +121,7 @@ async fn init_prometheus_with_listener(
 				hyper::service::service_fn(move |req| request_metrics(req, registry.clone())),
 			)
 			.into_owned();
+		let conn = graceful.watch(conn);
 
 		tokio::spawn(async move {
 			if let Err(err) = conn.await {
-- 
GitLab