From b49118e4b77275eaffa015f379d47d165a406eda Mon Sep 17 00:00:00 2001 From: Prashant Srivastava Date: Wed, 9 Jul 2025 11:25:45 -0700 Subject: [PATCH 1/8] Reload propagators for distro config to take effect --- .../distro/aws_opentelemetry_distro.py | 7 ++- .../distro/test_aws_opentelemetry_distro.py | 60 +++++++++++++++++-- 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py index a7f73f4e1..8047b7cee 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py @@ -1,5 +1,6 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 +import importlib import os import sys from logging import Logger, getLogger @@ -24,6 +25,7 @@ OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION, OTEL_EXPORTER_OTLP_PROTOCOL, ) +from opentelemetry import propagate _logger: Logger = getLogger(__name__) @@ -70,7 +72,10 @@ def _configure(self, **kwargs): os.environ.setdefault(OTEL_EXPORTER_OTLP_PROTOCOL, "http/protobuf") - os.environ.setdefault(OTEL_PROPAGATORS, "xray,tracecontext,b3,b3multi") + if os.environ.get(OTEL_PROPAGATORS, None) is None: + os.environ.setdefault(OTEL_PROPAGATORS, "tracecontext,baggage,xray") + importlib.reload(propagate) + os.environ.setdefault(OTEL_PYTHON_ID_GENERATOR, "xray") os.environ.setdefault( OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION, "base2_exponential_bucket_histogram" diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py index 5a044c5eb..b011ef253 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py @@ -1,11 +1,14 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 import os +import importlib +import sys from importlib.metadata import PackageNotFoundError, version from unittest import TestCase from unittest.mock import patch from amazon.opentelemetry.distro.aws_opentelemetry_distro import AwsOpenTelemetryDistro +from opentelemetry.propagators.composite import CompositePropagator class TestAwsOpenTelemetryDistro(TestCase): @@ -40,6 +43,9 @@ def setUp(self): if var in os.environ: del os.environ[var] + # Preserve the original sys.path + self.original_sys_path = sys.path.copy() + def tearDown(self): # Clear all env vars first for var in self.env_vars_to_check: @@ -50,6 +56,9 @@ def tearDown(self): for var, value in self.env_vars_to_restore.items(): os.environ[var] = value + # Restore the original sys.path + sys.path[:] = self.original_sys_path + def test_package_available(self): try: version("aws-opentelemetry-distro") @@ -65,7 +74,7 @@ def test_configure_sets_default_values(self, mock_super_configure, mock_apply_pa # Check that default values are set self.assertEqual(os.environ.get("OTEL_EXPORTER_OTLP_PROTOCOL"), "http/protobuf") - self.assertEqual(os.environ.get("OTEL_PROPAGATORS"), "xray,tracecontext,b3,b3multi") + self.assertEqual(os.environ.get("OTEL_PROPAGATORS"), "tracecontext,baggage,xray") self.assertEqual(os.environ.get("OTEL_PYTHON_ID_GENERATOR"), "xray") self.assertEqual( os.environ.get("OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION"), @@ -93,7 +102,7 @@ def test_configure_without_patches(self, mock_super_configure, mock_apply_patche @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches") @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure") def test_configure_with_agent_observability_enabled( - self, mock_super_configure, mock_apply_patches, mock_is_agent_observability, mock_get_aws_region + self, mock_super_configure, mock_apply_patches, mock_is_agent_observability, mock_get_aws_region ): """Test that _configure sets agent observability defaults when enabled""" mock_is_agent_observability.return_value = True @@ -188,8 +197,7 @@ def test_configure_preserves_existing_env_vars( @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches") @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure") @patch("os.getcwd") - @patch("sys.path", new_callable=list) - def test_configure_adds_cwd_to_sys_path(self, mock_sys_path, mock_getcwd, mock_super_configure, mock_apply_patches): + def test_configure_adds_cwd_to_sys_path(self, mock_getcwd, mock_super_configure, mock_apply_patches): """Test that _configure adds current working directory to sys.path""" mock_getcwd.return_value = "/test/working/directory" @@ -197,7 +205,7 @@ def test_configure_adds_cwd_to_sys_path(self, mock_sys_path, mock_getcwd, mock_s distro._configure() # Check that cwd was added to sys.path - self.assertIn("/test/working/directory", mock_sys_path) + self.assertIn("/test/working/directory", sys.path) @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.get_aws_region") @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_agent_observability_enabled") @@ -224,3 +232,45 @@ def test_configure_with_agent_observability_endpoints_already_set( # And exporters are still set to otlp self.assertEqual(os.environ.get("OTEL_TRACES_EXPORTER"), "otlp") self.assertEqual(os.environ.get("OTEL_LOGS_EXPORTER"), "otlp") + + def test_user_defined_propagators(self): + """Test that user-defined propagators are respected""" + # Set user-defined propagators + os.environ["OTEL_PROPAGATORS"] = "xray" + + # Force the reload of the propagate module otherwise the above environment + # variable doesn't taker effect. + from opentelemetry import propagate + importlib.reload(propagate) + + distro = AwsOpenTelemetryDistro() + distro._configure() + + # Verify that user-defined propagators are preserved + propagators = propagate.get_global_textmap() + self.assertTrue(isinstance(propagators, CompositePropagator)) + expected_propagators = ["AwsXRayPropagator"] + individual_propagators = propagators._propagators + self.assertEqual(1, len(individual_propagators)) + actual_propagators = [] + for i, prop in enumerate(individual_propagators): + actual_propagators.append(type(prop).__name__) + self.assertEqual(expected_propagators, actual_propagators) + + def test_otel_propagators_added_when_not_user_defined(self): + distro = AwsOpenTelemetryDistro() + distro._configure() + + # Verify that the propagators are set correctly by ADOT + from opentelemetry import propagate + propagators = propagate.get_global_textmap() + + self.assertTrue(isinstance(propagators, CompositePropagator)) + + expected_propagators = ["TraceContextTextMapPropagator", "W3CBaggagePropagator", "AwsXRayPropagator"] + individual_propagators = propagators._propagators + self.assertEqual(3, len(individual_propagators)) + actual_propagators = [] + for i, prop in enumerate(individual_propagators): + actual_propagators.append(type(prop).__name__) + self.assertEqual(expected_propagators, actual_propagators) From d8ce58a48c84535a59995fa3b943517d06db204a Mon Sep 17 00:00:00 2001 From: Prashant Srivastava Date: Wed, 9 Jul 2025 12:29:31 -0700 Subject: [PATCH 2/8] Lint fix + Unit test fix --- .../opentelemetry/distro/aws_opentelemetry_distro.py | 2 +- .../distro/test_aws_opentelementry_configurator.py | 2 +- .../distro/test_aws_opentelemetry_distro.py | 11 +++++------ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py index 8047b7cee..056d6bb51 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py @@ -19,13 +19,13 @@ OTEL_TRACES_SAMPLER, ) from amazon.opentelemetry.distro.patches._instrumentation_patch import apply_instrumentation_patches +from opentelemetry import propagate from opentelemetry.distro import OpenTelemetryDistro from opentelemetry.environment_variables import OTEL_PROPAGATORS, OTEL_PYTHON_ID_GENERATOR from opentelemetry.sdk.environment_variables import ( OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION, OTEL_EXPORTER_OTLP_PROTOCOL, ) -from opentelemetry import propagate _logger: Logger = getLogger(__name__) diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py index 2a01bbd5c..dc32a4d69 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py @@ -1262,7 +1262,7 @@ def validate_distro_environ(): tc.assertEqual( "base2_exponential_bucket_histogram", os.environ.get("OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION") ) - tc.assertEqual("xray,tracecontext,b3,b3multi", os.environ.get("OTEL_PROPAGATORS")) + tc.assertEqual("tracecontext,baggage,xray", os.environ.get("OTEL_PROPAGATORS")) tc.assertEqual("xray", os.environ.get("OTEL_PYTHON_ID_GENERATOR")) # Not set diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py index b011ef253..327085e4e 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py @@ -1,13 +1,14 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -import os import importlib +import os import sys from importlib.metadata import PackageNotFoundError, version from unittest import TestCase from unittest.mock import patch from amazon.opentelemetry.distro.aws_opentelemetry_distro import AwsOpenTelemetryDistro +from opentelemetry import propagate from opentelemetry.propagators.composite import CompositePropagator @@ -102,7 +103,7 @@ def test_configure_without_patches(self, mock_super_configure, mock_apply_patche @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches") @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure") def test_configure_with_agent_observability_enabled( - self, mock_super_configure, mock_apply_patches, mock_is_agent_observability, mock_get_aws_region + self, mock_super_configure, mock_apply_patches, mock_is_agent_observability, mock_get_aws_region ): """Test that _configure sets agent observability defaults when enabled""" mock_is_agent_observability.return_value = True @@ -240,7 +241,6 @@ def test_user_defined_propagators(self): # Force the reload of the propagate module otherwise the above environment # variable doesn't taker effect. - from opentelemetry import propagate importlib.reload(propagate) distro = AwsOpenTelemetryDistro() @@ -253,7 +253,7 @@ def test_user_defined_propagators(self): individual_propagators = propagators._propagators self.assertEqual(1, len(individual_propagators)) actual_propagators = [] - for i, prop in enumerate(individual_propagators): + for prop in individual_propagators: actual_propagators.append(type(prop).__name__) self.assertEqual(expected_propagators, actual_propagators) @@ -262,7 +262,6 @@ def test_otel_propagators_added_when_not_user_defined(self): distro._configure() # Verify that the propagators are set correctly by ADOT - from opentelemetry import propagate propagators = propagate.get_global_textmap() self.assertTrue(isinstance(propagators, CompositePropagator)) @@ -271,6 +270,6 @@ def test_otel_propagators_added_when_not_user_defined(self): individual_propagators = propagators._propagators self.assertEqual(3, len(individual_propagators)) actual_propagators = [] - for i, prop in enumerate(individual_propagators): + for prop in individual_propagators: actual_propagators.append(type(prop).__name__) self.assertEqual(expected_propagators, actual_propagators) From 0c00b2e89b5a595341c88021263f8cd1cc9d7476 Mon Sep 17 00:00:00 2001 From: Prashant Srivastava Date: Wed, 9 Jul 2025 13:33:23 -0700 Subject: [PATCH 3/8] test --- .../opentelemetry/distro/test_aws_opentelemetry_distro.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py index 327085e4e..0b4eb4323 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py @@ -45,7 +45,7 @@ def setUp(self): del os.environ[var] # Preserve the original sys.path - self.original_sys_path = sys.path.copy() + # self.original_sys_path = sys.path.copy() def tearDown(self): # Clear all env vars first @@ -58,7 +58,7 @@ def tearDown(self): os.environ[var] = value # Restore the original sys.path - sys.path[:] = self.original_sys_path + # sys.path[:] = self.original_sys_path def test_package_available(self): try: From d8e7671dd7780ddbfde260645284d819f869f3b9 Mon Sep 17 00:00:00 2001 From: Prashant Srivastava Date: Wed, 9 Jul 2025 13:37:39 -0700 Subject: [PATCH 4/8] test --- .../distro/test_aws_opentelemetry_distro.py | 78 +++++++++---------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py index 0b4eb4323..7079c17bf 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py @@ -234,42 +234,42 @@ def test_configure_with_agent_observability_endpoints_already_set( self.assertEqual(os.environ.get("OTEL_TRACES_EXPORTER"), "otlp") self.assertEqual(os.environ.get("OTEL_LOGS_EXPORTER"), "otlp") - def test_user_defined_propagators(self): - """Test that user-defined propagators are respected""" - # Set user-defined propagators - os.environ["OTEL_PROPAGATORS"] = "xray" - - # Force the reload of the propagate module otherwise the above environment - # variable doesn't taker effect. - importlib.reload(propagate) - - distro = AwsOpenTelemetryDistro() - distro._configure() - - # Verify that user-defined propagators are preserved - propagators = propagate.get_global_textmap() - self.assertTrue(isinstance(propagators, CompositePropagator)) - expected_propagators = ["AwsXRayPropagator"] - individual_propagators = propagators._propagators - self.assertEqual(1, len(individual_propagators)) - actual_propagators = [] - for prop in individual_propagators: - actual_propagators.append(type(prop).__name__) - self.assertEqual(expected_propagators, actual_propagators) - - def test_otel_propagators_added_when_not_user_defined(self): - distro = AwsOpenTelemetryDistro() - distro._configure() - - # Verify that the propagators are set correctly by ADOT - propagators = propagate.get_global_textmap() - - self.assertTrue(isinstance(propagators, CompositePropagator)) - - expected_propagators = ["TraceContextTextMapPropagator", "W3CBaggagePropagator", "AwsXRayPropagator"] - individual_propagators = propagators._propagators - self.assertEqual(3, len(individual_propagators)) - actual_propagators = [] - for prop in individual_propagators: - actual_propagators.append(type(prop).__name__) - self.assertEqual(expected_propagators, actual_propagators) + # def test_user_defined_propagators(self): + # """Test that user-defined propagators are respected""" + # # Set user-defined propagators + # os.environ["OTEL_PROPAGATORS"] = "xray" + # + # # Force the reload of the propagate module otherwise the above environment + # # variable doesn't taker effect. + # importlib.reload(propagate) + # + # distro = AwsOpenTelemetryDistro() + # distro._configure() + # + # # Verify that user-defined propagators are preserved + # propagators = propagate.get_global_textmap() + # self.assertTrue(isinstance(propagators, CompositePropagator)) + # expected_propagators = ["AwsXRayPropagator"] + # individual_propagators = propagators._propagators + # self.assertEqual(1, len(individual_propagators)) + # actual_propagators = [] + # for prop in individual_propagators: + # actual_propagators.append(type(prop).__name__) + # self.assertEqual(expected_propagators, actual_propagators) + # + # def test_otel_propagators_added_when_not_user_defined(self): + # distro = AwsOpenTelemetryDistro() + # distro._configure() + # + # # Verify that the propagators are set correctly by ADOT + # propagators = propagate.get_global_textmap() + # + # self.assertTrue(isinstance(propagators, CompositePropagator)) + # + # expected_propagators = ["TraceContextTextMapPropagator", "W3CBaggagePropagator", "AwsXRayPropagator"] + # individual_propagators = propagators._propagators + # self.assertEqual(3, len(individual_propagators)) + # actual_propagators = [] + # for prop in individual_propagators: + # actual_propagators.append(type(prop).__name__) + # self.assertEqual(expected_propagators, actual_propagators) From 69ba828ceaf9a25d542d18a5c6c0636f6e09adb1 Mon Sep 17 00:00:00 2001 From: Prashant Srivastava Date: Wed, 9 Jul 2025 13:46:46 -0700 Subject: [PATCH 5/8] test --- .../distro/test_aws_opentelemetry_distro.py | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py index 7079c17bf..02934065c 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py @@ -256,20 +256,20 @@ def test_configure_with_agent_observability_endpoints_already_set( # for prop in individual_propagators: # actual_propagators.append(type(prop).__name__) # self.assertEqual(expected_propagators, actual_propagators) - # - # def test_otel_propagators_added_when_not_user_defined(self): - # distro = AwsOpenTelemetryDistro() - # distro._configure() - # - # # Verify that the propagators are set correctly by ADOT - # propagators = propagate.get_global_textmap() - # - # self.assertTrue(isinstance(propagators, CompositePropagator)) - # - # expected_propagators = ["TraceContextTextMapPropagator", "W3CBaggagePropagator", "AwsXRayPropagator"] - # individual_propagators = propagators._propagators - # self.assertEqual(3, len(individual_propagators)) - # actual_propagators = [] - # for prop in individual_propagators: - # actual_propagators.append(type(prop).__name__) - # self.assertEqual(expected_propagators, actual_propagators) + + def test_otel_propagators_added_when_not_user_defined(self): + distro = AwsOpenTelemetryDistro() + distro._configure() + + # Verify that the propagators are set correctly by ADOT + propagators = propagate.get_global_textmap() + + self.assertTrue(isinstance(propagators, CompositePropagator)) + + expected_propagators = ["TraceContextTextMapPropagator", "W3CBaggagePropagator", "AwsXRayPropagator"] + individual_propagators = propagators._propagators + self.assertEqual(3, len(individual_propagators)) + actual_propagators = [] + for prop in individual_propagators: + actual_propagators.append(type(prop).__name__) + self.assertEqual(expected_propagators, actual_propagators) From a0209f7ba9f5171882ce1da8c235ed6002cee24f Mon Sep 17 00:00:00 2001 From: Prashant Srivastava Date: Wed, 9 Jul 2025 13:51:09 -0700 Subject: [PATCH 6/8] test --- .../distro/test_aws_opentelemetry_distro.py | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py index 02934065c..a48e306cb 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py @@ -45,7 +45,7 @@ def setUp(self): del os.environ[var] # Preserve the original sys.path - # self.original_sys_path = sys.path.copy() + self.original_sys_path = sys.path.copy() def tearDown(self): # Clear all env vars first @@ -58,7 +58,7 @@ def tearDown(self): os.environ[var] = value # Restore the original sys.path - # sys.path[:] = self.original_sys_path + sys.path[:] = self.original_sys_path def test_package_available(self): try: @@ -234,30 +234,34 @@ def test_configure_with_agent_observability_endpoints_already_set( self.assertEqual(os.environ.get("OTEL_TRACES_EXPORTER"), "otlp") self.assertEqual(os.environ.get("OTEL_LOGS_EXPORTER"), "otlp") - # def test_user_defined_propagators(self): - # """Test that user-defined propagators are respected""" - # # Set user-defined propagators - # os.environ["OTEL_PROPAGATORS"] = "xray" - # - # # Force the reload of the propagate module otherwise the above environment - # # variable doesn't taker effect. - # importlib.reload(propagate) - # - # distro = AwsOpenTelemetryDistro() - # distro._configure() - # - # # Verify that user-defined propagators are preserved - # propagators = propagate.get_global_textmap() - # self.assertTrue(isinstance(propagators, CompositePropagator)) - # expected_propagators = ["AwsXRayPropagator"] - # individual_propagators = propagators._propagators - # self.assertEqual(1, len(individual_propagators)) - # actual_propagators = [] - # for prop in individual_propagators: - # actual_propagators.append(type(prop).__name__) - # self.assertEqual(expected_propagators, actual_propagators) - - def test_otel_propagators_added_when_not_user_defined(self): + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches") + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure") + def test_user_defined_propagators(self, mock_super_configure, mock_apply_patches): + """Test that user-defined propagators are respected""" + # Set user-defined propagators + os.environ["OTEL_PROPAGATORS"] = "xray" + + # Force the reload of the propagate module otherwise the above environment + # variable doesn't taker effect. + importlib.reload(propagate) + + distro = AwsOpenTelemetryDistro() + distro._configure() + + # Verify that user-defined propagators are preserved + propagators = propagate.get_global_textmap() + self.assertTrue(isinstance(propagators, CompositePropagator)) + expected_propagators = ["AwsXRayPropagator"] + individual_propagators = propagators._propagators + self.assertEqual(1, len(individual_propagators)) + actual_propagators = [] + for prop in individual_propagators: + actual_propagators.append(type(prop).__name__) + self.assertEqual(expected_propagators, actual_propagators) + + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches") + @patch("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure") + def test_otel_propagators_added_when_not_user_defined(self, mock_super_configure, mock_apply_patches): distro = AwsOpenTelemetryDistro() distro._configure() From f281ebf87e9ac99351e0887a146d626648747193 Mon Sep 17 00:00:00 2001 From: Prashant Srivastava Date: Wed, 9 Jul 2025 13:57:29 -0700 Subject: [PATCH 7/8] add comment --- .../amazon/opentelemetry/distro/aws_opentelemetry_distro.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py index 056d6bb51..e4d92c6b2 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py @@ -74,6 +74,11 @@ def _configure(self, **kwargs): if os.environ.get(OTEL_PROPAGATORS, None) is None: os.environ.setdefault(OTEL_PROPAGATORS, "tracecontext,baggage,xray") + # We need to explicitly reload the opentelemetry.propagate module here + # because this module initializes the default propagators when it loads very early in the chain. + # Without reloading the OTEL_PROPAGATOR config from this distro won't take any effect. + # It's a hack from our end until OpenTelemetry fixes this behavior for distros to + # override the default propagators. importlib.reload(propagate) os.environ.setdefault(OTEL_PYTHON_ID_GENERATOR, "xray") From 3db92d8f5b7b2e8276f20218281afd821c323266 Mon Sep 17 00:00:00 2001 From: Prashant Srivastava Date: Wed, 9 Jul 2025 14:41:01 -0700 Subject: [PATCH 8/8] reorder propagators --- .../amazon/opentelemetry/distro/aws_opentelemetry_distro.py | 3 ++- .../distro/test_aws_opentelementry_configurator.py | 2 +- .../opentelemetry/distro/test_aws_opentelemetry_distro.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py index e4d92c6b2..aaab17951 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_distro.py @@ -73,7 +73,8 @@ def _configure(self, **kwargs): os.environ.setdefault(OTEL_EXPORTER_OTLP_PROTOCOL, "http/protobuf") if os.environ.get(OTEL_PROPAGATORS, None) is None: - os.environ.setdefault(OTEL_PROPAGATORS, "tracecontext,baggage,xray") + # xray is set after baggage in case xray propagator depends on the result of the baggage header extraction. + os.environ.setdefault(OTEL_PROPAGATORS, "baggage,xray,tracecontext") # We need to explicitly reload the opentelemetry.propagate module here # because this module initializes the default propagators when it loads very early in the chain. # Without reloading the OTEL_PROPAGATOR config from this distro won't take any effect. diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py index dc32a4d69..9e4afc81e 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelementry_configurator.py @@ -1262,7 +1262,7 @@ def validate_distro_environ(): tc.assertEqual( "base2_exponential_bucket_histogram", os.environ.get("OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION") ) - tc.assertEqual("tracecontext,baggage,xray", os.environ.get("OTEL_PROPAGATORS")) + tc.assertEqual("baggage,xray,tracecontext", os.environ.get("OTEL_PROPAGATORS")) tc.assertEqual("xray", os.environ.get("OTEL_PYTHON_ID_GENERATOR")) # Not set diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py index a48e306cb..3b20e8308 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_opentelemetry_distro.py @@ -75,7 +75,7 @@ def test_configure_sets_default_values(self, mock_super_configure, mock_apply_pa # Check that default values are set self.assertEqual(os.environ.get("OTEL_EXPORTER_OTLP_PROTOCOL"), "http/protobuf") - self.assertEqual(os.environ.get("OTEL_PROPAGATORS"), "tracecontext,baggage,xray") + self.assertEqual(os.environ.get("OTEL_PROPAGATORS"), "baggage,xray,tracecontext") self.assertEqual(os.environ.get("OTEL_PYTHON_ID_GENERATOR"), "xray") self.assertEqual( os.environ.get("OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION"), @@ -270,7 +270,7 @@ def test_otel_propagators_added_when_not_user_defined(self, mock_super_configure self.assertTrue(isinstance(propagators, CompositePropagator)) - expected_propagators = ["TraceContextTextMapPropagator", "W3CBaggagePropagator", "AwsXRayPropagator"] + expected_propagators = ["W3CBaggagePropagator", "AwsXRayPropagator", "TraceContextTextMapPropagator"] individual_propagators = propagators._propagators self.assertEqual(3, len(individual_propagators)) actual_propagators = []