From 87090028ffc6986c699190f74aa317e45e9b663e Mon Sep 17 00:00:00 2001 From: Owais Lone Date: Wed, 23 Sep 2020 18:04:17 +0530 Subject: [PATCH] Fix B3 propagator to not crash work with DefaultSpan --- .../sdk/trace/propagation/b3_format.py | 14 ++++++++------ .../tests/trace/propagation/test_b3_format.py | 13 +++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/propagation/b3_format.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/propagation/b3_format.py index f6d3345ed77..c2b12f33f5a 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/propagation/b3_format.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/propagation/b3_format.py @@ -140,21 +140,23 @@ def inject( ) -> None: span = trace.get_current_span(context=context) - if span.get_context() == trace.INVALID_SPAN_CONTEXT: + span_context = span.get_context() + if span_context == trace.INVALID_SPAN_CONTEXT: return - sampled = (trace.TraceFlags.SAMPLED & span.context.trace_flags) != 0 + sampled = (trace.TraceFlags.SAMPLED & span_context.trace_flags) != 0 set_in_carrier( - carrier, self.TRACE_ID_KEY, format_trace_id(span.context.trace_id), + carrier, self.TRACE_ID_KEY, format_trace_id(span_context.trace_id), ) set_in_carrier( - carrier, self.SPAN_ID_KEY, format_span_id(span.context.span_id) + carrier, self.SPAN_ID_KEY, format_span_id(span_context.span_id) ) - if span.parent is not None: + span_parent = getattr(span, "parent", None) + if span_parent is not None: set_in_carrier( carrier, self.PARENT_SPAN_ID_KEY, - format_span_id(span.parent.span_id), + format_span_id(span_parent.span_id), ) set_in_carrier(carrier, self.SAMPLED_KEY, "1" if sampled else "0") diff --git a/opentelemetry-sdk/tests/trace/propagation/test_b3_format.py b/opentelemetry-sdk/tests/trace/propagation/test_b3_format.py index bc508f3fd91..77834adec97 100644 --- a/opentelemetry-sdk/tests/trace/propagation/test_b3_format.py +++ b/opentelemetry-sdk/tests/trace/propagation/test_b3_format.py @@ -307,3 +307,16 @@ def test_inject_empty_context(): new_carrier = {} FORMAT.inject(dict.__setitem__, new_carrier, get_current()) assert len(new_carrier) == 0 + + @staticmethod + def test_default_span(): + """Make sure propagator does not crash when working with DefaultSpan""" + + def getter(carrier, key): + return carrier.get(key, None) + + def setter(carrier, key, value): + carrier[key] = value + + ctx = FORMAT.extract(getter, {}) + FORMAT.inject(setter, {}, ctx)