Skip to content

Commit 4f2c964

Browse files
authored
Propagator return original context if failed to extract (#139)
1 parent e57ca09 commit 4f2c964

3 files changed

Lines changed: 50 additions & 67 deletions

File tree

opentelemetry-propagator-gcp/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## Unreleased
44

5+
- Fix propagator modifying context if failed to extract
6+
([#139](https://github.com/GoogleCloudPlatform/opentelemetry-operations-python/pull/139))
7+
58
## Version 1.0.0rc0
69

710
Released 2021-04-22

opentelemetry-propagator-gcp/src/opentelemetry/propagators/cloud_trace_propagator/__init__.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,24 @@ def extract(
5656
context: typing.Optional[Context] = None,
5757
getter: textmap.Getter = textmap.default_getter,
5858
) -> Context:
59+
if context is None:
60+
context = Context()
61+
5962
header = self._get_header_value(getter, carrier)
6063

6164
if not header:
62-
return trace.set_span_in_context(trace.INVALID_SPAN, context)
65+
return context
6366

6467
match = re.fullmatch(_TRACE_CONTEXT_HEADER_RE, header)
6568
if match is None:
66-
return trace.set_span_in_context(trace.INVALID_SPAN, context)
69+
return context
6770

6871
trace_id = match.group("trace_id")
6972
span_id = match.group("span_id")
7073
trace_options = match.group("trace_flags")
7174

7275
if trace_id == "0" * 32 or int(span_id) == 0:
73-
return trace.set_span_in_context(trace.INVALID_SPAN, context)
76+
return context
7477

7578
span_context = SpanContext(
7679
trace_id=int(trace_id, 16),

opentelemetry-propagator-gcp/tests/test_cloud_trace_propagator.py

Lines changed: 41 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import opentelemetry.trace as trace
1818
from opentelemetry.context import get_current
19+
from opentelemetry.context.context import Context
1920
from opentelemetry.propagators.cloud_trace_propagator import (
2021
_TRACE_CONTEXT_HEADER_NAME,
2122
CloudTraceFormatPropagator,
@@ -43,7 +44,13 @@ def _extract(self, header_value):
4344
new_context = self.propagator.extract(
4445
carrier=header, getter=default_getter
4546
)
46-
return trace.get_current_span(new_context).get_span_context()
47+
return new_context
48+
49+
def _extract_span_context(self, header_value):
50+
"""Test helper"""
51+
return trace.get_current_span(
52+
self._extract(header_value)
53+
).get_span_context()
4754

4855
def _inject(self, span=None):
4956
"""Test helper"""
@@ -54,27 +61,30 @@ def _inject(self, span=None):
5461
self.propagator.inject(output, context=ctx)
5562
return output.get(_TRACE_CONTEXT_HEADER_NAME)
5663

57-
def test_no_context_header(self):
58-
header = {}
59-
new_context = self.propagator.extract(
60-
carrier=header, getter=default_getter
61-
)
64+
def _assert_failed_to_extract(self, new_context: Context):
65+
self.assertEqual(new_context, Context())
6266
self.assertEqual(
6367
trace.get_current_span(new_context).get_span_context(),
6468
trace.INVALID_SPAN.get_span_context(),
6569
)
6670

71+
def test_no_context_header(self):
72+
headers = {}
73+
new_context = self.propagator.extract(
74+
carrier=headers, getter=default_getter
75+
)
76+
self._assert_failed_to_extract(new_context)
77+
6778
def test_empty_context_header(self):
6879
header = ""
69-
self.assertEqual(
70-
self._extract(header), trace.INVALID_SPAN.get_span_context()
71-
)
80+
new_context = self._extract(header)
81+
self._assert_failed_to_extract(new_context)
7282

7383
def test_valid_header(self):
7484
header = "{}/{};o=1".format(
7585
format_trace_id(self.valid_trace_id), self.valid_span_id
7686
)
77-
new_span_context = self._extract(header)
87+
new_span_context = self._extract_span_context(header)
7888
self.assertEqual(new_span_context.trace_id, self.valid_trace_id)
7989
self.assertEqual(new_span_context.span_id, self.valid_span_id)
8090
self.assertEqual(new_span_context.trace_flags, TraceFlags(1))
@@ -83,7 +93,7 @@ def test_valid_header(self):
8393
header = "{}/{};o=10".format(
8494
format_trace_id(self.valid_trace_id), self.valid_span_id
8595
)
86-
new_span_context = self._extract(header)
96+
new_span_context = self._extract_span_context(header)
8797
self.assertEqual(new_span_context.trace_id, self.valid_trace_id)
8898
self.assertEqual(new_span_context.span_id, self.valid_span_id)
8999
self.assertEqual(new_span_context.trace_flags, TraceFlags(10))
@@ -92,14 +102,14 @@ def test_valid_header(self):
92102
header = "{}/{};o=0".format(
93103
format_trace_id(self.valid_trace_id), self.valid_span_id
94104
)
95-
new_span_context = self._extract(header)
105+
new_span_context = self._extract_span_context(header)
96106
self.assertEqual(new_span_context.trace_id, self.valid_trace_id)
97107
self.assertEqual(new_span_context.span_id, self.valid_span_id)
98108
self.assertEqual(new_span_context.trace_flags, TraceFlags(0))
99109
self.assertTrue(new_span_context.is_remote)
100110

101111
header = "{}/{};o=0".format(format_trace_id(self.valid_trace_id), 345)
102-
new_span_context = self._extract(header)
112+
new_span_context = self._extract_span_context(header)
103113
self.assertEqual(new_span_context.trace_id, self.valid_trace_id)
104114
self.assertEqual(new_span_context.span_id, 345)
105115
self.assertEqual(new_span_context.trace_flags, TraceFlags(0))
@@ -129,106 +139,73 @@ def test_mixed_case_header_key(self):
129139

130140
def test_invalid_header_format(self):
131141
header = "invalid_header"
132-
self.assertEqual(
133-
self._extract(header), trace.INVALID_SPAN.get_span_context()
134-
)
142+
self._assert_failed_to_extract(self._extract(header))
135143

136144
header = "{}/{};o=".format(
137145
format_trace_id(self.valid_trace_id), self.valid_span_id
138146
)
139-
self.assertEqual(
140-
self._extract(header), trace.INVALID_SPAN.get_span_context()
141-
)
147+
self._assert_failed_to_extract(self._extract(header))
142148

143149
header = "extra_chars/{}/{};o=1".format(
144150
format_trace_id(self.valid_trace_id), self.valid_span_id
145151
)
146-
self.assertEqual(
147-
self._extract(header), trace.INVALID_SPAN.get_span_context()
148-
)
152+
self._assert_failed_to_extract(self._extract(header))
149153

150154
header = "{}/{}extra_chars;o=1".format(
151155
format_trace_id(self.valid_trace_id), self.valid_span_id
152156
)
153-
self.assertEqual(
154-
self._extract(header), trace.INVALID_SPAN.get_span_context()
155-
)
157+
self._assert_failed_to_extract(self._extract(header))
156158

157159
header = "{}/{};o=1extra_chars".format(
158160
format_trace_id(self.valid_trace_id), self.valid_span_id
159161
)
160-
self.assertEqual(
161-
self._extract(header), trace.INVALID_SPAN.get_span_context()
162-
)
162+
self._assert_failed_to_extract(self._extract(header))
163163

164164
header = "{}/;o=1".format(format_trace_id(self.valid_trace_id))
165-
self.assertEqual(
166-
self._extract(header), trace.INVALID_SPAN.get_span_context()
167-
)
165+
self._assert_failed_to_extract(self._extract(header))
168166

169167
header = "/{};o=1".format(self.valid_span_id)
170-
self.assertEqual(
171-
self._extract(header), trace.INVALID_SPAN.get_span_context()
172-
)
168+
self._assert_failed_to_extract(self._extract(header))
173169

174170
header = "{}/{};o={}".format("123", "34", "4")
175-
self.assertEqual(
176-
self._extract(header), trace.INVALID_SPAN.get_span_context()
177-
)
171+
self._assert_failed_to_extract(self._extract(header))
178172

179173
def test_invalid_trace_id(self):
180174
header = "{}/{};o={}".format(INVALID_TRACE_ID, self.valid_span_id, 1)
181-
self.assertEqual(
182-
self._extract(header), trace.INVALID_SPAN.get_span_context()
183-
)
175+
self._assert_failed_to_extract(self._extract(header))
176+
184177
header = "{}/{};o={}".format("0" * 32, self.valid_span_id, 1)
185-
self.assertEqual(
186-
self._extract(header), trace.INVALID_SPAN.get_span_context()
187-
)
178+
self._assert_failed_to_extract(self._extract(header))
188179

189180
header = "0/{};o={}".format(self.valid_span_id, 1)
190-
self.assertEqual(
191-
self._extract(header), trace.INVALID_SPAN.get_span_context()
192-
)
181+
self._assert_failed_to_extract(self._extract(header))
193182

194183
header = "234/{};o={}".format(self.valid_span_id, 1)
195-
self.assertEqual(
196-
self._extract(header), trace.INVALID_SPAN.get_span_context()
197-
)
184+
self._assert_failed_to_extract(self._extract(header))
198185

199186
header = "{}/{};o={}".format(self.too_long_id, self.valid_span_id, 1)
200-
self.assertEqual(
201-
self._extract(header), trace.INVALID_SPAN.get_span_context()
202-
)
187+
self._assert_failed_to_extract(self._extract(header))
203188

204189
def test_invalid_span_id(self):
205190
header = "{}/{};o={}".format(
206191
format_trace_id(self.valid_trace_id), INVALID_SPAN_ID, 1
207192
)
208-
self.assertEqual(
209-
self._extract(header), trace.INVALID_SPAN.get_span_context()
210-
)
193+
self._assert_failed_to_extract(self._extract(header))
211194

212195
header = "{}/{};o={}".format(
213196
format_trace_id(self.valid_trace_id), "0" * 16, 1
214197
)
215-
self.assertEqual(
216-
self._extract(header), trace.INVALID_SPAN.get_span_context()
217-
)
198+
self._assert_failed_to_extract(self._extract(header))
218199

219200
header = "{}/{};o={}".format(
220201
format_trace_id(self.valid_trace_id), "0", 1
221202
)
222-
self.assertEqual(
223-
self._extract(header), trace.INVALID_SPAN.get_span_context()
224-
)
203+
self._assert_failed_to_extract(self._extract(header))
225204

226205
header = "{}/{};o={}".format(
227206
format_trace_id(self.valid_trace_id), self.too_long_id, 1
228207
)
229-
self.assertEqual(
230-
self._extract(header), trace.INVALID_SPAN.get_span_context()
231-
)
208+
self._assert_failed_to_extract(self._extract(header))
232209

233210
def test_inject_with_no_context(self):
234211
output = self._inject()

0 commit comments

Comments
 (0)