From 76453ac936826d834d23947a7f8a26ce0cc22aa0 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Mon, 19 Dec 2022 11:39:20 -0800 Subject: [PATCH 1/3] Adds an option to configure `disable_aws_context_propagation` by environment variable The variable `OTEL_LAMBDA_DISABLE_AWS_CONTEXT_PROPAGATION` can be used to disable aws context propagation. This is similar to the proposed changes in the JS implementation: https://github.com/open-telemetry/opentelemetry-js-contrib/pull/1227 Signed-off-by: Alex Boten --- CHANGELOG.md | 4 ++++ .../instrumentation/aws_lambda/__init__.py | 17 +++++++++++++--- .../test_aws_lambda_instrumentation_manual.py | 20 +++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b7dc36084..54ece19492 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` + ([#](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/)) + ## 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..ffff6049de 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" + ).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 2936f04718..d0e1f02608 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_propagatio_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", }, From f03899b1154eba98d6794c62d294cf6441b80366 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Mon, 19 Dec 2022 11:42:04 -0800 Subject: [PATCH 2/3] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54ece19492..75e434c2e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-instrumentation-aws-lambda` Adds an option to configure `disable_aws_context_propagation` by environment variable: `OTEL_LAMBDA_DISABLE_AWS_CONTEXT_PROPAGATION` - ([#](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/)) + ([#1507](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1507)) ## Version 1.15.0/0.36b0 (2022-12-10) From 6948d860db3871c7b9a3fac4df55275c35f4a3f6 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Mon, 19 Dec 2022 14:11:36 -0800 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: Srikanth Chekuri Co-authored-by: Diego Hurtado --- .../src/opentelemetry/instrumentation/aws_lambda/__init__.py | 2 +- .../tests/test_aws_lambda_instrumentation_manual.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 ffff6049de..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 @@ -415,7 +415,7 @@ def _instrument(self, **kwargs): "disable_aws_context_propagation", False ) or os.getenv( OTEL_LAMBDA_DISABLE_AWS_CONTEXT_PROPAGATION, "False" - ).lower() in ( + ).strip().lower() in ( "true", "1", "t", 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 30a7fc6aaa..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 @@ -241,7 +241,7 @@ def custom_event_context_extractor(lambda_event): xray_traceid=MOCK_XRAY_TRACE_CONTEXT_SAMPLED, ), TestCase( - name="no_custom_extractor_xray_disable_aws_propagatio_via_env_var", + name="no_custom_extractor_xray_disable_aws_propagation_via_env_var", custom_extractor=None, context={ "headers": {