From 7fbc174ab1b1ad8c6a93d1740e3c73229da66be6 Mon Sep 17 00:00:00 2001 From: Pablo Deputter Date: Wed, 23 Sep 2026 13:25:36 +0200 Subject: [PATCH 1/3] ref(aws-lambda): Drop `send_default_pii` support --- sentry_sdk/integrations/aws_lambda.py | 74 +++++++------------ .../BasicOkSendDefaultPii/.gitignore | 11 --- .../BasicOkSendDefaultPii/.lock | 0 .../BasicOkSendDefaultPii/index.py | 15 ---- .../BasicOkSpanStreamingPii/.gitignore | 11 --- .../BasicOkSpanStreamingPii/index.py | 15 ---- .../aws_lambda/test_aws_lambda.py | 51 ++----------- 7 files changed, 30 insertions(+), 147 deletions(-) delete mode 100644 tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSendDefaultPii/.gitignore delete mode 100644 tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSendDefaultPii/.lock delete mode 100644 tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSendDefaultPii/index.py delete mode 100644 tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreamingPii/.gitignore delete mode 100644 tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreamingPii/index.py diff --git a/sentry_sdk/integrations/aws_lambda.py b/sentry_sdk/integrations/aws_lambda.py index b28f7315e3..3652d3d398 100644 --- a/sentry_sdk/integrations/aws_lambda.py +++ b/sentry_sdk/integrations/aws_lambda.py @@ -17,7 +17,7 @@ CLOUD_PLATFORM, CLOUD_PROVIDER, ) -from sentry_sdk.scope import Scope, should_send_default_pii +from sentry_sdk.scope import Scope from sentry_sdk.traces import SegmentNameSource from sentry_sdk.utils import ( AnnotatedValue, @@ -25,7 +25,6 @@ capture_internal_exceptions, ensure_integration_enabled, event_from_exception, - has_data_collection_enabled, logger, reraise, ) @@ -180,31 +179,21 @@ def sentry_handler( "httpMethod" ] + data_collection = client.options["data_collection"] if "queryStringParameters" in request_data: qs = request_data["queryStringParameters"] if qs: - if has_data_collection_enabled(client.options): - filtered_qs = _apply_key_value_collection_filtering( - items=qs, - behaviour=client.options["data_collection"][ - "url_query_params" - ], - ) - if filtered_qs: - additional_attributes["url.query"] = urlencode(filtered_qs) - elif should_send_default_pii(): - additional_attributes["url.query"] = urlencode(qs) - - if not scope._user: - if has_data_collection_enabled(client.options): - if client.options["data_collection"]["user_info"]: - user_info = _get_user_from_event(request_data) - if user_info: - scope.set_user(user_info) - elif should_send_default_pii(): - user_info = _get_user_from_event(request_data) - if user_info: - scope.set_user(user_info) + filtered_qs = _apply_key_value_collection_filtering( + items=qs, + behaviour=data_collection["url_query_params"], + ) + if filtered_qs: + additional_attributes["url.query"] = urlencode(filtered_qs) + + if not scope._user and data_collection["user_info"]: + user_info = _get_user_from_event(request_data) + if user_info: + scope.set_user(user_info) sampling_context = { "aws_event": aws_event, @@ -397,43 +386,30 @@ def event_processor( request["url"] = _get_url(aws_event, aws_context) + client_options = sentry_sdk.get_client().options + data_collection = client_options["data_collection"] + if "queryStringParameters" in aws_event: query_string = aws_event["queryStringParameters"] - client_options = sentry_sdk.get_client().options - if has_data_collection_enabled(client_options): - if query_string: - filtered_qs = _apply_key_value_collection_filtering( - items=query_string, - behaviour=client_options["data_collection"]["url_query_params"], - ) - if filtered_qs: - request["query_string"] = filtered_qs - else: - request["query_string"] = query_string + if query_string: + filtered_qs = _apply_key_value_collection_filtering( + items=query_string, + behaviour=data_collection["url_query_params"], + ) + if filtered_qs: + request["query_string"] = filtered_qs if "headers" in aws_event: request["headers"] = _filter_headers(aws_event["headers"]) - client_options = sentry_sdk.get_client().options - if has_data_collection_enabled(client_options): - if client_options["data_collection"]["user_info"]: - extracted_user = _get_user_from_event(aws_event) - if extracted_user: - user_info = sentry_event.setdefault("user", {}) - for key, value in extracted_user.items(): - user_info.setdefault(key, value) - - if "incoming_request" in client_options["data_collection"]["http_bodies"]: - if "body" in aws_event: - request["data"] = aws_event.get("body", "") - - elif should_send_default_pii(): + if data_collection["user_info"]: extracted_user = _get_user_from_event(aws_event) if extracted_user: user_info = sentry_event.setdefault("user", {}) for key, value in extracted_user.items(): user_info.setdefault(key, value) + if "incoming_request" in data_collection["http_bodies"]: if "body" in aws_event: request["data"] = aws_event.get("body", "") else: diff --git a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSendDefaultPii/.gitignore b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSendDefaultPii/.gitignore deleted file mode 100644 index 1c56884372..0000000000 --- a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSendDefaultPii/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -# Need to add some ignore rules in this directory, because the unit tests will add the Sentry SDK and its dependencies -# into this directory to create a Lambda function package that contains everything needed to instrument a Lambda function using Sentry. - -# Ignore everything -* - -# But not index.py -!index.py - -# And not .gitignore itself -!.gitignore diff --git a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSendDefaultPii/.lock b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSendDefaultPii/.lock deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSendDefaultPii/index.py b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSendDefaultPii/index.py deleted file mode 100644 index 502a6ae3ee..0000000000 --- a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSendDefaultPii/index.py +++ /dev/null @@ -1,15 +0,0 @@ -import os - -import sentry_sdk -from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration - -sentry_sdk.init( - dsn=os.environ.get("SENTRY_DSN"), - traces_sample_rate=1.0, - send_default_pii=True, - integrations=[AwsLambdaIntegration()], -) - - -def handler(event, context): - return {"event": event} diff --git a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreamingPii/.gitignore b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreamingPii/.gitignore deleted file mode 100644 index 1c56884372..0000000000 --- a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreamingPii/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -# Need to add some ignore rules in this directory, because the unit tests will add the Sentry SDK and its dependencies -# into this directory to create a Lambda function package that contains everything needed to instrument a Lambda function using Sentry. - -# Ignore everything -* - -# But not index.py -!index.py - -# And not .gitignore itself -!.gitignore diff --git a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreamingPii/index.py b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreamingPii/index.py deleted file mode 100644 index 502a6ae3ee..0000000000 --- a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreamingPii/index.py +++ /dev/null @@ -1,15 +0,0 @@ -import os - -import sentry_sdk -from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration - -sentry_sdk.init( - dsn=os.environ.get("SENTRY_DSN"), - traces_sample_rate=1.0, - send_default_pii=True, - integrations=[AwsLambdaIntegration()], -) - - -def handler(event, context): - return {"event": event} diff --git a/tests/integrations/aws_lambda/test_aws_lambda.py b/tests/integrations/aws_lambda/test_aws_lambda.py index 487323dcb9..45aa6a8f20 100644 --- a/tests/integrations/aws_lambda/test_aws_lambda.py +++ b/tests/integrations/aws_lambda/test_aws_lambda.py @@ -250,7 +250,7 @@ def test_non_dict_event( assert segment_spans[0]["status"] == "error" -def test_request_data_with_send_default_pii_false(lambda_client, test_environment): +def test_request_data_with_default_data_collection(lambda_client, test_environment): payload = b""" { "resource": "/asd", @@ -290,8 +290,7 @@ def test_request_data_with_send_default_pii_false(lambda_client, test_environmen attrs = segment_spans[0]["attributes"] assert _get_span_attr(attrs, "http.request.method") == "GET" - # With send_default_pii=False (default for layer), query string is not included. - assert "url.query" not in attrs + assert _get_span_attr(attrs, "url.query") == "bonkers=true" USER_INFO_PAYLOAD = b""" @@ -827,7 +826,7 @@ def test_request_attributes(lambda_client, test_environment): } lambda_client.invoke( - FunctionName="BasicOkSpanStreamingPii", + FunctionName="BasicOkSpanStreamingDataCollection", Payload=json.dumps(payload), ) span_items = test_environment["server"].span_items @@ -846,14 +845,14 @@ def test_request_attributes(lambda_client, test_environment): _get_span_attr(attrs, "http.request.header.content-type") == "application/json" ) assert _get_span_attr(attrs, "http.request.header.accept") == "text/html" - assert _get_span_attr(attrs, "faas.name") == "BasicOkSpanStreamingPii" + assert _get_span_attr(attrs, "faas.name") == "BasicOkSpanStreamingDataCollection" assert _get_span_attr(attrs, "cloud.provider") == "aws" assert _get_span_attr(attrs, "cloud.platform") == "aws_lambda" assert _get_span_attr(attrs, "cloud.region") == "us-east-1" assert _get_span_attr(attrs, "faas.version") == "$LATEST" assert "faas.invocation_id" in attrs assert _get_span_attr(attrs, "aws.log.group.names") == [ - "aws/lambda/BasicOkSpanStreamingPii" + "aws/lambda/BasicOkSpanStreamingDataCollection" ] assert _get_span_attr(attrs, "aws.log.stream.names") == ["$LATEST"] @@ -888,46 +887,6 @@ def test_url_query_params_with_data_collection(lambda_client, test_environment): ) -def test_user_info_with_send_default_pii(lambda_client, test_environment): - payload = b""" - { - "resource": "/asd", - "path": "/asd", - "httpMethod": "GET", - "headers": { - "Host": "iwsz2c7uwi.execute-api.us-east-1.amazonaws.com", - "User-Agent": "custom", - "X-Forwarded-Proto": "https" - }, - "queryStringParameters": { - "bonkers": "true" - }, - "pathParameters": null, - "stageVariables": null, - "requestContext": { - "identity": { - "sourceIp": "213.47.147.207", - "userArn": "42" - } - }, - "body": null, - "isBase64Encoded": false - } - """ - - lambda_client.invoke( - FunctionName="BasicOkSpanStreamingPii", - Payload=payload, - ) - span_items = test_environment["server"].span_items - - segment_spans = [s for s in span_items if s.get("is_segment")] - assert len(segment_spans) == 1 - attrs = segment_spans[0]["attributes"] - - assert _get_span_attr(attrs, "user.id") == "42" - - def test_user_info_with_data_collection_user_info_off(lambda_client, test_environment): lambda_client.invoke( FunctionName="BasicOkSpanStreamingDataCollectionUserInfoOff", From bf79d4acd2013bcb9c9238ff8a03fd32c3d95065 Mon Sep 17 00:00:00 2001 From: Pablo Deputter Date: Wed, 23 Sep 2026 14:37:34 +0200 Subject: [PATCH 2/3] ref(aws-lambda): Simplify logic --- sentry_sdk/integrations/aws_lambda.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sentry_sdk/integrations/aws_lambda.py b/sentry_sdk/integrations/aws_lambda.py index 3652d3d398..6fdd209c01 100644 --- a/sentry_sdk/integrations/aws_lambda.py +++ b/sentry_sdk/integrations/aws_lambda.py @@ -412,11 +412,10 @@ def event_processor( if "incoming_request" in data_collection["http_bodies"]: if "body" in aws_event: request["data"] = aws_event.get("body", "") - else: - if aws_event.get("body", None): - # Unfortunately couldn't find a way to get structured body from AWS - # event. Meaning every body is unstructured to us. - request["data"] = AnnotatedValue.removed_because_raw_data() + elif aws_event.get("body", None): + # Unfortunately couldn't find a way to get structured body from AWS + # event. Meaning every body is unstructured to us. + request["data"] = AnnotatedValue.removed_because_raw_data() sentry_event["request"] = deepcopy(request) From aeaea3407c551c143ac07bdb5d5ae0d922e77441 Mon Sep 17 00:00:00 2001 From: Pablo Deputter Date: Wed, 23 Sep 2026 14:42:27 +0200 Subject: [PATCH 3/3] tests(aws-lambda): Add missing `data_collection={}` to `sentry_init` calls --- .../BasicOkSpanStreaming/index.py | 1 + .../RaiseErrorPerformanceDisabled/index.py | 1 + .../RaiseErrorPerformanceEnabled/index.py | 1 + .../RaiseErrorSpanStreaming/index.py | 1 + .../TimeoutErrorScopeModified/index.py | 1 + .../lambda_functions_with_embedded_sdk/TracesSampler/index.py | 1 + 6 files changed, 6 insertions(+) diff --git a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreaming/index.py b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreaming/index.py index 4f82a4eb2b..3a2cfeec85 100644 --- a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreaming/index.py +++ b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkSpanStreaming/index.py @@ -5,6 +5,7 @@ sentry_sdk.init( dsn=os.environ.get("SENTRY_DSN"), + data_collection={}, traces_sample_rate=1.0, integrations=[AwsLambdaIntegration()], ) diff --git a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorPerformanceDisabled/index.py b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorPerformanceDisabled/index.py index 7669fb8aaf..707234b95c 100644 --- a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorPerformanceDisabled/index.py +++ b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorPerformanceDisabled/index.py @@ -5,6 +5,7 @@ sentry_sdk.init( dsn=os.environ.get("SENTRY_DSN"), + data_collection={}, traces_sample_rate=None, # this is the default, just added for clarity integrations=[AwsLambdaIntegration()], ) diff --git a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorPerformanceEnabled/index.py b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorPerformanceEnabled/index.py index 9503f04966..e7dd016973 100644 --- a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorPerformanceEnabled/index.py +++ b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorPerformanceEnabled/index.py @@ -5,6 +5,7 @@ sentry_sdk.init( dsn=os.environ.get("SENTRY_DSN"), + data_collection={}, traces_sample_rate=1.0, integrations=[AwsLambdaIntegration()], ) diff --git a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorSpanStreaming/index.py b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorSpanStreaming/index.py index 9503f04966..e7dd016973 100644 --- a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorSpanStreaming/index.py +++ b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/RaiseErrorSpanStreaming/index.py @@ -5,6 +5,7 @@ sentry_sdk.init( dsn=os.environ.get("SENTRY_DSN"), + data_collection={}, traces_sample_rate=1.0, integrations=[AwsLambdaIntegration()], ) diff --git a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/TimeoutErrorScopeModified/index.py b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/TimeoutErrorScopeModified/index.py index 109245b90d..52fb73e47d 100644 --- a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/TimeoutErrorScopeModified/index.py +++ b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/TimeoutErrorScopeModified/index.py @@ -6,6 +6,7 @@ sentry_sdk.init( dsn=os.environ.get("SENTRY_DSN"), + data_collection={}, traces_sample_rate=1.0, integrations=[AwsLambdaIntegration(timeout_warning=True)], ) diff --git a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/TracesSampler/index.py b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/TracesSampler/index.py index 3e4d9b3c36..36ff898561 100644 --- a/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/TracesSampler/index.py +++ b/tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/TracesSampler/index.py @@ -30,6 +30,7 @@ def trace_sampler(sampling_context): sentry_sdk.init( dsn=os.environ.get("SENTRY_DSN"), + data_collection={}, traces_sample_rate=1.0, traces_sampler=trace_sampler, integrations=[AwsLambdaIntegration()],