diff --git a/CHANGELOG.md b/CHANGELOG.md index 981d2fd23..2e49e661c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Make Django request span attributes available for `start_span`. ([#1730](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1730)) +### Fixed + +- Fix `AttributeError` when AWS Lambda handler receives a list event + ([#1738](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1738)) + ## Version 1.17.0/0.38b0 (2023-03-22) 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 938540049..4404839c6 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 @@ -342,7 +342,9 @@ def _instrument( # If the request came from an API Gateway, extract http attributes from the event # https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/instrumentation/aws-lambda.md#api-gateway # https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md#http-server-semantic-conventions - if lambda_event and lambda_event.get("requestContext"): + if isinstance(lambda_event, dict) and lambda_event.get( + "requestContext" + ): span.set_attribute(SpanAttributes.FAAS_TRIGGER, "http") if lambda_event.get("version") == "2.0": 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 fd3c9f88c..1df7499d3 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 @@ -399,6 +399,15 @@ class TestAwsLambdaInstrumentor(TestBase): }, ) + def test_lambda_handles_list_event(self): + AwsLambdaInstrumentor().instrument() + + mock_execute_lambda([{"message": "test"}]) + + spans = self.memory_exporter.get_finished_spans() + + assert spans + def test_uninstrument(self): AwsLambdaInstrumentor().instrument()