Skip to content

Commit 9cccc94

Browse files
moved arn logic to the wrapper
1 parent c8bd364 commit 9cccc94

File tree

4 files changed

+142
-72
lines changed

4 files changed

+142
-72
lines changed

datadog_lambda/tracing.py

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -217,20 +217,16 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context):
217217
"""
218218

219219
# EventBridge => SQS
220-
is_sqs = False
221220
try:
222221
context = _extract_context_from_eventbridge_sqs_event(event)
223222
if _is_context_complete(context):
224-
return context, None, None
223+
return context, None
225224
except Exception:
226225
logger.debug("Failed extracting context as EventBridge to SQS.")
227226

228227
try:
229228
first_record = event.get("Records")[0]
230229

231-
arn = first_record.get("eventSourceARN", "")
232-
if arn:
233-
is_sqs = True
234230
# logic to deal with SNS => SQS event
235231
if "body" in first_record:
236232
body_str = first_record.get("body")
@@ -245,8 +241,6 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context):
245241
msg_attributes = first_record.get("messageAttributes")
246242
if msg_attributes is None:
247243
sns_record = first_record.get("Sns") or {}
248-
if not is_sqs:
249-
arn = sns_record.get("TopicArn", "")
250244
msg_attributes = sns_record.get("MessageAttributes") or {}
251245
dd_payload = msg_attributes.get("_datadog")
252246
if dd_payload:
@@ -277,13 +271,12 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context):
277271
return (
278272
extract_context_from_step_functions(dd_data, None),
279273
None,
280-
None,
281274
)
282275
except Exception:
283276
logger.debug(
284277
"Failed to extract Step Functions context from SQS/SNS event."
285278
)
286-
return propagator.extract(dd_data), dd_data, arn
279+
return propagator.extract(dd_data), dd_data
287280
else:
288281
# Handle case where trace context is injected into attributes.AWSTraceHeader
289282
# example: Root=1-654321ab-000000001234567890abcdef;Parent=0123456789abcdef;Sampled=1
@@ -308,12 +301,11 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context):
308301
sampling_priority=float(x_ray_context["sampled"]),
309302
),
310303
None,
311-
None,
312304
)
313-
return extract_context_from_lambda_context(lambda_context), None, None
305+
return extract_context_from_lambda_context(lambda_context), None
314306
except Exception as e:
315307
logger.debug("The trace extractor returned with error %s", e)
316-
return extract_context_from_lambda_context(lambda_context), None, None
308+
return extract_context_from_lambda_context(lambda_context), None
317309

318310

319311
def _extract_context_from_eventbridge_sqs_event(event):
@@ -374,7 +366,6 @@ def extract_context_from_kinesis_event(event, lambda_context):
374366
"""
375367
try:
376368
record = get_first_record(event)
377-
arn = record.get("eventSourceARN", "")
378369
kinesis = record.get("kinesis")
379370
if not kinesis:
380371
return extract_context_from_lambda_context(lambda_context)
@@ -388,11 +379,11 @@ def extract_context_from_kinesis_event(event, lambda_context):
388379
data_obj = json.loads(data_str)
389380
dd_ctx = data_obj.get("_datadog")
390381
if dd_ctx:
391-
return propagator.extract(dd_ctx), dd_ctx, arn
382+
return propagator.extract(dd_ctx), dd_ctx
392383
except Exception as e:
393384
logger.debug("The trace extractor returned with error %s", e)
394385

395-
return extract_context_from_lambda_context(lambda_context), None, None
386+
return extract_context_from_lambda_context(lambda_context), None
396387

397388

398389
def _deterministic_sha256_hash(s: str, part: str) -> int:
@@ -602,7 +593,6 @@ def extract_dd_trace_context(
602593
event_source = parse_event_source(event)
603594
context = None
604595
dd_json_data = None
605-
arn = None
606596

607597
if extractor is not None:
608598
context = extract_context_custom_extractor(extractor, event, lambda_context)
@@ -611,13 +601,13 @@ def extract_dd_trace_context(
611601
event, lambda_context, event_source, decode_authorizer_context
612602
)
613603
elif event_source.equals(EventTypes.SNS) or event_source.equals(EventTypes.SQS):
614-
context, dd_json_data, arn = extract_context_from_sqs_or_sns_event_or_context(
604+
context, dd_json_data = extract_context_from_sqs_or_sns_event_or_context(
615605
event, lambda_context
616606
)
617607
elif event_source.equals(EventTypes.EVENTBRIDGE):
618608
context = extract_context_from_eventbridge_event(event, lambda_context)
619609
elif event_source.equals(EventTypes.KINESIS):
620-
context, dd_json_data, arn = extract_context_from_kinesis_event(
610+
context, dd_json_data = extract_context_from_kinesis_event(
621611
event, lambda_context
622612
)
623613
elif event_source.equals(EventTypes.STEPFUNCTIONS):
@@ -636,7 +626,7 @@ def extract_dd_trace_context(
636626
if dd_trace_context:
637627
trace_context_source = TraceContextSource.XRAY
638628
logger.debug("extracted dd trace context %s", dd_trace_context)
639-
return dd_trace_context, trace_context_source, event_source, dd_json_data, arn
629+
return dd_trace_context, trace_context_source, event_source, dd_json_data
640630

641631

642632
def get_dd_trace_context_obj():

datadog_lambda/wrapper.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
from datadog_lambda.trigger import (
4545
extract_trigger_tags,
4646
extract_http_status_code_tag,
47+
EventTypes,
4748
)
4849

4950
if config.profiling_enabled:
@@ -220,7 +221,6 @@ def _before(self, event, context):
220221
trace_context_source,
221222
event_source,
222223
dd_json_data,
223-
arn,
224224
) = extract_dd_trace_context(
225225
event,
226226
context,
@@ -247,7 +247,10 @@ def _before(self, event, context):
247247
)
248248
if config.data_streams_enabled:
249249
if dd_json_data:
250-
set_dsm_checkpoint(dd_json_data, event_source.to_string(), arn)
250+
source_arn = extract_source_arn(event, event_source)
251+
set_dsm_checkpoint(
252+
dd_json_data, event_source.to_string(), source_arn
253+
)
251254

252255
self.span = create_function_execution_span(
253256
context=context,
@@ -379,4 +382,13 @@ def carrier_get(key):
379382
logger.debug(f"Failed to set DSM checkpoint: {e}")
380383

381384

385+
def extract_source_arn(event, event_source):
386+
if event_source.equals(EventTypes.SQS) or event_source.equals(EventTypes.KINESIS):
387+
return event.get("Records", [{}])[0].get("eventSourceARN")
388+
elif event_source.equals(EventTypes.SNS):
389+
return event.get("Records", [{}])[0].get("Sns", {}).get("TopicArn")
390+
else:
391+
return None
392+
393+
382394
datadog_lambda_wrapper = _LambdaDecorator

tests/test_tracing.py

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ def test_extract_dd_trace_context(event, expect):
245245
event = json.load(f)
246246
ctx = get_mock_context()
247247

248-
actual, _, _, _, _ = extract_dd_trace_context(event, ctx)
248+
actual, _, _, _ = extract_dd_trace_context(event, ctx)
249249
assert (expect is None) is (actual is None)
250250
assert (expect is None) or actual.trace_id == expect.trace_id
251251
assert (expect is None) or actual.span_id == expect.span_id
@@ -269,7 +269,7 @@ def tearDown(self):
269269
@with_trace_propagation_style("datadog")
270270
def test_without_datadog_trace_headers(self):
271271
lambda_ctx = get_mock_context()
272-
ctx, source, _, _, _ = extract_dd_trace_context({}, lambda_ctx)
272+
ctx, source, _, _ = extract_dd_trace_context({}, lambda_ctx)
273273
self.assertEqual(source, "xray")
274274
self.assertEqual(
275275
ctx,
@@ -292,7 +292,7 @@ def test_without_datadog_trace_headers(self):
292292
@with_trace_propagation_style("datadog")
293293
def test_with_non_object_event(self):
294294
lambda_ctx = get_mock_context()
295-
ctx, source, _, _, _ = extract_dd_trace_context(b"", lambda_ctx)
295+
ctx, source, _, _ = extract_dd_trace_context(b"", lambda_ctx)
296296
self.assertEqual(source, "xray")
297297
self.assertEqual(
298298
ctx,
@@ -315,7 +315,7 @@ def test_with_non_object_event(self):
315315
@with_trace_propagation_style("datadog")
316316
def test_with_incomplete_datadog_trace_headers(self):
317317
lambda_ctx = get_mock_context()
318-
ctx, source, _, _, _ = extract_dd_trace_context(
318+
ctx, source, _, _ = extract_dd_trace_context(
319319
{"headers": {TraceHeader.TRACE_ID: "123"}},
320320
lambda_ctx,
321321
)
@@ -340,7 +340,7 @@ def test_with_incomplete_datadog_trace_headers(self):
340340
def common_tests_with_trace_context_extraction_injection(
341341
self, headers, event_containing_headers, lambda_context=get_mock_context()
342342
):
343-
ctx, source, _, _, _ = extract_dd_trace_context(
343+
ctx, source, _, _ = extract_dd_trace_context(
344344
event_containing_headers,
345345
lambda_context,
346346
)
@@ -393,7 +393,7 @@ def extractor_foo(event, context):
393393
return trace_id, parent_id, sampling_priority
394394

395395
lambda_ctx = get_mock_context()
396-
ctx, ctx_source, _, _, _ = extract_dd_trace_context(
396+
ctx, ctx_source, _, _ = extract_dd_trace_context(
397397
{
398398
"foo": {
399399
TraceHeader.TRACE_ID: "123",
@@ -428,7 +428,7 @@ def extractor_raiser(event, context):
428428
raise Exception("kreator")
429429

430430
lambda_ctx = get_mock_context()
431-
ctx, ctx_source, _, _, _ = extract_dd_trace_context(
431+
ctx, ctx_source, _, _ = extract_dd_trace_context(
432432
{
433433
"foo": {
434434
TraceHeader.TRACE_ID: "123",
@@ -627,7 +627,7 @@ def _test_step_function_trace_data_common(
627627
TraceHeader.TAGS: f"_dd.p.tid={expected_tid}",
628628
}
629629

630-
ctx, source, _, _, _ = extract_dd_trace_context(event, lambda_ctx)
630+
ctx, source, _, _ = extract_dd_trace_context(event, lambda_ctx)
631631

632632
self.assertEqual(source, "event")
633633
self.assertEqual(ctx, expected_context)
@@ -1148,7 +1148,7 @@ def test_mixed_parent_context_when_merging(self):
11481148
# use the dd-trace trace-id and the x-ray parent-id
11491149
# This allows parenting relationships like dd-trace -> x-ray -> dd-trace
11501150
lambda_ctx = get_mock_context()
1151-
ctx, source, _, _, _ = extract_dd_trace_context(
1151+
ctx, source, _, _ = extract_dd_trace_context(
11521152
{
11531153
"headers": {
11541154
TraceHeader.TRACE_ID: "123",
@@ -1174,7 +1174,7 @@ def test_set_dd_trace_py_root_no_span_id(self):
11741174
os.environ["_X_AMZN_TRACE_ID"] = "Root=1-5e272390-8c398be037738dc042009320"
11751175

11761176
lambda_ctx = get_mock_context()
1177-
ctx, source, _, _, _ = extract_dd_trace_context(
1177+
ctx, source, _, _ = extract_dd_trace_context(
11781178
{
11791179
"headers": {
11801180
TraceHeader.TRACE_ID: "123",
@@ -2467,15 +2467,14 @@ def test_extract_context_from_sqs_event_with_datadog_context(self):
24672467
]
24682468
}
24692469

2470-
(context, dd_json_data, arn) = extract_context_from_sqs_or_sns_event_or_context(
2470+
(context, dd_json_data) = extract_context_from_sqs_or_sns_event_or_context(
24712471
sqs_event, lambda_ctx
24722472
)
24732473

24742474
self.assertEqual(context.trace_id, 456)
24752475
self.assertEqual(context.span_id, 789)
24762476
self.assertEqual(context.sampling_priority, 1)
24772477
self.assertEqual(dd_json_data, expected_trace_data)
2478-
self.assertEqual(arn, "arn:aws:sqs:us-east-1:123456789012:test-queue")
24792478

24802479
def test_extract_context_from_sns_event_with_datadog_context(self):
24812480
"""Test SNS event extraction with datadog context returns expected values."""
@@ -2501,15 +2500,14 @@ def test_extract_context_from_sns_event_with_datadog_context(self):
25012500
]
25022501
}
25032502

2504-
(context, dd_json_data, arn) = extract_context_from_sqs_or_sns_event_or_context(
2503+
(context, dd_json_data) = extract_context_from_sqs_or_sns_event_or_context(
25052504
sns_event, lambda_ctx
25062505
)
25072506

25082507
self.assertEqual(context.trace_id, 111)
25092508
self.assertEqual(context.span_id, 222)
25102509
self.assertEqual(context.sampling_priority, 2)
25112510
self.assertEqual(dd_json_data, expected_trace_data)
2512-
self.assertEqual(arn, "arn:aws:sns:us-east-1:123456789012:test-topic")
25132511

25142512
def test_extract_context_from_kinesis_event_with_datadog_context(self):
25152513
"""Test Kinesis event extraction with datadog context returns expected values."""
@@ -2531,16 +2529,13 @@ def test_extract_context_from_kinesis_event_with_datadog_context(self):
25312529
]
25322530
}
25332531

2534-
context, dd_json_data, arn = extract_context_from_kinesis_event(
2532+
context, dd_json_data = extract_context_from_kinesis_event(
25352533
kinesis_event, lambda_ctx
25362534
)
25372535

25382536
self.assertEqual(context.trace_id, 333)
25392537
self.assertEqual(context.span_id, 444)
25402538
self.assertEqual(dd_json_data, expected_trace_data)
2541-
self.assertEqual(
2542-
arn, "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream"
2543-
)
25442539

25452540
def test_step_function_context_in_sqs_calls_step_function_extractor(self):
25462541
"""Test that Step Function context in SQS calls the step function extractor."""
@@ -2564,13 +2559,12 @@ def test_step_function_context_in_sqs_calls_step_function_extractor(self):
25642559
]
25652560
}
25662561

2567-
(context, dd_json_data, arn) = extract_context_from_sqs_or_sns_event_or_context(
2562+
(context, dd_json_data) = extract_context_from_sqs_or_sns_event_or_context(
25682563
sfn_sqs_event, lambda_ctx
25692564
)
25702565

25712566
self.assertIsNotNone(context)
25722567
self.assertIsNone(dd_json_data)
2573-
self.assertIsNone(arn)
25742568

25752569
def test_extract_context_from_sns_to_sqs_event_with_datadog_context(self):
25762570
"""Test SNS -> SQS event extraction with datadog context returns expected values."""
@@ -2605,12 +2599,11 @@ def test_extract_context_from_sns_to_sqs_event_with_datadog_context(self):
26052599
]
26062600
}
26072601

2608-
(context, dd_json_data, arn) = extract_context_from_sqs_or_sns_event_or_context(
2602+
(context, dd_json_data) = extract_context_from_sqs_or_sns_event_or_context(
26092603
sns_to_sqs_event, lambda_ctx
26102604
)
26112605

26122606
self.assertEqual(context.trace_id, 555)
26132607
self.assertEqual(context.span_id, 666)
26142608
self.assertEqual(context.sampling_priority, 1)
26152609
self.assertEqual(dd_json_data, expected_trace_data)
2616-
self.assertEqual(arn, "arn:aws:sqs:us-east-1:123456789012:test-queue")

0 commit comments

Comments
 (0)