27
27
_logger = logging .getLogger (__name__ )
28
28
29
29
30
+ class AwsParseTraceHeaderError (Exception ):
31
+ def __init__ (self , message ):
32
+ self .message = message
33
+
34
+
30
35
class AwsXRayFormat (TextMapPropagator ):
31
36
"""Propagator for the AWS X-Ray Trace Header propagation protocol.
32
37
@@ -75,11 +80,12 @@ def extract(
75
80
trace .INVALID_SPAN , context = context
76
81
)
77
82
78
- trace_id , span_id , sampled , err = self .extract_span_properties (
79
- trace_header
80
- )
81
-
82
- if err is not None :
83
+ try :
84
+ trace_id , span_id , sampled = self ._extract_span_properties (
85
+ trace_header
86
+ )
87
+ except AwsParseTraceHeaderError as err :
88
+ _logger .debug (err .message )
83
89
return trace .set_span_in_context (
84
90
trace .INVALID_SPAN , context = context
85
91
)
@@ -97,7 +103,7 @@ def extract(
97
103
)
98
104
99
105
if not span_context .is_valid :
100
- _logger .error (
106
+ _logger .debug (
101
107
"Invalid Span Extracted. Insertting INVALID span into provided context."
102
108
)
103
109
return trace .set_span_in_context (
@@ -108,94 +114,79 @@ def extract(
108
114
trace .DefaultSpan (span_context ), context = context
109
115
)
110
116
111
- def extract_span_properties (self , trace_header ):
117
+ def _extract_span_properties (self , trace_header ):
112
118
trace_id = trace .INVALID_TRACE_ID
113
119
span_id = trace .INVALID_SPAN_ID
114
120
sampled = False
115
121
116
- extract_err = None
117
-
118
122
for kv_pair_str in trace_header .split (self .KV_PAIR_DELIMITER ):
119
- if extract_err :
120
- break
121
-
122
123
try :
123
124
key_str , value_str = kv_pair_str .split (
124
125
self .KEY_AND_VALUE_DELIMITER
125
126
)
126
127
key , value = key_str .strip (), value_str .strip ()
127
- except ValueError :
128
- _logger . error (
128
+ except ValueError as ex :
129
+ raise AwsParseTraceHeaderError (
129
130
(
130
131
"Error parsing X-Ray trace header. Invalid key value pair: %s. Returning INVALID span context." ,
131
132
kv_pair_str ,
132
133
)
133
- )
134
- return trace_id , span_id , sampled , extract_err
135
-
134
+ ) from ex
136
135
if key == self .TRACE_ID_KEY :
137
- if not self .validate_trace_id (value ):
138
- _logger . error (
136
+ if not self ._validate_trace_id (value ):
137
+ raise AwsParseTraceHeaderError (
139
138
(
140
139
"Invalid TraceId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context." ,
141
140
self .TRACE_HEADER_KEY ,
142
141
trace_header ,
143
142
)
144
143
)
145
- extract_err = True
146
- break
147
144
148
145
try :
149
- trace_id = self .parse_trace_id (value )
150
- except ValueError :
151
- _logger . error (
146
+ trace_id = self ._parse_trace_id (value )
147
+ except ValueError as ex :
148
+ raise AwsParseTraceHeaderError (
152
149
(
153
150
"Invalid TraceId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context." ,
154
151
self .TRACE_HEADER_KEY ,
155
152
trace_header ,
156
153
)
157
- )
158
- extract_err = True
154
+ ) from ex
159
155
elif key == self .PARENT_ID_KEY :
160
- if not self .validate_span_id (value ):
161
- _logger . error (
156
+ if not self ._validate_span_id (value ):
157
+ raise AwsParseTraceHeaderError (
162
158
(
163
159
"Invalid ParentId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context." ,
164
160
self .TRACE_HEADER_KEY ,
165
161
trace_header ,
166
162
)
167
163
)
168
- extract_err = True
169
- break
170
164
171
165
try :
172
- span_id = AwsXRayFormat .parse_span_id (value )
173
- except ValueError :
174
- _logger . error (
166
+ span_id = AwsXRayFormat ._parse_span_id (value )
167
+ except ValueError as ex :
168
+ raise AwsParseTraceHeaderError (
175
169
(
176
170
"Invalid TraceId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context." ,
177
171
self .TRACE_HEADER_KEY ,
178
172
trace_header ,
179
173
)
180
- )
181
- extract_err = True
174
+ ) from ex
182
175
elif key == self .SAMPLED_FLAG_KEY :
183
- if not self .validate_sampled_flag (value ):
184
- _logger . error (
176
+ if not self ._validate_sampled_flag (value ):
177
+ raise AwsParseTraceHeaderError (
185
178
(
186
179
"Invalid Sampling flag in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context." ,
187
180
self .TRACE_HEADER_KEY ,
188
181
trace_header ,
189
182
)
190
183
)
191
- extract_err = True
192
- break
193
184
194
- sampled = self .parse_sampled_flag (value )
185
+ sampled = self ._parse_sampled_flag (value )
195
186
196
- return trace_id , span_id , sampled , extract_err
187
+ return trace_id , span_id , sampled
197
188
198
- def validate_trace_id (self , trace_id_str ):
189
+ def _validate_trace_id (self , trace_id_str ):
199
190
return (
200
191
len (trace_id_str ) == self .TRACE_ID_LENGTH
201
192
and trace_id_str .startswith (self .TRACE_ID_VERSION )
@@ -205,7 +196,7 @@ def validate_trace_id(self, trace_id_str):
205
196
== self .TRACE_ID_DELIMITER
206
197
)
207
198
208
- def parse_trace_id (self , trace_id_str ):
199
+ def _parse_trace_id (self , trace_id_str ):
209
200
timestamp_subset = trace_id_str [
210
201
self .TRACE_ID_DELIMITER_INDEX_1
211
202
+ 1 : self .TRACE_ID_DELIMITER_INDEX_2
@@ -215,22 +206,22 @@ def parse_trace_id(self, trace_id_str):
215
206
]
216
207
return int (timestamp_subset + unique_id_subset , 16 )
217
208
218
- def validate_span_id (self , span_id_str ):
209
+ def _validate_span_id (self , span_id_str ):
219
210
return len (span_id_str ) == self .PARENT_ID_LENGTH
220
211
221
212
@staticmethod
222
- def parse_span_id (span_id_str ):
213
+ def _parse_span_id (span_id_str ):
223
214
return int (span_id_str , 16 )
224
215
225
- def validate_sampled_flag (self , sampled_flag_str ):
216
+ def _validate_sampled_flag (self , sampled_flag_str ):
226
217
return len (
227
218
sampled_flag_str
228
219
) == self .SAMPLED_FLAG_LENGTH and sampled_flag_str in (
229
220
self .IS_SAMPLED ,
230
221
self .NOT_SAMPLED ,
231
222
)
232
223
233
- def parse_sampled_flag (self , sampled_flag_str ):
224
+ def _parse_sampled_flag (self , sampled_flag_str ):
234
225
return sampled_flag_str [0 ] == self .IS_SAMPLED
235
226
236
227
def inject (
0 commit comments