Skip to content

Commit f55bcec

Browse files
authored
Handle None in OTEL_PROPAGATORS (#4553)
1 parent e46db88 commit f55bcec

File tree

3 files changed

+60
-9
lines changed

3 files changed

+60
-9
lines changed

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313
([#4508](https://github.com/open-telemetry/opentelemetry-python/pull/4508))
1414
- Fix serialization of extended attributes for logs signal
1515
([#4342](https://github.com/open-telemetry/opentelemetry-python/pull/4342))
16+
- Handle OTEL_PROPAGATORS contains None
17+
([#4553](https://github.com/open-telemetry/opentelemetry-python/pull/4553))
1618
- docs: updated and added to the metrics and log examples
1719
([#4559](https://github.com/open-telemetry/opentelemetry-python/pull/4559))
1820

@@ -1531,8 +1533,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
15311533
Serialize tuple type values by coercing them into a string, since Jaeger does not
15321534
support tuple types.
15331535
([#865](https://github.com/open-telemetry/opentelemetry-python/pull/865))
1534-
- Validate span attribute types in SDK
1535-
([#678](https://github.com/open-telemetry/opentelemetry-python/pull/678))
15361536
- Specify to_json indent from arguments
15371537
([#718](https://github.com/open-telemetry/opentelemetry-python/pull/718))
15381538
- Span.resource will now default to an empty resource

opentelemetry-api/src/opentelemetry/propagate/__init__.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def example_route():
7070

7171
from logging import getLogger
7272
from os import environ
73-
from typing import Optional
73+
from typing import List, Optional
7474

7575
from opentelemetry.context.context import Context
7676
from opentelemetry.environment_variables import OTEL_PROPAGATORS
@@ -121,7 +121,7 @@ def inject(
121121
get_global_textmap().inject(carrier, context=context, setter=setter)
122122

123123

124-
propagators = []
124+
propagators: List[textmap.TextMapPropagator] = []
125125

126126
# Single use variable here to hack black and make lint pass
127127
environ_propagators = environ.get(
@@ -132,12 +132,17 @@ def inject(
132132

133133
for propagator in environ_propagators.split(","):
134134
propagator = propagator.strip()
135-
135+
if propagator.lower() == "none":
136+
logger.debug(
137+
"OTEL_PROPAGATORS environment variable contains none, removing all propagators"
138+
)
139+
propagators = []
140+
break
136141
try:
137-
propagators.append( # type: ignore
142+
propagators.append(
138143
next( # type: ignore
139144
iter( # type: ignore
140-
entry_points( # type: ignore
145+
entry_points( # type: ignore[misc]
141146
group="opentelemetry_propagator",
142147
name=propagator,
143148
)
@@ -153,7 +158,9 @@ def inject(
153158
raise
154159

155160

156-
_HTTP_TEXT_FORMAT = composite.CompositePropagator(propagators) # type: ignore
161+
_HTTP_TEXT_FORMAT: textmap.TextMapPropagator = composite.CompositePropagator(
162+
propagators
163+
)
157164

158165

159166
def get_global_textmap() -> textmap.TextMapPropagator:
@@ -164,4 +171,4 @@ def set_global_textmap(
164171
http_text_format: textmap.TextMapPropagator,
165172
) -> None:
166173
global _HTTP_TEXT_FORMAT # pylint:disable=global-statement
167-
_HTTP_TEXT_FORMAT = http_text_format # type: ignore
174+
_HTTP_TEXT_FORMAT = http_text_format

opentelemetry-api/tests/propagators/test_propagators.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,50 @@ def test_propagators(propagators):
4949

5050
reload(opentelemetry.propagate)
5151

52+
@patch.dict(environ, {OTEL_PROPAGATORS: "None"})
53+
@patch("opentelemetry.propagators.composite.CompositePropagator")
54+
def test_none_propogators(self, mock_compositehttppropagator):
55+
def test_propagators(propagators):
56+
propagators = {propagator.__class__ for propagator in propagators}
57+
58+
self.assertEqual(len(propagators), 0)
59+
self.assertEqual(
60+
propagators,
61+
set(),
62+
)
63+
64+
mock_compositehttppropagator.configure_mock(
65+
**{"side_effect": test_propagators}
66+
)
67+
68+
# pylint: disable=import-outside-toplevel
69+
import opentelemetry.propagate
70+
71+
reload(opentelemetry.propagate)
72+
73+
@patch.dict(environ, {OTEL_PROPAGATORS: "tracecontext, None"})
74+
@patch("opentelemetry.propagators.composite.CompositePropagator")
75+
def test_multiple_propogators_with_none(
76+
self, mock_compositehttppropagator
77+
):
78+
def test_propagators(propagators):
79+
propagators = {propagator.__class__ for propagator in propagators}
80+
81+
self.assertEqual(len(propagators), 0)
82+
self.assertEqual(
83+
propagators,
84+
set(),
85+
)
86+
87+
mock_compositehttppropagator.configure_mock(
88+
**{"side_effect": test_propagators}
89+
)
90+
91+
# pylint: disable=import-outside-toplevel
92+
import opentelemetry.propagate
93+
94+
reload(opentelemetry.propagate)
95+
5296
@patch.dict(environ, {OTEL_PROPAGATORS: "a, b, c "})
5397
@patch("opentelemetry.propagators.composite.CompositePropagator")
5498
@patch("opentelemetry.util._importlib_metadata.entry_points")

0 commit comments

Comments
 (0)