Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e53ca45

Browse files
committedNov 8, 2020
Use an exception to catch inability to parse
1 parent d9a2c8c commit e53ca45

File tree

5 files changed

+48
-81
lines changed

5 files changed

+48
-81
lines changed
 

‎sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/aws_xray_ids_generator.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
import datetime
1615
import random
16+
import time
1717

1818
from opentelemetry import trace
1919

@@ -28,10 +28,13 @@ class AwsXRayIdsGenerator(trace.IdsGenerator):
2828
See: https://docs.aws.amazon.com/xray/latest/devguide/xray-api-sendingdata.html#xray-api-traceids
2929
"""
3030

31+
random_ids_generator = trace.RandomIdsGenerator()
32+
3133
def generate_span_id(self) -> int:
32-
return trace.RandomIdsGenerator().generate_span_id()
34+
return self.random_ids_generator.generate_span_id()
3335

34-
def generate_trace_id(self) -> int:
35-
trace_time = int(datetime.datetime.utcnow().timestamp())
36+
@staticmethod
37+
def generate_trace_id() -> int:
38+
trace_time = int(time.time())
3639
trace_identifier = random.getrandbits(96)
3740
return (trace_time << 96) + trace_identifier

‎sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/propagation/aws_xray_format.py

+38-47
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
_logger = logging.getLogger(__name__)
2828

2929

30+
class AwsParseTraceHeaderError(Exception):
31+
def __init__(self, message):
32+
self.message = message
33+
34+
3035
class AwsXRayFormat(TextMapPropagator):
3136
"""Propagator for the AWS X-Ray Trace Header propagation protocol.
3237
@@ -75,11 +80,12 @@ def extract(
7580
trace.INVALID_SPAN, context=context
7681
)
7782

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)
8389
return trace.set_span_in_context(
8490
trace.INVALID_SPAN, context=context
8591
)
@@ -97,7 +103,7 @@ def extract(
97103
)
98104

99105
if not span_context.is_valid:
100-
_logger.error(
106+
_logger.debug(
101107
"Invalid Span Extracted. Insertting INVALID span into provided context."
102108
)
103109
return trace.set_span_in_context(
@@ -108,94 +114,79 @@ def extract(
108114
trace.DefaultSpan(span_context), context=context
109115
)
110116

111-
def extract_span_properties(self, trace_header):
117+
def _extract_span_properties(self, trace_header):
112118
trace_id = trace.INVALID_TRACE_ID
113119
span_id = trace.INVALID_SPAN_ID
114120
sampled = False
115121

116-
extract_err = None
117-
118122
for kv_pair_str in trace_header.split(self.KV_PAIR_DELIMITER):
119-
if extract_err:
120-
break
121-
122123
try:
123124
key_str, value_str = kv_pair_str.split(
124125
self.KEY_AND_VALUE_DELIMITER
125126
)
126127
key, value = key_str.strip(), value_str.strip()
127-
except ValueError:
128-
_logger.error(
128+
except ValueError as ex:
129+
raise AwsParseTraceHeaderError(
129130
(
130131
"Error parsing X-Ray trace header. Invalid key value pair: %s. Returning INVALID span context.",
131132
kv_pair_str,
132133
)
133-
)
134-
return trace_id, span_id, sampled, extract_err
135-
134+
) from ex
136135
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(
139138
(
140139
"Invalid TraceId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context.",
141140
self.TRACE_HEADER_KEY,
142141
trace_header,
143142
)
144143
)
145-
extract_err = True
146-
break
147144

148145
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(
152149
(
153150
"Invalid TraceId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context.",
154151
self.TRACE_HEADER_KEY,
155152
trace_header,
156153
)
157-
)
158-
extract_err = True
154+
) from ex
159155
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(
162158
(
163159
"Invalid ParentId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context.",
164160
self.TRACE_HEADER_KEY,
165161
trace_header,
166162
)
167163
)
168-
extract_err = True
169-
break
170164

171165
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(
175169
(
176170
"Invalid TraceId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context.",
177171
self.TRACE_HEADER_KEY,
178172
trace_header,
179173
)
180-
)
181-
extract_err = True
174+
) from ex
182175
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(
185178
(
186179
"Invalid Sampling flag in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context.",
187180
self.TRACE_HEADER_KEY,
188181
trace_header,
189182
)
190183
)
191-
extract_err = True
192-
break
193184

194-
sampled = self.parse_sampled_flag(value)
185+
sampled = self._parse_sampled_flag(value)
195186

196-
return trace_id, span_id, sampled, extract_err
187+
return trace_id, span_id, sampled
197188

198-
def validate_trace_id(self, trace_id_str):
189+
def _validate_trace_id(self, trace_id_str):
199190
return (
200191
len(trace_id_str) == self.TRACE_ID_LENGTH
201192
and trace_id_str.startswith(self.TRACE_ID_VERSION)
@@ -205,7 +196,7 @@ def validate_trace_id(self, trace_id_str):
205196
== self.TRACE_ID_DELIMITER
206197
)
207198

208-
def parse_trace_id(self, trace_id_str):
199+
def _parse_trace_id(self, trace_id_str):
209200
timestamp_subset = trace_id_str[
210201
self.TRACE_ID_DELIMITER_INDEX_1
211202
+ 1 : self.TRACE_ID_DELIMITER_INDEX_2
@@ -215,22 +206,22 @@ def parse_trace_id(self, trace_id_str):
215206
]
216207
return int(timestamp_subset + unique_id_subset, 16)
217208

218-
def validate_span_id(self, span_id_str):
209+
def _validate_span_id(self, span_id_str):
219210
return len(span_id_str) == self.PARENT_ID_LENGTH
220211

221212
@staticmethod
222-
def parse_span_id(span_id_str):
213+
def _parse_span_id(span_id_str):
223214
return int(span_id_str, 16)
224215

225-
def validate_sampled_flag(self, sampled_flag_str):
216+
def _validate_sampled_flag(self, sampled_flag_str):
226217
return len(
227218
sampled_flag_str
228219
) == self.SAMPLED_FLAG_LENGTH and sampled_flag_str in (
229220
self.IS_SAMPLED,
230221
self.NOT_SAMPLED,
231222
)
232223

233-
def parse_sampled_flag(self, sampled_flag_str):
224+
def _parse_sampled_flag(self, sampled_flag_str):
234225
return sampled_flag_str[0] == self.IS_SAMPLED
235226

236227
def inject(
Original file line numberDiff line numberDiff line change
@@ -1,13 +0,0 @@
1-
# Copyright The OpenTelemetry Authors
2-
#
3-
# Licensed under the Apache License, Version 2.0 (the "License");
4-
# you may not use this file except in compliance with the License.
5-
# You may obtain a copy of the License at
6-
#
7-
# http://www.apache.org/licenses/LICENSE-2.0
8-
#
9-
# Unless required by applicable law or agreed to in writing, software
10-
# distributed under the License is distributed on an "AS IS" BASIS,
11-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12-
# See the License for the specific language governing permissions and
13-
# limitations under the License.
Original file line numberDiff line numberDiff line change
@@ -1,13 +0,0 @@
1-
# Copyright The OpenTelemetry Authors
2-
#
3-
# Licensed under the Apache License, Version 2.0 (the "License");
4-
# you may not use this file except in compliance with the License.
5-
# You may obtain a copy of the License at
6-
#
7-
# http://www.apache.org/licenses/LICENSE-2.0
8-
#
9-
# Unless required by applicable law or agreed to in writing, software
10-
# distributed under the License is distributed on an "AS IS" BASIS,
11-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12-
# See the License for the specific language governing permissions and
13-
# limitations under the License.

‎sdk-extension/opentelemetry-sdk-extension-aws/tests/trace/test_aws_xray_ids_generator.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414

1515
import datetime
16+
import time
1617
import unittest
1718

1819
from opentelemetry.sdk.extension.aws.trace import AwsXRayIdsGenerator
@@ -33,11 +34,9 @@ def test_id_timestamps_are_acceptable_for_xray(self):
3334
for _ in range(1000):
3435
trace_id = ids_generator.generate_trace_id()
3536
trace_id_time = trace_id >> 96
36-
current_time = int(datetime.datetime.utcnow().timestamp())
37+
current_time = int(time.time())
3738
self.assertLessEqual(trace_id_time, current_time)
3839
one_month_ago_time = int(
39-
(
40-
datetime.datetime.utcnow() - datetime.timedelta(30)
41-
).timestamp()
40+
(datetime.datetime.now() - datetime.timedelta(30)).timestamp()
4241
)
4342
self.assertGreater(trace_id_time, one_month_ago_time)

0 commit comments

Comments
 (0)
Please sign in to comment.