From 773063aa99c76b9650fa1481eb94b621cdceca34 Mon Sep 17 00:00:00 2001 From: Marcin Zaremba Date: Wed, 24 Mar 2021 16:39:11 +0100 Subject: [PATCH 1/4] Fix the empty headers use case for OTTracePropagator --- .../src/opentelemetry/propagators/ot_trace/__init__.py | 9 +++++---- .../tests/test_ot_trace_propagator.py | 9 +++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py b/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py index 3aef2cfcb0..e85dcb0a4f 100644 --- a/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py +++ b/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py @@ -13,7 +13,7 @@ # limitations under the License. from re import compile as re_compile -from typing import Iterable, Optional +from typing import Any, Iterable, Optional from opentelemetry.baggage import get_all, set_baggage from opentelemetry.context import Context @@ -55,10 +55,10 @@ def extract( ) -> Context: traceid = _extract_first_element( - getter.get(carrier, OT_TRACE_ID_HEADER) + getter.get(carrier, OT_TRACE_ID_HEADER), INVALID_TRACE_ID ) - spanid = _extract_first_element(getter.get(carrier, OT_SPAN_ID_HEADER)) + spanid = _extract_first_element(getter.get(carrier, OT_SPAN_ID_HEADER), INVALID_SPAN_ID) sampled = _extract_first_element( getter.get(carrier, OT_SAMPLED_HEADER) @@ -164,7 +164,8 @@ def fields(self): def _extract_first_element( items: Iterable[TextMapPropagatorT], + default: Any = None, ) -> Optional[TextMapPropagatorT]: if items is None: - return None + return default return next(iter(items), None) diff --git a/propagator/opentelemetry-propagator-ot-trace/tests/test_ot_trace_propagator.py b/propagator/opentelemetry-propagator-ot-trace/tests/test_ot_trace_propagator.py index 5af8129d7a..e8b19e44a0 100644 --- a/propagator/opentelemetry-propagator-ot-trace/tests/test_ot_trace_propagator.py +++ b/propagator/opentelemetry-propagator-ot-trace/tests/test_ot_trace_propagator.py @@ -366,3 +366,12 @@ def test_extract_baggage(self): self.assertEqual(baggage["abc"], "abc") self.assertEqual(baggage["def"], "def") + + def test_extract_empty(self): + "Test extraction when no headers are present" + + span_context = get_current_span( + self.ot_trace_propagator.extract(carrier_getter, {}) + ).get_span_context() + + self.assertEqual(span_context, INVALID_SPAN_CONTEXT) From 8b29a792d7e385e7ff842d1475323dea748bf852 Mon Sep 17 00:00:00 2001 From: Marcin Zaremba Date: Wed, 24 Mar 2021 16:57:14 +0100 Subject: [PATCH 2/4] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4102c1f8c3..5d5c5ceaa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased](https://github.com/open-telemetry/opentelemetry-python-contrib/compare/v0.18b0...HEAD) - Updated instrumentations to use `opentelemetry.trace.use_span` instead of `Tracer.use_span()` ([#364](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/364)) +- `opentelemetry-propagator-ot-trace` Do not throw an exception when headers are not present + ([#378](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/378)) ### Changed - Rename `IdsGenerator` to `IdGenerator` From f48ee97baefa58e36f6b72e08e7c9cfaf240eb99 Mon Sep 17 00:00:00 2001 From: Marcin Zaremba Date: Wed, 24 Mar 2021 17:06:11 +0100 Subject: [PATCH 3/4] Reformat code with black --- .../src/opentelemetry/propagators/ot_trace/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py b/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py index e85dcb0a4f..d00e128c0c 100644 --- a/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py +++ b/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py @@ -58,7 +58,9 @@ def extract( getter.get(carrier, OT_TRACE_ID_HEADER), INVALID_TRACE_ID ) - spanid = _extract_first_element(getter.get(carrier, OT_SPAN_ID_HEADER), INVALID_SPAN_ID) + spanid = _extract_first_element( + getter.get(carrier, OT_SPAN_ID_HEADER), INVALID_SPAN_ID + ) sampled = _extract_first_element( getter.get(carrier, OT_SAMPLED_HEADER) @@ -119,7 +121,9 @@ def inject( carrier, OT_TRACE_ID_HEADER, hex(span_context.trace_id)[2:][-16:] ) set_in_carrier( - carrier, OT_SPAN_ID_HEADER, hex(span_context.span_id)[2:][-16:], + carrier, + OT_SPAN_ID_HEADER, + hex(span_context.span_id)[2:][-16:], ) if span_context.trace_flags == TraceFlags.SAMPLED: From f4e6cd100287db12f3d05d95b310f22626ab960b Mon Sep 17 00:00:00 2001 From: Marcin Zaremba Date: Wed, 24 Mar 2021 17:24:28 +0100 Subject: [PATCH 4/4] Fix formatting once again --- .../src/opentelemetry/propagators/ot_trace/__init__.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py b/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py index d00e128c0c..603096cb6e 100644 --- a/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py +++ b/propagator/opentelemetry-propagator-ot-trace/src/opentelemetry/propagators/ot_trace/__init__.py @@ -121,9 +121,7 @@ def inject( carrier, OT_TRACE_ID_HEADER, hex(span_context.trace_id)[2:][-16:] ) set_in_carrier( - carrier, - OT_SPAN_ID_HEADER, - hex(span_context.span_id)[2:][-16:], + carrier, OT_SPAN_ID_HEADER, hex(span_context.span_id)[2:][-16:], ) if span_context.trace_flags == TraceFlags.SAMPLED: @@ -167,8 +165,7 @@ def fields(self): def _extract_first_element( - items: Iterable[TextMapPropagatorT], - default: Any = None, + items: Iterable[TextMapPropagatorT], default: Any = None, ) -> Optional[TextMapPropagatorT]: if items is None: return default