@@ -35,40 +35,97 @@ def setUpClass(cls):
35
35
cls .serialized_span_id = b3_format .format_span_id (
36
36
trace .generate_span_id ()
37
37
)
38
+ cls .serialized_parent_id = b3_format .format_span_id (
39
+ trace .generate_span_id ()
40
+ )
41
+
42
+ def get_child_parent_new_carrier (self , old_carrier ):
43
+
44
+ parent_context = FORMAT .extract (get_as_list , old_carrier )
45
+
46
+ parent = trace .Span ("parent" , parent_context )
47
+ child = trace .Span (
48
+ "child" ,
49
+ trace_api .SpanContext (
50
+ parent_context .trace_id ,
51
+ trace .generate_span_id (),
52
+ trace_options = parent_context .trace_options ,
53
+ trace_state = parent_context .trace_state ,
54
+ ),
55
+ parent = parent
56
+ )
57
+
58
+ new_carrier = {}
59
+ FORMAT .inject (child , dict .__setitem__ , new_carrier )
60
+
61
+ return child , parent , new_carrier
38
62
39
63
def test_extract_multi_header (self ):
40
64
"""Test the extraction of B3 headers."""
41
- carrier = {
42
- FORMAT .TRACE_ID_KEY : self .serialized_trace_id ,
43
- FORMAT .SPAN_ID_KEY : self .serialized_span_id ,
44
- FORMAT .SAMPLED_KEY : "1" ,
45
- }
46
- span_context = FORMAT .extract (get_as_list , carrier )
47
- new_carrier = {}
48
- FORMAT .inject (span_context , dict .__setitem__ , new_carrier )
65
+ child , parent , new_carrier = self .get_child_parent_new_carrier (
66
+ {
67
+ FORMAT .TRACE_ID_KEY : self .serialized_trace_id ,
68
+ FORMAT .SPAN_ID_KEY : self .serialized_span_id ,
69
+ FORMAT .PARENT_SPAN_ID_KEY : self .serialized_parent_id ,
70
+ FORMAT .SAMPLED_KEY : "1" ,
71
+ }
72
+ )
73
+
74
+ self .assertEqual (
75
+ new_carrier [FORMAT .TRACE_ID_KEY ],
76
+ b3_format .format_trace_id (child .context .trace_id ),
77
+ )
49
78
self .assertEqual (
50
- new_carrier [FORMAT .TRACE_ID_KEY ], self .serialized_trace_id
79
+ new_carrier [FORMAT .SPAN_ID_KEY ],
80
+ b3_format .format_span_id (child .context .span_id ),
51
81
)
52
82
self .assertEqual (
53
- new_carrier [FORMAT .SPAN_ID_KEY ], self .serialized_span_id
83
+ new_carrier [FORMAT .PARENT_SPAN_ID_KEY ],
84
+ b3_format .format_span_id (parent .context .span_id ),
54
85
)
55
86
self .assertEqual (new_carrier [FORMAT .SAMPLED_KEY ], "1" )
56
87
57
88
def test_extract_single_header (self ):
58
89
"""Test the extraction from a single b3 header."""
59
- carrier = {
60
- FORMAT . SINGLE_HEADER_KEY : "{}-{}" . format (
61
- self . serialized_trace_id , self . serialized_span_id
62
- )
63
- }
64
- span_context = FORMAT . extract ( get_as_list , carrier )
65
- new_carrier = {}
66
- FORMAT . inject ( span_context , dict . __setitem__ , new_carrier )
90
+ child , parent , new_carrier = self . get_child_parent_new_carrier (
91
+ {
92
+ FORMAT . SINGLE_HEADER_KEY : "{}-{}" . format (
93
+ self . serialized_trace_id , self . serialized_span_id
94
+ )
95
+ }
96
+ )
97
+
67
98
self .assertEqual (
68
- new_carrier [FORMAT .TRACE_ID_KEY ], self .serialized_trace_id
99
+ new_carrier [FORMAT .TRACE_ID_KEY ],
100
+ b3_format .format_trace_id (child .context .trace_id ),
69
101
)
70
102
self .assertEqual (
71
- new_carrier [FORMAT .SPAN_ID_KEY ], self .serialized_span_id
103
+ new_carrier [FORMAT .SPAN_ID_KEY ],
104
+ b3_format .format_span_id (child .context .span_id ),
105
+ )
106
+ self .assertEqual (new_carrier [FORMAT .SAMPLED_KEY ], "1" )
107
+
108
+ child , parent , new_carrier = self .get_child_parent_new_carrier (
109
+ {
110
+ FORMAT .SINGLE_HEADER_KEY : "{}-{}-1-{}" .format (
111
+ self .serialized_trace_id ,
112
+ self .serialized_span_id ,
113
+ self .serialized_parent_id ,
114
+ )
115
+ }
116
+ )
117
+
118
+ self .assertEqual (
119
+ new_carrier [FORMAT .TRACE_ID_KEY ],
120
+ b3_format .format_trace_id (child .context .trace_id ),
121
+ )
122
+ self .assertEqual (
123
+ new_carrier [FORMAT .SPAN_ID_KEY ],
124
+ b3_format .format_span_id (child .context .span_id ),
125
+ )
126
+ self .assertEqual (
127
+ new_carrier [FORMAT .PARENT_SPAN_ID_KEY ],
128
+ b3_format .format_span_id (parent .context .span_id ),
72
129
)
73
130
self .assertEqual (new_carrier [FORMAT .SAMPLED_KEY ], "1" )
74
131
@@ -77,82 +134,84 @@ def test_extract_header_precedence(self):
77
134
headers.
78
135
"""
79
136
single_header_trace_id = self .serialized_trace_id [:- 3 ] + "123"
80
- carrier = {
81
- FORMAT .SINGLE_HEADER_KEY : "{}-{}" .format (
82
- single_header_trace_id , self .serialized_span_id
83
- ),
84
- FORMAT .TRACE_ID_KEY : self .serialized_trace_id ,
85
- FORMAT .SPAN_ID_KEY : self .serialized_span_id ,
86
- FORMAT .SAMPLED_KEY : "1" ,
87
- }
88
- span_context = FORMAT .extract (get_as_list , carrier )
89
- new_carrier = {}
90
- FORMAT .inject (span_context , dict .__setitem__ , new_carrier )
137
+
138
+ child , parent , new_carrier = self .get_child_parent_new_carrier (
139
+ {
140
+ FORMAT .SINGLE_HEADER_KEY : "{}-{}" .format (
141
+ single_header_trace_id , self .serialized_span_id
142
+ ),
143
+ FORMAT .TRACE_ID_KEY : self .serialized_trace_id ,
144
+ FORMAT .SPAN_ID_KEY : self .serialized_span_id ,
145
+ FORMAT .SAMPLED_KEY : "1" ,
146
+ }
147
+ )
148
+
91
149
self .assertEqual (
92
150
new_carrier [FORMAT .TRACE_ID_KEY ], single_header_trace_id
93
151
)
94
152
95
153
def test_enabled_sampling (self ):
96
154
"""Test b3 sample key variants that turn on sampling."""
97
155
for variant in ["1" , "True" , "true" , "d" ]:
98
- carrier = {
99
- FORMAT . TRACE_ID_KEY : self . serialized_trace_id ,
100
- FORMAT .SPAN_ID_KEY : self .serialized_span_id ,
101
- FORMAT .SAMPLED_KEY : variant ,
102
- }
103
- span_context = FORMAT . extract ( get_as_list , carrier )
104
- new_carrier = {}
105
- FORMAT . inject ( span_context , dict . __setitem__ , new_carrier )
156
+ child , parent , new_carrier = self . get_child_parent_new_carrier (
157
+ {
158
+ FORMAT .TRACE_ID_KEY : self .serialized_trace_id ,
159
+ FORMAT .SPAN_ID_KEY : self . serialized_span_id ,
160
+ FORMAT . SAMPLED_KEY : variant ,
161
+ }
162
+ )
163
+
106
164
self .assertEqual (new_carrier [FORMAT .SAMPLED_KEY ], "1" )
107
165
108
166
def test_disabled_sampling (self ):
109
167
"""Test b3 sample key variants that turn off sampling."""
110
168
for variant in ["0" , "False" , "false" , None ]:
111
- carrier = {
112
- FORMAT . TRACE_ID_KEY : self . serialized_trace_id ,
113
- FORMAT .SPAN_ID_KEY : self .serialized_span_id ,
114
- FORMAT .SAMPLED_KEY : variant ,
115
- }
116
- span_context = FORMAT . extract ( get_as_list , carrier )
117
- new_carrier = {}
118
- FORMAT . inject ( span_context , dict . __setitem__ , new_carrier )
169
+ child , parent , new_carrier = self . get_child_parent_new_carrier (
170
+ {
171
+ FORMAT .TRACE_ID_KEY : self .serialized_trace_id ,
172
+ FORMAT .SPAN_ID_KEY : self . serialized_span_id ,
173
+ FORMAT . SAMPLED_KEY : variant ,
174
+ }
175
+ )
176
+
119
177
self .assertEqual (new_carrier [FORMAT .SAMPLED_KEY ], "0" )
120
178
121
179
def test_flags (self ):
122
180
"""x-b3-flags set to "1" should result in propagation."""
123
- carrier = {
124
- FORMAT . TRACE_ID_KEY : self . serialized_trace_id ,
125
- FORMAT .SPAN_ID_KEY : self .serialized_span_id ,
126
- FORMAT .FLAGS_KEY : "1" ,
127
- }
128
- span_context = FORMAT . extract ( get_as_list , carrier )
129
- new_carrier = {}
130
- FORMAT . inject ( span_context , dict . __setitem__ , new_carrier )
181
+ child , parent , new_carrier = self . get_child_parent_new_carrier (
182
+ {
183
+ FORMAT .TRACE_ID_KEY : self .serialized_trace_id ,
184
+ FORMAT .SPAN_ID_KEY : self . serialized_span_id ,
185
+ FORMAT . FLAGS_KEY : "1" ,
186
+ }
187
+ )
188
+
131
189
self .assertEqual (new_carrier [FORMAT .SAMPLED_KEY ], "1" )
132
190
133
191
def test_flags_and_sampling (self ):
134
192
"""Propagate if b3 flags and sampling are set."""
135
- carrier = {
136
- FORMAT . TRACE_ID_KEY : self . serialized_trace_id ,
137
- FORMAT .SPAN_ID_KEY : self .serialized_span_id ,
138
- FORMAT .FLAGS_KEY : "1" ,
139
- }
140
- span_context = FORMAT . extract ( get_as_list , carrier )
141
- new_carrier = {}
142
- FORMAT . inject ( span_context , dict . __setitem__ , new_carrier )
193
+ child , parent , new_carrier = self . get_child_parent_new_carrier (
194
+ {
195
+ FORMAT .TRACE_ID_KEY : self .serialized_trace_id ,
196
+ FORMAT .SPAN_ID_KEY : self . serialized_span_id ,
197
+ FORMAT . FLAGS_KEY : "1" ,
198
+ }
199
+ )
200
+
143
201
self .assertEqual (new_carrier [FORMAT .SAMPLED_KEY ], "1" )
144
202
145
203
def test_64bit_trace_id (self ):
146
204
"""64 bit trace ids should be padded to 128 bit trace ids."""
147
205
trace_id_64_bit = self .serialized_trace_id [:16 ]
148
- carrier = {
149
- FORMAT .TRACE_ID_KEY : trace_id_64_bit ,
150
- FORMAT .SPAN_ID_KEY : self .serialized_span_id ,
151
- FORMAT .FLAGS_KEY : "1" ,
152
- }
153
- span_context = FORMAT .extract (get_as_list , carrier )
154
- new_carrier = {}
155
- FORMAT .inject (span_context , dict .__setitem__ , new_carrier )
206
+
207
+ child , parent , new_carrier = self .get_child_parent_new_carrier (
208
+ {
209
+ FORMAT .TRACE_ID_KEY : trace_id_64_bit ,
210
+ FORMAT .SPAN_ID_KEY : self .serialized_span_id ,
211
+ FORMAT .FLAGS_KEY : "1" ,
212
+ }
213
+ )
214
+
156
215
self .assertEqual (
157
216
new_carrier [FORMAT .TRACE_ID_KEY ], "0" * 16 + trace_id_64_bit
158
217
)
0 commit comments