|
5 | 5 | from unittest import TestCase
|
6 | 6 | from unittest.mock import MagicMock, patch
|
7 | 7 |
|
| 8 | +from opentelemetry.exporter.otlp.proto.common._internal.metrics_encoder import OTLPMetricExporterMixin |
| 9 | + |
8 | 10 | from amazon.opentelemetry.distro.always_record_sampler import AlwaysRecordSampler
|
9 | 11 | from amazon.opentelemetry.distro.attribute_propagating_span_processor import AttributePropagatingSpanProcessor
|
10 | 12 | from amazon.opentelemetry.distro.aws_metric_attributes_span_exporter import AwsMetricAttributesSpanExporter
|
|
14 | 16 | _customize_exporter,
|
15 | 17 | _customize_sampler,
|
16 | 18 | _customize_span_processors,
|
17 |
| - _is_application_signals_enabled, |
| 19 | + _is_application_signals_enabled, ApplicationSignalsExporterProvider, |
18 | 20 | )
|
19 | 21 | from amazon.opentelemetry.distro.aws_opentelemetry_distro import AwsOpenTelemetryDistro
|
20 | 22 | from amazon.opentelemetry.distro.aws_span_metrics_processor import AwsSpanMetricsProcessor
|
21 | 23 | from amazon.opentelemetry.distro.sampler._aws_xray_sampling_client import _AwsXRaySamplingClient
|
22 | 24 | from amazon.opentelemetry.distro.sampler.aws_xray_remote_sampler import AwsXRayRemoteSampler
|
23 | 25 | from opentelemetry.environment_variables import OTEL_LOGS_EXPORTER, OTEL_METRICS_EXPORTER, OTEL_TRACES_EXPORTER
|
| 26 | +from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter as OTLPGrpcOTLPMetricExporter |
| 27 | +from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPHttpOTLPMetricExporter |
24 | 28 | from opentelemetry.sdk.environment_variables import OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG
|
25 | 29 | from opentelemetry.sdk.resources import Resource
|
26 | 30 | from opentelemetry.sdk.trace import Span, SpanProcessor, Tracer, TracerProvider
|
|
29 | 33 | from opentelemetry.trace import get_tracer_provider
|
30 | 34 |
|
31 | 35 |
|
32 |
| -# This class setup Tracer Provider Globally, which can only set once |
33 |
| -# if there is another setup for tracer provider, may cause issue |
34 | 36 | class TestAwsOpenTelemetryConfigurator(TestCase):
|
| 37 | + """ Tests AwsOpenTelemetryConfigurator and AwsOpenTelemetryDistro |
| 38 | +
|
| 39 | + NOTE: This class setup Tracer Provider Globally, which can only be set once. If there is another setup for tracer |
| 40 | + provider, it may cause issues for those tests. |
| 41 | + """ |
35 | 42 | @classmethod
|
36 | 43 | def setUpClass(cls):
|
37 |
| - os.environ.setdefault(OTEL_TRACES_EXPORTER, "none") |
38 |
| - os.environ.setdefault(OTEL_METRICS_EXPORTER, "none") |
39 |
| - os.environ.setdefault(OTEL_LOGS_EXPORTER, "none") |
40 |
| - os.environ.setdefault(OTEL_TRACES_SAMPLER, "traceidratio") |
41 |
| - os.environ.setdefault(OTEL_TRACES_SAMPLER_ARG, "0.01") |
| 44 | + # Run AwsOpenTelemetryDistro to set up environment, then validate expected env values. |
42 | 45 | aws_open_telemetry_distro: AwsOpenTelemetryDistro = AwsOpenTelemetryDistro()
|
43 | 46 | aws_open_telemetry_distro.configure(apply_patches=False)
|
| 47 | + validate_distro_environ() |
| 48 | + |
| 49 | + # Overwrite exporter configs to keep tests clean, set sampler configs for tests |
| 50 | + os.environ[OTEL_TRACES_EXPORTER] = "none" |
| 51 | + os.environ[OTEL_METRICS_EXPORTER] = "none" |
| 52 | + os.environ[OTEL_LOGS_EXPORTER] = "none" |
| 53 | + os.environ[OTEL_TRACES_SAMPLER] = "traceidratio" |
| 54 | + os.environ[OTEL_TRACES_SAMPLER_ARG] = "0.01" |
| 55 | + |
| 56 | + # Run configurator and get trace provider |
44 | 57 | aws_otel_configurator: AwsOpenTelemetryConfigurator = AwsOpenTelemetryConfigurator()
|
45 | 58 | aws_otel_configurator.configure()
|
46 | 59 | cls.tracer_provider: TracerProvider = get_tracer_provider()
|
@@ -249,3 +262,38 @@ def test_customize_span_processors(self):
|
249 | 262 | second_processor: SpanProcessor = mock_tracer_provider.add_span_processor.call_args_list[1].args[0]
|
250 | 263 | self.assertIsInstance(second_processor, AwsSpanMetricsProcessor)
|
251 | 264 | os.environ.pop("OTEL_AWS_APPLICATION_SIGNALS_ENABLED", None)
|
| 265 | + |
| 266 | + def test_application_signals_exporter_provider(self): |
| 267 | + # Check default protocol - HTTP, as specified by AwsOpenTelemetryDistro |
| 268 | + exporter: OTLPMetricExporterMixin = ApplicationSignalsExporterProvider().create_exporter() |
| 269 | + self.assertIsInstance(exporter, OTLPHttpOTLPMetricExporter) |
| 270 | + self.assertEqual( "http://localhost:4316", exporter._endpoint) |
| 271 | + |
| 272 | + # Overwrite protocol to gRPC. Note that this causes `http://` to be stripped from endpoint |
| 273 | + os.environ["OTEL_EXPORTER_OTLP_PROTOCOL"] = "grpc" |
| 274 | + exporter: SpanExporter = ApplicationSignalsExporterProvider().create_exporter() |
| 275 | + self.assertIsInstance(exporter, OTLPGrpcOTLPMetricExporter) |
| 276 | + self.assertEqual("localhost:4316", exporter._endpoint) |
| 277 | + |
| 278 | + # Overwrite protocol back to HTTP. Note that `http://` comes back to endpoint |
| 279 | + os.environ["OTEL_EXPORTER_OTLP_PROTOCOL"] = "http/protobuf" |
| 280 | + exporter: SpanExporter = ApplicationSignalsExporterProvider().create_exporter() |
| 281 | + self.assertIsInstance(exporter, OTLPHttpOTLPMetricExporter) |
| 282 | + self.assertEqual("http://localhost:4316", exporter._endpoint) |
| 283 | + |
| 284 | +def validate_distro_environ(): |
| 285 | + tc: TestCase = TestCase() |
| 286 | + # Set by OpenTelemetryDistro |
| 287 | + tc.assertEqual("otlp", os.environ.get("OTEL_TRACES_EXPORTER")) |
| 288 | + tc.assertEqual("otlp", os.environ.get("OTEL_METRICS_EXPORTER")) |
| 289 | + |
| 290 | + # Set by AwsOpenTelemetryDistro |
| 291 | + tc.assertEqual("http/protobuf", os.environ.get("OTEL_EXPORTER_OTLP_PROTOCOL")) |
| 292 | + tc.assertEqual("base2_exponential_bucket_histogram", |
| 293 | + os.environ.get("OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION")) |
| 294 | + tc.assertEqual("xray,tracecontext,b3,b3multi", os.environ.get("OTEL_PROPAGATORS")) |
| 295 | + tc.assertEqual("xray", os.environ.get("OTEL_PYTHON_ID_GENERATOR")) |
| 296 | + |
| 297 | + # Not set |
| 298 | + tc.assertEqual(None, os.environ.get("OTEL_TRACES_SAMPLER")) |
| 299 | + tc.assertEqual(None, os.environ.get("OTEL_TRACES_SAMPLER_ARG")) |
0 commit comments