diff --git a/prdoc/pr_6220.prdoc b/prdoc/pr_6220.prdoc
new file mode 100644
index 0000000000000000000000000000000000000000..6a5ee4fa59becebec6eaba07f87843521368f3ca
--- /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 9bdec3cb818344ec9c9e045926a6f76d99d91ba0..b8dfd6fb2beee5d96003e3d65a5927a95ab4cd2a 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 35597cad03d8876ec58c320d31c0152aec8f9dba..5edac2e6650f528c5f138c800fa3c9b350be52c5 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 {