diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b7dc36084..75e434c2e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +- `opentelemetry-instrumentation-aws-lambda` Adds an option to configure `disable_aws_context_propagation` by + environment variable: `OTEL_LAMBDA_DISABLE_AWS_CONTEXT_PROPAGATION` + ([#1507](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1507)) + ## Version 1.15.0/0.36b0 (2022-12-10) - Add uninstrument test for sqlalchemy diff --git a/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py b/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py index 35dcec9491..d33da79876 100644 --- a/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py @@ -101,6 +101,9 @@ def custom_event_context_extractor(lambda_event): OTEL_INSTRUMENTATION_AWS_LAMBDA_FLUSH_TIMEOUT = ( "OTEL_INSTRUMENTATION_AWS_LAMBDA_FLUSH_TIMEOUT" ) +OTEL_LAMBDA_DISABLE_AWS_CONTEXT_PROPAGATION = ( + "OTEL_LAMBDA_DISABLE_AWS_CONTEXT_PROPAGATION" +) def _default_event_context_extractor(lambda_event: Any) -> Context: @@ -408,6 +411,16 @@ def _instrument(self, **kwargs): flush_timeout_env, ) + disable_aws_context_propagation = kwargs.get( + "disable_aws_context_propagation", False + ) or os.getenv( + OTEL_LAMBDA_DISABLE_AWS_CONTEXT_PROPAGATION, "False" + ).strip().lower() in ( + "true", + "1", + "t", + ) + _instrument( self._wrapped_module_name, self._wrapped_function_name, @@ -416,9 +429,7 @@ def _instrument(self, **kwargs): "event_context_extractor", _default_event_context_extractor ), tracer_provider=kwargs.get("tracer_provider"), - disable_aws_context_propagation=kwargs.get( - "disable_aws_context_propagation", False - ), + disable_aws_context_propagation=disable_aws_context_propagation, ) def _uninstrument(self, **kwargs): diff --git a/instrumentation/opentelemetry-instrumentation-aws-lambda/tests/test_aws_lambda_instrumentation_manual.py b/instrumentation/opentelemetry-instrumentation-aws-lambda/tests/test_aws_lambda_instrumentation_manual.py index 3837c0bdaa..b828be5487 100644 --- a/instrumentation/opentelemetry-instrumentation-aws-lambda/tests/test_aws_lambda_instrumentation_manual.py +++ b/instrumentation/opentelemetry-instrumentation-aws-lambda/tests/test_aws_lambda_instrumentation_manual.py @@ -27,6 +27,7 @@ _HANDLER, _X_AMZN_TRACE_ID, OTEL_INSTRUMENTATION_AWS_LAMBDA_FLUSH_TIMEOUT, + OTEL_LAMBDA_DISABLE_AWS_CONTEXT_PROPAGATION, AwsLambdaInstrumentor, ) from opentelemetry.propagate import get_global_textmap @@ -168,6 +169,7 @@ class TestCase: expected_state_value: str = None expected_trace_state_len: int = 0 disable_aws_context_propagation: bool = False + disable_aws_context_propagation_envvar: str = "" def custom_event_context_extractor(lambda_event): return get_global_textmap().extract(lambda_event["foo"]["headers"]) @@ -238,6 +240,23 @@ def custom_event_context_extractor(lambda_event): expected_state_value=MOCK_W3C_TRACE_STATE_VALUE, xray_traceid=MOCK_XRAY_TRACE_CONTEXT_SAMPLED, ), + TestCase( + name="no_custom_extractor_xray_disable_aws_propagation_via_env_var", + custom_extractor=None, + context={ + "headers": { + TraceContextTextMapPropagator._TRACEPARENT_HEADER_NAME: MOCK_W3C_TRACE_CONTEXT_SAMPLED, + TraceContextTextMapPropagator._TRACESTATE_HEADER_NAME: f"{MOCK_W3C_TRACE_STATE_KEY}={MOCK_W3C_TRACE_STATE_VALUE},foo=1,bar=2", + } + }, + disable_aws_context_propagation=False, + disable_aws_context_propagation_envvar="true", + expected_traceid=MOCK_W3C_TRACE_ID, + expected_parentid=MOCK_W3C_PARENT_SPAN_ID, + expected_trace_state_len=3, + expected_state_value=MOCK_W3C_TRACE_STATE_VALUE, + xray_traceid=MOCK_XRAY_TRACE_CONTEXT_SAMPLED, + ), ] for test in tests: test_env_patch = mock.patch.dict( @@ -246,6 +265,7 @@ def custom_event_context_extractor(lambda_event): **os.environ, # NOT Active Tracing _X_AMZN_TRACE_ID: test.xray_traceid, + OTEL_LAMBDA_DISABLE_AWS_CONTEXT_PROPAGATION: test.disable_aws_context_propagation_envvar, # NOT using the X-Ray Propagator OTEL_PROPAGATORS: "tracecontext", },