Skip to content

Commit f283a4b

Browse files
Bastian KrolFerenc-
Bastian Krol
authored andcommitted
fix(w3c trace context): correctly parse flags hex string to int
Signed-off-by: Bastian Krol <[email protected]>
1 parent b6c0e9b commit f283a4b

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

instana/w3c_trace_context/traceparent.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,13 @@ def get_traceparent_fields(traceparent):
3636
version = traceparent_properties[0]
3737
trace_id = traceparent_properties[1]
3838
parent_id = traceparent_properties[2]
39-
flags = int(traceparent_properties[3])
39+
flags = int(traceparent_properties[3], 16)
4040
sampled_flag = (flags & SAMPLED_BITMASK) == SAMPLED_BITMASK
4141
return version, trace_id, parent_id, sampled_flag
42-
except Exception: # This method is intended to be called with a version 00 validated traceparent
42+
except Exception as err: # This method is intended to be called with a version 00 validated traceparent
4343
# This exception handling is added just for making sure we do not throw any unhandled exception
4444
# if somebody calls the method in the future without a validated traceparent
45+
logger.debug("Parsing the traceparent failed: {}".format(err))
4546
return None, None, None, None
4647

4748
def update_traceparent(self, traceparent, in_trace_id, in_span_id, level):

tests/w3c_trace_context/test_traceparent.py

+26
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@ def test_validate_valid(self):
1313
traceparent = "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
1414
self.assertEqual(traceparent, self.tp.validate(traceparent))
1515

16+
def test_validate_newer_version(self):
17+
# Although the incoming traceparent header sports a newer version number, we should still be able to parse the
18+
# parts that we understand (and consider it valid).
19+
traceparent = "ff-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01-12345-abcd"
20+
self.assertEqual(traceparent, self.tp.validate(traceparent))
21+
22+
def test_validate_unknown_flags(self):
23+
traceparent = "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-ee"
24+
self.assertEqual(traceparent, self.tp.validate(traceparent))
25+
1626
def test_validate_invalid_traceparent(self):
1727
traceparent = "00-4bxxxxx3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
1828
self.assertIsNone(self.tp.validate(traceparent))
@@ -35,6 +45,22 @@ def test_get_traceparent_fields_unsampled(self):
3545
self.assertEqual(parent_id, "00f067aa0ba902b7")
3646
self.assertFalse(sampled_flag)
3747

48+
def test_get_traceparent_fields_newer_version(self):
49+
# Although the incoming traceparent header sports a newer version number, we should still be able to parse the
50+
# parts that we understand (and consider it valid).
51+
traceparent = "ff-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01-12345-abcd"
52+
version, trace_id, parent_id, sampled_flag = self.tp.get_traceparent_fields(traceparent)
53+
self.assertEqual(trace_id, "4bf92f3577b34da6a3ce929d0e0e4736")
54+
self.assertEqual(parent_id, "00f067aa0ba902b7")
55+
self.assertTrue(sampled_flag)
56+
57+
def test_get_traceparent_fields_unknown_flags(self):
58+
traceparent = "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-ff"
59+
version, trace_id, parent_id, sampled_flag = self.tp.get_traceparent_fields(traceparent)
60+
self.assertEqual(trace_id, "4bf92f3577b34da6a3ce929d0e0e4736")
61+
self.assertEqual(parent_id, "00f067aa0ba902b7")
62+
self.assertTrue(sampled_flag)
63+
3864
def test_get_traceparent_fields_None_input(self):
3965
traceparent = None
4066
version, trace_id, parent_id, sampled_flag = self.tp.get_traceparent_fields(traceparent)

0 commit comments

Comments
 (0)