From d0ef36510f9000650189675ff4cdd0a0e8c07026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Thu, 12 Dec 2024 05:03:40 +0100 Subject: [PATCH] Include SpanContext information in Context Debug (#2365) Co-authored-by: Cijo Thomas --- opentelemetry/src/context.rs | 16 +++++++++++++--- opentelemetry/src/trace/context.rs | 6 ++++++ opentelemetry/src/trace/span_context.rs | 24 ++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/opentelemetry/src/context.rs b/opentelemetry/src/context.rs index 67eae958f6..4398e7b589 100644 --- a/opentelemetry/src/context.rs +++ b/opentelemetry/src/context.rs @@ -327,9 +327,19 @@ impl Context { impl fmt::Debug for Context { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Context") - .field("entries", &self.entries.len()) - .finish() + let mut dbg = f.debug_struct("Context"); + let mut entries = self.entries.len(); + #[cfg(feature = "trace")] + { + if let Some(span) = &self.span { + dbg.field("span", &span.span_context()); + entries += 1; + } else { + dbg.field("span", &"None"); + } + } + + dbg.field("entries", &entries).finish() } } diff --git a/opentelemetry/src/trace/context.rs b/opentelemetry/src/trace/context.rs index 723a525f88..125c96f5f5 100644 --- a/opentelemetry/src/trace/context.rs +++ b/opentelemetry/src/trace/context.rs @@ -32,6 +32,12 @@ pub(crate) struct SynchronizedSpan { inner: Option>, } +impl SynchronizedSpan { + pub(crate) fn span_context(&self) -> &SpanContext { + &self.span_context + } +} + impl From for SynchronizedSpan { fn from(value: SpanContext) -> Self { Self { diff --git a/opentelemetry/src/trace/span_context.rs b/opentelemetry/src/trace/span_context.rs index 2e1502299b..151e2416fd 100644 --- a/opentelemetry/src/trace/span_context.rs +++ b/opentelemetry/src/trace/span_context.rs @@ -544,6 +544,7 @@ impl SpanContext { #[cfg(test)] mod tests { use super::*; + use crate::{trace::TraceContextExt, Context}; #[rustfmt::skip] fn trace_id_test_data() -> Vec<(TraceId, &'static str, [u8; 16])> { @@ -647,4 +648,27 @@ mod tests { assert!(trace_state.get("testkey").is_none()); // The original state doesn't change assert_eq!(inserted_trace_state.get("testkey").unwrap(), "testvalue"); // } + + #[test] + fn test_context_span_debug() { + let cx = Context::current(); + assert_eq!( + format!("{:?}", cx), + "Context { span: \"None\", entries: 0 }" + ); + let cx = Context::current().with_remote_span_context(SpanContext::NONE); + assert_eq!( + format!("{:?}", cx), + "Context { \ + span: SpanContext { \ + trace_id: 00000000000000000000000000000000, \ + span_id: 0000000000000000, \ + trace_flags: TraceFlags(0), \ + is_remote: false, \ + trace_state: TraceState(None) \ + }, \ + entries: 1 \ + }" + ); + } }