Skip to content

Commit e914755

Browse files
fixed arn extraction logic
1 parent 9ed0801 commit e914755

File tree

2 files changed

+79
-26
lines changed

2 files changed

+79
-26
lines changed

datadog_lambda/wrapper.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ def _before(self, event, context):
247247
)
248248
if config.data_streams_enabled:
249249
if dd_json_data:
250-
source_arn = extract_source_arn(event, event_source)
250+
source_arn = extract_source_arn(event)
251251
set_dsm_checkpoint(
252252
dd_json_data, event_source.to_string(), source_arn
253253
)
@@ -382,13 +382,12 @@ def carrier_get(key):
382382
logger.debug(f"Failed to set DSM checkpoint: {e}")
383383

384384

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 ""
385+
def extract_source_arn(event):
386+
first_record = event.get("Records", [{}])[0]
387+
arn = first_record.get("eventSourceARN", "")
388+
if not arn:
389+
arn = first_record.get("Sns", {}).get("TopicArn", "")
390+
return arn
392391

393392

394393
datadog_lambda_wrapper = _LambdaDecorator

tests/test_wrapper.py

Lines changed: 72 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -928,13 +928,8 @@ def test_extract_source_arn_sqs_event(self):
928928
]
929929
}
930930

931-
event_source = type(
932-
"EventSource",
933-
(),
934-
{"equals": lambda self, event_type, **kwargs: event_type.name == "SQS"},
935-
)()
931+
result = wrapper.extract_source_arn(sqs_event)
936932

937-
result = wrapper.extract_source_arn(sqs_event, event_source)
938933
self.assertEqual(result, "arn:aws:sqs:us-east-1:123456789012:test-queue")
939934

940935
def test_extract_source_arn_sns_event(self):
@@ -952,13 +947,8 @@ def test_extract_source_arn_sns_event(self):
952947
]
953948
}
954949

955-
event_source = type(
956-
"EventSource",
957-
(),
958-
{"equals": lambda self, event_type, **kwargs: event_type.name == "SNS"},
959-
)()
950+
result = wrapper.extract_source_arn(sns_event)
960951

961-
result = wrapper.extract_source_arn(sns_event, event_source)
962952
self.assertEqual(result, "arn:aws:sns:us-east-1:123456789012:test-topic")
963953

964954
def test_extract_source_arn_other_event(self):
@@ -971,11 +961,75 @@ def test_extract_source_arn_other_event(self):
971961
},
972962
}
973963

974-
event_source = type(
975-
"EventSource",
976-
(),
977-
{"equals": lambda self, event_type, **kwargs: event_type.name == "S3"},
978-
)()
964+
result = wrapper.extract_source_arn(other_event)
979965

980-
result = wrapper.extract_source_arn(other_event, event_source)
981966
self.assertEqual(result, "")
967+
968+
def test_extract_source_arn_kinesis_event(self):
969+
"""Test extracting ARN from Kinesis event"""
970+
kinesis_event = {
971+
"Records": [
972+
{
973+
"kinesis": {
974+
"kinesisSchemaVersion": "1.0",
975+
"partitionKey": "partitionkey",
976+
"sequenceNumber": "496242301546858",
977+
"data": "eyJmb28iOiAiYmFyIn0=",
978+
"approximateArrivalTimestamp": 1643638425.163,
979+
},
980+
"eventSource": "aws:kinesis",
981+
"eventVersion": "1.0",
982+
"eventID": "shardId-000000000002:49624230154685806402418",
983+
"eventName": "aws:kinesis:record",
984+
"invokeIdentityArn": "arn:aws:iam::601427279990:role/test-role",
985+
"awsRegion": "us-east-1",
986+
"eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream",
987+
}
988+
]
989+
}
990+
991+
result = wrapper.extract_source_arn(kinesis_event)
992+
993+
self.assertEqual(
994+
result, "arn:aws:kinesis:us-east-1:123456789012:stream/test-stream"
995+
)
996+
997+
def test_extract_source_arn_sns_to_sqs_event(self):
998+
"""Test extracting ARN from SNS -> SQS event (SQS record from SNS topic)"""
999+
sns_to_sqs_event = {
1000+
"Records": [
1001+
{
1002+
"messageId": "892f0033-3a4e-4d61-9e26-70d6f7901cd5",
1003+
"receiptHandle": "test-receipt-handle",
1004+
"body": {
1005+
"Type": "Notification",
1006+
"MessageId": "6dacdb4e-f8dd-5752-9f49-858ee02bcd55",
1007+
"TopicArn": "arn:aws:sns:us-east-1:123456789012:test-topic",
1008+
"Message": "hello from SNS",
1009+
"Timestamp": "2024-05-16T14:22:46.902Z",
1010+
"SignatureVersion": "1",
1011+
"Signature": "test-signature",
1012+
"SigningCertURL": "https://sns.us-east-1.amazonaws.com/test-cert.pem",
1013+
"UnsubscribeURL": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe",
1014+
"MessageAttributes": {},
1015+
},
1016+
"attributes": {
1017+
"ApproximateReceiveCount": "1",
1018+
"SentTimestamp": "1715869366931",
1019+
"SenderId": "test-sender-id",
1020+
"ApproximateFirstReceiveTimestamp": "1715869366945",
1021+
},
1022+
"messageAttributes": {},
1023+
"md5OfBody": "test-md5-hash",
1024+
"eventSource": "aws:sqs",
1025+
"eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:test-queue-from-sns",
1026+
"awsRegion": "us-east-1",
1027+
}
1028+
]
1029+
}
1030+
1031+
result = wrapper.extract_source_arn(sns_to_sqs_event)
1032+
1033+
self.assertEqual(
1034+
result, "arn:aws:sqs:us-east-1:123456789012:test-queue-from-sns"
1035+
)

0 commit comments

Comments
 (0)