From dada6cea6447ce2730a3f3b43a3b48b7a5c26cf6 Mon Sep 17 00:00:00 2001
From: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com>
Date: Fri, 4 Oct 2024 17:18:40 +0300
Subject: [PATCH] Remove jaeger everywhere (#5875)

Jaeger tracing went mostly unused and it created bigger problems like
wasting CPU or memory leaks, so remove it entirely.

Fixes: https://github.com/paritytech/polkadot-sdk/issues/4995

---------

Signed-off-by: Alexandru Gheorghe <alexandru.gheorghe@parity.io>
---
 Cargo.lock                                    |  65 +--
 Cargo.toml                                    |   3 -
 .../src/lib.rs                                |   1 -
 polkadot/cli/src/cli.rs                       |   6 -
 polkadot/cli/src/command.rs                   |  37 +-
 .../node/collation-generation/src/tests.rs    |   1 -
 .../core/approval-voting-parallel/Cargo.toml  |   1 -
 polkadot/node/core/av-store/Cargo.toml        |   1 -
 polkadot/node/core/av-store/src/lib.rs        |   7 -
 .../node/core/bitfield-signing/src/lib.rs     |  54 +-
 .../node/core/bitfield-signing/src/tests.rs   |   9 +-
 .../core/candidate-validation/src/tests.rs    |   1 -
 polkadot/node/core/provisioner/src/lib.rs     |  20 +-
 polkadot/node/jaeger/Cargo.toml               |  23 -
 polkadot/node/jaeger/src/config.rs            |  73 ---
 polkadot/node/jaeger/src/errors.rs            |  28 -
 polkadot/node/jaeger/src/lib.rs               | 169 ------
 polkadot/node/jaeger/src/spans.rs             | 520 ------------------
 .../availability-distribution/src/lib.rs      |  27 +-
 .../src/pov_requester/mod.rs                  |  13 -
 .../src/requester/fetch_task/mod.rs           |  41 +-
 .../src/requester/fetch_task/tests.rs         |   1 -
 .../src/requester/mod.rs                      |  40 +-
 .../src/requester/tests.rs                    |  18 +-
 .../src/responder.rs                          |  10 +-
 .../network/availability-recovery/src/lib.rs  |   6 -
 .../network/bitfield-distribution/src/lib.rs  |  35 +-
 .../bitfield-distribution/src/tests.rs        |  14 +-
 polkadot/node/network/bridge/src/rx/mod.rs    |   2 +-
 polkadot/node/network/bridge/src/rx/tests.rs  |   8 +-
 .../src/collator_side/mod.rs                  |  26 +-
 .../src/collator_side/tests/mod.rs            |   2 -
 .../tests/prospective_parachains.rs           |   3 +-
 .../src/validator_side/collation.rs           |  14 -
 .../src/validator_side/mod.rs                 |  27 +-
 .../tests/prospective_parachains.rs           |   3 +-
 polkadot/node/network/protocol/Cargo.toml     |   1 -
 polkadot/node/network/protocol/src/lib.rs     |  29 +-
 .../src/legacy_v1/mod.rs                      |  32 +-
 .../src/legacy_v1/requester.rs                |  14 +-
 .../src/legacy_v1/tests.rs                    |   2 -
 polkadot/node/overseer/src/dummy.rs           |   1 -
 polkadot/node/overseer/src/lib.rs             |  28 +-
 polkadot/node/service/src/lib.rs              |  47 +-
 polkadot/node/service/src/overseer.rs         |   3 -
 .../src/lib/availability/mod.rs               |   7 +-
 .../node/subsystem-bench/src/lib/mock/mod.rs  |   1 -
 .../node/subsystem-test-helpers/src/mock.rs   |   9 +-
 polkadot/node/subsystem-types/Cargo.toml      |   1 -
 polkadot/node/subsystem-types/src/errors.rs   |   4 -
 polkadot/node/subsystem-types/src/lib.rs      |  10 +-
 polkadot/node/subsystem-util/Cargo.toml       |   1 -
 polkadot/node/subsystem/Cargo.toml            |   1 -
 polkadot/node/subsystem/src/lib.rs            |   3 -
 polkadot/node/test/service/src/lib.rs         |   2 -
 .../adder/collator/src/main.rs                |   1 -
 .../undying/collator/src/main.rs              |   1 -
 prdoc/pr_5875.prdoc                           |  47 ++
 umbrella/Cargo.toml                           |   7 +-
 umbrella/src/lib.rs                           |   4 -
 60 files changed, 139 insertions(+), 1426 deletions(-)
 delete mode 100644 polkadot/node/jaeger/Cargo.toml
 delete mode 100644 polkadot/node/jaeger/src/config.rs
 delete mode 100644 polkadot/node/jaeger/src/errors.rs
 delete mode 100644 polkadot/node/jaeger/src/lib.rs
 delete mode 100644 polkadot/node/jaeger/src/spans.rs
 create mode 100644 prdoc/pr_5875.prdoc

diff --git a/Cargo.lock b/Cargo.lock
index 2747a3dece0..568d642879b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -7732,12 +7732,6 @@ dependencies = [
  "cfg-if",
 ]
 
-[[package]]
-name = "integer-encoding"
-version = "3.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02"
-
 [[package]]
 name = "integer-sqrt"
 version = "0.1.5"
@@ -9564,17 +9558,6 @@ dependencies = [
  "sp-core 28.0.0",
 ]
 
-[[package]]
-name = "mick-jaeger"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69672161530e8aeca1d1400fbf3f1a1747ff60ea604265a4e906c2442df20532"
-dependencies = [
- "futures",
- "rand",
- "thrift",
-]
-
 [[package]]
 name = "mime"
 version = "0.3.17"
@@ -10585,15 +10568,6 @@ dependencies = [
  "syn 1.0.109",
 ]
 
-[[package]]
-name = "ordered-float"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7"
-dependencies = [
- "num-traits",
-]
-
 [[package]]
 name = "ordered-float"
 version = "2.10.1"
@@ -14274,7 +14248,6 @@ dependencies = [
  "parking_lot 0.12.3",
  "polkadot-approval-distribution",
  "polkadot-node-core-approval-voting",
- "polkadot-node-jaeger",
  "polkadot-node-metrics",
  "polkadot-node-network-protocol",
  "polkadot-node-primitives",
@@ -14317,7 +14290,6 @@ dependencies = [
  "parity-scale-codec",
  "parking_lot 0.12.3",
  "polkadot-erasure-coding",
- "polkadot-node-jaeger",
  "polkadot-node-primitives",
  "polkadot-node-subsystem",
  "polkadot-node-subsystem-test-helpers",
@@ -14686,23 +14658,6 @@ dependencies = [
  "tracing-gum",
 ]
 
-[[package]]
-name = "polkadot-node-jaeger"
-version = "7.0.0"
-dependencies = [
- "log",
- "mick-jaeger",
- "parity-scale-codec",
- "parking_lot 0.12.3",
- "polkadot-node-primitives",
- "polkadot-primitives",
- "sc-network",
- "sc-network-types",
- "sp-core 28.0.0",
- "thiserror",
- "tokio",
-]
-
 [[package]]
 name = "polkadot-node-metrics"
 version = "7.0.0"
@@ -14743,7 +14698,6 @@ dependencies = [
  "futures",
  "hex",
  "parity-scale-codec",
- "polkadot-node-jaeger",
  "polkadot-node-primitives",
  "polkadot-primitives",
  "rand",
@@ -14787,7 +14741,6 @@ dependencies = [
 name = "polkadot-node-subsystem"
 version = "7.0.0"
 dependencies = [
- "polkadot-node-jaeger",
  "polkadot-node-subsystem-types",
  "polkadot-overseer",
 ]
@@ -14823,7 +14776,6 @@ dependencies = [
  "fatality",
  "futures",
  "orchestra",
- "polkadot-node-jaeger",
  "polkadot-node-network-protocol",
  "polkadot-node-primitives",
  "polkadot-primitives",
@@ -14862,7 +14814,6 @@ dependencies = [
  "parking_lot 0.12.3",
  "pin-project",
  "polkadot-erasure-coding",
- "polkadot-node-jaeger",
  "polkadot-node-metrics",
  "polkadot-node-network-protocol",
  "polkadot-node-primitives",
@@ -15447,7 +15398,6 @@ dependencies = [
  "polkadot-node-core-pvf-execute-worker",
  "polkadot-node-core-pvf-prepare-worker",
  "polkadot-node-core-runtime-api",
- "polkadot-node-jaeger",
  "polkadot-node-metrics",
  "polkadot-node-network-protocol",
  "polkadot-node-primitives",
@@ -20308,7 +20258,7 @@ version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c"
 dependencies = [
- "ordered-float 2.10.1",
+ "ordered-float",
  "serde",
 ]
 
@@ -24709,19 +24659,6 @@ dependencies = [
  "num_cpus",
 ]
 
-[[package]]
-name = "thrift"
-version = "0.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b82ca8f46f95b3ce96081fe3dd89160fdea970c254bb72925255d1b62aae692e"
-dependencies = [
- "byteorder",
- "integer-encoding",
- "log",
- "ordered-float 1.1.1",
- "threadpool",
-]
-
 [[package]]
 name = "tikv-jemalloc-ctl"
 version = "0.5.4"
diff --git a/Cargo.toml b/Cargo.toml
index 8c9bf848c5a..df662ac2698 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -175,7 +175,6 @@ members = [
 	"polkadot/node/core/runtime-api",
 	"polkadot/node/gum",
 	"polkadot/node/gum/proc-macro",
-	"polkadot/node/jaeger",
 	"polkadot/node/malus",
 	"polkadot/node/metrics",
 	"polkadot/node/network/approval-distribution",
@@ -843,7 +842,6 @@ merkleized-metadata = { version = "0.1.0" }
 merlin = { version = "3.0", default-features = false }
 messages-relay = { path = "bridges/relays/messages" }
 metered = { version = "0.6.1", default-features = false, package = "prioritized-metered-channel" }
-mick-jaeger = { version = "0.1.8" }
 milagro-bls = { version = "1.5.4", default-features = false, package = "snowbridge-milagro-bls" }
 minimal-template-node = { path = "templates/minimal/node" }
 minimal-template-runtime = { path = "templates/minimal/runtime" }
@@ -1047,7 +1045,6 @@ polkadot-node-core-pvf-common = { path = "polkadot/node/core/pvf/common", defaul
 polkadot-node-core-pvf-execute-worker = { path = "polkadot/node/core/pvf/execute-worker", default-features = false }
 polkadot-node-core-pvf-prepare-worker = { path = "polkadot/node/core/pvf/prepare-worker", default-features = false }
 polkadot-node-core-runtime-api = { path = "polkadot/node/core/runtime-api", default-features = false }
-polkadot-node-jaeger = { path = "polkadot/node/jaeger", default-features = false }
 polkadot-node-metrics = { path = "polkadot/node/metrics", default-features = false }
 polkadot-node-network-protocol = { path = "polkadot/node/network/protocol", default-features = false }
 polkadot-node-primitives = { path = "polkadot/node/primitives", default-features = false }
diff --git a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs
index f0a082dce53..3a204b0f383 100644
--- a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs
+++ b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs
@@ -363,7 +363,6 @@ fn build_polkadot_full_node(
 			// Disable BEEFY. It should not be required by the internal relay chain node.
 			enable_beefy: false,
 			force_authoring_backoff: false,
-			jaeger_agent: None,
 			telemetry_worker_handle,
 
 			// Cumulus doesn't spawn PVF workers, so we can disable version checks.
diff --git a/polkadot/cli/src/cli.rs b/polkadot/cli/src/cli.rs
index 1445ade08e2..eb67a395634 100644
--- a/polkadot/cli/src/cli.rs
+++ b/polkadot/cli/src/cli.rs
@@ -93,12 +93,6 @@ pub struct RunCmd {
 	#[arg(long)]
 	pub force_authoring_backoff: bool,
 
-	/// Add the destination address to the 'Jaeger' agent.
-	///
-	/// Must be valid socket address, of format `IP:Port` (commonly `127.0.0.1:6831`).
-	#[arg(long)]
-	pub jaeger_agent: Option<String>,
-
 	/// Add the destination address to the `pyroscope` agent.
 	///
 	/// Must be valid socket address, of format `IP:Port` (commonly `127.0.0.1:4040`).
diff --git a/polkadot/cli/src/command.rs b/polkadot/cli/src/command.rs
index 34ada58bbcd..d124c8fb7eb 100644
--- a/polkadot/cli/src/command.rs
+++ b/polkadot/cli/src/command.rs
@@ -23,14 +23,15 @@ use polkadot_service::{
 	benchmarking::{benchmark_inherent_data, RemarkBuilder, TransferKeepAliveBuilder},
 	HeaderBackend, IdentifyVariant,
 };
+#[cfg(feature = "pyroscope")]
+use pyroscope_pprofrs::{pprof_backend, PprofConfig};
 use sc_cli::SubstrateCli;
 use sp_core::crypto::Ss58AddressFormatRegistry;
 use sp_keyring::Sr25519Keyring;
-use std::net::ToSocketAddrs;
 
 pub use crate::error::Error;
 #[cfg(feature = "pyroscope")]
-use pyroscope_pprofrs::{pprof_backend, PprofConfig};
+use std::net::ToSocketAddrs;
 
 type Result<T> = std::result::Result<T, Error>;
 
@@ -195,18 +196,6 @@ where
 		info!("----------------------------");
 	}
 
-	let jaeger_agent = if let Some(ref jaeger_agent) = cli.run.jaeger_agent {
-		Some(
-			jaeger_agent
-				.to_socket_addrs()
-				.map_err(Error::AddressResolutionFailure)?
-				.next()
-				.ok_or_else(|| Error::AddressResolutionMissing)?,
-		)
-	} else {
-		None
-	};
-
 	let node_version =
 		if cli.run.disable_worker_version_check { None } else { Some(NODE_VERSION.to_string()) };
 
@@ -227,7 +216,6 @@ where
 				is_parachain_node: polkadot_service::IsParachainNode::No,
 				enable_beefy,
 				force_authoring_backoff: cli.run.force_authoring_backoff,
-				jaeger_agent,
 				telemetry_worker_handle: None,
 				node_version,
 				secure_validator_mode,
@@ -306,7 +294,7 @@ pub fn run() -> Result<()> {
 
 			runner.async_run(|mut config| {
 				let (client, _, import_queue, task_manager) =
-					polkadot_service::new_chain_ops(&mut config, None)?;
+					polkadot_service::new_chain_ops(&mut config)?;
 				Ok((cmd.run(client, import_queue).map_err(Error::SubstrateCli), task_manager))
 			})
 		},
@@ -318,8 +306,7 @@ pub fn run() -> Result<()> {
 
 			Ok(runner.async_run(|mut config| {
 				let (client, _, _, task_manager) =
-					polkadot_service::new_chain_ops(&mut config, None)
-						.map_err(Error::PolkadotService)?;
+					polkadot_service::new_chain_ops(&mut config).map_err(Error::PolkadotService)?;
 				Ok((cmd.run(client, config.database).map_err(Error::SubstrateCli), task_manager))
 			})?)
 		},
@@ -330,8 +317,7 @@ pub fn run() -> Result<()> {
 			set_default_ss58_version(chain_spec);
 
 			Ok(runner.async_run(|mut config| {
-				let (client, _, _, task_manager) =
-					polkadot_service::new_chain_ops(&mut config, None)?;
+				let (client, _, _, task_manager) = polkadot_service::new_chain_ops(&mut config)?;
 				Ok((cmd.run(client, config.chain_spec).map_err(Error::SubstrateCli), task_manager))
 			})?)
 		},
@@ -343,7 +329,7 @@ pub fn run() -> Result<()> {
 
 			Ok(runner.async_run(|mut config| {
 				let (client, _, import_queue, task_manager) =
-					polkadot_service::new_chain_ops(&mut config, None)?;
+					polkadot_service::new_chain_ops(&mut config)?;
 				Ok((cmd.run(client, import_queue).map_err(Error::SubstrateCli), task_manager))
 			})?)
 		},
@@ -359,7 +345,7 @@ pub fn run() -> Result<()> {
 
 			Ok(runner.async_run(|mut config| {
 				let (client, backend, _, task_manager) =
-					polkadot_service::new_chain_ops(&mut config, None)?;
+					polkadot_service::new_chain_ops(&mut config)?;
 				let task_handle = task_manager.spawn_handle();
 				let aux_revert = Box::new(|client, backend, blocks| {
 					polkadot_service::revert_backend(client, backend, blocks, config, task_handle)
@@ -392,22 +378,21 @@ pub fn run() -> Result<()> {
 					.into()),
 				#[cfg(feature = "runtime-benchmarks")]
 				BenchmarkCmd::Storage(cmd) => runner.sync_run(|mut config| {
-					let (client, backend, _, _) =
-						polkadot_service::new_chain_ops(&mut config, None)?;
+					let (client, backend, _, _) = polkadot_service::new_chain_ops(&mut config)?;
 					let db = backend.expose_db();
 					let storage = backend.expose_storage();
 
 					cmd.run(config, client.clone(), db, storage).map_err(Error::SubstrateCli)
 				}),
 				BenchmarkCmd::Block(cmd) => runner.sync_run(|mut config| {
-					let (client, _, _, _) = polkadot_service::new_chain_ops(&mut config, None)?;
+					let (client, _, _, _) = polkadot_service::new_chain_ops(&mut config)?;
 
 					cmd.run(client.clone()).map_err(Error::SubstrateCli)
 				}),
 				// These commands are very similar and can be handled in nearly the same way.
 				BenchmarkCmd::Extrinsic(_) | BenchmarkCmd::Overhead(_) =>
 					runner.sync_run(|mut config| {
-						let (client, _, _, _) = polkadot_service::new_chain_ops(&mut config, None)?;
+						let (client, _, _, _) = polkadot_service::new_chain_ops(&mut config)?;
 						let header = client.header(client.info().genesis_hash).unwrap().unwrap();
 						let inherent_data = benchmark_inherent_data(header)
 							.map_err(|e| format!("generating inherent data: {:?}", e))?;
diff --git a/polkadot/node/collation-generation/src/tests.rs b/polkadot/node/collation-generation/src/tests.rs
index 0feee79e763..7f76988bb03 100644
--- a/polkadot/node/collation-generation/src/tests.rs
+++ b/polkadot/node/collation-generation/src/tests.rs
@@ -1090,7 +1090,6 @@ mod helpers {
 					unpin_handle: polkadot_node_subsystem_test_helpers::mock::dummy_unpin_handle(
 						activated_hash,
 					),
-					span: Arc::new(overseer::jaeger::Span::Disabled),
 				}),
 				..Default::default()
 			})))
diff --git a/polkadot/node/core/approval-voting-parallel/Cargo.toml b/polkadot/node/core/approval-voting-parallel/Cargo.toml
index e62062eab40..3a98cce80e9 100644
--- a/polkadot/node/core/approval-voting-parallel/Cargo.toml
+++ b/polkadot/node/core/approval-voting-parallel/Cargo.toml
@@ -24,7 +24,6 @@ polkadot-node-subsystem-util = { workspace = true, default-features = true }
 polkadot-overseer = { workspace = true, default-features = true }
 polkadot-primitives = { workspace = true, default-features = true }
 polkadot-node-primitives = { workspace = true, default-features = true }
-polkadot-node-jaeger = { workspace = true, default-features = true }
 polkadot-node-network-protocol = { workspace = true, default-features = true }
 polkadot-node-metrics = { workspace = true, default-features = true }
 
diff --git a/polkadot/node/core/av-store/Cargo.toml b/polkadot/node/core/av-store/Cargo.toml
index c867180e541..1d14e4cfba3 100644
--- a/polkadot/node/core/av-store/Cargo.toml
+++ b/polkadot/node/core/av-store/Cargo.toml
@@ -25,7 +25,6 @@ polkadot-overseer = { workspace = true, default-features = true }
 polkadot-primitives = { workspace = true, default-features = true }
 polkadot-node-primitives = { workspace = true, default-features = true }
 sp-consensus = { workspace = true }
-polkadot-node-jaeger = { workspace = true, default-features = true }
 
 [dev-dependencies]
 log = { workspace = true, default-features = true }
diff --git a/polkadot/node/core/av-store/src/lib.rs b/polkadot/node/core/av-store/src/lib.rs
index 7b245c9e3c5..9473040e8f5 100644
--- a/polkadot/node/core/av-store/src/lib.rs
+++ b/polkadot/node/core/av-store/src/lib.rs
@@ -39,7 +39,6 @@ use polkadot_node_subsystem_util::database::{DBTransaction, Database};
 use sp_consensus::SyncOracle;
 
 use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec};
-use polkadot_node_jaeger as jaeger;
 use polkadot_node_primitives::{AvailableData, ErasureChunk};
 use polkadot_node_subsystem::{
 	errors::{ChainApiError, RuntimeApiError},
@@ -1315,10 +1314,6 @@ fn store_available_data(
 		},
 	};
 
-	let erasure_span = jaeger::Span::new(candidate_hash, "erasure-coding")
-		.with_candidate(candidate_hash)
-		.with_pov(&available_data.pov);
-
 	// Important note: This check below is critical for consensus and the `backing` subsystem relies
 	// on it to ensure candidate validity.
 	let chunks = polkadot_erasure_coding::obtain_chunks_v1(n_validators, &available_data)?;
@@ -1328,8 +1323,6 @@ fn store_available_data(
 		return Err(Error::InvalidErasureRoot)
 	}
 
-	drop(erasure_span);
-
 	let erasure_chunks: Vec<_> = chunks
 		.iter()
 		.zip(branches.map(|(proof, _)| proof))
diff --git a/polkadot/node/core/bitfield-signing/src/lib.rs b/polkadot/node/core/bitfield-signing/src/lib.rs
index e3effb7949e..474de1c66ab 100644
--- a/polkadot/node/core/bitfield-signing/src/lib.rs
+++ b/polkadot/node/core/bitfield-signing/src/lib.rs
@@ -27,10 +27,9 @@ use futures::{
 	FutureExt,
 };
 use polkadot_node_subsystem::{
-	jaeger,
 	messages::{AvailabilityStoreMessage, BitfieldDistributionMessage},
-	overseer, ActivatedLeaf, FromOrchestra, OverseerSignal, PerLeafSpan, SpawnedSubsystem,
-	SubsystemError, SubsystemResult,
+	overseer, ActivatedLeaf, FromOrchestra, OverseerSignal, SpawnedSubsystem, SubsystemError,
+	SubsystemResult,
 };
 use polkadot_node_subsystem_util::{
 	self as util, request_availability_cores, runtime::recv_runtime, Validator,
@@ -80,11 +79,8 @@ async fn get_core_availability(
 	core: &CoreState,
 	validator_index: ValidatorIndex,
 	sender: &Mutex<&mut impl overseer::BitfieldSigningSenderTrait>,
-	span: &jaeger::Span,
 ) -> Result<bool, Error> {
 	if let CoreState::Occupied(core) = core {
-		let _span = span.child("query-chunk-availability");
-
 		let (tx, rx) = oneshot::channel();
 		sender
 			.lock()
@@ -118,15 +114,12 @@ async fn get_core_availability(
 ///   prone to false negatives)
 async fn construct_availability_bitfield(
 	relay_parent: Hash,
-	span: &jaeger::Span,
 	validator_idx: ValidatorIndex,
 	sender: &mut impl overseer::BitfieldSigningSenderTrait,
 ) -> Result<AvailabilityBitfield, Error> {
 	// get the set of availability cores from the runtime
-	let availability_cores = {
-		let _span = span.child("get-availability-cores");
-		recv_runtime(request_availability_cores(relay_parent, sender).await).await?
-	};
+	let availability_cores =
+		{ recv_runtime(request_availability_cores(relay_parent, sender).await).await? };
 
 	// Wrap the sender in a Mutex to share it between the futures.
 	//
@@ -140,7 +133,7 @@ async fn construct_availability_bitfield(
 	let results = future::try_join_all(
 		availability_cores
 			.iter()
-			.map(|core| get_core_availability(core, validator_idx, &sender, span)),
+			.map(|core| get_core_availability(core, validator_idx, &sender)),
 	)
 	.await?;
 
@@ -234,8 +227,6 @@ async fn handle_active_leaves_update<Sender>(
 where
 	Sender: overseer::BitfieldSigningSenderTrait,
 {
-	let span = PerLeafSpan::new(leaf.span, "bitfield-signing");
-	let span_delay = span.child("delay");
 	let wait_until = Instant::now() + SPAWNED_TASK_DELAY;
 
 	// now do all the work we can before we need to wait for the availability store
@@ -253,28 +244,16 @@ where
 	// SPAWNED_TASK_DELAY each time.
 	let _timer = metrics.time_run();
 
-	drop(span_delay);
-	let span_availability = span.child("availability");
-
-	let bitfield = match construct_availability_bitfield(
-		leaf.hash,
-		&span_availability,
-		validator.index(),
-		&mut sender,
-	)
-	.await
-	{
-		Err(Error::Runtime(runtime_err)) => {
-			// Don't take down the node on runtime API errors.
-			gum::warn!(target: LOG_TARGET, err = ?runtime_err, "Encountered a runtime API error");
-			return Ok(())
-		},
-		Err(err) => return Err(err),
-		Ok(bitfield) => bitfield,
-	};
-
-	drop(span_availability);
-	let span_signing = span.child("signing");
+	let bitfield =
+		match construct_availability_bitfield(leaf.hash, validator.index(), &mut sender).await {
+			Err(Error::Runtime(runtime_err)) => {
+				// Don't take down the node on runtime API errors.
+				gum::warn!(target: LOG_TARGET, err = ?runtime_err, "Encountered a runtime API error");
+				return Ok(())
+			},
+			Err(err) => return Err(err),
+			Ok(bitfield) => bitfield,
+		};
 
 	let signed_bitfield =
 		match validator.sign(keystore, bitfield).map_err(|e| Error::Keystore(e))? {
@@ -290,9 +269,6 @@ where
 
 	metrics.on_bitfield_signed();
 
-	drop(span_signing);
-	let _span_gossip = span.child("gossip");
-
 	sender
 		.send_message(BitfieldDistributionMessage::DistributeBitfield(leaf.hash, signed_bitfield))
 		.await;
diff --git a/polkadot/node/core/bitfield-signing/src/tests.rs b/polkadot/node/core/bitfield-signing/src/tests.rs
index eeaa524d1c6..c08018375cf 100644
--- a/polkadot/node/core/bitfield-signing/src/tests.rs
+++ b/polkadot/node/core/bitfield-signing/src/tests.rs
@@ -40,13 +40,8 @@ fn construct_availability_bitfield_works() {
 		let validator_index = ValidatorIndex(1u32);
 
 		let (mut sender, mut receiver) = polkadot_node_subsystem_test_helpers::sender_receiver();
-		let future = construct_availability_bitfield(
-			relay_parent,
-			&jaeger::Span::Disabled,
-			validator_index,
-			&mut sender,
-		)
-		.fuse();
+		let future =
+			construct_availability_bitfield(relay_parent, validator_index, &mut sender).fuse();
 		pin_mut!(future);
 
 		let hash_a = CandidateHash(Hash::repeat_byte(1));
diff --git a/polkadot/node/core/candidate-validation/src/tests.rs b/polkadot/node/core/candidate-validation/src/tests.rs
index 17ca67889f6..46de55e4836 100644
--- a/polkadot/node/core/candidate-validation/src/tests.rs
+++ b/polkadot/node/core/candidate-validation/src/tests.rs
@@ -1215,7 +1215,6 @@ fn dummy_active_leaves_update(hash: Hash) -> ActiveLeavesUpdate {
 			hash,
 			number: 10,
 			unpin_handle: polkadot_node_subsystem_test_helpers::mock::dummy_unpin_handle(hash),
-			span: Arc::new(overseer::jaeger::Span::Disabled),
 		}),
 		..Default::default()
 	}
diff --git a/polkadot/node/core/provisioner/src/lib.rs b/polkadot/node/core/provisioner/src/lib.rs
index ffc5859b775..9a06d9cff0c 100644
--- a/polkadot/node/core/provisioner/src/lib.rs
+++ b/polkadot/node/core/provisioner/src/lib.rs
@@ -27,13 +27,12 @@ use futures_timer::Delay;
 use schnellru::{ByLength, LruMap};
 
 use polkadot_node_subsystem::{
-	jaeger,
 	messages::{
 		Ancestors, CandidateBackingMessage, ChainApiMessage, ProspectiveParachainsMessage,
 		ProvisionableData, ProvisionerInherentData, ProvisionerMessage, RuntimeApiRequest,
 	},
-	overseer, ActivatedLeaf, ActiveLeavesUpdate, FromOrchestra, OverseerSignal, PerLeafSpan,
-	SpawnedSubsystem, SubsystemError,
+	overseer, ActivatedLeaf, ActiveLeavesUpdate, FromOrchestra, OverseerSignal, SpawnedSubsystem,
+	SubsystemError,
 };
 use polkadot_node_subsystem_util::{
 	has_required_runtime, request_availability_cores, request_persisted_validation_data,
@@ -95,13 +94,10 @@ pub struct PerRelayParent {
 	signed_bitfields: Vec<SignedAvailabilityBitfield>,
 	is_inherent_ready: bool,
 	awaiting_inherent: Vec<oneshot::Sender<ProvisionerInherentData>>,
-	span: PerLeafSpan,
 }
 
 impl PerRelayParent {
 	fn new(leaf: ActivatedLeaf, per_session: &PerSession) -> Self {
-		let span = PerLeafSpan::new(leaf.span.clone(), "provisioner");
-
 		Self {
 			leaf,
 			backed_candidates: Vec::new(),
@@ -110,7 +106,6 @@ impl PerRelayParent {
 			signed_bitfields: Vec::new(),
 			is_inherent_ready: false,
 			awaiting_inherent: Vec::new(),
-			span,
 		}
 	}
 }
@@ -270,12 +265,11 @@ async fn handle_communication<Context>(
 		},
 		ProvisionerMessage::ProvisionableData(relay_parent, data) => {
 			if let Some(state) = per_relay_parent.get_mut(&relay_parent) {
-				let span = state.span.child("provisionable-data");
 				let _timer = metrics.time_provisionable_data();
 
 				gum::trace!(target: LOG_TARGET, ?relay_parent, "Received provisionable data: {:?}", &data);
 
-				note_provisionable_data(state, &span, data);
+				note_provisionable_data(state, data);
 			}
 		},
 	}
@@ -295,12 +289,10 @@ async fn send_inherent_data_bg<Context>(
 	let backed_candidates = per_relay_parent.backed_candidates.clone();
 	let mode = per_relay_parent.prospective_parachains_mode;
 	let elastic_scaling_mvp = per_relay_parent.elastic_scaling_mvp;
-	let span = per_relay_parent.span.child("req-inherent-data");
 
 	let mut sender = ctx.sender().clone();
 
 	let bg = async move {
-		let _span = span;
 		let _timer = metrics.time_request_inherent_data();
 
 		gum::trace!(
@@ -359,7 +351,6 @@ async fn send_inherent_data_bg<Context>(
 
 fn note_provisionable_data(
 	per_relay_parent: &mut PerRelayParent,
-	span: &jaeger::Span,
 	provisionable_data: ProvisionableData,
 ) {
 	match provisionable_data {
@@ -373,10 +364,7 @@ fn note_provisionable_data(
 				para = ?backed_candidate.descriptor().para_id,
 				"noted backed candidate",
 			);
-			let _span = span
-				.child("provisionable-backed")
-				.with_candidate(candidate_hash)
-				.with_para_id(backed_candidate.descriptor().para_id);
+
 			per_relay_parent.backed_candidates.push(backed_candidate);
 		},
 		// We choose not to punish these forms of misbehavior for the time being.
diff --git a/polkadot/node/jaeger/Cargo.toml b/polkadot/node/jaeger/Cargo.toml
deleted file mode 100644
index 8615041bdaf..00000000000
--- a/polkadot/node/jaeger/Cargo.toml
+++ /dev/null
@@ -1,23 +0,0 @@
-[package]
-name = "polkadot-node-jaeger"
-version = "7.0.0"
-authors.workspace = true
-edition.workspace = true
-license.workspace = true
-description = "Polkadot Jaeger primitives, but equally useful for Grafana/Tempo"
-
-[lints]
-workspace = true
-
-[dependencies]
-mick-jaeger = { workspace = true }
-parking_lot = { workspace = true, default-features = true }
-polkadot-primitives = { workspace = true, default-features = true }
-polkadot-node-primitives = { workspace = true, default-features = true }
-sc-network = { workspace = true, default-features = true }
-sc-network-types = { workspace = true, default-features = true }
-sp-core = { workspace = true, default-features = true }
-thiserror = { workspace = true }
-tokio = { workspace = true, default-features = true }
-log = { workspace = true, default-features = true }
-codec = { workspace = true }
diff --git a/polkadot/node/jaeger/src/config.rs b/polkadot/node/jaeger/src/config.rs
deleted file mode 100644
index 702a22e1245..00000000000
--- a/polkadot/node/jaeger/src/config.rs
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (C) Parity Technologies (UK) Ltd.
-// This file is part of Polkadot.
-
-// Polkadot is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// Polkadot is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.
-
-//! Polkadot Jaeger configuration.
-
-/// Configuration for the jaeger tracing.
-#[derive(Clone)]
-pub struct JaegerConfig {
-	pub(crate) node_name: String,
-	pub(crate) agent_addr: std::net::SocketAddr,
-}
-
-impl std::default::Default for JaegerConfig {
-	fn default() -> Self {
-		Self {
-			node_name: "unknown_".to_owned(),
-			agent_addr: "127.0.0.1:6831"
-				.parse()
-				.expect(r#"Static "127.0.0.1:6831" is a valid socket address string. qed"#),
-		}
-	}
-}
-
-impl JaegerConfig {
-	/// Use the builder pattern to construct a configuration.
-	pub fn builder() -> JaegerConfigBuilder {
-		JaegerConfigBuilder::default()
-	}
-}
-
-/// Jaeger configuration builder.
-#[derive(Default)]
-pub struct JaegerConfigBuilder {
-	inner: JaegerConfig,
-}
-
-impl JaegerConfigBuilder {
-	/// Set the name for this node.
-	pub fn named<S>(mut self, name: S) -> Self
-	where
-		S: AsRef<str>,
-	{
-		self.inner.node_name = name.as_ref().to_owned();
-		self
-	}
-
-	/// Set the agent address to send the collected spans to.
-	pub fn agent<U>(mut self, addr: U) -> Self
-	where
-		U: Into<std::net::SocketAddr>,
-	{
-		self.inner.agent_addr = addr.into();
-		self
-	}
-
-	/// Construct the configuration.
-	pub fn build(self) -> JaegerConfig {
-		self.inner
-	}
-}
diff --git a/polkadot/node/jaeger/src/errors.rs b/polkadot/node/jaeger/src/errors.rs
deleted file mode 100644
index adedda34c7f..00000000000
--- a/polkadot/node/jaeger/src/errors.rs
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) Parity Technologies (UK) Ltd.
-// This file is part of Polkadot.
-
-// Polkadot is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// Polkadot is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.
-
-//! Polkadot Jaeger error definitions.
-
-/// A description of an error during jaeger initialization.
-#[derive(Debug, thiserror::Error)]
-#[allow(missing_docs)]
-pub enum JaegerError {
-	#[error("Already launched the collector thread")]
-	AlreadyLaunched,
-
-	#[error("Missing jaeger configuration")]
-	MissingConfiguration,
-}
diff --git a/polkadot/node/jaeger/src/lib.rs b/polkadot/node/jaeger/src/lib.rs
deleted file mode 100644
index 2ce5b8b6eb6..00000000000
--- a/polkadot/node/jaeger/src/lib.rs
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright (C) Parity Technologies (UK) Ltd.
-// This file is part of Polkadot.
-
-// Polkadot is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// Polkadot is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.
-
-//! Polkadot Jaeger related primitives
-//!
-//! Provides primitives used by Polkadot for interfacing with Jaeger.
-//!
-//! # Integration
-//!
-//! See <https://www.jaegertracing.io/> for an introduction.
-//!
-//! The easiest way to try Jaeger is:
-//!
-//! - Start a docker container with the all-in-one docker image (see below).
-//! - Open your browser and navigate to <https://localhost:16686> to access the UI.
-//!
-//! The all-in-one image can be started with:
-//!
-//! ```not_rust
-//! podman login docker.io
-//! podman run -d --name jaeger \
-//!  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-//!  -p 5775:5775/udp \
-//!  -p 6831:6831/udp \
-//!  -p 6832:6832/udp \
-//!  -p 5778:5778 \
-//!  -p 16686:16686 \
-//!  -p 14268:14268 \
-//!  -p 14250:14250 \
-//!  -p 9411:9411 \
-//!  docker.io/jaegertracing/all-in-one:1.21
-//! ```
-
-#![forbid(unused_imports)]
-
-mod config;
-mod errors;
-mod spans;
-
-pub use self::{
-	config::{JaegerConfig, JaegerConfigBuilder},
-	errors::JaegerError,
-	spans::{hash_to_trace_identifier, PerLeafSpan, Span, Stage},
-};
-
-use self::spans::TraceIdentifier;
-
-use sp_core::traits::SpawnNamed;
-
-use parking_lot::RwLock;
-use std::{
-	result,
-	sync::{Arc, LazyLock},
-};
-
-static INSTANCE: LazyLock<RwLock<Jaeger>> = LazyLock::new(|| RwLock::new(Jaeger::None));
-
-/// Stateful convenience wrapper around [`mick_jaeger`].
-pub enum Jaeger {
-	/// Launched and operational state.
-	Launched {
-		/// [`mick_jaeger`] provided API to record spans to.
-		traces_in: Arc<mick_jaeger::TracesIn>,
-	},
-	/// Preparation state with the necessary config to launch the collector.
-	Prep(JaegerConfig),
-	/// Uninitialized, suggests wrong API usage if encountered.
-	None,
-}
-
-impl Jaeger {
-	/// Spawn the jaeger instance.
-	pub fn new(cfg: JaegerConfig) -> Self {
-		Jaeger::Prep(cfg)
-	}
-
-	/// Spawn the background task in order to send the tracing information out via UDP
-	#[cfg(target_os = "unknown")]
-	pub fn launch<S: SpawnNamed>(self, _spawner: S) -> result::Result<(), JaegerError> {
-		Ok(())
-	}
-
-	/// Provide a no-thrills test setup helper.
-	#[cfg(test)]
-	pub fn test_setup() {
-		let mut instance = INSTANCE.write();
-		match *instance {
-			Self::Launched { .. } => {},
-			_ => {
-				let (traces_in, _traces_out) = mick_jaeger::init(mick_jaeger::Config {
-					service_name: "polkadot-jaeger-test".to_owned(),
-				});
-				*instance = Self::Launched { traces_in };
-			},
-		}
-	}
-
-	/// Spawn the background task in order to send the tracing information out via UDP
-	#[cfg(not(target_os = "unknown"))]
-	pub fn launch<S: SpawnNamed>(self, spawner: S) -> result::Result<(), JaegerError> {
-		let cfg = match self {
-			Self::Prep(cfg) => Ok(cfg),
-			Self::Launched { .. } => return Err(JaegerError::AlreadyLaunched),
-			Self::None => Err(JaegerError::MissingConfiguration),
-		}?;
-
-		let jaeger_agent = cfg.agent_addr;
-
-		log::info!("🐹 Collecting jaeger spans for {:?}", &jaeger_agent);
-
-		let (traces_in, mut traces_out) = mick_jaeger::init(mick_jaeger::Config {
-			service_name: format!("polkadot-{}", cfg.node_name),
-		});
-
-		// Spawn a background task that pulls span information and sends them on the network.
-		spawner.spawn(
-			"jaeger-collector",
-			Some("jaeger"),
-			Box::pin(async move {
-				match tokio::net::UdpSocket::bind("0.0.0.0:0").await {
-					Ok(udp_socket) => loop {
-						let buf = traces_out.next().await;
-						// UDP sending errors happen only either if the API is misused or in case of
-						// missing privilege.
-						if let Err(e) = udp_socket.send_to(&buf, jaeger_agent).await {
-							log::debug!(target: "jaeger", "UDP send error: {}", e);
-						}
-					},
-					Err(e) => {
-						log::warn!(target: "jaeger", "UDP socket open error: {}", e);
-					},
-				}
-			}),
-		);
-
-		*INSTANCE.write() = Self::Launched { traces_in };
-		Ok(())
-	}
-
-	/// Create a span, but defer the evaluation/transformation into a `TraceIdentifier`.
-	///
-	/// The deferral allows to avoid the additional CPU runtime cost in case of
-	/// items that are not a pre-computed hash by themselves.
-	pub(crate) fn span<F>(&self, lazy_hash: F, span_name: &'static str) -> Option<mick_jaeger::Span>
-	where
-		F: Fn() -> TraceIdentifier,
-	{
-		if let Self::Launched { traces_in, .. } = self {
-			let ident = lazy_hash();
-			let trace_id = std::num::NonZeroU128::new(ident)?;
-			Some(traces_in.span(trace_id, span_name))
-		} else {
-			None
-		}
-	}
-}
diff --git a/polkadot/node/jaeger/src/spans.rs b/polkadot/node/jaeger/src/spans.rs
deleted file mode 100644
index efc1a9f91d1..00000000000
--- a/polkadot/node/jaeger/src/spans.rs
+++ /dev/null
@@ -1,520 +0,0 @@
-// Copyright (C) Parity Technologies (UK) Ltd.
-// This file is part of Polkadot.
-
-// Polkadot is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// Polkadot is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.
-
-//! Polkadot Jaeger span definitions.
-//!
-//! ```rust
-//! # use polkadot_primitives::{CandidateHash, Hash};
-//! # fn main() {
-//! use polkadot_node_jaeger as jaeger;
-//!
-//! let relay_parent = Hash::default();
-//! let candidate = CandidateHash::default();
-//!
-//! #[derive(Debug, Default)]
-//! struct Foo {
-//! 	a: u8,
-//! 	b: u16,
-//! 	c: u32,
-//! };
-//!
-//! let foo = Foo::default();
-//!
-//! let span =
-//! 	jaeger::Span::new(relay_parent, "root_of_aaall_spans")
-//! 		// explicit well defined items
-//! 		.with_candidate(candidate)
-//! 		// anything that implements `trait std::fmt::Debug`
-//! 		.with_string_fmt_debug_tag("foo", foo)
-//! 		// anything that implements `trait std::str::ToString`
-//! 		.with_string_tag("again", 1337_u32)
-//! 		// add a `Stage` for [`dot-jaeger`](https://github.com/paritytech/dot-jaeger)
-//! 		.with_stage(jaeger::Stage::CandidateBacking);
-//! 		// complete by design, no completion required
-//! # }
-//! ```
-//!
-//! In a few cases additional annotations might want to be added
-//! over the course of a function, for this purpose use the non-consuming
-//! `fn` variants, i.e.
-//! ```rust
-//! # use polkadot_primitives::{CandidateHash, Hash};
-//! # fn main() {
-//! # use polkadot_node_jaeger as jaeger;
-//!
-//! # let relay_parent = Hash::default();
-//! # let candidate = CandidateHash::default();
-//!
-//! # #[derive(Debug, Default)]
-//! # struct Foo {
-//! # 	a: u8,
-//! # 	b: u16,
-//! # 	c: u32,
-//! # };
-//! #
-//! # let foo = Foo::default();
-//!
-//! let root_span =
-//! 	jaeger::Span::new(relay_parent, "root_of_aaall_spans");
-//!
-//! // the preferred way of adding additional delayed information:
-//! let span = root_span.child("inner");
-//!
-//! // ... more operations ...
-//!
-//! // but this is also possible:
-//!
-//! let mut root_span = root_span;
-//! root_span.add_string_fmt_debug_tag("foo_constructed", &foo);
-//! root_span.add_string_tag("bar", true);
-//! # }
-//! ```
-
-use codec::Encode;
-use polkadot_node_primitives::PoV;
-use polkadot_primitives::{
-	BlakeTwo256, CandidateHash, ChunkIndex, Hash, HashT, Id as ParaId, ValidatorIndex,
-};
-use sc_network_types::PeerId;
-
-use std::{fmt, sync::Arc};
-
-use super::INSTANCE;
-
-/// A special "per leaf span".
-///
-/// Essentially this span wraps two spans:
-///
-/// 1. The span that is created per leaf in the overseer.
-/// 2. Some child span of the per-leaf span.
-///
-/// This just works as auxiliary structure to easily store both.
-#[derive(Debug)]
-pub struct PerLeafSpan {
-	leaf_span: Arc<Span>,
-	span: Span,
-}
-
-impl PerLeafSpan {
-	/// Creates a new instance.
-	///
-	/// Takes the `leaf_span` that is created by the overseer per leaf and a name for a child span.
-	/// Both will be stored in this object, while the child span is implicitly accessible by using
-	/// the [`Deref`](std::ops::Deref) implementation.
-	pub fn new(leaf_span: Arc<Span>, name: &'static str) -> Self {
-		let span = leaf_span.child(name);
-
-		Self { span, leaf_span }
-	}
-
-	/// Returns the leaf span.
-	pub fn leaf_span(&self) -> &Arc<Span> {
-		&self.leaf_span
-	}
-}
-
-/// Returns a reference to the child span.
-impl std::ops::Deref for PerLeafSpan {
-	type Target = Span;
-
-	fn deref(&self) -> &Span {
-		&self.span
-	}
-}
-
-/// A helper to annotate the stage with a numerical value
-/// to ease the life of the tooling team creating viable
-/// statistical metrics for which stage of the inclusion
-/// pipeline drops a significant amount of candidates,
-/// statistically speaking.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-#[repr(u8)]
-#[non_exhaustive]
-pub enum Stage {
-	CandidateBacking = 2,
-	StatementDistribution = 3,
-	PoVDistribution = 4,
-	AvailabilityDistribution = 5,
-	AvailabilityRecovery = 6,
-	BitfieldDistribution = 7,
-	ApprovalChecking = 8,
-	ApprovalDistribution = 9,
-	// Expand as needed, numbers should be ascending according to the stage
-	// through the inclusion pipeline, or according to the descriptions
-	// in [the path of a para chain block]
-	// (https://polkadot.network/the-path-of-a-parachain-block/)
-	// see [issue](https://github.com/paritytech/polkadot/issues/2389)
-}
-
-/// A wrapper type for a span.
-///
-/// Handles running with and without jaeger.
-pub enum Span {
-	/// Running with jaeger being enabled.
-	Enabled(mick_jaeger::Span),
-	/// Running with jaeger disabled.
-	Disabled,
-}
-
-/// Alias for the 16 byte unique identifier used with jaeger.
-pub(crate) type TraceIdentifier = u128;
-
-/// A helper to convert the hash to the fixed size representation
-/// needed for jaeger.
-#[inline]
-pub fn hash_to_trace_identifier(hash: Hash) -> TraceIdentifier {
-	let mut buf = [0u8; 16];
-	buf.copy_from_slice(&hash.as_ref()[0..16]);
-	// The slice bytes are copied in reading order, so if interpreted
-	// in string form by a human, that means lower indices have higher
-	// values and hence corresponds to BIG endian ordering of the individual
-	// bytes.
-	u128::from_be_bytes(buf) as TraceIdentifier
-}
-
-/// Helper to unify lazy proxy evaluation.
-pub trait LazyIdent {
-	/// Evaluate the type to a unique trace identifier.
-	/// Called lazily on demand.
-	fn eval(&self) -> TraceIdentifier;
-
-	/// Annotate a new root item with these additional spans
-	/// at construction.
-	fn extra_tags(&self, _span: &mut Span) {}
-}
-
-impl<'a> LazyIdent for &'a [u8] {
-	fn eval(&self) -> TraceIdentifier {
-		hash_to_trace_identifier(BlakeTwo256::hash_of(self))
-	}
-}
-
-impl LazyIdent for &PoV {
-	fn eval(&self) -> TraceIdentifier {
-		hash_to_trace_identifier(self.hash())
-	}
-
-	fn extra_tags(&self, span: &mut Span) {
-		span.add_pov(self)
-	}
-}
-
-impl LazyIdent for Hash {
-	fn eval(&self) -> TraceIdentifier {
-		hash_to_trace_identifier(*self)
-	}
-
-	fn extra_tags(&self, span: &mut Span) {
-		span.add_string_fmt_debug_tag("relay-parent", self);
-	}
-}
-
-impl LazyIdent for &Hash {
-	fn eval(&self) -> TraceIdentifier {
-		hash_to_trace_identifier(**self)
-	}
-
-	fn extra_tags(&self, span: &mut Span) {
-		span.add_string_fmt_debug_tag("relay-parent", self);
-	}
-}
-
-impl LazyIdent for CandidateHash {
-	fn eval(&self) -> TraceIdentifier {
-		hash_to_trace_identifier(self.0)
-	}
-
-	fn extra_tags(&self, span: &mut Span) {
-		span.add_string_fmt_debug_tag("candidate-hash", &self.0);
-		// A convenience for usage with the grafana tempo UI,
-		// not a technical requirement. It merely provides an easy anchor
-		// where the true trace identifier of the span is not based on
-		// a candidate hash (which it should be!), but is required to
-		// continue investigating.
-		span.add_string_tag("traceID", self.eval().to_string());
-	}
-}
-
-impl Span {
-	/// Creates a new span builder based on anything that can be lazily evaluated
-	/// to and identifier.
-	///
-	/// Attention: The primary identifier will be used for identification
-	/// and as such should be
-	pub fn new<I: LazyIdent>(identifier: I, span_name: &'static str) -> Span {
-		let mut span = INSTANCE
-			.read_recursive()
-			.span(|| <I as LazyIdent>::eval(&identifier), span_name)
-			.into();
-		<I as LazyIdent>::extra_tags(&identifier, &mut span);
-		span
-	}
-
-	/// Creates a new span builder based on an encodable type.
-	/// The encoded bytes are then used to derive the true trace identifier.
-	pub fn from_encodable<I: Encode>(identifier: I, span_name: &'static str) -> Span {
-		INSTANCE
-			.read_recursive()
-			.span(
-				move || {
-					let bytes = identifier.encode();
-					LazyIdent::eval(&bytes.as_slice())
-				},
-				span_name,
-			)
-			.into()
-	}
-
-	/// Derive a child span from `self`.
-	pub fn child(&self, name: &str) -> Self {
-		match self {
-			Self::Enabled(inner) => Self::Enabled(inner.child(name)),
-			Self::Disabled => Self::Disabled,
-		}
-	}
-
-	/// Attach a 'traceID' tag set to the decimal representation of the candidate hash.
-	#[inline(always)]
-	pub fn with_trace_id(mut self, candidate_hash: CandidateHash) -> Self {
-		self.add_string_tag("traceID", hash_to_trace_identifier(candidate_hash.0));
-		self
-	}
-
-	#[inline(always)]
-	pub fn with_string_tag<V: ToString>(mut self, tag: &'static str, val: V) -> Self {
-		self.add_string_tag::<V>(tag, val);
-		self
-	}
-
-	/// Attach a peer-id tag to the span.
-	#[inline(always)]
-	pub fn with_peer_id(self, peer: &PeerId) -> Self {
-		self.with_string_tag("peer-id", &peer.to_base58())
-	}
-
-	/// Attach a `peer-id` tag to the span when peer is present.
-	#[inline(always)]
-	pub fn with_optional_peer_id(self, peer: Option<&PeerId>) -> Self {
-		if let Some(peer) = peer {
-			self.with_peer_id(peer)
-		} else {
-			self
-		}
-	}
-
-	/// Attach a candidate hash to the span.
-	#[inline(always)]
-	pub fn with_candidate(self, candidate_hash: CandidateHash) -> Self {
-		self.with_string_fmt_debug_tag("candidate-hash", &candidate_hash.0)
-	}
-
-	/// Attach a para-id to the span.
-	#[inline(always)]
-	pub fn with_para_id(self, para_id: ParaId) -> Self {
-		self.with_int_tag("para-id", u32::from(para_id) as i64)
-	}
-
-	/// Attach a candidate stage.
-	/// Should always come with a `CandidateHash`.
-	#[inline(always)]
-	pub fn with_stage(self, stage: Stage) -> Self {
-		self.with_string_tag("candidate-stage", stage as u8)
-	}
-
-	#[inline(always)]
-	pub fn with_validator_index(self, validator: ValidatorIndex) -> Self {
-		self.with_string_tag("validator-index", &validator.0)
-	}
-
-	#[inline(always)]
-	pub fn with_chunk_index(self, chunk_index: ChunkIndex) -> Self {
-		self.with_string_tag("chunk-index", &chunk_index.0)
-	}
-
-	#[inline(always)]
-	pub fn with_relay_parent(self, relay_parent: Hash) -> Self {
-		self.with_string_fmt_debug_tag("relay-parent", relay_parent)
-	}
-
-	#[inline(always)]
-	pub fn with_claimed_validator_index(self, claimed_validator_index: ValidatorIndex) -> Self {
-		self.with_string_tag("claimed-validator", &claimed_validator_index.0)
-	}
-
-	#[inline(always)]
-	pub fn with_pov(mut self, pov: &PoV) -> Self {
-		self.add_pov(pov);
-		self
-	}
-
-	/// Add an additional int tag to the span without consuming.
-	///
-	/// Should be used sparingly, introduction of new types is preferred.
-	#[inline(always)]
-	pub fn with_int_tag(mut self, tag: &'static str, i: i64) -> Self {
-		self.add_int_tag(tag, i);
-		self
-	}
-
-	#[inline(always)]
-	pub fn with_uint_tag(mut self, tag: &'static str, u: u64) -> Self {
-		self.add_uint_tag(tag, u);
-		self
-	}
-
-	#[inline(always)]
-	pub fn with_string_fmt_debug_tag<V: fmt::Debug>(mut self, tag: &'static str, val: V) -> Self {
-		self.add_string_tag(tag, format!("{:?}", val));
-		self
-	}
-
-	/// Adds the `FollowsFrom` relationship to this span with respect to the given one.
-	#[inline(always)]
-	pub fn add_follows_from(&mut self, other: &Self) {
-		match (self, other) {
-			(Self::Enabled(ref mut inner), Self::Enabled(ref other_inner)) =>
-				inner.add_follows_from(&other_inner),
-			_ => {},
-		}
-	}
-
-	/// Add a PoV hash meta tag with lazy hash evaluation, without consuming the span.
-	#[inline(always)]
-	pub fn add_pov(&mut self, pov: &PoV) {
-		if self.is_enabled() {
-			// avoid computing the PoV hash if jaeger is not enabled
-			self.add_string_fmt_debug_tag("pov", pov.hash());
-		}
-	}
-
-	#[inline(always)]
-	pub fn add_para_id(&mut self, para_id: ParaId) {
-		self.add_int_tag("para-id", u32::from(para_id) as i64);
-	}
-
-	/// Add a string tag, without consuming the span.
-	pub fn add_string_tag<V: ToString>(&mut self, tag: &'static str, val: V) {
-		match self {
-			Self::Enabled(ref mut inner) => inner.add_string_tag(tag, val.to_string().as_str()),
-			Self::Disabled => {},
-		}
-	}
-
-	/// Add a string tag, without consuming the span.
-	pub fn add_string_fmt_debug_tag<V: fmt::Debug>(&mut self, tag: &'static str, val: V) {
-		match self {
-			Self::Enabled(ref mut inner) =>
-				inner.add_string_tag(tag, format!("{:?}", val).as_str()),
-			Self::Disabled => {},
-		}
-	}
-
-	pub fn add_int_tag(&mut self, tag: &'static str, value: i64) {
-		match self {
-			Self::Enabled(ref mut inner) => inner.add_int_tag(tag, value),
-			Self::Disabled => {},
-		}
-	}
-
-	pub fn add_uint_tag(&mut self, tag: &'static str, value: u64) {
-		match self {
-			Self::Enabled(ref mut inner) => inner.add_int_tag(tag, value as i64),
-			Self::Disabled => {},
-		}
-	}
-
-	/// Check whether jaeger is enabled
-	/// in order to avoid computational overhead.
-	pub const fn is_enabled(&self) -> bool {
-		match self {
-			Span::Enabled(_) => true,
-			_ => false,
-		}
-	}
-
-	/// Obtain the trace identifier for this set of spans.
-	pub fn trace_id(&self) -> Option<TraceIdentifier> {
-		match self {
-			Span::Enabled(inner) => Some(inner.trace_id().get()),
-			_ => None,
-		}
-	}
-}
-
-impl std::fmt::Debug for Span {
-	fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
-		write!(f, "<jaeger span>")
-	}
-}
-
-impl From<Option<mick_jaeger::Span>> for Span {
-	fn from(src: Option<mick_jaeger::Span>) -> Self {
-		if let Some(span) = src {
-			Self::Enabled(span)
-		} else {
-			Self::Disabled
-		}
-	}
-}
-
-impl From<mick_jaeger::Span> for Span {
-	fn from(src: mick_jaeger::Span) -> Self {
-		Self::Enabled(src)
-	}
-}
-
-#[cfg(test)]
-mod tests {
-	use super::*;
-	use crate::Jaeger;
-
-	// make sure to not use `::repeat_*()` based samples, since this does not verify endianness
-	const RAW: [u8; 32] = [
-		0xFF, 0xAA, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x78, 0x89, 0x9A, 0xAB, 0xBC, 0xCD, 0xDE,
-		0xEF, 0x00, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
-		0x0E, 0x0F,
-	];
-
-	#[test]
-	fn hash_derived_identifier_is_leading_16bytes() {
-		let candidate_hash = dbg!(Hash::from(&RAW));
-		let trace_id = dbg!(hash_to_trace_identifier(candidate_hash));
-		for (idx, (a, b)) in candidate_hash
-			.as_bytes()
-			.iter()
-			.take(16)
-			.zip(trace_id.to_be_bytes().iter())
-			.enumerate()
-		{
-			assert_eq!(*a, *b, "Index [{}] does not match: {} != {}", idx, a, b);
-		}
-	}
-
-	#[test]
-	fn extra_tags_do_not_change_trace_id() {
-		Jaeger::test_setup();
-		let candidate_hash = dbg!(Hash::from(&RAW));
-		let trace_id = hash_to_trace_identifier(candidate_hash);
-
-		let span = Span::new(candidate_hash, "foo");
-
-		assert_eq!(span.trace_id(), Some(trace_id));
-
-		let span = span.with_int_tag("tag", 7i64);
-
-		assert_eq!(span.trace_id(), Some(trace_id));
-	}
-}
diff --git a/polkadot/node/network/availability-distribution/src/lib.rs b/polkadot/node/network/availability-distribution/src/lib.rs
index d3185e0af80..43845381497 100644
--- a/polkadot/node/network/availability-distribution/src/lib.rs
+++ b/polkadot/node/network/availability-distribution/src/lib.rs
@@ -22,11 +22,9 @@ use polkadot_node_network_protocol::request_response::{
 	v1, v2, IncomingRequestReceiver, ReqProtocolNames,
 };
 use polkadot_node_subsystem::{
-	jaeger, messages::AvailabilityDistributionMessage, overseer, FromOrchestra, OverseerSignal,
+	messages::AvailabilityDistributionMessage, overseer, FromOrchestra, OverseerSignal,
 	SpawnedSubsystem, SubsystemError,
 };
-use polkadot_primitives::{BlockNumber, Hash};
-use std::collections::HashMap;
 
 /// Error and [`Result`] type for this subsystem.
 mod error;
@@ -104,7 +102,6 @@ impl AvailabilityDistributionSubsystem {
 	/// Start processing work as passed on from the Overseer.
 	async fn run<Context>(self, mut ctx: Context) -> std::result::Result<(), FatalError> {
 		let Self { mut runtime, recvs, metrics, req_protocol_names } = self;
-		let mut spans: HashMap<Hash, (BlockNumber, jaeger::PerLeafSpan)> = HashMap::new();
 
 		let IncomingRequestReceivers {
 			pov_req_receiver,
@@ -156,24 +153,16 @@ impl AvailabilityDistributionSubsystem {
 			};
 			match message {
 				FromOrchestra::Signal(OverseerSignal::ActiveLeaves(update)) => {
-					let cloned_leaf = match update.activated.clone() {
-						Some(activated) => activated,
-						None => continue,
-					};
-					let span =
-						jaeger::PerLeafSpan::new(cloned_leaf.span, "availability-distribution");
-					spans.insert(cloned_leaf.hash, (cloned_leaf.number, span));
 					log_error(
 						requester
 							.get_mut()
-							.update_fetching_heads(&mut ctx, &mut runtime, update, &spans)
+							.update_fetching_heads(&mut ctx, &mut runtime, update)
 							.await,
 						"Error in Requester::update_fetching_heads",
 						&mut warn_freq,
 					)?;
 				},
-				FromOrchestra::Signal(OverseerSignal::BlockFinalized(_hash, finalized_number)) => {
-					spans.retain(|_hash, (block_number, _span)| *block_number > finalized_number);
+				FromOrchestra::Signal(OverseerSignal::BlockFinalized(_hash, _finalized_number)) => {
 				},
 				FromOrchestra::Signal(OverseerSignal::Conclude) => return Ok(()),
 				FromOrchestra::Communication {
@@ -187,15 +176,6 @@ impl AvailabilityDistributionSubsystem {
 							tx,
 						},
 				} => {
-					let span = spans
-						.get(&relay_parent)
-						.map(|(_, span)| span.child("fetch-pov"))
-						.unwrap_or_else(|| jaeger::Span::new(&relay_parent, "fetch-pov"))
-						.with_trace_id(candidate_hash)
-						.with_candidate(candidate_hash)
-						.with_relay_parent(relay_parent)
-						.with_stage(jaeger::Stage::AvailabilityDistribution);
-
 					log_error(
 						pov_requester::fetch_pov(
 							&mut ctx,
@@ -207,7 +187,6 @@ impl AvailabilityDistributionSubsystem {
 							pov_hash,
 							tx,
 							metrics.clone(),
-							&span,
 						)
 						.await,
 						"pov_requester::fetch_pov",
diff --git a/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs b/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs
index 6c632fa7efe..5e26ae4b7a7 100644
--- a/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs
+++ b/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs
@@ -25,7 +25,6 @@ use polkadot_node_network_protocol::request_response::{
 };
 use polkadot_node_primitives::PoV;
 use polkadot_node_subsystem::{
-	jaeger,
 	messages::{IfDisconnected, NetworkBridgeTxMessage},
 	overseer,
 };
@@ -52,18 +51,7 @@ pub async fn fetch_pov<Context>(
 	pov_hash: Hash,
 	tx: oneshot::Sender<PoV>,
 	metrics: Metrics,
-	span: &jaeger::Span,
 ) -> Result<()> {
-	let _span = span
-		.child("fetch-pov")
-		.with_trace_id(candidate_hash)
-		.with_validator_index(from_validator)
-		.with_candidate(candidate_hash)
-		.with_para_id(para_id)
-		.with_relay_parent(parent)
-		.with_string_tag("pov-hash", format!("{:?}", pov_hash))
-		.with_stage(jaeger::Stage::AvailabilityDistribution);
-
 	let info = &runtime.get_session_info(ctx.sender(), parent).await?.session_info;
 	let authority_id = info
 		.discovery_keys
@@ -189,7 +177,6 @@ mod tests {
 				pov_hash,
 				tx,
 				Metrics::new_dummy(),
-				&jaeger::Span::Disabled,
 			)
 			.await
 			.expect("Should succeed");
diff --git a/polkadot/node/network/availability-distribution/src/requester/fetch_task/mod.rs b/polkadot/node/network/availability-distribution/src/requester/fetch_task/mod.rs
index 278608cc858..5be6f2d223a 100644
--- a/polkadot/node/network/availability-distribution/src/requester/fetch_task/mod.rs
+++ b/polkadot/node/network/availability-distribution/src/requester/fetch_task/mod.rs
@@ -31,7 +31,6 @@ use polkadot_node_network_protocol::request_response::{
 };
 use polkadot_node_primitives::ErasureChunk;
 use polkadot_node_subsystem::{
-	jaeger,
 	messages::{AvailabilityStoreMessage, IfDisconnected, NetworkBridgeTxMessage},
 	overseer,
 };
@@ -129,9 +128,6 @@ struct RunningTask {
 	/// Prometheus metrics for reporting results.
 	metrics: Metrics,
 
-	/// Span tracking the fetching of this chunk.
-	span: jaeger::Span,
-
 	/// Expected chunk index. We'll validate that the remote did send us the correct chunk (only
 	/// important for v2 requests).
 	chunk_index: ChunkIndex,
@@ -154,21 +150,9 @@ impl FetchTaskConfig {
 		metrics: Metrics,
 		session_info: &SessionInfo,
 		chunk_index: ChunkIndex,
-		span: jaeger::Span,
 		req_v1_protocol_name: ProtocolName,
 		req_v2_protocol_name: ProtocolName,
 	) -> Self {
-		let span = span
-			.child("fetch-task-config")
-			.with_trace_id(core.candidate_hash)
-			.with_string_tag("leaf", format!("{:?}", leaf))
-			.with_validator_index(session_info.our_index)
-			.with_chunk_index(chunk_index)
-			.with_uint_tag("group-index", core.group_responsible.0 as u64)
-			.with_relay_parent(core.candidate_descriptor.relay_parent)
-			.with_string_tag("pov-hash", format!("{:?}", core.candidate_descriptor.pov_hash))
-			.with_stage(jaeger::Stage::AvailabilityDistribution);
-
 		let live_in = vec![leaf].into_iter().collect();
 
 		// Don't run tasks for our backing group:
@@ -190,7 +174,6 @@ impl FetchTaskConfig {
 			relay_parent: core.candidate_descriptor.relay_parent,
 			metrics,
 			sender,
-			span,
 			chunk_index,
 			req_v1_protocol_name,
 			req_v2_protocol_name
@@ -279,7 +262,6 @@ impl RunningTask {
 		let mut bad_validators = Vec::new();
 		let mut succeeded = false;
 		let mut count: u32 = 0;
-		let mut span = self.span.child("run-fetch-chunk-task").with_relay_parent(self.relay_parent);
 		let mut network_error_freq = gum::Freq::new();
 		let mut canceled_freq = gum::Freq::new();
 		// Try validators in reverse order:
@@ -289,11 +271,7 @@ impl RunningTask {
 				self.metrics.on_retry();
 			}
 			count += 1;
-			let _chunk_fetch_span = span
-				.child("fetch-chunk-request")
-				.with_validator_index(self.request.index)
-				.with_chunk_index(self.chunk_index)
-				.with_stage(jaeger::Stage::AvailabilityDistribution);
+
 			// Send request:
 			let resp = match self
 				.do_request(&validator, &mut network_error_freq, &mut canceled_freq)
@@ -313,13 +291,7 @@ impl RunningTask {
 					continue
 				},
 			};
-			// We drop the span here, so that the span is not active while we recombine the chunk.
-			drop(_chunk_fetch_span);
-			let _chunk_recombine_span = span
-				.child("recombine-chunk")
-				.with_validator_index(self.request.index)
-				.with_chunk_index(self.chunk_index)
-				.with_stage(jaeger::Stage::AvailabilityDistribution);
+
 			let chunk = match resp {
 				Some(chunk) => chunk,
 				None => {
@@ -337,14 +309,6 @@ impl RunningTask {
 					continue
 				},
 			};
-			// We drop the span so that the span is not active whilst we validate and store the
-			// chunk.
-			drop(_chunk_recombine_span);
-			let _chunk_validate_and_store_span = span
-				.child("validate-and-store-chunk")
-				.with_validator_index(self.request.index)
-				.with_chunk_index(self.chunk_index)
-				.with_stage(jaeger::Stage::AvailabilityDistribution);
 
 			// Data genuine?
 			if !self.validate_chunk(&validator, &chunk, self.chunk_index) {
@@ -357,7 +321,6 @@ impl RunningTask {
 			succeeded = true;
 			break
 		}
-		span.add_int_tag("tries", count as _);
 		if succeeded {
 			self.metrics.on_fetch(SUCCEEDED);
 			self.conclude(bad_validators).await;
diff --git a/polkadot/node/network/availability-distribution/src/requester/fetch_task/tests.rs b/polkadot/node/network/availability-distribution/src/requester/fetch_task/tests.rs
index 2cd4bf29a56..9d4ac5bc4b1 100644
--- a/polkadot/node/network/availability-distribution/src/requester/fetch_task/tests.rs
+++ b/polkadot/node/network/availability-distribution/src/requester/fetch_task/tests.rs
@@ -365,7 +365,6 @@ fn get_test_running_task(
 			relay_parent: Hash::repeat_byte(71),
 			sender: tx,
 			metrics: Metrics::new_dummy(),
-			span: jaeger::Span::Disabled,
 			req_v1_protocol_name: req_protocol_names.get_name(Protocol::ChunkFetchingV1),
 			req_v2_protocol_name: req_protocol_names.get_name(Protocol::ChunkFetchingV2),
 			chunk_index,
diff --git a/polkadot/node/network/availability-distribution/src/requester/mod.rs b/polkadot/node/network/availability-distribution/src/requester/mod.rs
index 0175161af70..23382503272 100644
--- a/polkadot/node/network/availability-distribution/src/requester/mod.rs
+++ b/polkadot/node/network/availability-distribution/src/requester/mod.rs
@@ -31,7 +31,6 @@ use futures::{
 
 use polkadot_node_network_protocol::request_response::{v1, v2, IsRequest, ReqProtocolNames};
 use polkadot_node_subsystem::{
-	jaeger,
 	messages::{ChainApiMessage, RuntimeApiMessage},
 	overseer, ActivatedLeaf, ActiveLeavesUpdate,
 };
@@ -39,9 +38,7 @@ use polkadot_node_subsystem_util::{
 	availability_chunks::availability_chunk_index,
 	runtime::{get_occupied_cores, RuntimeInfo},
 };
-use polkadot_primitives::{
-	BlockNumber, CandidateHash, CoreIndex, Hash, OccupiedCore, SessionIndex,
-};
+use polkadot_primitives::{CandidateHash, CoreIndex, Hash, OccupiedCore, SessionIndex};
 
 use super::{FatalError, Metrics, Result, LOG_TARGET};
 
@@ -114,21 +111,13 @@ impl Requester {
 		ctx: &mut Context,
 		runtime: &mut RuntimeInfo,
 		update: ActiveLeavesUpdate,
-		spans: &HashMap<Hash, (BlockNumber, jaeger::PerLeafSpan)>,
 	) -> Result<()> {
 		gum::trace!(target: LOG_TARGET, ?update, "Update fetching heads");
 		let ActiveLeavesUpdate { activated, deactivated } = update;
 		if let Some(leaf) = activated {
-			let span = spans
-				.get(&leaf.hash)
-				.map(|(_, span)| span.child("update-fetching-heads"))
-				.unwrap_or_else(|| jaeger::Span::new(&leaf.hash, "update-fetching-heads"))
-				.with_string_tag("leaf", format!("{:?}", leaf.hash))
-				.with_stage(jaeger::Stage::AvailabilityDistribution);
-
 			// Order important! We need to handle activated, prior to deactivated, otherwise we
 			// might cancel still needed jobs.
-			self.start_requesting_chunks(ctx, runtime, leaf, &span).await?;
+			self.start_requesting_chunks(ctx, runtime, leaf).await?;
 		}
 
 		self.stop_requesting_chunks(deactivated.into_iter());
@@ -144,13 +133,7 @@ impl Requester {
 		ctx: &mut Context,
 		runtime: &mut RuntimeInfo,
 		new_head: ActivatedLeaf,
-		span: &jaeger::Span,
 	) -> Result<()> {
-		let mut span = span
-			.child("request-chunks-new-head")
-			.with_string_tag("leaf", format!("{:?}", new_head.hash))
-			.with_stage(jaeger::Stage::AvailabilityDistribution);
-
 		let sender = &mut ctx.sender().clone();
 		let ActivatedLeaf { hash: leaf, .. } = new_head;
 		let (leaf_session_index, ancestors_in_session) = get_block_ancestors_in_same_session(
@@ -160,15 +143,9 @@ impl Requester {
 			Self::LEAF_ANCESTRY_LEN_WITHIN_SESSION,
 		)
 		.await?;
-		span.add_uint_tag("ancestors-in-session", ancestors_in_session.len() as u64);
 
 		// Also spawn or bump tasks for candidates in ancestry in the same session.
 		for hash in std::iter::once(leaf).chain(ancestors_in_session) {
-			let span = span
-				.child("request-chunks-ancestor")
-				.with_string_tag("leaf", format!("{:?}", hash.clone()))
-				.with_stage(jaeger::Stage::AvailabilityDistribution);
-
 			let cores = get_occupied_cores(sender, hash).await?;
 			gum::trace!(
 				target: LOG_TARGET,
@@ -182,7 +159,7 @@ impl Requester {
 			// The next time the subsystem receives leaf update, some of spawned task will be bumped
 			// to be live in fresh relay parent, while some might get dropped due to the current
 			// leaf being deactivated.
-			self.add_cores(ctx, runtime, leaf, leaf_session_index, cores, span).await?;
+			self.add_cores(ctx, runtime, leaf, leaf_session_index, cores).await?;
 		}
 
 		Ok(())
@@ -211,22 +188,12 @@ impl Requester {
 		leaf: Hash,
 		leaf_session_index: SessionIndex,
 		cores: impl IntoIterator<Item = (CoreIndex, OccupiedCore)>,
-		span: jaeger::Span,
 	) -> Result<()> {
 		for (core_index, core) in cores {
-			let mut span = span
-				.child("check-fetch-candidate")
-				.with_trace_id(core.candidate_hash)
-				.with_string_tag("leaf", format!("{:?}", leaf))
-				.with_candidate(core.candidate_hash)
-				.with_stage(jaeger::Stage::AvailabilityDistribution);
-
 			if let Some(e) = self.fetches.get_mut(&core.candidate_hash) {
 				// Just book keeping - we are already requesting that chunk:
-				span.add_string_tag("already-requested-chunk", "true");
 				e.add_leaf(leaf);
 			} else {
-				span.add_string_tag("already-requested-chunk", "false");
 				let tx = self.tx.clone();
 				let metrics = self.metrics.clone();
 
@@ -272,7 +239,6 @@ impl Requester {
 						metrics,
 						session_info,
 						chunk_index,
-						span,
 						self.req_protocol_names.get_name(v1::ChunkFetchingRequest::PROTOCOL),
 						self.req_protocol_names.get_name(v2::ChunkFetchingRequest::PROTOCOL),
 					);
diff --git a/polkadot/node/network/availability-distribution/src/requester/tests.rs b/polkadot/node/network/availability-distribution/src/requester/tests.rs
index decb3156004..021f6da7e2e 100644
--- a/polkadot/node/network/availability-distribution/src/requester/tests.rs
+++ b/polkadot/node/network/availability-distribution/src/requester/tests.rs
@@ -15,9 +15,9 @@
 // along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.
 
 use futures::FutureExt;
-use std::{collections::HashMap, future::Future};
+use std::future::Future;
 
-use polkadot_node_network_protocol::{jaeger, request_response::ReqProtocolNames};
+use polkadot_node_network_protocol::request_response::ReqProtocolNames;
 use polkadot_node_primitives::{BlockData, ErasureChunk, PoV};
 use polkadot_node_subsystem_util::runtime::RuntimeInfo;
 use polkadot_primitives::{
@@ -208,7 +208,6 @@ fn check_ancestry_lookup_in_same_session() {
 
 	test_harness(test_state.clone(), |mut ctx| async move {
 		let chain = &test_state.relay_chain;
-		let spans: HashMap<Hash, (u32, jaeger::PerLeafSpan)> = HashMap::new();
 		let block_number = 1;
 		let update = ActiveLeavesUpdate {
 			activated: Some(new_leaf(chain[block_number], block_number as u32)),
@@ -216,7 +215,7 @@ fn check_ancestry_lookup_in_same_session() {
 		};
 
 		requester
-			.update_fetching_heads(&mut ctx, &mut runtime, update, &spans)
+			.update_fetching_heads(&mut ctx, &mut runtime, update)
 			.await
 			.expect("Leaf processing failed");
 		let fetch_tasks = &requester.fetches;
@@ -231,7 +230,7 @@ fn check_ancestry_lookup_in_same_session() {
 		};
 
 		requester
-			.update_fetching_heads(&mut ctx, &mut runtime, update, &spans)
+			.update_fetching_heads(&mut ctx, &mut runtime, update)
 			.await
 			.expect("Leaf processing failed");
 		let fetch_tasks = &requester.fetches;
@@ -252,7 +251,7 @@ fn check_ancestry_lookup_in_same_session() {
 			deactivated: vec![chain[1], chain[2]].into(),
 		};
 		requester
-			.update_fetching_heads(&mut ctx, &mut runtime, update, &spans)
+			.update_fetching_heads(&mut ctx, &mut runtime, update)
 			.await
 			.expect("Leaf processing failed");
 		let fetch_tasks = &requester.fetches;
@@ -281,7 +280,6 @@ fn check_ancestry_lookup_in_different_sessions() {
 
 	test_harness(test_state.clone(), |mut ctx| async move {
 		let chain = &test_state.relay_chain;
-		let spans: HashMap<Hash, (u32, jaeger::PerLeafSpan)> = HashMap::new();
 		let block_number = 3;
 		let update = ActiveLeavesUpdate {
 			activated: Some(new_leaf(chain[block_number], block_number as u32)),
@@ -289,7 +287,7 @@ fn check_ancestry_lookup_in_different_sessions() {
 		};
 
 		requester
-			.update_fetching_heads(&mut ctx, &mut runtime, update, &spans)
+			.update_fetching_heads(&mut ctx, &mut runtime, update)
 			.await
 			.expect("Leaf processing failed");
 		let fetch_tasks = &requester.fetches;
@@ -302,7 +300,7 @@ fn check_ancestry_lookup_in_different_sessions() {
 		};
 
 		requester
-			.update_fetching_heads(&mut ctx, &mut runtime, update, &spans)
+			.update_fetching_heads(&mut ctx, &mut runtime, update)
 			.await
 			.expect("Leaf processing failed");
 		let fetch_tasks = &requester.fetches;
@@ -315,7 +313,7 @@ fn check_ancestry_lookup_in_different_sessions() {
 		};
 
 		requester
-			.update_fetching_heads(&mut ctx, &mut runtime, update, &spans)
+			.update_fetching_heads(&mut ctx, &mut runtime, update)
 			.await
 			.expect("Leaf processing failed");
 		let fetch_tasks = &requester.fetches;
diff --git a/polkadot/node/network/availability-distribution/src/responder.rs b/polkadot/node/network/availability-distribution/src/responder.rs
index fb08c471250..6512fcb7f65 100644
--- a/polkadot/node/network/availability-distribution/src/responder.rs
+++ b/polkadot/node/network/availability-distribution/src/responder.rs
@@ -27,7 +27,7 @@ use polkadot_node_network_protocol::{
 	UnifiedReputationChange as Rep,
 };
 use polkadot_node_primitives::{AvailableData, ErasureChunk};
-use polkadot_node_subsystem::{jaeger, messages::AvailabilityStoreMessage, SubsystemSender};
+use polkadot_node_subsystem::{messages::AvailabilityStoreMessage, SubsystemSender};
 use polkadot_primitives::{CandidateHash, ValidatorIndex};
 
 use crate::{
@@ -193,8 +193,6 @@ pub async fn answer_pov_request<Sender>(
 where
 	Sender: SubsystemSender<AvailabilityStoreMessage>,
 {
-	let _span = jaeger::Span::new(req.payload.candidate_hash, "answer-pov-request");
-
 	let av_data = query_available_data(sender, req.payload.candidate_hash).await?;
 
 	let result = av_data.is_some();
@@ -228,12 +226,6 @@ where
 	// V1 and V2 requests have the same payload, so decoding into either one will work. It's the
 	// responses that differ, hence the `MakeResp` generic.
 	let payload: v1::ChunkFetchingRequest = req.payload.into();
-	let span = jaeger::Span::new(payload.candidate_hash, "answer-chunk-request");
-
-	let _child_span = span
-		.child("answer-chunk-request")
-		.with_trace_id(payload.candidate_hash)
-		.with_validator_index(payload.index);
 
 	let chunk = query_chunk(sender, payload.candidate_hash, payload.index).await?;
 
diff --git a/polkadot/node/network/availability-recovery/src/lib.rs b/polkadot/node/network/availability-recovery/src/lib.rs
index 167125f987a..114faa2859c 100644
--- a/polkadot/node/network/availability-recovery/src/lib.rs
+++ b/polkadot/node/network/availability-recovery/src/lib.rs
@@ -57,7 +57,6 @@ use polkadot_node_network_protocol::{
 use polkadot_node_primitives::AvailableData;
 use polkadot_node_subsystem::{
 	errors::RecoveryError,
-	jaeger,
 	messages::{AvailabilityRecoveryMessage, AvailabilityStoreMessage},
 	overseer, ActiveLeavesUpdate, FromOrchestra, OverseerSignal, SpawnedSubsystem,
 	SubsystemContext, SubsystemError,
@@ -387,9 +386,6 @@ async fn handle_recover<Context>(
 ) -> Result<()> {
 	let candidate_hash = receipt.hash();
 
-	let span = jaeger::Span::new(candidate_hash, "availability-recovery")
-		.with_stage(jaeger::Stage::AvailabilityRecovery);
-
 	if let Some(result) =
 		state.availability_lru.get(&candidate_hash).cloned().map(|v| v.into_result())
 	{
@@ -403,13 +399,11 @@ async fn handle_recover<Context>(
 		return Ok(())
 	}
 
-	let _span = span.child("not-cached");
 	let session_info_res = state
 		.runtime_info
 		.get_session_info_by_index(ctx.sender(), state.live_block.1, session_index)
 		.await;
 
-	let _span = span.child("session-info-ctx-received");
 	match session_info_res {
 		Ok(ExtendedSessionInfo { session_info, node_features, .. }) => {
 			let mut backer_group = None;
diff --git a/polkadot/node/network/bitfield-distribution/src/lib.rs b/polkadot/node/network/bitfield-distribution/src/lib.rs
index 029401e0bd5..3003f970a64 100644
--- a/polkadot/node/network/bitfield-distribution/src/lib.rs
+++ b/polkadot/node/network/bitfield-distribution/src/lib.rs
@@ -36,8 +36,8 @@ use polkadot_node_network_protocol::{
 	UnifiedReputationChange as Rep, Versioned, View,
 };
 use polkadot_node_subsystem::{
-	jaeger, messages::*, overseer, ActiveLeavesUpdate, FromOrchestra, OverseerSignal, PerLeafSpan,
-	SpawnedSubsystem, SubsystemError, SubsystemResult,
+	messages::*, overseer, ActiveLeavesUpdate, FromOrchestra, OverseerSignal, SpawnedSubsystem,
+	SubsystemError, SubsystemResult,
 };
 use polkadot_node_subsystem_util::{
 	self as util,
@@ -177,22 +177,14 @@ struct PerRelayParentData {
 	/// Track messages that were already received by a peer
 	/// to prevent flooding.
 	message_received_from_peer: HashMap<PeerId, HashSet<ValidatorId>>,
-
-	/// The span for this leaf/relay parent.
-	span: PerLeafSpan,
 }
 
 impl PerRelayParentData {
 	/// Create a new instance.
-	fn new(
-		signing_context: SigningContext,
-		validator_set: Vec<ValidatorId>,
-		span: PerLeafSpan,
-	) -> Self {
+	fn new(signing_context: SigningContext, validator_set: Vec<ValidatorId>) -> Self {
 		Self {
 			signing_context,
 			validator_set,
-			span,
 			one_per_validator: Default::default(),
 			message_sent_to_peer: Default::default(),
 			message_received_from_peer: Default::default(),
@@ -304,8 +296,6 @@ impl BitfieldDistribution {
 								let relay_parent = activated.hash;
 
 								gum::trace!(target: LOG_TARGET, ?relay_parent, "activated");
-								let span = PerLeafSpan::new(activated.span, "bitfield-distribution");
-								let _span = span.child("query-basics");
 
 								// query validator set and signing context per relay_parent once only
 								match query_basics(&mut ctx, relay_parent).await {
@@ -317,7 +307,7 @@ impl BitfieldDistribution {
 										// us anything to do with this relay-parent anyway.
 										let _ = state.per_relay_parent.insert(
 											relay_parent,
-											PerRelayParentData::new(signing_context, validator_set, span),
+											PerRelayParentData::new(signing_context, validator_set),
 										);
 									},
 									Err(err) => {
@@ -430,9 +420,7 @@ async fn relay_message<Context>(
 	rng: &mut (impl CryptoRng + Rng),
 ) {
 	let relay_parent = message.relay_parent;
-	let span = job_data.span.child("relay-msg");
 
-	let _span = span.child("provisionable");
 	// notify the overseer about a new and valid signed bitfield
 	ctx.send_message(ProvisionerMessage::ProvisionableData(
 		relay_parent,
@@ -440,11 +428,9 @@ async fn relay_message<Context>(
 	))
 	.await;
 
-	drop(_span);
 	let total_peers = peers.len();
 	let mut random_routing: RandomRouting = Default::default();
 
-	let _span = span.child("interested-peers");
 	// pass on the bitfield distribution to all interested peers
 	let interested_peers = peers
 		.iter()
@@ -487,8 +473,6 @@ async fn relay_message<Context>(
 			.insert(validator.clone());
 	});
 
-	drop(_span);
-
 	if interested_peers.is_empty() {
 		gum::trace!(
 			target: LOG_TARGET,
@@ -496,8 +480,6 @@ async fn relay_message<Context>(
 			"no peers are interested in gossip for relay parent",
 		);
 	} else {
-		let _span = span.child("gossip");
-
 		let v1_interested_peers =
 			filter_by_peer_version(&interested_peers, ValidationVersion::V1.into());
 		let v2_interested_peers =
@@ -594,14 +576,6 @@ async fn process_incoming_peer_message<Context>(
 
 	let validator_index = bitfield.unchecked_validator_index();
 
-	let mut _span = job_data
-		.span
-		.child("msg-received")
-		.with_peer_id(&origin)
-		.with_relay_parent(relay_parent)
-		.with_claimed_validator_index(validator_index)
-		.with_stage(jaeger::Stage::BitfieldDistribution);
-
 	let validator_set = &job_data.validator_set;
 	if validator_set.is_empty() {
 		gum::trace!(target: LOG_TARGET, ?relay_parent, ?origin, "Validator set is empty",);
@@ -914,7 +888,6 @@ async fn send_tracked_gossip_message<Context>(
 		return
 	};
 
-	let _span = job_data.span.child("gossip");
 	gum::trace!(
 		target: LOG_TARGET,
 		?dest,
diff --git a/polkadot/node/network/bitfield-distribution/src/tests.rs b/polkadot/node/network/bitfield-distribution/src/tests.rs
index 4ed4bf6b38c..66a3c3f7090 100644
--- a/polkadot/node/network/bitfield-distribution/src/tests.rs
+++ b/polkadot/node/network/bitfield-distribution/src/tests.rs
@@ -25,11 +25,7 @@ use polkadot_node_network_protocol::{
 	peer_set::ValidationVersion,
 	view, ObservedRole,
 };
-use polkadot_node_subsystem::{
-	jaeger,
-	jaeger::{PerLeafSpan, Span},
-	messages::ReportPeerMessage,
-};
+use polkadot_node_subsystem::messages::ReportPeerMessage;
 use polkadot_node_subsystem_test_helpers::make_subsystem_context;
 use polkadot_node_subsystem_util::TimeoutExt;
 use polkadot_primitives::{AvailabilityBitfield, Signed, ValidatorIndex};
@@ -86,7 +82,6 @@ fn prewarmed_state(
 					},
 					message_received_from_peer: hashmap!{},
 					message_sent_to_peer: hashmap!{},
-					span: PerLeafSpan::new(Arc::new(jaeger::Span::Disabled), "test"),
 				},
 		},
 		peer_data: peers
@@ -124,7 +119,6 @@ fn state_with_view(
 					one_per_validator: hashmap! {},
 					message_received_from_peer: hashmap! {},
 					message_sent_to_peer: hashmap! {},
-					span: PerLeafSpan::new(Arc::new(jaeger::Span::Disabled), "test"),
 				},
 			)
 		})
@@ -1024,11 +1018,7 @@ fn need_message_works() {
 	let validator_set = Vec::from_iter(validators.iter().map(|k| ValidatorId::from(k.public())));
 
 	let signing_context = SigningContext { session_index: 1, parent_hash: Hash::repeat_byte(0x00) };
-	let mut state = PerRelayParentData::new(
-		signing_context,
-		validator_set.clone(),
-		PerLeafSpan::new(Arc::new(Span::Disabled), "foo"),
-	);
+	let mut state = PerRelayParentData::new(signing_context, validator_set.clone());
 
 	let peer_a = PeerId::random();
 	let peer_b = PeerId::random();
diff --git a/polkadot/node/network/bridge/src/rx/mod.rs b/polkadot/node/network/bridge/src/rx/mod.rs
index 9a2357f02d8..bb99536f783 100644
--- a/polkadot/node/network/bridge/src/rx/mod.rs
+++ b/polkadot/node/network/bridge/src/rx/mod.rs
@@ -986,7 +986,7 @@ fn update_our_view<Context>(
 	};
 
 	let our_view = OurView::new(
-		live_heads.iter().take(MAX_VIEW_HEADS).cloned().map(|a| (a.hash, a.span)),
+		live_heads.iter().take(MAX_VIEW_HEADS).cloned().map(|a| a.hash),
 		finalized_number,
 	);
 
diff --git a/polkadot/node/network/bridge/src/rx/tests.rs b/polkadot/node/network/bridge/src/rx/tests.rs
index a96817eb254..e3f2715ef2b 100644
--- a/polkadot/node/network/bridge/src/rx/tests.rs
+++ b/polkadot/node/network/bridge/src/rx/tests.rs
@@ -16,7 +16,6 @@
 
 use super::*;
 use futures::{channel::oneshot, executor};
-use overseer::jaeger;
 use polkadot_node_network_protocol::{self as net_protocol, OurView};
 use polkadot_node_subsystem::messages::NetworkBridgeEvent;
 
@@ -1381,12 +1380,7 @@ fn our_view_updates_decreasing_order_and_limited_to_max() {
 		}
 
 		let our_views = (1..=MAX_VIEW_HEADS).rev().map(|start| {
-			OurView::new(
-				(start..=MAX_VIEW_HEADS)
-					.rev()
-					.map(|i| (Hash::repeat_byte(i as u8), Arc::new(jaeger::Span::Disabled))),
-				0,
-			)
+			OurView::new((start..=MAX_VIEW_HEADS).rev().map(|i| Hash::repeat_byte(i as u8)), 0)
 		});
 
 		for our_view in our_views {
diff --git a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs
index 97bc66d6058..af9beb535f4 100644
--- a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs
+++ b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs
@@ -38,12 +38,11 @@ use polkadot_node_network_protocol::{
 };
 use polkadot_node_primitives::{CollationSecondedSignal, PoV, Statement};
 use polkadot_node_subsystem::{
-	jaeger,
 	messages::{
 		CollatorProtocolMessage, NetworkBridgeEvent, NetworkBridgeTxMessage, ParentHeadData,
 		RuntimeApiMessage,
 	},
-	overseer, FromOrchestra, OverseerSignal, PerLeafSpan,
+	overseer, FromOrchestra, OverseerSignal,
 };
 use polkadot_node_subsystem_util::{
 	backing_implicit_view::View as ImplicitView,
@@ -284,9 +283,6 @@ struct State {
 	/// our view, including both leaves and implicit ancestry.
 	per_relay_parent: HashMap<Hash, PerRelayParent>,
 
-	/// Span per relay parent.
-	span_per_relay_parent: HashMap<Hash, PerLeafSpan>,
-
 	/// The result senders per collation.
 	collation_result_senders: HashMap<CandidateHash, oneshot::Sender<CollationSecondedSignal>>,
 
@@ -345,7 +341,6 @@ impl State {
 			implicit_view: None,
 			active_leaves: Default::default(),
 			per_relay_parent: Default::default(),
-			span_per_relay_parent: Default::default(),
 			collation_result_senders: Default::default(),
 			peer_ids: Default::default(),
 			validator_groups_buf: ValidatorGroupsBuffer::with_capacity(VALIDATORS_BUFFER_CAPACITY),
@@ -854,12 +849,6 @@ async fn process_msg<Context>(
 			result_sender,
 			core_index,
 		} => {
-			let _span1 = state
-				.span_per_relay_parent
-				.get(&candidate_receipt.descriptor.relay_parent)
-				.map(|s| s.child("distributing-collation"));
-			let _span2 = jaeger::Span::new(&pov, "distributing-collation");
-
 			match state.collating_on {
 				Some(id) if candidate_receipt.descriptor.para_id != id => {
 					// If the ParaId of a collation requested to be distributed does not match
@@ -1088,11 +1077,6 @@ async fn handle_incoming_request<Context>(
 	let peer_id = req.peer_id();
 	let para_id = req.para_id();
 
-	let _span = state
-		.span_per_relay_parent
-		.get(&relay_parent)
-		.map(|s| s.child("request-collation"));
-
 	match state.collating_on {
 		Some(our_para_id) if our_para_id == para_id => {
 			let per_relay_parent = match state.per_relay_parent.get_mut(&relay_parent) {
@@ -1147,8 +1131,6 @@ async fn handle_incoming_request<Context>(
 
 			state.metrics.on_collation_sent_requested();
 
-			let _span = _span.as_ref().map(|s| s.child("sending"));
-
 			let waiting = state.waiting_collation_fetches.entry(relay_parent).or_default();
 			let candidate_hash = receipt.hash();
 
@@ -1359,11 +1341,6 @@ async fn handle_our_view_change<Context>(
 	for leaf in added {
 		let mode = prospective_parachains_mode(ctx.sender(), *leaf).await?;
 
-		if let Some(span) = view.span_per_head().get(leaf).cloned() {
-			let per_leaf_span = PerLeafSpan::new(span, "collator-side");
-			state.span_per_relay_parent.insert(*leaf, per_leaf_span);
-		}
-
 		state.active_leaves.insert(*leaf, mode);
 		state.per_relay_parent.insert(*leaf, PerRelayParent::new(mode));
 
@@ -1464,7 +1441,6 @@ async fn handle_our_view_change<Context>(
 					),
 				}
 			}
-			state.span_per_relay_parent.remove(removed);
 			state.waiting_collation_fetches.remove(removed);
 		}
 	}
diff --git a/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs b/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs
index 2f4c768b89e..23954f8d781 100644
--- a/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs
+++ b/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs
@@ -18,7 +18,6 @@ use super::*;
 
 use std::{
 	collections::{BTreeMap, HashSet, VecDeque},
-	sync::Arc,
 	time::Duration,
 };
 
@@ -42,7 +41,6 @@ use polkadot_node_network_protocol::{
 use polkadot_node_primitives::BlockData;
 use polkadot_node_subsystem::{
 	errors::RuntimeApiError,
-	jaeger,
 	messages::{AllMessages, ReportPeerMessage, RuntimeApiMessage, RuntimeApiRequest},
 	ActiveLeavesUpdate,
 };
diff --git a/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs b/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs
index d3eae9dbba6..348feb9dd1d 100644
--- a/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs
+++ b/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs
@@ -36,8 +36,7 @@ async fn update_view(
 ) {
 	let new_view: HashMap<Hash, u32> = HashMap::from_iter(new_view);
 
-	let our_view =
-		OurView::new(new_view.keys().map(|hash| (*hash, Arc::new(jaeger::Span::Disabled))), 0);
+	let our_view = OurView::new(new_view.keys().map(|hash| *hash), 0);
 
 	overseer_send(
 		virtual_overseer,
diff --git a/polkadot/node/network/collator-protocol/src/validator_side/collation.rs b/polkadot/node/network/collator-protocol/src/validator_side/collation.rs
index 96ffe9f13db..58d9ebc5772 100644
--- a/polkadot/node/network/collator-protocol/src/validator_side/collation.rs
+++ b/polkadot/node/network/collator-protocol/src/validator_side/collation.rs
@@ -36,7 +36,6 @@ use polkadot_node_network_protocol::{
 	PeerId,
 };
 use polkadot_node_primitives::PoV;
-use polkadot_node_subsystem::jaeger;
 use polkadot_node_subsystem_util::{
 	metrics::prometheus::prometheus::HistogramTimer, runtime::ProspectiveParachainsMode,
 };
@@ -319,8 +318,6 @@ pub(super) struct CollationFetchRequest {
 	pub from_collator: BoxFuture<'static, OutgoingResult<request_v1::CollationFetchingResponse>>,
 	/// Handle used for checking if this request was cancelled.
 	pub cancellation_token: CancellationToken,
-	/// A jaeger span corresponding to the lifetime of the request.
-	pub span: Option<jaeger::Span>,
 	/// A metric histogram for the lifetime of the request
 	pub _lifetime_timer: Option<HistogramTimer>,
 }
@@ -339,7 +336,6 @@ impl Future for CollationFetchRequest {
 		};
 
 		if cancelled {
-			self.span.as_mut().map(|s| s.add_string_tag("success", "false"));
 			return Poll::Ready((
 				CollationEvent {
 					collator_protocol_version: self.collator_protocol_version,
@@ -361,16 +357,6 @@ impl Future for CollationFetchRequest {
 			)
 		});
 
-		match &res {
-			Poll::Ready((_, Ok(_))) => {
-				self.span.as_mut().map(|s| s.add_string_tag("success", "true"));
-			},
-			Poll::Ready((_, Err(_))) => {
-				self.span.as_mut().map(|s| s.add_string_tag("success", "false"));
-			},
-			_ => {},
-		};
-
 		res
 	}
 }
diff --git a/polkadot/node/network/collator-protocol/src/validator_side/mod.rs b/polkadot/node/network/collator-protocol/src/validator_side/mod.rs
index cbf00a9e119..deb6ce03f43 100644
--- a/polkadot/node/network/collator-protocol/src/validator_side/mod.rs
+++ b/polkadot/node/network/collator-protocol/src/validator_side/mod.rs
@@ -39,13 +39,12 @@ use polkadot_node_network_protocol::{
 };
 use polkadot_node_primitives::{SignedFullStatement, Statement};
 use polkadot_node_subsystem::{
-	jaeger,
 	messages::{
 		CanSecondRequest, CandidateBackingMessage, CollatorProtocolMessage, IfDisconnected,
 		NetworkBridgeEvent, NetworkBridgeTxMessage, ParentHeadData, ProspectiveParachainsMessage,
 		ProspectiveValidationDataRequest,
 	},
-	overseer, CollatorProtocolSenderTrait, FromOrchestra, OverseerSignal, PerLeafSpan,
+	overseer, CollatorProtocolSenderTrait, FromOrchestra, OverseerSignal,
 };
 use polkadot_node_subsystem_util::{
 	backing_implicit_view::View as ImplicitView,
@@ -420,9 +419,6 @@ struct State {
 	/// Metrics.
 	metrics: Metrics,
 
-	/// Span per relay parent.
-	span_per_relay_parent: HashMap<Hash, PerLeafSpan>,
-
 	/// When a timer in this `FuturesUnordered` triggers, we should dequeue the next request
 	/// attempt in the corresponding `collations_per_relay_parent`.
 	///
@@ -723,10 +719,6 @@ async fn request_collation(
 		collator_protocol_version: peer_protocol_version,
 		from_collator: response_recv,
 		cancellation_token: cancellation_token.clone(),
-		span: state
-			.span_per_relay_parent
-			.get(&relay_parent)
-			.map(|s| s.child("collation-request").with_para_id(para_id)),
 		_lifetime_timer: state.metrics.time_collation_request_duration(),
 	};
 
@@ -1066,11 +1058,6 @@ async fn handle_advertisement<Sender>(
 where
 	Sender: CollatorProtocolSenderTrait,
 {
-	let _span = state
-		.span_per_relay_parent
-		.get(&relay_parent)
-		.map(|s| s.child("advertise-collation"));
-
 	let peer_data = state.peer_data.get_mut(&peer_id).ok_or(AdvertisementError::UnknownPeer)?;
 
 	if peer_data.version == CollationVersion::V1 && !state.active_leaves.contains_key(&relay_parent)
@@ -1264,11 +1251,6 @@ where
 	for leaf in added {
 		let mode = prospective_parachains_mode(sender, *leaf).await?;
 
-		if let Some(span) = view.span_per_head().get(leaf).cloned() {
-			let per_leaf_span = PerLeafSpan::new(span, "validator-side");
-			state.span_per_relay_parent.insert(*leaf, per_leaf_span);
-		}
-
 		let mut per_relay_parent = PerRelayParent::new(mode);
 		assign_incoming(
 			sender,
@@ -1338,7 +1320,6 @@ where
 				keep
 			});
 			state.fetched_candidates.retain(|k, _| k.relay_parent != removed);
-			state.span_per_relay_parent.remove(&removed);
 		}
 	}
 
@@ -1983,10 +1964,6 @@ async fn handle_collation_fetch_response(
 		Ok(resp) => Ok(resp),
 	};
 
-	let _span = state
-		.span_per_relay_parent
-		.get(&pending_collation.relay_parent)
-		.map(|s| s.child("received-collation"));
 	let _timer = state.metrics.time_handle_collation_request_result();
 
 	let mut metrics_result = Err(());
@@ -2067,7 +2044,6 @@ async fn handle_collation_fetch_response(
 				candidate_hash = ?candidate_receipt.hash(),
 				"Received collation",
 			);
-			let _span = jaeger::Span::new(&pov, "received-collation");
 
 			metrics_result = Ok(());
 			Ok(PendingCollationFetch {
@@ -2093,7 +2069,6 @@ async fn handle_collation_fetch_response(
 				candidate_hash = ?receipt.hash(),
 				"Received collation (v3)",
 			);
-			let _span = jaeger::Span::new(&pov, "received-collation");
 
 			metrics_result = Ok(());
 			Ok(PendingCollationFetch {
diff --git a/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs b/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs
index 472731b506a..dff98e22e3d 100644
--- a/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs
+++ b/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs
@@ -103,8 +103,7 @@ pub(super) async fn update_view(
 ) -> Option<AllMessages> {
 	let new_view: HashMap<Hash, u32> = HashMap::from_iter(new_view);
 
-	let our_view =
-		OurView::new(new_view.keys().map(|hash| (*hash, Arc::new(jaeger::Span::Disabled))), 0);
+	let our_view = OurView::new(new_view.keys().map(|hash| *hash), 0);
 
 	overseer_send(
 		virtual_overseer,
diff --git a/polkadot/node/network/protocol/Cargo.toml b/polkadot/node/network/protocol/Cargo.toml
index c9ae23d756c..3d51d3c0a56 100644
--- a/polkadot/node/network/protocol/Cargo.toml
+++ b/polkadot/node/network/protocol/Cargo.toml
@@ -15,7 +15,6 @@ async-trait = { workspace = true }
 hex = { workspace = true, default-features = true }
 polkadot-primitives = { workspace = true, default-features = true }
 polkadot-node-primitives = { workspace = true, default-features = true }
-polkadot-node-jaeger = { workspace = true, default-features = true }
 codec = { features = ["derive"], workspace = true }
 sc-network = { workspace = true, default-features = true }
 sc-network-types = { workspace = true, default-features = true }
diff --git a/polkadot/node/network/protocol/src/lib.rs b/polkadot/node/network/protocol/src/lib.rs
index ca0f8a4e484..f4f1b715b92 100644
--- a/polkadot/node/network/protocol/src/lib.rs
+++ b/polkadot/node/network/protocol/src/lib.rs
@@ -21,10 +21,9 @@
 
 use codec::{Decode, Encode};
 use polkadot_primitives::{BlockNumber, Hash};
-use std::{collections::HashMap, fmt};
+use std::fmt;
 
 #[doc(hidden)]
-pub use polkadot_node_jaeger as jaeger;
 pub use sc_network::IfDisconnected;
 pub use sc_network_types::PeerId;
 #[doc(hidden)]
@@ -91,31 +90,16 @@ impl Into<sc_network::ObservedRole> for ObservedRole {
 }
 
 /// Specialized wrapper around [`View`].
-///
-/// Besides the access to the view itself, it also gives access to the [`jaeger::Span`] per
-/// leave/head.
 #[derive(Debug, Clone, Default)]
 pub struct OurView {
 	view: View,
-	span_per_head: HashMap<Hash, Arc<jaeger::Span>>,
 }
 
 impl OurView {
 	/// Creates a new instance.
-	pub fn new(
-		heads: impl IntoIterator<Item = (Hash, Arc<jaeger::Span>)>,
-		finalized_number: BlockNumber,
-	) -> Self {
-		let state_per_head = heads.into_iter().collect::<HashMap<_, _>>();
-		let view = View::new(state_per_head.keys().cloned(), finalized_number);
-		Self { view, span_per_head: state_per_head }
-	}
-
-	/// Returns the span per head map.
-	///
-	/// For each head there exists one span in this map.
-	pub fn span_per_head(&self) -> &HashMap<Hash, Arc<jaeger::Span>> {
-		&self.span_per_head
+	pub fn new(heads: impl IntoIterator<Item = Hash>, finalized_number: BlockNumber) -> Self {
+		let view = View::new(heads, finalized_number);
+		Self { view }
 	}
 }
 
@@ -133,8 +117,7 @@ impl std::ops::Deref for OurView {
 	}
 }
 
-/// Construct a new [`OurView`] with the given chain heads, finalized number 0 and disabled
-/// [`jaeger::Span`]'s.
+/// Construct a new [`OurView`] with the given chain heads, finalized number 0
 ///
 /// NOTE: Use for tests only.
 ///
@@ -149,7 +132,7 @@ impl std::ops::Deref for OurView {
 macro_rules! our_view {
 	( $( $hash:expr ),* $(,)? ) => {
 		$crate::OurView::new(
-			vec![ $( $hash.clone() ),* ].into_iter().map(|h| (h, $crate::Arc::new($crate::jaeger::Span::Disabled))),
+			vec![ $( $hash.clone() ),* ].into_iter().map(|h| h),
 			0,
 		)
 	};
diff --git a/polkadot/node/network/statement-distribution/src/legacy_v1/mod.rs b/polkadot/node/network/statement-distribution/src/legacy_v1/mod.rs
index 264333435a0..8270b980919 100644
--- a/polkadot/node/network/statement-distribution/src/legacy_v1/mod.rs
+++ b/polkadot/node/network/statement-distribution/src/legacy_v1/mod.rs
@@ -33,9 +33,8 @@ use polkadot_node_subsystem_util::{
 };
 
 use polkadot_node_subsystem::{
-	jaeger,
 	messages::{CandidateBackingMessage, NetworkBridgeEvent, NetworkBridgeTxMessage},
-	overseer, ActivatedLeaf, PerLeafSpan, StatementDistributionSenderTrait,
+	overseer, ActivatedLeaf, StatementDistributionSenderTrait,
 };
 use polkadot_primitives::{
 	AuthorityDiscoveryId, CandidateHash, CommittedCandidateReceipt, CompactStatement, Hash,
@@ -632,15 +631,12 @@ pub(crate) struct ActiveHeadData {
 	session_index: sp_staking::SessionIndex,
 	/// How many `Seconded` statements we've seen per validator.
 	seconded_counts: HashMap<ValidatorIndex, usize>,
-	/// A Jaeger span for this head, so we can attach data to it.
-	span: PerLeafSpan,
 }
 
 impl ActiveHeadData {
 	fn new(
 		validators: IndexedVec<ValidatorIndex, ValidatorId>,
 		session_index: sp_staking::SessionIndex,
-		span: PerLeafSpan,
 	) -> Self {
 		ActiveHeadData {
 			candidates: Default::default(),
@@ -650,7 +646,6 @@ impl ActiveHeadData {
 			validators,
 			session_index,
 			seconded_counts: Default::default(),
-			span,
 		}
 	}
 
@@ -901,12 +896,6 @@ async fn circulate_statement_and_dependents<Context>(
 		None => return,
 	};
 
-	let _span = active_head
-		.span
-		.child("circulate-statement")
-		.with_candidate(statement.payload().candidate_hash())
-		.with_stage(jaeger::Stage::StatementDistribution);
-
 	let topology = topology_store
 		.get_topology_or_fallback(active_head.session_index)
 		.local_grid_neighbors();
@@ -933,12 +922,10 @@ async fn circulate_statement_and_dependents<Context>(
 		}
 	};
 
-	let _span = _span.child("send-to-peers");
 	// Now send dependent statements to all peers needing them, if any.
 	if let Some((candidate_hash, peers_needing_dependents)) = outputs {
 		for peer in peers_needing_dependents {
 			if let Some(peer_data) = peers.get_mut(&peer) {
-				let _span_loop = _span.child("to-peer").with_peer_id(&peer);
 				// defensive: the peer data should always be some because the iterator
 				// of peers is derived from the set of peers.
 				send_statements_about(
@@ -1513,11 +1500,6 @@ async fn handle_incoming_message<'a, Context>(
 
 	let fingerprint = message.get_fingerprint();
 	let candidate_hash = *fingerprint.0.candidate_hash();
-	let handle_incoming_span = active_head
-		.span
-		.child("handle-incoming")
-		.with_candidate(candidate_hash)
-		.with_peer_id(&peer);
 
 	let max_message_count = active_head.validators.len() * 2;
 
@@ -1699,8 +1681,6 @@ async fn handle_incoming_message<'a, Context>(
 		NotedStatement::Fresh(statement) => {
 			modify_reputation(reputation, ctx.sender(), peer, BENEFIT_VALID_STATEMENT_FIRST).await;
 
-			let mut _span = handle_incoming_span.child("notify-backing");
-
 			// When we receive a new message from a peer, we forward it to the
 			// candidate backing subsystem.
 			ctx.send_message(CandidateBackingMessage::Statement(relay_parent, statement_with_pvd))
@@ -2079,7 +2059,6 @@ pub(crate) async fn handle_activated_leaf<Context>(
 	activated: ActivatedLeaf,
 ) -> Result<()> {
 	let relay_parent = activated.hash;
-	let span = PerLeafSpan::new(activated.span, "statement-distribution-legacy");
 	gum::trace!(
 		target: LOG_TARGET,
 		hash = ?relay_parent,
@@ -2095,11 +2074,10 @@ pub(crate) async fn handle_activated_leaf<Context>(
 		.await?;
 	let session_info = &info.session_info;
 
-	state.active_heads.entry(relay_parent).or_insert(ActiveHeadData::new(
-		session_info.validators.clone(),
-		session_index,
-		span,
-	));
+	state
+		.active_heads
+		.entry(relay_parent)
+		.or_insert(ActiveHeadData::new(session_info.validators.clone(), session_index));
 
 	Ok(())
 }
diff --git a/polkadot/node/network/statement-distribution/src/legacy_v1/requester.rs b/polkadot/node/network/statement-distribution/src/legacy_v1/requester.rs
index 8a8a8f3d624..c0346adfe10 100644
--- a/polkadot/node/network/statement-distribution/src/legacy_v1/requester.rs
+++ b/polkadot/node/network/statement-distribution/src/legacy_v1/requester.rs
@@ -28,7 +28,6 @@ use polkadot_node_network_protocol::{
 	},
 	PeerId, UnifiedReputationChange,
 };
-use polkadot_node_subsystem::{Span, Stage};
 use polkadot_node_subsystem_util::TimeoutExt;
 use polkadot_primitives::{CandidateHash, CommittedCandidateReceipt, Hash};
 
@@ -82,10 +81,6 @@ pub async fn fetch(
 	mut sender: mpsc::Sender<RequesterMessage>,
 	metrics: Metrics,
 ) {
-	let span = Span::new(candidate_hash, "fetch-large-statement")
-		.with_relay_parent(relay_parent)
-		.with_stage(Stage::StatementDistribution);
-
 	gum::debug!(
 		target: LOG_TARGET,
 		?candidate_hash,
@@ -102,11 +97,7 @@ pub async fn fetch(
 
 	// We retry endlessly (with sleep periods), and rely on the subsystem to kill us eventually.
 	loop {
-		let span = span.child("try-available-peers");
-
 		while let Some(peer) = new_peers.pop() {
-			let _span = span.child("try-peer").with_peer_id(&peer);
-
 			let (outgoing, pending_response) =
 				OutgoingRequest::new(Recipient::Peer(peer), req.clone());
 			if let Err(err) = sender
@@ -182,7 +173,7 @@ pub async fn fetch(
 		new_peers = std::mem::take(&mut tried_peers);
 
 		// All our peers failed us - try getting new ones before trying again:
-		match try_get_new_peers(relay_parent, candidate_hash, &mut sender, &span).await {
+		match try_get_new_peers(relay_parent, candidate_hash, &mut sender).await {
 			Ok(Some(mut peers)) => {
 				gum::trace!(target: LOG_TARGET, ?peers, "Received new peers.");
 				// New arrivals will be tried first:
@@ -205,10 +196,7 @@ async fn try_get_new_peers(
 	relay_parent: Hash,
 	candidate_hash: CandidateHash,
 	sender: &mut mpsc::Sender<RequesterMessage>,
-	span: &Span,
 ) -> Result<Option<Vec<PeerId>>, ()> {
-	let _span = span.child("wait-for-peers");
-
 	let (tx, rx) = oneshot::channel();
 
 	if let Err(err) = sender
diff --git a/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs b/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs
index 8e6fcbaebbf..5e00fb96d74 100644
--- a/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs
+++ b/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs
@@ -121,7 +121,6 @@ fn active_head_accepts_only_2_seconded_per_validator() {
 	let mut head_data = ActiveHeadData::new(
 		IndexedVec::<ValidatorIndex, ValidatorId>::from(validators),
 		session_index,
-		PerLeafSpan::new(Arc::new(jaeger::Span::Disabled), "test"),
 	);
 
 	let keystore: KeystorePtr = Arc::new(LocalKeystore::in_memory());
@@ -467,7 +466,6 @@ fn peer_view_update_sends_messages() {
 		let mut data = ActiveHeadData::new(
 			IndexedVec::<ValidatorIndex, ValidatorId>::from(validators),
 			session_index,
-			PerLeafSpan::new(Arc::new(jaeger::Span::Disabled), "test"),
 		);
 
 		let statement = SignedFullStatement::sign(
diff --git a/polkadot/node/overseer/src/dummy.rs b/polkadot/node/overseer/src/dummy.rs
index 6f9cd9d0040..d618c0c7ca9 100644
--- a/polkadot/node/overseer/src/dummy.rs
+++ b/polkadot/node/overseer/src/dummy.rs
@@ -193,7 +193,6 @@ where
 		.chain_selection(subsystem.clone())
 		.prospective_parachains(subsystem.clone())
 		.activation_external_listeners(Default::default())
-		.span_per_active_leaf(Default::default())
 		.active_leaves(Default::default())
 		.spawner(SpawnGlue(spawner))
 		.metrics(metrics)
diff --git a/polkadot/node/overseer/src/lib.rs b/polkadot/node/overseer/src/lib.rs
index e30ed69f9e3..87ef63d8a5d 100644
--- a/polkadot/node/overseer/src/lib.rs
+++ b/polkadot/node/overseer/src/lib.rs
@@ -88,8 +88,8 @@ use polkadot_node_subsystem_types::messages::{
 
 pub use polkadot_node_subsystem_types::{
 	errors::{SubsystemError, SubsystemResult},
-	jaeger, ActivatedLeaf, ActiveLeavesUpdate, ChainApiBackend, OverseerSignal,
-	RuntimeApiSubsystemClient, UnpinHandle,
+	ActivatedLeaf, ActiveLeavesUpdate, ChainApiBackend, OverseerSignal, RuntimeApiSubsystemClient,
+	UnpinHandle,
 };
 
 pub mod metrics;
@@ -650,9 +650,6 @@ pub struct Overseer<SupportsParachains> {
 	/// External listeners waiting for a hash to be in the active-leave set.
 	pub activation_external_listeners: HashMap<Hash, Vec<oneshot::Sender<SubsystemResult<()>>>>,
 
-	/// Stores the [`jaeger::Span`] per active leaf.
-	pub span_per_active_leaf: HashMap<Hash, Arc<jaeger::Span>>,
-
 	/// The set of the "active leaves".
 	pub active_leaves: HashMap<Hash, BlockNumber>,
 
@@ -817,11 +814,10 @@ where
 		};
 
 		let mut update = match self.on_head_activated(&block.hash, Some(block.parent_hash)).await {
-			Some(span) => ActiveLeavesUpdate::start_work(ActivatedLeaf {
+			Some(_) => ActiveLeavesUpdate::start_work(ActivatedLeaf {
 				hash: block.hash,
 				number: block.number,
 				unpin_handle: block.unpin_handle,
-				span,
 			}),
 			None => ActiveLeavesUpdate::default(),
 		};
@@ -874,11 +870,7 @@ where
 
 	/// Handles a header activation. If the header's state doesn't support the parachains API,
 	/// this returns `None`.
-	async fn on_head_activated(
-		&mut self,
-		hash: &Hash,
-		parent_hash: Option<Hash>,
-	) -> Option<Arc<jaeger::Span>> {
+	async fn on_head_activated(&mut self, hash: &Hash, _parent_hash: Option<Hash>) -> Option<()> {
 		if !self.supports_parachains.head_supports_parachains(hash).await {
 			return None
 		}
@@ -896,22 +888,12 @@ where
 			}
 		}
 
-		let mut span = jaeger::Span::new(*hash, "leaf-activated");
-
-		if let Some(parent_span) = parent_hash.and_then(|h| self.span_per_active_leaf.get(&h)) {
-			span.add_follows_from(parent_span);
-		}
-
-		let span = Arc::new(span);
-		self.span_per_active_leaf.insert(*hash, span.clone());
-
-		Some(span)
+		Some(())
 	}
 
 	fn on_head_deactivated(&mut self, hash: &Hash) {
 		self.metrics.on_head_deactivated();
 		self.activation_external_listeners.remove(hash);
-		self.span_per_active_leaf.remove(hash);
 	}
 
 	fn clean_up_external_listeners(&mut self) {
diff --git a/polkadot/node/service/src/lib.rs b/polkadot/node/service/src/lib.rs
index d029f3be53e..9515dd23113 100644
--- a/polkadot/node/service/src/lib.rs
+++ b/polkadot/node/service/src/lib.rs
@@ -59,7 +59,6 @@ use {
 	sc_client_api::BlockBackend,
 	sc_consensus_grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider},
 	sc_transaction_pool_api::OffchainTransactionPoolFactory,
-	sp_core::traits::SpawnNamed,
 };
 
 use polkadot_node_subsystem_util::database::Database;
@@ -76,9 +75,6 @@ pub use {
 	sp_consensus_babe::BabeApi,
 };
 
-#[cfg(feature = "full-node")]
-use polkadot_node_subsystem::jaeger;
-
 use std::{collections::HashMap, path::PathBuf, sync::Arc, time::Duration};
 
 use prometheus_endpoint::Registry;
@@ -222,9 +218,6 @@ pub enum Error {
 	#[error(transparent)]
 	Telemetry(#[from] sc_telemetry::Error),
 
-	#[error(transparent)]
-	Jaeger(#[from] polkadot_node_subsystem::jaeger::JaegerError),
-
 	#[cfg(feature = "full-node")]
 	#[error(transparent)]
 	Availability(#[from] AvailabilityError),
@@ -365,25 +358,6 @@ pub fn open_database(db_source: &DatabaseSource) -> Result<Arc<dyn Database>, Er
 	Ok(parachains_db)
 }
 
-/// Initialize the `Jeager` collector. The destination must listen
-/// on the given address and port for `UDP` packets.
-#[cfg(any(test, feature = "full-node"))]
-fn jaeger_launch_collector_with_agent(
-	spawner: impl SpawnNamed,
-	config: &Configuration,
-	agent: Option<std::net::SocketAddr>,
-) -> Result<(), Error> {
-	if let Some(agent) = agent {
-		let cfg = jaeger::JaegerConfig::builder()
-			.agent(agent)
-			.named(&config.network.node_name)
-			.build();
-
-		jaeger::Jaeger::new(cfg).launch(spawner)?;
-	}
-	Ok(())
-}
-
 #[cfg(feature = "full-node")]
 type FullSelectChain = relay_chain_selection::SelectRelayChain<FullBackend>;
 #[cfg(feature = "full-node")]
@@ -411,7 +385,6 @@ struct Basics {
 #[cfg(feature = "full-node")]
 fn new_partial_basics(
 	config: &mut Configuration,
-	jaeger_agent: Option<std::net::SocketAddr>,
 	telemetry_worker_handle: Option<TelemetryWorkerHandle>,
 ) -> Result<Basics, Error> {
 	let telemetry = config
@@ -463,8 +436,6 @@ fn new_partial_basics(
 		telemetry
 	});
 
-	jaeger_launch_collector_with_agent(task_manager.spawn_handle(), &*config, jaeger_agent)?;
-
 	Ok(Basics { task_manager, client, backend, keystore_container, telemetry })
 }
 
@@ -637,7 +608,6 @@ pub struct NewFullParams<OverseerGenerator: OverseerGen> {
 	/// Whether to enable the block authoring backoff on production networks
 	/// where it isn't enabled by default.
 	pub force_authoring_backoff: bool,
-	pub jaeger_agent: Option<std::net::SocketAddr>,
 	pub telemetry_worker_handle: Option<TelemetryWorkerHandle>,
 	/// The version of the node. TESTING ONLY: `None` can be passed to skip the node/worker version
 	/// check, both on startup and in the workers.
@@ -742,7 +712,6 @@ pub fn new_full<
 		is_parachain_node,
 		enable_beefy,
 		force_authoring_backoff,
-		jaeger_agent,
 		telemetry_worker_handle,
 		node_version,
 		secure_validator_mode,
@@ -798,7 +767,7 @@ pub fn new_full<
 	let disable_grandpa = config.disable_grandpa;
 	let name = config.network.node_name.clone();
 
-	let basics = new_partial_basics(&mut config, jaeger_agent, telemetry_worker_handle)?;
+	let basics = new_partial_basics(&mut config, telemetry_worker_handle)?;
 
 	let prometheus_registry = config.prometheus_registry().cloned();
 
@@ -1437,11 +1406,10 @@ pub fn new_full<
 
 #[cfg(feature = "full-node")]
 macro_rules! chain_ops {
-	($config:expr, $jaeger_agent:expr, $telemetry_worker_handle:expr) => {{
+	($config:expr, $telemetry_worker_handle:expr) => {{
 		let telemetry_worker_handle = $telemetry_worker_handle;
-		let jaeger_agent = $jaeger_agent;
 		let mut config = $config;
-		let basics = new_partial_basics(config, jaeger_agent, telemetry_worker_handle)?;
+		let basics = new_partial_basics(config, telemetry_worker_handle)?;
 
 		use ::sc_consensus::LongestChain;
 		// use the longest chain selection, since there is no overseer available
@@ -1457,19 +1425,18 @@ macro_rules! chain_ops {
 #[cfg(feature = "full-node")]
 pub fn new_chain_ops(
 	config: &mut Configuration,
-	jaeger_agent: Option<std::net::SocketAddr>,
 ) -> Result<(Arc<FullClient>, Arc<FullBackend>, sc_consensus::BasicQueue<Block>, TaskManager), Error>
 {
 	config.keystore = sc_service::config::KeystoreConfig::InMemory;
 
 	if config.chain_spec.is_rococo() || config.chain_spec.is_versi() {
-		chain_ops!(config, jaeger_agent, None)
+		chain_ops!(config, None)
 	} else if config.chain_spec.is_kusama() {
-		chain_ops!(config, jaeger_agent, None)
+		chain_ops!(config, None)
 	} else if config.chain_spec.is_westend() {
-		return chain_ops!(config, jaeger_agent, None)
+		return chain_ops!(config, None)
 	} else {
-		chain_ops!(config, jaeger_agent, None)
+		chain_ops!(config, None)
 	}
 }
 
diff --git a/polkadot/node/service/src/overseer.rs b/polkadot/node/service/src/overseer.rs
index a98b6bcb308..279b6ff8070 100644
--- a/polkadot/node/service/src/overseer.rs
+++ b/polkadot/node/service/src/overseer.rs
@@ -358,7 +358,6 @@ where
 		.chain_selection(ChainSelectionSubsystem::new(chain_selection_config, parachains_db))
 		.prospective_parachains(ProspectiveParachainsSubsystem::new(Metrics::register(registry)?))
 		.activation_external_listeners(Default::default())
-		.span_per_active_leaf(Default::default())
 		.active_leaves(Default::default())
 		.supports_parachains(runtime_client)
 		.metrics(metrics)
@@ -580,7 +579,6 @@ where
 		.chain_selection(ChainSelectionSubsystem::new(chain_selection_config, parachains_db))
 		.prospective_parachains(ProspectiveParachainsSubsystem::new(Metrics::register(registry)?))
 		.activation_external_listeners(Default::default())
-		.span_per_active_leaf(Default::default())
 		.active_leaves(Default::default())
 		.supports_parachains(runtime_client)
 		.metrics(metrics)
@@ -728,7 +726,6 @@ where
 		.chain_selection(DummySubsystem)
 		.prospective_parachains(DummySubsystem)
 		.activation_external_listeners(Default::default())
-		.span_per_active_leaf(Default::default())
 		.active_leaves(Default::default())
 		.supports_parachains(runtime_client)
 		.metrics(Metrics::register(registry)?)
diff --git a/polkadot/node/subsystem-bench/src/lib/availability/mod.rs b/polkadot/node/subsystem-bench/src/lib/availability/mod.rs
index f28adff315f..a99f013195f 100644
--- a/polkadot/node/subsystem-bench/src/lib/availability/mod.rs
+++ b/polkadot/node/subsystem-bench/src/lib/availability/mod.rs
@@ -49,10 +49,7 @@ use polkadot_node_subsystem::{
 	messages::{AllMessages, AvailabilityRecoveryMessage},
 	Overseer, OverseerConnector, SpawnGlue,
 };
-use polkadot_node_subsystem_types::{
-	messages::{AvailabilityStoreMessage, NetworkBridgeEvent},
-	Span,
-};
+use polkadot_node_subsystem_types::messages::{AvailabilityStoreMessage, NetworkBridgeEvent};
 use polkadot_overseer::{metrics::Metrics as OverseerMetrics, Handle as OverseerHandle};
 use polkadot_primitives::{Block, CoreIndex, GroupIndex, Hash};
 use sc_network::request_responses::{IncomingRequest as RawIncomingRequest, ProtocolConfig};
@@ -421,7 +418,7 @@ pub async fn benchmark_availability_write(
 
 		// Inform bitfield distribution about our view of current test block
 		let message = polkadot_node_subsystem_types::messages::BitfieldDistributionMessage::NetworkBridgeUpdate(
-			NetworkBridgeEvent::OurViewChange(OurView::new(vec![(relay_block_hash, Arc::new(Span::Disabled))], 0))
+			NetworkBridgeEvent::OurViewChange(OurView::new(vec![relay_block_hash], 0))
 		);
 		env.send_message(AllMessages::BitfieldDistribution(message)).await;
 
diff --git a/polkadot/node/subsystem-bench/src/lib/mock/mod.rs b/polkadot/node/subsystem-bench/src/lib/mock/mod.rs
index 2ca47d9fc08..00c19fe62cc 100644
--- a/polkadot/node/subsystem-bench/src/lib/mock/mod.rs
+++ b/polkadot/node/subsystem-bench/src/lib/mock/mod.rs
@@ -71,7 +71,6 @@ macro_rules! dummy_builder {
 			.dispute_distribution(MockDisputeDistribution {})
 			.prospective_parachains(MockProspectiveParachains {})
 			.activation_external_listeners(Default::default())
-			.span_per_active_leaf(Default::default())
 			.active_leaves(Default::default())
 			.metrics($metrics)
 			.supports_parachains(AlwaysSupportsParachains {})
diff --git a/polkadot/node/subsystem-test-helpers/src/mock.rs b/polkadot/node/subsystem-test-helpers/src/mock.rs
index 14026960ac1..f73b4b573ff 100644
--- a/polkadot/node/subsystem-test-helpers/src/mock.rs
+++ b/polkadot/node/subsystem-test-helpers/src/mock.rs
@@ -16,7 +16,7 @@
 
 use std::sync::Arc;
 
-use polkadot_node_subsystem::{jaeger, ActivatedLeaf, BlockInfo};
+use polkadot_node_subsystem::{ActivatedLeaf, BlockInfo};
 use sc_client_api::UnpinHandle;
 use sc_keystore::LocalKeystore;
 use sc_utils::mpsc::tracing_unbounded;
@@ -52,12 +52,7 @@ pub fn dummy_unpin_handle(block: Hash) -> UnpinHandle<Block> {
 
 /// Create a new leaf with the given hash and number.
 pub fn new_leaf(hash: Hash, number: BlockNumber) -> ActivatedLeaf {
-	ActivatedLeaf {
-		hash,
-		number,
-		unpin_handle: dummy_unpin_handle(hash),
-		span: Arc::new(jaeger::Span::Disabled),
-	}
+	ActivatedLeaf { hash, number, unpin_handle: dummy_unpin_handle(hash) }
 }
 
 /// Create a new leaf with the given hash and number.
diff --git a/polkadot/node/subsystem-types/Cargo.toml b/polkadot/node/subsystem-types/Cargo.toml
index c8fc324699e..b5686ec96be 100644
--- a/polkadot/node/subsystem-types/Cargo.toml
+++ b/polkadot/node/subsystem-types/Cargo.toml
@@ -17,7 +17,6 @@ polkadot-primitives = { workspace = true, default-features = true }
 polkadot-node-primitives = { workspace = true, default-features = true }
 polkadot-node-network-protocol = { workspace = true, default-features = true }
 polkadot-statement-table = { workspace = true, default-features = true }
-polkadot-node-jaeger = { workspace = true, default-features = true }
 orchestra = { features = ["futures_channel"], workspace = true }
 sc-network = { workspace = true, default-features = true }
 sc-network-types = { workspace = true, default-features = true }
diff --git a/polkadot/node/subsystem-types/src/errors.rs b/polkadot/node/subsystem-types/src/errors.rs
index 8e1b515c8db..8770f3a3d9a 100644
--- a/polkadot/node/subsystem-types/src/errors.rs
+++ b/polkadot/node/subsystem-types/src/errors.rs
@@ -16,7 +16,6 @@
 
 //! Error types for the subsystem requests.
 
-use crate::JaegerError;
 use ::orchestra::OrchestraError as OverseerError;
 use fatality::fatality;
 
@@ -109,9 +108,6 @@ pub enum SubsystemError {
 	#[error(transparent)]
 	Prometheus(#[from] prometheus_endpoint::PrometheusError),
 
-	#[error(transparent)]
-	Jaeger(#[from] JaegerError),
-
 	#[error("Failed to {0}")]
 	Context(String),
 
diff --git a/polkadot/node/subsystem-types/src/lib.rs b/polkadot/node/subsystem-types/src/lib.rs
index cd39aa03e56..cde6bba18e7 100644
--- a/polkadot/node/subsystem-types/src/lib.rs
+++ b/polkadot/node/subsystem-types/src/lib.rs
@@ -23,7 +23,7 @@
 #![warn(missing_docs)]
 
 use smallvec::SmallVec;
-use std::{fmt, sync::Arc};
+use std::fmt;
 
 pub use polkadot_primitives::{Block, BlockNumber, Hash};
 
@@ -42,9 +42,6 @@ pub mod messages;
 mod runtime_client;
 pub use runtime_client::{ChainApiBackend, DefaultSubsystemClient, RuntimeApiSubsystemClient};
 
-pub use jaeger::*;
-pub use polkadot_node_jaeger as jaeger;
-
 /// How many slots are stack-reserved for active leaves updates
 ///
 /// If there are fewer than this number of slots, then we've wasted some stack space.
@@ -60,11 +57,6 @@ pub struct ActivatedLeaf {
 	pub number: BlockNumber,
 	/// A handle to unpin the block on drop.
 	pub unpin_handle: UnpinHandle,
-	/// An associated [`jaeger::Span`].
-	///
-	/// NOTE: Each span should only be kept active as long as the leaf is considered active and
-	/// should be dropped when the leaf is deactivated.
-	pub span: Arc<jaeger::Span>,
 }
 
 /// Changes in the set of active leaves: the parachain heads which we care to work on.
diff --git a/polkadot/node/subsystem-util/Cargo.toml b/polkadot/node/subsystem-util/Cargo.toml
index 3bd3892ba60..d12daa57205 100644
--- a/polkadot/node/subsystem-util/Cargo.toml
+++ b/polkadot/node/subsystem-util/Cargo.toml
@@ -27,7 +27,6 @@ schnellru = { workspace = true }
 polkadot-erasure-coding = { workspace = true, default-features = true }
 polkadot-node-subsystem = { workspace = true, default-features = true }
 polkadot-node-subsystem-types = { workspace = true, default-features = true }
-polkadot-node-jaeger = { workspace = true, default-features = true }
 polkadot-node-metrics = { workspace = true, default-features = true }
 polkadot-node-network-protocol = { workspace = true, default-features = true }
 polkadot-primitives = { workspace = true, default-features = true }
diff --git a/polkadot/node/subsystem/Cargo.toml b/polkadot/node/subsystem/Cargo.toml
index 8edfea9e26b..ce4bceec733 100644
--- a/polkadot/node/subsystem/Cargo.toml
+++ b/polkadot/node/subsystem/Cargo.toml
@@ -12,4 +12,3 @@ workspace = true
 [dependencies]
 polkadot-overseer = { workspace = true, default-features = true }
 polkadot-node-subsystem-types = { workspace = true, default-features = true }
-polkadot-node-jaeger = { workspace = true, default-features = true }
diff --git a/polkadot/node/subsystem/src/lib.rs b/polkadot/node/subsystem/src/lib.rs
index 8b407c75a0c..bde5a623c47 100644
--- a/polkadot/node/subsystem/src/lib.rs
+++ b/polkadot/node/subsystem/src/lib.rs
@@ -21,9 +21,6 @@
 #![deny(missing_docs)]
 #![deny(unused_crate_dependencies)]
 
-pub use jaeger::*;
-pub use polkadot_node_jaeger as jaeger;
-
 pub use polkadot_overseer::{self as overseer, *};
 
 pub use polkadot_node_subsystem_types::{
diff --git a/polkadot/node/test/service/src/lib.rs b/polkadot/node/test/service/src/lib.rs
index f879aa93df9..aa7295dddc5 100644
--- a/polkadot/node/test/service/src/lib.rs
+++ b/polkadot/node/test/service/src/lib.rs
@@ -88,7 +88,6 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
 					is_parachain_node,
 					enable_beefy: true,
 					force_authoring_backoff: false,
-					jaeger_agent: None,
 					telemetry_worker_handle: None,
 					node_version: None,
 					secure_validator_mode: false,
@@ -111,7 +110,6 @@ pub fn new_full<OverseerGenerator: OverseerGen>(
 					is_parachain_node,
 					enable_beefy: true,
 					force_authoring_backoff: false,
-					jaeger_agent: None,
 					telemetry_worker_handle: None,
 					node_version: None,
 					secure_validator_mode: false,
diff --git a/polkadot/parachain/test-parachains/adder/collator/src/main.rs b/polkadot/parachain/test-parachains/adder/collator/src/main.rs
index 4660b4d38f7..416e58b0a8a 100644
--- a/polkadot/parachain/test-parachains/adder/collator/src/main.rs
+++ b/polkadot/parachain/test-parachains/adder/collator/src/main.rs
@@ -82,7 +82,6 @@ fn main() -> Result<()> {
 						),
 						enable_beefy: false,
 						force_authoring_backoff: false,
-						jaeger_agent: None,
 						telemetry_worker_handle: None,
 
 						// Collators don't spawn PVF workers, so we can disable version checks.
diff --git a/polkadot/parachain/test-parachains/undying/collator/src/main.rs b/polkadot/parachain/test-parachains/undying/collator/src/main.rs
index 3dfa714e6d1..017eefe5ee3 100644
--- a/polkadot/parachain/test-parachains/undying/collator/src/main.rs
+++ b/polkadot/parachain/test-parachains/undying/collator/src/main.rs
@@ -84,7 +84,6 @@ fn main() -> Result<()> {
 						),
 						enable_beefy: false,
 						force_authoring_backoff: false,
-						jaeger_agent: None,
 						telemetry_worker_handle: None,
 
 						// Collators don't spawn PVF workers, so we can disable version checks.
diff --git a/prdoc/pr_5875.prdoc b/prdoc/pr_5875.prdoc
new file mode 100644
index 00000000000..fb308c02dde
--- /dev/null
+++ b/prdoc/pr_5875.prdoc
@@ -0,0 +1,47 @@
+title: "Remove jaeger from polkadot"
+
+doc:
+  - audience: [ Node Dev, Node Operator ]
+    description: |
+      Jaeger was remove from the codebase because it was not used by anyone
+      and it did not help with the debugging.
+
+crates:
+  - name: polkadot-sdk
+    bump: patch
+  - name: polkadot-overseer
+    bump: major
+  - name: polkadot-node-subsystem
+    bump: patch
+  - name: polkadot-node-subsystem-types
+    bump: major
+  - name: polkadot-node-network-protocol
+    bump: major
+  - name: polkadot-service
+    bump: major
+  - name: polkadot-availability-distribution
+    bump: patch
+  - name: polkadot-availability-recovery
+    bump: patch
+  - name: polkadot-node-core-av-store
+    bump: patch
+  - name: polkadot-statement-distribution
+    bump: patch
+  - name: polkadot-collator-protocol
+    bump: patch
+  - name: polkadot-availability-bitfield-distribution
+    bump: patch
+  - name: polkadot-network-bridge
+    bump: patch
+  - name: polkadot-node-collation-generation
+    bump: patch
+  - name: polkadot-node-core-bitfield-signing
+    bump: patch
+  - name: polkadot-node-core-candidate-validation
+    bump: patch
+  - name: polkadot-node-core-provisioner
+    bump: patch
+  - name: cumulus-relay-chain-inprocess-interface
+    bump: patch
+  - name: polkadot-cli
+    bump: major
diff --git a/umbrella/Cargo.toml b/umbrella/Cargo.toml
index 83cbebbc61c..3e7edc73982 100644
--- a/umbrella/Cargo.toml
+++ b/umbrella/Cargo.toml
@@ -600,7 +600,7 @@ runtime = [
 	"sp-wasm-interface",
 	"sp-weights",
 ]
-node = ["asset-test-utils", "bridge-hub-test-utils", "cumulus-client-cli", "cumulus-client-collator", "cumulus-client-consensus-aura", "cumulus-client-consensus-common", "cumulus-client-consensus-proposer", "cumulus-client-consensus-relay-chain", "cumulus-client-network", "cumulus-client-parachain-inherent", "cumulus-client-pov-recovery", "cumulus-client-service", "cumulus-relay-chain-inprocess-interface", "cumulus-relay-chain-interface", "cumulus-relay-chain-minimal-node", "cumulus-relay-chain-rpc-interface", "cumulus-test-relay-sproof-builder", "emulated-integration-tests-common", "fork-tree", "frame-benchmarking-cli", "frame-remote-externalities", "frame-support-procedural-tools", "generate-bags", "mmr-gadget", "mmr-rpc", "pallet-contracts-mock-network", "pallet-revive-mock-network", "pallet-transaction-payment-rpc", "parachains-runtimes-test-utils", "polkadot-approval-distribution", "polkadot-availability-bitfield-distribution", "polkadot-availability-distribution", "polkadot-availability-recovery", "polkadot-cli", "polkadot-collator-protocol", "polkadot-dispute-distribution", "polkadot-erasure-coding", "polkadot-gossip-support", "polkadot-network-bridge", "polkadot-node-collation-generation", "polkadot-node-core-approval-voting", "polkadot-node-core-approval-voting-parallel", "polkadot-node-core-av-store", "polkadot-node-core-backing", "polkadot-node-core-bitfield-signing", "polkadot-node-core-candidate-validation", "polkadot-node-core-chain-api", "polkadot-node-core-chain-selection", "polkadot-node-core-dispute-coordinator", "polkadot-node-core-parachains-inherent", "polkadot-node-core-prospective-parachains", "polkadot-node-core-provisioner", "polkadot-node-core-pvf", "polkadot-node-core-pvf-checker", "polkadot-node-core-pvf-common", "polkadot-node-core-pvf-execute-worker", "polkadot-node-core-pvf-prepare-worker", "polkadot-node-core-runtime-api", "polkadot-node-jaeger", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-types", "polkadot-node-subsystem-util", "polkadot-overseer", "polkadot-parachain-lib", "polkadot-rpc", "polkadot-service", "polkadot-statement-distribution", "polkadot-statement-table", "sc-allocator", "sc-authority-discovery", "sc-basic-authorship", "sc-block-builder", "sc-chain-spec", "sc-cli", "sc-client-api", "sc-client-db", "sc-consensus", "sc-consensus-aura", "sc-consensus-babe", "sc-consensus-babe-rpc", "sc-consensus-beefy", "sc-consensus-beefy-rpc", "sc-consensus-epochs", "sc-consensus-grandpa", "sc-consensus-grandpa-rpc", "sc-consensus-manual-seal", "sc-consensus-pow", "sc-consensus-slots", "sc-executor", "sc-executor-common", "sc-executor-polkavm", "sc-executor-wasmtime", "sc-informant", "sc-keystore", "sc-mixnet", "sc-network", "sc-network-common", "sc-network-gossip", "sc-network-light", "sc-network-statement", "sc-network-sync", "sc-network-transactions", "sc-network-types", "sc-offchain", "sc-proposer-metrics", "sc-rpc", "sc-rpc-api", "sc-rpc-server", "sc-rpc-spec-v2", "sc-service", "sc-state-db", "sc-statement-store", "sc-storage-monitor", "sc-sync-state-rpc", "sc-sysinfo", "sc-telemetry", "sc-tracing", "sc-transaction-pool", "sc-transaction-pool-api", "sc-utils", "snowbridge-runtime-test-common", "sp-blockchain", "sp-consensus", "sp-core-hashing", "sp-core-hashing-proc-macro", "sp-database", "sp-maybe-compressed-blob", "sp-panic-handler", "sp-rpc", "staging-chain-spec-builder", "staging-node-inspect", "staging-tracking-allocator", "std", "subkey", "substrate-build-script-utils", "substrate-frame-rpc-support", "substrate-frame-rpc-system", "substrate-prometheus-endpoint", "substrate-rpc-client", "substrate-state-trie-migration-rpc", "substrate-wasm-builder", "tracing-gum", "xcm-emulator", "xcm-simulator"]
+node = ["asset-test-utils", "bridge-hub-test-utils", "cumulus-client-cli", "cumulus-client-collator", "cumulus-client-consensus-aura", "cumulus-client-consensus-common", "cumulus-client-consensus-proposer", "cumulus-client-consensus-relay-chain", "cumulus-client-network", "cumulus-client-parachain-inherent", "cumulus-client-pov-recovery", "cumulus-client-service", "cumulus-relay-chain-inprocess-interface", "cumulus-relay-chain-interface", "cumulus-relay-chain-minimal-node", "cumulus-relay-chain-rpc-interface", "cumulus-test-relay-sproof-builder", "emulated-integration-tests-common", "fork-tree", "frame-benchmarking-cli", "frame-remote-externalities", "frame-support-procedural-tools", "generate-bags", "mmr-gadget", "mmr-rpc", "pallet-contracts-mock-network", "pallet-revive-mock-network", "pallet-transaction-payment-rpc", "parachains-runtimes-test-utils", "polkadot-approval-distribution", "polkadot-availability-bitfield-distribution", "polkadot-availability-distribution", "polkadot-availability-recovery", "polkadot-cli", "polkadot-collator-protocol", "polkadot-dispute-distribution", "polkadot-erasure-coding", "polkadot-gossip-support", "polkadot-network-bridge", "polkadot-node-collation-generation", "polkadot-node-core-approval-voting", "polkadot-node-core-approval-voting-parallel", "polkadot-node-core-av-store", "polkadot-node-core-backing", "polkadot-node-core-bitfield-signing", "polkadot-node-core-candidate-validation", "polkadot-node-core-chain-api", "polkadot-node-core-chain-selection", "polkadot-node-core-dispute-coordinator", "polkadot-node-core-parachains-inherent", "polkadot-node-core-prospective-parachains", "polkadot-node-core-provisioner", "polkadot-node-core-pvf", "polkadot-node-core-pvf-checker", "polkadot-node-core-pvf-common", "polkadot-node-core-pvf-execute-worker", "polkadot-node-core-pvf-prepare-worker", "polkadot-node-core-runtime-api", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-types", "polkadot-node-subsystem-util", "polkadot-overseer", "polkadot-parachain-lib", "polkadot-rpc", "polkadot-service", "polkadot-statement-distribution", "polkadot-statement-table", "sc-allocator", "sc-authority-discovery", "sc-basic-authorship", "sc-block-builder", "sc-chain-spec", "sc-cli", "sc-client-api", "sc-client-db", "sc-consensus", "sc-consensus-aura", "sc-consensus-babe", "sc-consensus-babe-rpc", "sc-consensus-beefy", "sc-consensus-beefy-rpc", "sc-consensus-epochs", "sc-consensus-grandpa", "sc-consensus-grandpa-rpc", "sc-consensus-manual-seal", "sc-consensus-pow", "sc-consensus-slots", "sc-executor", "sc-executor-common", "sc-executor-polkavm", "sc-executor-wasmtime", "sc-informant", "sc-keystore", "sc-mixnet", "sc-network", "sc-network-common", "sc-network-gossip", "sc-network-light", "sc-network-statement", "sc-network-sync", "sc-network-transactions", "sc-network-types", "sc-offchain", "sc-proposer-metrics", "sc-rpc", "sc-rpc-api", "sc-rpc-server", "sc-rpc-spec-v2", "sc-service", "sc-state-db", "sc-statement-store", "sc-storage-monitor", "sc-sync-state-rpc", "sc-sysinfo", "sc-telemetry", "sc-tracing", "sc-transaction-pool", "sc-transaction-pool-api", "sc-utils", "snowbridge-runtime-test-common", "sp-blockchain", "sp-consensus", "sp-core-hashing", "sp-core-hashing-proc-macro", "sp-database", "sp-maybe-compressed-blob", "sp-panic-handler", "sp-rpc", "staging-chain-spec-builder", "staging-node-inspect", "staging-tracking-allocator", "std", "subkey", "substrate-build-script-utils", "substrate-frame-rpc-support", "substrate-frame-rpc-system", "substrate-prometheus-endpoint", "substrate-rpc-client", "substrate-state-trie-migration-rpc", "substrate-wasm-builder", "tracing-gum", "xcm-emulator", "xcm-simulator"]
 tuples-96 = [
 	"frame-support-procedural?/tuples-96",
 	"frame-support?/tuples-96",
@@ -2052,11 +2052,6 @@ path = "../polkadot/node/core/runtime-api"
 default-features = false
 optional = true
 
-[dependencies.polkadot-node-jaeger]
-path = "../polkadot/node/jaeger"
-default-features = false
-optional = true
-
 [dependencies.polkadot-node-metrics]
 path = "../polkadot/node/metrics"
 default-features = false
diff --git a/umbrella/src/lib.rs b/umbrella/src/lib.rs
index 4a653dab99b..656273029fe 100644
--- a/umbrella/src/lib.rs
+++ b/umbrella/src/lib.rs
@@ -874,10 +874,6 @@ pub use polkadot_node_core_pvf_prepare_worker;
 #[cfg(feature = "polkadot-node-core-runtime-api")]
 pub use polkadot_node_core_runtime_api;
 
-/// Polkadot Jaeger primitives, but equally useful for Grafana/Tempo.
-#[cfg(feature = "polkadot-node-jaeger")]
-pub use polkadot_node_jaeger;
-
 /// Subsystem metric helpers.
 #[cfg(feature = "polkadot-node-metrics")]
 pub use polkadot_node_metrics;
-- 
GitLab