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