Skip to content

Commit 22ec7b0

Browse files
authored
chore(aws_lambda): Remove transaction-based tracing (#7418)
User setting was missing in the span streaming branch. Duplicated tests -- removed the non-span-streaming versions. Closes https://linear.app/getsentry/issue/PY-2682/remove-transaction-based-tracing-from-aws-lambda
1 parent ec1b32a commit 22ec7b0

16 files changed

Lines changed: 193 additions & 421 deletions

File tree

‎scripts/init_serverless_sdk.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
dsn=os.environ["SENTRY_DSN"],
2424
integrations=[AwsLambdaIntegration(timeout_warning=True)],
2525
traces_sample_rate=float(os.environ["SENTRY_TRACES_SAMPLE_RATE"]),
26+
trace_lifecycle="stream",
2627
)
2728

2829

‎sentry_sdk/integrations/aws_lambda.py‎

Lines changed: 64 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from urllib.parse import urlencode
1010

1111
import sentry_sdk
12-
from sentry_sdk.api import continue_trace
1312
from sentry_sdk.consts import OP
1413
from sentry_sdk.data_collection import _apply_key_value_collection_filtering
1514
from sentry_sdk.integrations import Integration
@@ -20,8 +19,6 @@
2019
)
2120
from sentry_sdk.scope import Scope, should_send_default_pii
2221
from sentry_sdk.traces import SegmentNameSource
23-
from sentry_sdk.tracing import TransactionSource
24-
from sentry_sdk.tracing_utils import has_span_streaming_enabled
2522
from sentry_sdk.utils import (
2623
AnnotatedValue,
2724
TimeoutThread,
@@ -45,6 +42,24 @@
4542
MILLIS_TO_SECONDS = 1000.0
4643

4744

45+
def _get_user_from_event(aws_event: "dict[str, Any]") -> "dict[str, Any]":
46+
identity = aws_event.get("requestContext", {}).get("identity")
47+
if identity is None:
48+
return {}
49+
50+
user_info: "dict[str, Any]" = {}
51+
52+
user_arn = identity.get("userArn")
53+
if user_arn is not None:
54+
user_info["id"] = user_arn
55+
56+
ip = identity.get("sourceIp")
57+
if ip is not None:
58+
user_info["ip_address"] = ip
59+
60+
return user_info
61+
62+
4863
def _wrap_init_error(init_error: "F") -> "F":
4964
@ensure_integration_enabled(AwsLambdaIntegration, init_error)
5065
def sentry_init_error(*args: "Any", **kwargs: "Any") -> "Any":
@@ -177,52 +192,49 @@ def sentry_handler(
177192
elif should_send_default_pii():
178193
additional_attributes["url.query"] = urlencode(qs)
179194

195+
if not scope._user:
196+
if has_data_collection_enabled(client.options):
197+
if client.options["data_collection"]["user_info"]:
198+
user_info = _get_user_from_event(request_data)
199+
if user_info:
200+
scope.set_user(user_info)
201+
elif should_send_default_pii():
202+
user_info = _get_user_from_event(request_data)
203+
if user_info:
204+
scope.set_user(user_info)
205+
180206
sampling_context = {
181207
"aws_event": aws_event,
182208
"aws_context": aws_context,
183209
}
184210

185211
function_name = aws_context.function_name
186212

187-
if has_span_streaming_enabled(client.options):
188-
sentry_sdk.traces.continue_trace(headers)
189-
Scope.set_custom_sampling_context(sampling_context)
190-
span_ctx = sentry_sdk.traces.start_span(
191-
name=function_name,
192-
parent_span=None,
193-
attributes={
194-
"sentry.op": OP.FUNCTION_AWS,
195-
"sentry.origin": AwsLambdaIntegration.origin,
196-
"sentry.segment.name.source": SegmentNameSource.COMPONENT,
197-
"cloud.region": aws_region,
198-
"cloud.resource_id": aws_context.invoked_function_arn,
199-
"cloud.platform": CLOUD_PLATFORM.AWS_LAMBDA,
200-
"cloud.provider": CLOUD_PROVIDER.AWS,
201-
"faas.name": function_name,
202-
"faas.invocation_id": aws_context.aws_request_id,
203-
"faas.version": aws_context.function_version,
204-
"aws.lambda.invoked_arn": aws_context.invoked_function_arn,
205-
"aws.log.group.names": [aws_context.log_group_name],
206-
"aws.log.stream.names": [aws_context.log_stream_name],
207-
"messaging.batch.message_count": batch_size,
208-
**header_attributes,
209-
**additional_attributes,
210-
},
211-
)
212-
else:
213-
transaction = continue_trace(
214-
headers,
215-
op=OP.FUNCTION_AWS,
216-
name=function_name,
217-
source=TransactionSource.COMPONENT,
218-
origin=AwsLambdaIntegration.origin,
219-
)
220-
221-
span_ctx = sentry_sdk.start_transaction(
222-
transaction, custom_sampling_context=sampling_context
223-
)
224-
225-
with span_ctx:
213+
sentry_sdk.traces.continue_trace(headers)
214+
Scope.set_custom_sampling_context(sampling_context)
215+
216+
with sentry_sdk.traces.start_span(
217+
name=function_name,
218+
parent_span=None,
219+
attributes={
220+
"sentry.op": OP.FUNCTION_AWS,
221+
"sentry.origin": AwsLambdaIntegration.origin,
222+
"sentry.segment.name.source": SegmentNameSource.COMPONENT,
223+
"cloud.region": aws_region,
224+
"cloud.resource_id": aws_context.invoked_function_arn,
225+
"cloud.platform": CLOUD_PLATFORM.AWS_LAMBDA,
226+
"cloud.provider": CLOUD_PROVIDER.AWS,
227+
"faas.name": function_name,
228+
"faas.invocation_id": aws_context.aws_request_id,
229+
"faas.version": aws_context.function_version,
230+
"aws.lambda.invoked_arn": aws_context.invoked_function_arn,
231+
"aws.log.group.names": [aws_context.log_group_name],
232+
"aws.log.stream.names": [aws_context.log_stream_name],
233+
"messaging.batch.message_count": batch_size,
234+
**header_attributes,
235+
**additional_attributes,
236+
},
237+
):
226238
try:
227239
return handler(aws_event, aws_context, *args, **kwargs)
228240
except Exception:
@@ -402,38 +414,22 @@ def event_processor(
402414
client_options = sentry_sdk.get_client().options
403415
if has_data_collection_enabled(client_options):
404416
if client_options["data_collection"]["user_info"]:
405-
user_info = sentry_event.setdefault("user", {})
406-
407-
identity = aws_event.get("requestContext", {}).get("identity")
408-
if identity is None:
409-
identity = {}
410-
411-
id = identity.get("userArn")
412-
if id is not None:
413-
user_info.setdefault("id", id)
414-
415-
ip = identity.get("sourceIp")
416-
if ip is not None:
417-
user_info.setdefault("ip_address", ip)
417+
extracted_user = _get_user_from_event(aws_event)
418+
if extracted_user:
419+
user_info = sentry_event.setdefault("user", {})
420+
for key, value in extracted_user.items():
421+
user_info.setdefault(key, value)
418422

419423
if "incoming_request" in client_options["data_collection"]["http_bodies"]:
420424
if "body" in aws_event:
421425
request["data"] = aws_event.get("body", "")
422426

423427
elif should_send_default_pii():
424-
user_info = sentry_event.setdefault("user", {})
425-
426-
identity = aws_event.get("requestContext", {}).get("identity")
427-
if identity is None:
428-
identity = {}
429-
430-
id = identity.get("userArn")
431-
if id is not None:
432-
user_info.setdefault("id", id)
433-
434-
ip = identity.get("sourceIp")
435-
if ip is not None:
436-
user_info.setdefault("ip_address", ip)
428+
extracted_user = _get_user_from_event(aws_event)
429+
if extracted_user:
430+
user_info = sentry_event.setdefault("user", {})
431+
for key, value in extracted_user.items():
432+
user_info.setdefault(key, value)
437433

438434
if "body" in aws_event:
439435
request["data"] = aws_event.get("body", "")

‎tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkDataCollectionAllowlist/index.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
dsn=os.environ.get("SENTRY_DSN"),
88
traces_sample_rate=1.0,
99
integrations=[AwsLambdaIntegration()],
10+
trace_lifecycle="stream",
1011
_experiments={
1112
"data_collection": {
1213
"http_headers": {

‎tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkDataCollectionDenylist/index.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
dsn=os.environ.get("SENTRY_DSN"),
88
traces_sample_rate=1.0,
99
integrations=[AwsLambdaIntegration()],
10+
trace_lifecycle="stream",
1011
_experiments={
1112
"data_collection": {
1213
"http_headers": {

‎tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkDataCollectionOff/index.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
dsn=os.environ.get("SENTRY_DSN"),
88
traces_sample_rate=1.0,
99
integrations=[AwsLambdaIntegration()],
10+
trace_lifecycle="stream",
1011
_experiments={
1112
"data_collection": {
1213
"http_headers": {

‎tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkDataCollectionUrlQueryAllowlist/index.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
dsn=os.environ.get("SENTRY_DSN"),
88
traces_sample_rate=1.0,
99
integrations=[AwsLambdaIntegration()],
10+
trace_lifecycle="stream",
1011
_experiments={
1112
"data_collection": {
1213
"url_query_params": {

‎tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkDataCollectionUrlQueryDenylist/index.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
dsn=os.environ.get("SENTRY_DSN"),
88
traces_sample_rate=1.0,
99
integrations=[AwsLambdaIntegration()],
10+
trace_lifecycle="stream",
1011
_experiments={
1112
"data_collection": {
1213
"url_query_params": {

‎tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkDataCollectionUrlQueryOff/index.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
dsn=os.environ.get("SENTRY_DSN"),
88
traces_sample_rate=1.0,
99
integrations=[AwsLambdaIntegration()],
10+
trace_lifecycle="stream",
1011
_experiments={
1112
"data_collection": {
1213
"url_query_params": {"mode": "off"},

‎tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkDataCollectionUserInfoOff/index.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
dsn=os.environ.get("SENTRY_DSN"),
88
traces_sample_rate=1.0,
99
integrations=[AwsLambdaIntegration()],
10+
trace_lifecycle="stream",
1011
_experiments={
1112
"data_collection": {
1213
"user_info": False,

‎tests/integrations/aws_lambda/lambda_functions_with_embedded_sdk/BasicOkDataCollectionUserInfoOn/index.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
dsn=os.environ.get("SENTRY_DSN"),
88
traces_sample_rate=1.0,
99
integrations=[AwsLambdaIntegration()],
10+
trace_lifecycle="stream",
1011
_experiments={
1112
"data_collection": {
1213
"user_info": True,

0 commit comments

Comments
 (0)