|
| 1 | +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. |
| 2 | +# SPDX-License-Identifier: Apache-2.0 |
| 3 | +import os |
| 4 | +import time |
| 5 | +from unittest import TestCase |
| 6 | + |
| 7 | +from amazon.opentelemetry.distro.aws_opentelemetry_configurator import AwsOpenTelemetryConfigurator |
| 8 | +from amazon.opentelemetry.distro.aws_opentelemetry_distro import AwsOpenTelemetryDistro |
| 9 | +from opentelemetry.environment_variables import OTEL_LOGS_EXPORTER, OTEL_METRICS_EXPORTER, OTEL_TRACES_EXPORTER |
| 10 | +from opentelemetry.sdk.environment_variables import OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG |
| 11 | +from opentelemetry.sdk.trace import Span, Tracer, TracerProvider |
| 12 | +from opentelemetry.trace import get_tracer_provider |
| 13 | + |
| 14 | + |
| 15 | +# This class setup Tracer Provider Globally, which can only set once |
| 16 | +# if there is another setup for tracer provider, may cause issue |
| 17 | +class TestAwsTracerConfigurer(TestCase): |
| 18 | + @classmethod |
| 19 | + def setUpClass(cls): |
| 20 | + os.environ.setdefault(OTEL_TRACES_EXPORTER, "none") |
| 21 | + os.environ.setdefault(OTEL_METRICS_EXPORTER, "none") |
| 22 | + os.environ.setdefault(OTEL_LOGS_EXPORTER, "none") |
| 23 | + os.environ.setdefault(OTEL_TRACES_SAMPLER, "traceidratio") |
| 24 | + os.environ.setdefault(OTEL_TRACES_SAMPLER_ARG, "0.01") |
| 25 | + aws_open_telemetry_distro: AwsOpenTelemetryDistro = AwsOpenTelemetryDistro() |
| 26 | + aws_open_telemetry_distro.configure() |
| 27 | + aws_otel_configurator: AwsOpenTelemetryConfigurator = AwsOpenTelemetryConfigurator() |
| 28 | + aws_otel_configurator.configure() |
| 29 | + cls.tracer_provider: TracerProvider = get_tracer_provider() |
| 30 | + |
| 31 | + # The probability of this passing once without correct IDs is low, 20 times is inconceivable. |
| 32 | + def test_provide_generate_xray_ids(self): |
| 33 | + for _ in range(20): |
| 34 | + tracer: Tracer = self.tracer_provider.get_tracer("test") |
| 35 | + start_time_sec: int = int(time.time()) |
| 36 | + span: Span = tracer.start_span("test") |
| 37 | + trace_id: int = span.get_span_context().trace_id |
| 38 | + trace_id_4_byte_hex: str = hex(trace_id)[2:10] |
| 39 | + trace_id_4_byte_int: int = int(trace_id_4_byte_hex, 16) |
| 40 | + self.assertGreaterEqual(trace_id_4_byte_int, start_time_sec) |
| 41 | + |
| 42 | + # Sanity check that the trace ID ratio sampler works fine with the x-ray generator. |
| 43 | + def test_trace_id_ratio_sampler(self): |
| 44 | + for _ in range(20): |
| 45 | + num_spans: int = 100000 |
| 46 | + num_sampled: int = 0 |
| 47 | + tracer: Tracer = self.tracer_provider.get_tracer("test") |
| 48 | + for _ in range(num_spans): |
| 49 | + span: Span = tracer.start_span("test") |
| 50 | + if span.get_span_context().trace_flags.sampled: |
| 51 | + num_sampled += 1 |
| 52 | + span.end() |
| 53 | + # Configured for 1%, confirm there are at most 5% to account for randomness and reduce test flakiness. |
| 54 | + self.assertGreater(0.05, num_sampled / num_spans) |
0 commit comments