From fedf9448c0943a119e7e035629aaa463833fc332 Mon Sep 17 00:00:00 2001 From: Jakub Wach Date: Mon, 25 Apr 2022 15:29:20 +0200 Subject: [PATCH] Fixes issue with headers not being a dict in AWS lambda instr (#1055) --- CHANGELOG.md | 11 ++++++++--- .../instrumentation/aws_lambda/__init__.py | 4 ++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 653965ab09..051b3d115d 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](https://github.com/open-telemetry/opentelemetry-python/compare/v1.11.1-0.30b1...HEAD) +### Fixed +- `opentelemetry-instrumentation-aws-lambda` Fixed an issue - in some rare cases (API GW proxy integration test) + headers are set to None, breaking context propagators. + ([#1055](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1055)) ## [1.11.1-0.30b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.11.1-0.30b1) - 2022-04-21 @@ -14,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-instrumentation-starlette` Capture custom request/response headers in span attributes ([#1046])(https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1046) +### Fixed - Prune autoinstrumentation sitecustomize module directory from PYTHONPATH immediately ([#1066](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1066)) @@ -23,13 +28,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-instrumentation-pyramid` Fixed which package is the correct caller in _traced_init. ([#830](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/830)) - `opentelemetry-instrumentation-tornado` Fix Tornado errors mapping to 500 - ([#1048])(https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1048) + ([#1048](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1048)) - `opentelemetry-instrumentation-urllib` make span attributes available to sampler ([1014](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1014)) - `opentelemetry-instrumentation-flask` Fix non-recording span bug - ([#999])(https://github.com/open-telemetry/opentelemetry-python-contrib/pull/999) + ([#999](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/999)) - `opentelemetry-instrumentation-tornado` Fix non-recording span bug - ([#999])(https://github.com/open-telemetry/opentelemetry-python-contrib/pull/999) + ([#999](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/999)) ### Added 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 ad83418fbb..d791b2f17c 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 @@ -108,6 +108,8 @@ def _default_event_context_extractor(lambda_event: Any) -> Context: Assumes the Lambda Event is a map with the headers under the 'headers' key. This is the mapping to use when the Lambda is invoked by an API Gateway REST API where API Gateway is acting as a pure proxy for the request. + Protects headers from being something other than dictionary, as this + is what downstream propagators expect. See more: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format @@ -118,12 +120,14 @@ def _default_event_context_extractor(lambda_event: Any) -> Context: Returns: A Context with configuration found in the event. """ + headers = None try: headers = lambda_event["headers"] except (TypeError, KeyError): logger.debug( "Extracting context from Lambda Event failed: either enable X-Ray active tracing or configure API Gateway to trigger this Lambda function as a pure proxy. Otherwise, generated spans will have an invalid (empty) parent context." ) + if not isinstance(headers, dict): headers = {} return get_global_textmap().extract(headers)