diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/setup.cfg b/sdk-extension/opentelemetry-sdk-extension-aws/setup.cfg index cfcffd2d..c50d15a3 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/setup.cfg +++ b/sdk-extension/opentelemetry-sdk-extension-aws/setup.cfg @@ -39,11 +39,11 @@ package_dir= =src packages=find_namespace: install_requires = - opentelemetry-api == 0.14.b0 + opentelemetry-api == 0.15.dev0 [options.entry_points] opentelemetry_propagator = - aws_xray = opentelemetry.sdk.extension.aws.trace.propagation.aws_xray_format:AWSXRayFormat + aws_xray = opentelemetry.sdk.extension.aws.trace.propagation.aws_xray_format:AwsXRayFormat [options.extras_require] test = diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/__init__.py b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/__init__.py index be8c0984..f33a095c 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/__init__.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/__init__.py @@ -13,7 +13,7 @@ # limitations under the License. from opentelemetry.sdk.extension.aws.trace.aws_xray_ids_generator import ( - AWSXRayIdsGenerator, + AwsXRayIdsGenerator, ) -__all__ = ["AWSXRayIdsGenerator"] +__all__ = ["AwsXRayIdsGenerator"] diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/aws_xray_ids_generator.py b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/aws_xray_ids_generator.py index f9492d9e..799c1603 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/aws_xray_ids_generator.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/aws_xray_ids_generator.py @@ -18,7 +18,7 @@ from opentelemetry import trace -class AWSXRayIdsGenerator(trace.IdsGenerator): +class AwsXRayIdsGenerator(trace.IdsGenerator): """Generates tracing IDs compatible with the AWS X-Ray tracing service. In the X-Ray system, the first 32 bits of the `TraceId` are the Unix epoch time in seconds. Since spans (AWS calls them segments) with an embedded timestamp diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/propagation/aws_xray_format.py b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/propagation/aws_xray_format.py index 412bb7b9..c0feacca 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/propagation/aws_xray_format.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/propagation/aws_xray_format.py @@ -28,7 +28,7 @@ _logger = logging.getLogger(__name__) -class AWSXRayFormat(TextMapPropagator): +class AwsXRayFormat(TextMapPropagator): """Propagator for the AWS X-Ray Trace Header propagation protocol. See: https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-tracingheader @@ -62,13 +62,21 @@ def extract( carrier: TextMapPropagatorT, context: typing.Optional[Context] = None, ) -> Context: - if not carrier: - raise ValueError(("Could not extract from carrier: %s", carrier)) + trace_header_list = get_from_carrier(carrier, self.TRACE_HEADER_KEY) - trace_header = get_from_carrier(carrier, self.TRACE_HEADER_KEY) + if not trace_header_list or len(trace_header_list) != 1: + return trace.set_span_in_context( + trace.INVALID_SPAN, + context=context + ) - if not trace_header or trace_header == '': - return trace.set_span_in_context(trace.INVALID_SPAN) + trace_header = trace_header_list[0] + + if not trace_header: + return trace.set_span_in_context( + trace.INVALID_SPAN, + context=context + ) trace_id = trace.INVALID_TRACE_ID span_id = trace.INVALID_SPAN_ID @@ -91,7 +99,10 @@ def extract( key_and_value_delimiter_index = stripped_kv_pair.index(self.KEY_AND_VALUE_DELIMITER) except ValueError as _: _logger.error(("Error parsing X-Ray trace header. Invalid key value pair: %s. Returning INVALID span context.", kv_pair_subset)) - return trace.set_span_in_context(trace.INVALID_SPAN) + return trace.set_span_in_context( + trace.INVALID_SPAN, + context=context + ) value = stripped_kv_pair[key_and_value_delimiter_index + 1:] @@ -101,17 +112,37 @@ def extract( value[self.TRACE_ID_DELIMITER_INDEX_1] != self.TRACE_ID_DELIMITER or value[self.TRACE_ID_DELIMITER_INDEX_2] != self.TRACE_ID_DELIMITER): _logger.error(("Invalid TraceId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context.", self.TRACE_HEADER_KEY, trace_header)) - return trace.INVALID_SPAN_CONTEXT + return trace.set_span_in_context( + trace.INVALID_SPAN, + context=context + ) timestamp_subset = value[self.TRACE_ID_DELIMITER_INDEX_1 + 1: self.TRACE_ID_DELIMITER_INDEX_2] unique_id_subset = value[self.TRACE_ID_DELIMITER_INDEX_2 + 1: self.TRACE_ID_LENGTH] - trace_id = int(timestamp_subset + unique_id_subset, 16) + try: + trace_id = int(timestamp_subset + unique_id_subset, 16) + except ValueError as _: + _logger.error(("Invalid TraceId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context.", self.TRACE_HEADER_KEY, trace_header)) + return trace.set_span_in_context( + trace.INVALID_SPAN, + context=context + ) elif stripped_kv_pair.startswith(self.PARENT_ID_KEY): if len(value) != self.PARENT_ID_LENGTH: _logger.error(("Invalid ParentId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context.", self.TRACE_HEADER_KEY, trace_header)) - return trace.INVALID_SPAN_CONTEXT - - span_id = int(value, 16) + return trace.set_span_in_context( + trace.INVALID_SPAN, + context=context + ) + + try: + span_id = int(value, 16) + except ValueError as _: + _logger.error(("Invalid TraceId in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context.", self.TRACE_HEADER_KEY, trace_header)) + return trace.set_span_in_context( + trace.INVALID_SPAN, + context=context + ) elif stripped_kv_pair.startswith(self.SAMPLED_FLAG_KEY): is_sampled_flag_valid = True @@ -129,7 +160,10 @@ def extract( if not is_sampled_flag_valid: _logger.error(("Invalid Sampling flag in X-Ray trace header: '%s' with value '%s'. Returning INVALID span context.", self.TRACE_HEADER_KEY, trace_header)) - return trace.INVALID_SPAN_CONTEXT + return trace.set_span_in_context( + trace.INVALID_SPAN, + context=context + ) options = 0 if sampled: @@ -144,7 +178,11 @@ def extract( ) if not span_context.is_valid: - return context + _logger.error("Invalid Span Extracted. Insertting INVALID span into provided context.") + return trace.set_span_in_context( + trace.INVALID_SPAN, + context=context + ) return trace.set_span_in_context( trace.DefaultSpan( @@ -159,12 +197,9 @@ def inject( carrier: TextMapPropagatorT, context: typing.Optional[Context] = None, ) -> None: - if not carrier: - raise ValueError(("Could not extract from carrier: %s", carrier)) - span = trace.get_current_span(context=context) - span_context = span.get_context() + span_context = span.get_span_context() if not span_context.is_valid: return diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/version.py b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/version.py index e426c8aa..e7b342d6 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/version.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.14.b0" +__version__ = "0.15.dev0" diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/tests/trace/propagation/test_aws_xray_format.py b/sdk-extension/opentelemetry-sdk-extension-aws/tests/trace/propagation/test_aws_xray_format.py index 1288b9b8..11c20566 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/tests/trace/propagation/test_aws_xray_format.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/tests/trace/propagation/test_aws_xray_format.py @@ -18,312 +18,329 @@ from requests.structures import CaseInsensitiveDict from unittest import mock -import opentelemetry as trace_api -from opentelemetry.trace import ( - INVALID_SPAN_CONTEXT, - DEFAULT_TRACE_STATE, - set_span_in_context, - TraceFlags, -) -# from opentelemetry.trace.propagation.textmap import ( -# Getter, -# Setter, -# TextMapPropagatorT, -# ) -# from opentelemetry.trace.span import INVALID_TRACE_ID -# from opentelemetry.sdk import resources, trace from opentelemetry.sdk.extension.aws.trace import AwsXRayIdsGenerator from opentelemetry.sdk.extension.aws.trace.propagation.aws_xray_format import ( - AWSXRayFormat + AwsXRayFormat +) +import opentelemetry.trace as trace_api +from opentelemetry.trace import ( + DEFAULT_TRACE_OPTIONS, + DEFAULT_TRACE_STATE, + INVALID_SPAN_CONTEXT, + SpanContext, + TraceFlags, + set_span_in_context, + TraceState ) +from opentelemetry.trace.propagation.textmap import ( + Getter, + Setter, + TextMapPropagatorT, +) +from opentelemetry.trace.span import INVALID_TRACE_ID +TRACE_ID_BASE16 = "8a3c60f7d188f8fa79d48a391a778fa6" -class AwsXRayPropagatorTest(unittest.TestCase): +SPAN_ID_BASE16 = "53995c3f42cd8ad8" + +# Propagators Usage Methods - TRACE_ID_BASE16 = "8a3c60f7d188f8fa79d48a391a778fa6" - - SPAN_ID_BASE16 = "53995c3f42cd8ad8" - - carrier_setter: Setter[TextMapPropagatorT] = dict.__setitem__ - carrier_getter: Getter[TextMapPropagatorT] = dict.__getitem__ - XRAY_PROPAGATOR = AWSXRayFormat() - # tracer = trace_api.get_tracer(__name__) - - def build_test_context( - self, - trace_id=TRACE_ID_BASE16, - span_id=SPAN_ID_BASE16, - is_remote=False, - trace_flags=DEFAULT_TRACE_OPTIONS, - trace_state=DEFAULT_TRACE_STATE - ): - return set_span_in_context( - trace_api.DefaultSpan(span_context), +def get_as_list(dict_object, key): + value = dict_object.get(key) + return [value] if value is not None else [] + +# Inject Methods + +def build_test_context( + trace_id=int(TRACE_ID_BASE16, 16), + span_id=int(SPAN_ID_BASE16, 16), + is_remote=True, + trace_flags=DEFAULT_TRACE_OPTIONS, + trace_state=DEFAULT_TRACE_STATE +): + return set_span_in_context( + trace_api.DefaultSpan( SpanContext( trace_id, span_id, is_remote, trace_flags, trace_state, - ), + ) ) + ) + +def build_dict_with_xray_trace_header( + trace_id=f"{AwsXRayFormat.TRACE_ID_VERSION}{AwsXRayFormat.TRACE_ID_DELIMITER}{TRACE_ID_BASE16[:AwsXRayFormat.TRACE_ID_FIRST_PART_LENGTH]}{AwsXRayFormat.TRACE_ID_DELIMITER}{TRACE_ID_BASE16[AwsXRayFormat.TRACE_ID_FIRST_PART_LENGTH:]}", + span_id=SPAN_ID_BASE16, + sampled="0", +): + carrier = CaseInsensitiveDict() - def build_dict_with_xray_trace_header( - self, - trace_id=f"{AWSXRayFormat.TRACE_ID_VERSION}{TRACE_ID_DELIMITER}{TRACE_ID_BASE16[:AWSXRayFormat.TRACE_ID_FIRST_PART_LENGTH]}{AWSXRayFormat.TRACE_ID_DELIMITER}{TRACE_ID_BASE16[AWSXRayFormat.TRACE_ID_FIRST_PART_LENGTH:]}", - span_id=SPAN_ID_BASE16, - sampled="0", - ): - carrier = CaseInsentitiveDict() - - carrier.put({ - AWSXRayFormat.TRACE_HEADER_KEY : ( - f"{AWSXRayFormat.TRACE_ID_KEY}{AWSXRayFormat.KEY_AND_VALUE_DELIMITER}{trace_id}{AWSXRayFormat.KV_PAIR_DELIMITER}" - f"{AWSXRayFormat.PARENT_ID_KEY}{AWSXRayFormat.KEY_AND_VALUE_DELIMITER}{span_id}{AWSXRayFormat.KV_PAIR_DELIMITER}" - f"{AWSXRayFormat.SAMPLED_FLAG_KEY}{AWSXRayFormat.KEY_AND_VALUE_DELIMITER}{sampled}" - ) - }) + carrier[AwsXRayFormat.TRACE_HEADER_KEY] = ( + f"{AwsXRayFormat.TRACE_ID_KEY}{AwsXRayFormat.KEY_AND_VALUE_DELIMITER}{trace_id}{AwsXRayFormat.KV_PAIR_DELIMITER}" + f"{AwsXRayFormat.PARENT_ID_KEY}{AwsXRayFormat.KEY_AND_VALUE_DELIMITER}{span_id}{AwsXRayFormat.KV_PAIR_DELIMITER}" + f"{AwsXRayFormat.SAMPLED_FLAG_KEY}{AwsXRayFormat.KEY_AND_VALUE_DELIMITER}{sampled}" + ) + + return carrier + +# Extract Methods + +def get_extracted_span_context(encompassing_context): + return trace_api.get_current_span( + encompassing_context + ).get_span_context() - return carrier +class AwsXRayPropagatorTest(unittest.TestCase): + carrier_setter: Setter[TextMapPropagatorT] = CaseInsensitiveDict.__setitem__ + carrier_getter: Getter[TextMapPropagatorT] = get_as_list + XRAY_PROPAGATOR = AwsXRayFormat() # Inject Tests def test_inject_into_non_sampled_context(self): - carrier = CaseInsentitiveDict() + carrier = CaseInsensitiveDict() - XRAY_PROPAGATOR.inject( - carrier_setter, + AwsXRayPropagatorTest.XRAY_PROPAGATOR.inject( + AwsXRayPropagatorTest.carrier_setter, carrier, build_test_context() ) - - self.assertDictContainsSubset( - build_dict_with_xray_trace_header(sampled="1"), - carrier, + + self.assertTrue( + set( + carrier.items() + ).issubset( + set( + build_dict_with_xray_trace_header().items() + ) + ), 'Failed to inject into context that was not yet sampled' ) def test_inject_into_sampled_context(self): - carrier = CaseInsentitiveDict() + carrier = CaseInsensitiveDict() - XRAY_PROPAGATOR.inject( - carrier_setter, + AwsXRayPropagatorTest.XRAY_PROPAGATOR.inject( + AwsXRayPropagatorTest.carrier_setter, carrier, build_test_context(trace_flags=TraceFlags(TraceFlags.SAMPLED)) ) - self.assertDictContainsSubset( - build_dict_with_xray_trace_header(sampled="1"), - carrier, + self.assertTrue( + set( + carrier.items() + ).issubset( + set( + build_dict_with_xray_trace_header(sampled="1").items(), + ) + ), 'Failed to inject into context that was already sampled' ) def test_inject_into_context_with_non_default_state(self): - carrier = CaseInsentitiveDict() + carrier = CaseInsensitiveDict() - XRAY_PROPAGATOR.inject( - carrier_setter, + AwsXRayPropagatorTest.XRAY_PROPAGATOR.inject( + AwsXRayPropagatorTest.carrier_setter, carrier, build_test_context(trace_state=TraceState({"foo" : "bar"})) ) # TODO: (NathanielRN) Assert trace state when the propagator supports it - self.assertDictContainsSubset( - build_dict_with_xray_trace_header(sampled="1"), - carrier, + self.assertTrue( + set( + carrier.items() + ).issubset( + set( + build_dict_with_xray_trace_header().items(), + ) + ), 'Failed to inject into context with non default state' ) # Extract Tests - def get_extracted_span_context(self, encompassing_context): - return trace.get_current_span( - encompassing_context - ).get_current_span_context() - def test_extract_empty_carrier_from_none_carrier(self): - - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, CaseInsensitiveDict() ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), - None + INVALID_SPAN_CONTEXT ) def test_extract_empty_carrier_from_invalid_context(self): - - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, - CaseInsensitiveDict(), - INVALID_SPAN_CONTEXT + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, + CaseInsensitiveDict() ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), INVALID_SPAN_CONTEXT ) def test_extract_sampled_context(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, build_dict_with_xray_trace_header(), ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), - build_test_context() + get_extracted_span_context(build_test_context()) ) def test_extract_sampled_context(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, build_dict_with_xray_trace_header(sampled="1"), ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), - build_test_context(trace_flags=TraceFlags(TraceFlags.SAMPLED)) + get_extracted_span_context(build_test_context(trace_flags=TraceFlags(TraceFlags.SAMPLED))) ) def test_extract_different_order(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, - CaseInsensitiveDict({ - AWSXRayFormat.TRACE_HEADER_KEY : ( - f"{AWSXRayFormat.PARENT_ID_KEY}{AWSXRayFormat.KEY_AND_VALUE_DELIMITER}{span_id}{AWSXRayFormat.KV_PAIR_DELIMITER}" - f"{AWSXRayFormat.SAMPLED_FLAG_KEY}{AWSXRayFormat.KEY_AND_VALUE_DELIMITER}0" - f"{AWSXRayFormat.TRACE_ID_KEY}{AWSXRayFormat.KEY_AND_VALUE_DELIMITER}{trace_id}{AWSXRayFormat.KV_PAIR_DELIMITER}" - ) - }), + default_xray_trace_header_dict = build_dict_with_xray_trace_header() + xray_trace_header_components = default_xray_trace_header_dict[AwsXRayFormat.TRACE_HEADER_KEY].split(AwsXRayFormat.KV_PAIR_DELIMITER) + xray_trace_header_dict_in_different_order = CaseInsensitiveDict( + { + AwsXRayFormat.TRACE_HEADER_KEY: AwsXRayFormat.KV_PAIR_DELIMITER.join(default_xray_trace_header_dict[AwsXRayFormat.TRACE_HEADER_KEY].split(AwsXRayFormat.KV_PAIR_DELIMITER)[::-1]) + } + ) + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, + xray_trace_header_dict_in_different_order, ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), - build_test_context() + get_extracted_span_context(build_test_context()) ) def test_extract_with_additional_fields(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, - CaseInsensitiveDict({ - AWSXRayFormat.TRACE_HEADER_KEY : ( - f"{AWSXRayFormat.TRACE_ID_KEY}{AWSXRayFormat.KEY_AND_VALUE_DELIMITER}{trace_id}{AWSXRayFormat.KV_PAIR_DELIMITER}" - f"{AWSXRayFormat.PARENT_ID_KEY}{AWSXRayFormat.KEY_AND_VALUE_DELIMITER}{span_id}{AWSXRayFormat.KV_PAIR_DELIMITER}" - f"{AWSXRayFormat.SAMPLED_FLAG_KEY}{AWSXRayFormat.KEY_AND_VALUE_DELIMITER}0" - ";" - "foo:bar" - ) - }), + default_xray_trace_header_dict = build_dict_with_xray_trace_header() + xray_trace_header_dict_with_extra_fields = CaseInsensitiveDict( + { + AwsXRayFormat.TRACE_HEADER_KEY: default_xray_trace_header_dict[AwsXRayFormat.TRACE_HEADER_KEY] + ";Foo=Bar" + } + ) + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, + xray_trace_header_dict_with_extra_fields, ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), - build_test_context() + get_extracted_span_context(build_test_context()) ) def test_extract_invalid_xray_trace_header(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, CaseInsensitiveDict({ - AWSXRayFormat.TRACE_HEADER_KEY : "" + AwsXRayFormat.TRACE_HEADER_KEY : "" }), ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), INVALID_SPAN_CONTEXT ) def test_extract_invalid_trace_id(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, build_dict_with_xray_trace_header( trace_id="abcdefghijklmnopqrstuvwxyzabcdef" ), ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), INVALID_SPAN_CONTEXT ) def test_extract_invalid_trace_id_size(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, build_dict_with_xray_trace_header( trace_id="1-8a3c60f7-d188f8fa79d48a391a778fa600" ), ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), INVALID_SPAN_CONTEXT ) def test_extract_invalid_span_id(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, build_dict_with_xray_trace_header( span_id="abcdefghijklmnop" ), ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), INVALID_SPAN_CONTEXT ) def test_extract_invalid_span_id_size(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, build_dict_with_xray_trace_header( span_id="53995c3f42cd8ad800" ), ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), INVALID_SPAN_CONTEXT ) def test_extract_invalid_empty_sampled_flag(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, build_dict_with_xray_trace_header( sampled="" ), ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), INVALID_SPAN_CONTEXT ) def test_extract_invalid_sampled_flag_size(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, build_dict_with_xray_trace_header( sampled="10002" ), ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), INVALID_SPAN_CONTEXT ) def test_extract_invalid_non_numeric_sampled_flag(self): - actual_context_encompassing_extracted = XRAY_PROPAGATOR.extract( - carrier_getter, + actual_context_encompassing_extracted = AwsXRayPropagatorTest.XRAY_PROPAGATOR.extract( + AwsXRayPropagatorTest.carrier_getter, build_dict_with_xray_trace_header( sampled="a" ), ) - self.assertEquals( + self.assertEqual( get_extracted_span_context(actual_context_encompassing_extracted), INVALID_SPAN_CONTEXT - ) \ No newline at end of file + ) diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/tests/trace/test_aws_xray_ids_generator.py b/sdk-extension/opentelemetry-sdk-extension-aws/tests/trace/test_aws_xray_ids_generator.py index 46f012cb..5077f44a 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/tests/trace/test_aws_xray_ids_generator.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/tests/trace/test_aws_xray_ids_generator.py @@ -36,9 +36,9 @@ def test_id_timestamps_are_acceptable_for_xray(self): for _ in range(1_000): trace_id = ids_generator.generate_trace_id() trace_id_time = trace_id >> 96 - current_time = int(datetime.datetime.now().timestamp()) - self.assertLess(trace_id_time, current_time) + current_time = int(datetime.datetime.utcnow().timestamp()) + self.assertLessEqual(trace_id_time, current_time) one_month_ago_time = int( - datetime.datetime.now() - datetime.timedelta(30) + (datetime.datetime.utcnow() - datetime.timedelta(30)).timestamp() ) self.assertGreater(trace_id_time, one_month_ago_time) diff --git a/tox.ini b/tox.ini index dc62e90a..fc15e43b 100644 --- a/tox.ini +++ b/tox.ini @@ -5,6 +5,10 @@ envlist = ; Environments are organized by individual package, allowing ; for specifying supported Python versions per package. + ; opentelemetry-sdk-extension-aws + py3{5,6,7,8}-test-sdkextension-aws + pypy3-test-sdkextension-aws + ; opentelemetry-instrumentation-aiohttp-client py3{5,6,7,8}-test-instrumentation-aiohttp-client pypy3-test-instrumentation-aiohttp-client @@ -183,6 +187,7 @@ changedir = test-instrumentation-system-metrics: instrumentation/opentelemetry-instrumentation-system-metrics/tests test-instrumentation-tornado: instrumentation/opentelemetry-instrumentation-tornado/tests test-instrumentation-wsgi: instrumentation/opentelemetry-instrumentation-wsgi/tests + test-sdkextension-aws: sdk-extension/opentelemetry-sdk-extension-aws/tests test-exporter-datadog: exporter/opentelemetry-exporter-datadog/tests @@ -257,6 +262,9 @@ commands_pre = elasticsearch{2,5,6,7}: pip install {toxinidir}/opentelemetry-python-core/opentelemetry-instrumentation {toxinidir}/instrumentation/opentelemetry-instrumentation-elasticsearch[test] + + aws: pip install requests {toxinidir}/sdk-extension/opentelemetry-sdk-extension-aws + ; In order to get a healthy coverage report, ; we have to install packages in editable mode. coverage: python {toxinidir}/scripts/eachdist.py install --editable