Skip to content

Commit 8b32ac8

Browse files
XinRanZhAWSADOT Patch workflowthpierce
authored
Implement Unit Test for Tracer Configurer Module (#38)
*Description of changes:* Implement Unit Test for Tracer Configurer Module By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. --------- Co-authored-by: ADOT Patch workflow <[email protected]> Co-authored-by: Thomas Pierce <[email protected]>
1 parent 1033ae8 commit 8b32ac8

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

aws-opentelemetry-distro/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ dependencies = [
1414
"opentelemetry-api ~= 1.12",
1515
"opentelemetry-instrumentation == 0.43b0",
1616
"opentelemetry-sdk ~= 1.13",
17+
"opentelemetry-distro == 0.43b0",
1718
"opentelemetry-sdk-extension-aws ~= 2.0.1",
1819
"opentelemetry-exporter-otlp-proto-grpc == 1.22.0"
1920
]

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_attribute_propagating_span_processor.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from amazon.opentelemetry.distro.attribute_propagating_span_processor import AttributePropagatingSpanProcessor
99
from opentelemetry.sdk.trace import ReadableSpan, Span, Tracer, TracerProvider
1010
from opentelemetry.semconv.trace import MessagingOperationValues, SpanAttributes
11-
from opentelemetry.trace import SpanContext, SpanKind, TraceFlags, TraceState, set_span_in_context, set_tracer_provider
11+
from opentelemetry.trace import SpanContext, SpanKind, TraceFlags, TraceState, set_span_in_context
1212

1313

1414
def _get_ingress_operation(span: Span):
@@ -36,7 +36,6 @@ def setUp(self):
3636
sampler=None,
3737
resource=None,
3838
)
39-
set_tracer_provider(self.provider)
4039
self.provider.add_span_processor(self.processor)
4140
self.tracer: Tracer = self.provider.get_tracer("awsxray")
4241

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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

Comments
 (0)