diff --git a/opentelemetry-aws/src/lib.rs b/opentelemetry-aws/src/lib.rs index 7c13ca55fb..27c32ca236 100644 --- a/opentelemetry-aws/src/lib.rs +++ b/opentelemetry-aws/src/lib.rs @@ -324,7 +324,7 @@ pub mod trace { let propagator = XrayPropagator::default(); let context = propagator.extract(&map); - assert_eq!(context.remote_span_context(), Some(&expected)); + assert_eq!(context.span().span_context(), &expected); } } @@ -333,10 +333,7 @@ pub mod trace { let map: HashMap = HashMap::new(); let propagator = XrayPropagator::default(); let context = propagator.extract(&map); - assert_eq!( - context.remote_span_context(), - Some(&SpanContext::empty_context()) - ) + assert_eq!(context.span().span_context(), &SpanContext::empty_context()) } #[test] diff --git a/opentelemetry-datadog/src/lib.rs b/opentelemetry-datadog/src/lib.rs index 4454e870cb..815f09d90b 100644 --- a/opentelemetry-datadog/src/lib.rs +++ b/opentelemetry-datadog/src/lib.rs @@ -343,7 +343,7 @@ mod propagator { let propagator = DatadogPropagator::default(); let context = propagator.extract(&map); - assert_eq!(context.remote_span_context(), Some(&expected)); + assert_eq!(context.span().span_context(), &expected); } } @@ -352,10 +352,7 @@ mod propagator { let map: HashMap = HashMap::new(); let propagator = DatadogPropagator::default(); let context = propagator.extract(&map); - assert_eq!( - context.remote_span_context(), - Some(&SpanContext::empty_context()) - ) + assert_eq!(context.span().span_context(), &SpanContext::empty_context()) } #[test] diff --git a/opentelemetry-jaeger/src/lib.rs b/opentelemetry-jaeger/src/lib.rs index a4ee5984bc..a9d262ace7 100644 --- a/opentelemetry-jaeger/src/lib.rs +++ b/opentelemetry-jaeger/src/lib.rs @@ -497,10 +497,7 @@ mod propagator { let map: HashMap = HashMap::new(); let propagator = Propagator::new(); let context = propagator.extract(&map); - assert_eq!( - context.remote_span_context(), - Some(&SpanContext::empty_context()) - ) + assert_eq!(context.span().span_context(), &SpanContext::empty_context()) } #[test] @@ -513,7 +510,7 @@ mod propagator { ); let propagator = Propagator::new(); let context = propagator.extract(&map); - assert_eq!(context.remote_span_context(), Some(&expected)); + assert_eq!(context.span().span_context(), &expected); } } @@ -526,10 +523,7 @@ mod propagator { ); let propagator = Propagator::new(); let context = propagator.extract(&map); - assert_eq!( - context.remote_span_context(), - Some(&SpanContext::empty_context()) - ); + assert_eq!(context.span().span_context(), &SpanContext::empty_context()); } #[test] @@ -541,10 +535,7 @@ mod propagator { ); let propagator = Propagator::new(); let context = propagator.extract(&map); - assert_eq!( - context.remote_span_context(), - Some(&SpanContext::empty_context()) - ); + assert_eq!(context.span().span_context(), &SpanContext::empty_context()); } #[test] @@ -557,14 +548,14 @@ mod propagator { let propagator = Propagator::new(); let context = propagator.extract(&map); assert_eq!( - context.remote_span_context(), - Some(&SpanContext::new( + context.span().span_context(), + &SpanContext::new( TraceId::from_u128(TRACE_ID), SpanId::from_u64(SPAN_ID), 1, true, TraceState::default(), - )) + ) ); } diff --git a/opentelemetry-zipkin/src/propagator/mod.rs b/opentelemetry-zipkin/src/propagator/mod.rs index b8ae070529..c000365c46 100644 --- a/opentelemetry-zipkin/src/propagator/mod.rs +++ b/opentelemetry-zipkin/src/propagator/mod.rs @@ -319,33 +319,33 @@ mod tests { const SPAN_ID_HEX: u64 = 0x00f0_67aa_0ba9_02b7; #[rustfmt::skip] - fn single_header_extract_data() -> Vec<(&'static str, Option)> { + fn single_header_extract_data() -> Vec<(&'static str, SpanContext)> { vec![ - ("4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7", Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_DEFERRED, true, TraceState::default()))), // deferred - ("4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-0", Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default()))), // not sampled - ("4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-1", Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_SAMPLED, true, TraceState::default()))), // sampled - ("4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-d", Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_DEBUG, true, TraceState::default()))), // debug - ("4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-1-00000000000000cd", Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), 1, true, TraceState::default()))), // with parent span id - ("a3ce929d0e0e4736-00f067aa0ba902b7-1-00000000000000cd", Some(SpanContext::new(TraceId::from_u128(0x0000_0000_0000_0000_a3ce_929d_0e0e_4736), SpanId::from_u64(SPAN_ID_HEX), 1, true, TraceState::default()))), // padding 64 bit traceID - ("0", None), - ("-", None), + ("4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7", SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_DEFERRED, true, TraceState::default())), // deferred + ("4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-0", SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default())), // not sampled + ("4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-1", SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_SAMPLED, true, TraceState::default())), // sampled + ("4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-d", SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_DEBUG, true, TraceState::default())), // debug + ("4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-1-00000000000000cd", SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), 1, true, TraceState::default())), // with parent span id + ("a3ce929d0e0e4736-00f067aa0ba902b7-1-00000000000000cd", SpanContext::new(TraceId::from_u128(0x0000_0000_0000_0000_a3ce_929d_0e0e_4736), SpanId::from_u64(SPAN_ID_HEX), 1, true, TraceState::default())), // padding 64 bit traceID + ("0", SpanContext::empty_context()), + ("-", SpanContext::empty_context()), ] } #[rustfmt::skip] #[allow(clippy::type_complexity)] - fn multi_header_extract_data() -> Vec<((Option<&'static str>, Option<&'static str>, Option<&'static str>, Option<&'static str>, Option<&'static str>), Option)> { + fn multi_header_extract_data() -> Vec<((Option<&'static str>, Option<&'static str>, Option<&'static str>, Option<&'static str>, Option<&'static str>), SpanContext)> { // (TraceId, SpanId, Sampled, FlagId, ParentSpanId) vec![ - ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), None, None, None), Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_DEFERRED, true, TraceState::default()))), // deferred - ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("0"), None, None), Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default()))), // not sampled - ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("1"), None, None), Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_SAMPLED, true, TraceState::default()))), // sampled - ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("true"), None, None), Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_SAMPLED, true, TraceState::default()))), - ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("false"), None, None), Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default()))), // use true/false to set sample - ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), None, Some("1"), None), Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_DEBUG | TRACE_FLAG_SAMPLED, true, TraceState::default()))), // debug - ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("0"), Some("1"), Some("00f067aa0ba90200")), Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_DEBUG | TRACE_FLAG_SAMPLED, true, TraceState::default()))), // debug flag should override sample flag - ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("1"), Some("2"), Some("00f067aa0ba90200")), Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_SAMPLED, true, TraceState::default()))), // invalid debug flag, should ignore - ((None, None, Some("0"), None, None), None), + ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), None, None, None), SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_DEFERRED, true, TraceState::default())), // deferred + ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("0"), None, None), SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default())), // not sampled + ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("1"), None, None), SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_SAMPLED, true, TraceState::default())), // sampled + ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("true"), None, None), SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_SAMPLED, true, TraceState::default())), + ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("false"), None, None), SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default())), // use true/false to set sample + ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), None, Some("1"), None), SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_DEBUG | TRACE_FLAG_SAMPLED, true, TraceState::default())), // debug + ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("0"), Some("1"), Some("00f067aa0ba90200")), SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_DEBUG | TRACE_FLAG_SAMPLED, true, TraceState::default())), // debug flag should override sample flag + ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("1"), Some("2"), Some("00f067aa0ba90200")), SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_SAMPLED, true, TraceState::default())), // invalid debug flag, should ignore + ((None, None, Some("0"), None, None), SpanContext::empty_context()), ] } @@ -388,13 +388,13 @@ mod tests { #[rustfmt::skip] #[allow(clippy::type_complexity)] - fn single_multi_header_extract_data() -> Vec<((Option<&'static str>, Option<&'static str>, Option<&'static str>, Option<&'static str>, Option<&'static str>), &'static str, Option)> { + fn single_multi_header_extract_data() -> Vec<((Option<&'static str>, Option<&'static str>, Option<&'static str>, Option<&'static str>, Option<&'static str>), &'static str, SpanContext)> { // (TraceId, SpanId, Sampled, FlagId, ParentSpanId), b3 vec![ ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), None, None, None), "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-0", - Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default()))), // single header take precedence - ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("0"), None, None), "-", Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default()))), // when single header is invalid, fall back to multiple headers - ((Some("0"), Some("0"), Some("0"), None, None), "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-0", Some(SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default()))) // invalid multiple header should go unnoticed since single header take precedence. + SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default())), // single header take precedence + ((Some(TRACE_ID_STR), Some(SPAN_ID_STR), Some("0"), None, None), "-", SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default())), // when single header is invalid, fall back to multiple headers + ((Some("0"), Some("0"), Some("0"), None, None), "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-0", SpanContext::new(TraceId::from_u128(TRACE_ID_HEX), SpanId::from_u64(SPAN_ID_HEX), TRACE_FLAG_NOT_SAMPLED, true, TraceState::default())) // invalid multiple header should go unnoticed since single header take precedence. ] } @@ -478,8 +478,9 @@ mod tests { assert_eq!( single_header_propagator .extract(&extractor) - .remote_span_context() - .cloned(), + .span() + .span_context() + .clone(), expected_context ) } @@ -490,15 +491,17 @@ mod tests { assert_eq!( multi_header_propagator .extract(&extractor) - .remote_span_context() - .cloned(), + .span() + .span_context() + .clone(), expected_context ); assert_eq!( unspecific_header_propagator .extract(&extractor) - .remote_span_context() - .cloned(), + .span() + .span_context() + .clone(), expected_context ) } @@ -512,15 +515,17 @@ mod tests { assert_eq!( single_header_propagator .extract(&extractor) - .remote_span_context() - .cloned(), + .span() + .span_context() + .clone(), expected_context ); assert_eq!( single_multi_propagator .extract(&extractor) - .remote_span_context() - .cloned(), + .span() + .span_context() + .clone(), expected_context ) } @@ -534,8 +539,9 @@ mod tests { assert_eq!( single_header_propagator .extract(&extractor) - .remote_span_context(), - None + .span() + .span_context(), + &SpanContext::empty_context(), ) } @@ -545,8 +551,9 @@ mod tests { assert_eq!( multi_header_propagator .extract(&extractor) - .remote_span_context(), - None + .span() + .span_context(), + &SpanContext::empty_context(), ) } } diff --git a/opentelemetry/src/sdk/propagation/composite.rs b/opentelemetry/src/sdk/propagation/composite.rs index e4fdce6aa2..672d772f02 100644 --- a/opentelemetry/src/sdk/propagation/composite.rs +++ b/opentelemetry/src/sdk/propagation/composite.rs @@ -209,8 +209,9 @@ mod tests { assert_eq!( composite_propagator .extract(&extractor) - .remote_span_context(), - None + .span() + .span_context(), + &SpanContext::empty_context() ); } } @@ -254,14 +255,15 @@ mod tests { assert_eq!( composite_propagator .extract(&extractor) - .remote_span_context(), - Some(&SpanContext::new( + .span() + .span_context(), + &SpanContext::new( TraceId::from_u128(1), SpanId::from_u64(1), 0, true, TraceState::default(), - )) + ) ); } } diff --git a/opentelemetry/src/sdk/propagation/trace_context.rs b/opentelemetry/src/sdk/propagation/trace_context.rs index c00c75c83c..7f4c65c83d 100644 --- a/opentelemetry/src/sdk/propagation/trace_context.rs +++ b/opentelemetry/src/sdk/propagation/trace_context.rs @@ -214,8 +214,8 @@ mod tests { extractor.insert(TRACESTATE_HEADER.to_string(), trace_state.to_string()); assert_eq!( - propagator.extract(&extractor).remote_span_context(), - Some(&expected_context) + propagator.extract(&extractor).span().span_context(), + &expected_context ) } } @@ -233,8 +233,8 @@ mod tests { assert_eq!( propagator .extract(&extractor) - .remote_span_context() - .unwrap() + .span() + .span_context() .trace_state() .header(), state @@ -250,8 +250,8 @@ mod tests { extractor.insert(TRACEPARENT_HEADER.to_string(), invalid_header.to_string()); assert_eq!( - propagator.extract(&extractor).remote_span_context(), - None, + propagator.extract(&extractor).span().span_context(), + &SpanContext::empty_context(), "{}", reason ) diff --git a/opentelemetry/src/sdk/trace/tracer.rs b/opentelemetry/src/sdk/trace/tracer.rs index 0268f8114a..a0df867e15 100644 --- a/opentelemetry/src/sdk/trace/tracer.rs +++ b/opentelemetry/src/sdk/trace/tracer.rs @@ -181,51 +181,38 @@ impl crate::trace::Tracer for Tracer { let mut flags = 0; let mut span_trace_state = Default::default(); - let parent_cx = { - let cx = builder - .parent_context - .take() - .unwrap_or_else(Context::current); - - // Sampling expects to be able to access the parent span via `span` so wrap remote span - // context in a wrapper span if necessary. Remote span contexts will be passed to - // subsequent context's, so wrapping is only necessary if there is no active span. - match cx.remote_span_context() { - Some(remote_sc) if !cx.has_active_span() => { - cx.with_span(Span::new(remote_sc.clone(), None, self.clone())) - } - _ => cx, - } - }; - let span = parent_cx.span(); - let parent_span_context = if parent_cx.has_active_span() { - Some(span.span_context()) + let parent_cx = builder + .parent_context + .take() + .unwrap_or_else(Context::current); + let parent_span = if parent_cx.has_active_span() { + Some(parent_cx.span()) } else { None }; // Build context for sampling decision - let (no_parent, trace_id, parent_span_id, remote_parent, parent_trace_flags) = - parent_span_context - .as_ref() - .map(|ctx| { - ( - false, - ctx.trace_id(), - ctx.span_id(), - ctx.is_remote(), - ctx.trace_flags(), - ) - }) - .unwrap_or(( - true, - builder - .trace_id - .unwrap_or_else(|| config.id_generator.new_trace_id()), - SpanId::invalid(), + let (no_parent, trace_id, parent_span_id, remote_parent, parent_trace_flags) = parent_span + .as_ref() + .map(|parent| { + let sc = parent.span_context(); + ( false, - 0, - )); + sc.trace_id(), + sc.span_id(), + sc.is_remote(), + sc.trace_flags(), + ) + }) + .unwrap_or(( + true, + builder + .trace_id + .unwrap_or_else(|| config.id_generator.new_trace_id()), + SpanId::invalid(), + false, + 0, + )); // There are 3 paths for sampling. // @@ -246,13 +233,13 @@ impl crate::trace::Tracer for Tracer { ) } else { // has parent that is local: use parent if sampled, or don't record. - parent_span_context - .filter(|span_context| span_context.is_sampled()) - .map(|span_context| { + parent_span + .filter(|span| span.span_context().is_sampled()) + .map(|span| { ( parent_trace_flags, Vec::new(), - span_context.trace_state().clone(), + span.span_context().trace_state().clone(), ) }) }; diff --git a/opentelemetry/src/trace/context.rs b/opentelemetry/src/trace/context.rs index 93bb2ade1a..68d8de4431 100644 --- a/opentelemetry/src/trace/context.rs +++ b/opentelemetry/src/trace/context.rs @@ -106,8 +106,6 @@ impl SpanRef<'_> { } } -struct RemoteSpanContext(crate::trace::SpanContext); - /// Methods for storing and retrieving trace data in a context. pub trait TraceContextExt { /// Returns a clone of the current context with the included span. @@ -151,12 +149,6 @@ pub trait TraceContextExt { /// /// This is useful for building propagators. fn with_remote_span_context(&self, span_context: crate::trace::SpanContext) -> Self; - - /// Returns a reference to the remote span context data stored in this context, - /// or none if no remote span context has been set. - /// - /// This is useful for building tracers. - fn remote_span_context(&self) -> Option<&crate::trace::SpanContext>; } impl TraceContextExt for Context { @@ -187,12 +179,10 @@ impl TraceContextExt for Context { } fn with_remote_span_context(&self, span_context: crate::trace::SpanContext) -> Self { - self.with_value(RemoteSpanContext(span_context)) - } - - fn remote_span_context(&self) -> Option<&crate::trace::SpanContext> { - self.get::() - .map(|span_context| &span_context.0) + self.with_value(SynchronizedSpan { + span_context, + inner: None, + }) } } diff --git a/opentelemetry/src/trace/noop.rs b/opentelemetry/src/trace/noop.rs index fd3277d47b..19250744c3 100644 --- a/opentelemetry/src/trace/noop.rs +++ b/opentelemetry/src/trace/noop.rs @@ -153,17 +153,11 @@ impl trace::Tracer for NoopTracer { /// /// If the span builder or context contains a valid span context, it is propagated. fn build(&self, mut builder: trace::SpanBuilder) -> Self::Span { - let parent_span_context = builder.parent_context.take().and_then(|parent_cx| { - if parent_cx.has_active_span() { - Some(parent_cx.span().span_context().clone()) - } else { - parent_cx.remote_span_context().cloned() - } - }); - if let Some(span_context) = parent_span_context { - trace::NoopSpan { span_context } - } else { - self.invalid() + match builder.parent_context.take() { + Some(cx) if cx.has_active_span() => trace::NoopSpan { + span_context: cx.span().span_context().clone(), + }, + _ => self.invalid(), } } }