Skip to content
This repository was archived by the owner on Jul 11, 2022. It is now read-only.

Commit 73ea288

Browse files
cshoweyurishkuro
authored andcommitted
Fix handling of missing headers in the b3 codec (#215)
* Fix handling of missing headers in the b3 codec The b3 codec uses .get() to extract headers and so does not throw a key error if headers are missing. However many of these headers are decoded via "header_to_hex" which throws an exception on a None value. Other codecs handle the missing header case by returning None, update the b3 codec to follow this convention. Signed-off-by: Caleb Howe <[email protected]>
1 parent 22859a3 commit 73ea288

File tree

2 files changed

+31
-12
lines changed

2 files changed

+31
-12
lines changed

jaeger_client/codecs.py

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -298,19 +298,24 @@ def inject(self, span_context, carrier):
298298
def extract(self, carrier):
299299
if not isinstance(carrier, dict):
300300
raise InvalidCarrierException('carrier not a dictionary')
301-
lowercase_keys = dict([(k.lower(), k) for k in carrier])
302-
trace_id = header_to_hex(carrier.get(lowercase_keys.get(self._trace_header_lc)))
303-
span_id = header_to_hex(carrier.get(lowercase_keys.get(self._span_header_lc)))
304-
parent_id = carrier.get(lowercase_keys.get(self._parent_span_header_lc))
305-
if parent_id:
306-
parent_id = header_to_hex(parent_id)
301+
trace_id = span_id = parent_id = None
307302
flags = 0x00
308-
sampled = carrier.get(lowercase_keys.get(self._sampled_header_lc))
309-
if sampled == '1':
310-
flags |= SAMPLED_FLAG
311-
debug = carrier.get(lowercase_keys.get(self._flags_header_lc))
312-
if debug == '1':
313-
flags |= DEBUG_FLAG
303+
for header_key, header_value in six.iteritems(carrier):
304+
if header_value is None:
305+
continue
306+
lower_key = header_key.lower()
307+
if lower_key == self._trace_header_lc:
308+
trace_id = header_to_hex(header_value)
309+
elif lower_key == self._span_header_lc:
310+
span_id = header_to_hex(header_value)
311+
elif lower_key == self._parent_span_header_lc:
312+
parent_id = header_to_hex(header_value)
313+
elif lower_key == self._sampled_header_lc and header_value == '1':
314+
flags |= SAMPLED_FLAG
315+
elif lower_key == self._flags_header_lc and header_value == '1':
316+
flags |= DEBUG_FLAG
317+
if not trace_id or not span_id:
318+
return None
314319
return SpanContext(trace_id=trace_id, span_id=span_id,
315320
parent_id=parent_id, flags=flags,
316321
baggage=None)

tests/test_codecs.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,20 @@ def test_b3_extract(self):
339339
span_context = codec.extract(carrier)
340340
assert span_context.flags == 0x01
341341

342+
# validate present debug header with falsy value
343+
carrier = {'X-b3-SpanId': 'a2fb4a1d1a96d312', 'X-B3-flags': '0',
344+
'X-B3-traceId': '463ac35c9f6413ad48485a3953bb6124'}
345+
span_context = codec.extract(carrier)
346+
assert span_context.flags == 0x00
347+
348+
# validate missing context
349+
assert codec.extract({}) is None
350+
351+
# validate explicit none in context
352+
carrier = {'X-b3-SpanId': None,
353+
'X-B3-traceId': '463ac35c9f6413ad48485a3953bb6124'}
354+
assert codec.extract(carrier) is None
355+
342356
# validate invalid hex string
343357
with self.assertRaises(SpanContextCorruptedException):
344358
codec.extract({'x-B3-TraceId': 'a2fb4a1d1a96d312z'})

0 commit comments

Comments
 (0)