From 96a337928a221544019e690bc23ef75bb06b61e2 Mon Sep 17 00:00:00 2001 From: alexgallotta <5581237+alexgallotta@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:48:04 -0500 Subject: [PATCH 1/2] add eb-sqs --- .../src/lifecycle/invocation/span_inferrer.rs | 17 +++++++++- .../invocation/triggers/dynamodb_event.rs | 2 +- .../invocation/triggers/event_bridge_event.rs | 2 +- .../invocation/triggers/sqs_event.rs | 33 +++++++++++++++++-- .../tests/payloads/eventbridge_sqs_event.json | 21 ++++++++++++ 5 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 bottlecap/tests/payloads/eventbridge_sqs_event.json diff --git a/bottlecap/src/lifecycle/invocation/span_inferrer.rs b/bottlecap/src/lifecycle/invocation/span_inferrer.rs index edc3253c1..457afe9a5 100644 --- a/bottlecap/src/lifecycle/invocation/span_inferrer.rs +++ b/bottlecap/src/lifecycle/invocation/span_inferrer.rs @@ -98,7 +98,22 @@ impl SpanInferrer { inferred_span.start - wrapped_inferred_span.start; self.wrapped_inferred_span = Some(wrapped_inferred_span); - } + } else if let Ok(event_bridge_entity) = + serde_json::from_str::(&t.body) + { + let mut wrapped_inferred_span = Span { + span_id: Self::generate_span_id(), + ..Default::default() + }; + + event_bridge_entity.enrich_span(&mut wrapped_inferred_span); + inferred_span.meta.extend(event_bridge_entity.get_tags()); + + wrapped_inferred_span.duration = + inferred_span.start - wrapped_inferred_span.start; + + self.wrapped_inferred_span = Some(wrapped_inferred_span); + }; trigger = Some(Box::new(t)); } diff --git a/bottlecap/src/lifecycle/invocation/triggers/dynamodb_event.rs b/bottlecap/src/lifecycle/invocation/triggers/dynamodb_event.rs index 46c20fe27..026e74832 100644 --- a/bottlecap/src/lifecycle/invocation/triggers/dynamodb_event.rs +++ b/bottlecap/src/lifecycle/invocation/triggers/dynamodb_event.rs @@ -142,7 +142,7 @@ mod tests { let expected = DynamoDbRecord { dynamodb: DynamoDbEntity { - approximate_creation_date_time: 1428537600.0, + approximate_creation_date_time: 1_428_537_600.0, size_bytes: 26, stream_view_type: String::from("NEW_AND_OLD_IMAGES"), }, diff --git a/bottlecap/src/lifecycle/invocation/triggers/event_bridge_event.rs b/bottlecap/src/lifecycle/invocation/triggers/event_bridge_event.rs index f51b111c6..ff7d174c6 100644 --- a/bottlecap/src/lifecycle/invocation/triggers/event_bridge_event.rs +++ b/bottlecap/src/lifecycle/invocation/triggers/event_bridge_event.rs @@ -200,7 +200,7 @@ mod tests { assert_eq!(span.resource, "testBus"); // Seconds resolution - assert_eq!(span.start, 1731140535000000000); + assert_eq!(span.start, 1_731_140_535_000_000_000); } #[test] diff --git a/bottlecap/src/lifecycle/invocation/triggers/sqs_event.rs b/bottlecap/src/lifecycle/invocation/triggers/sqs_event.rs index 4f804c3de..2f17a58b5 100644 --- a/bottlecap/src/lifecycle/invocation/triggers/sqs_event.rs +++ b/bottlecap/src/lifecycle/invocation/triggers/sqs_event.rs @@ -4,6 +4,7 @@ use serde_json::Value; use std::collections::HashMap; use tracing::debug; +use crate::lifecycle::invocation::triggers::event_bridge_event::EventBridgeEvent; use crate::lifecycle::invocation::{ processor::MS_TO_NS, triggers::{ @@ -180,8 +181,6 @@ impl Trigger for SqsRecord { } } - // TODO: Check for EventBridge event sent through SQS - // Check for SNS event sent through SQS if let Ok(sns_entity) = serde_json::from_str::(&self.body) { let sns_record = SnsRecord { @@ -190,6 +189,8 @@ impl Trigger for SqsRecord { }; return sns_record.get_carrier(); + } else if let Ok(event) = serde_json::from_str::(&self.body) { + return event.get_carrier(); } // TODO: AWSTraceHeader @@ -362,4 +363,32 @@ mod tests { assert_eq!(carrier, expected); } + + #[test] + fn test_get_carrier_from_eventbridge() { + let json = read_json_file("eventbridge_sqs_event.json"); + let payload = serde_json::from_str(&json).expect("Failed to deserialize into Value"); + let event = SqsRecord::new(payload).expect("Failed to deserialize EventBridgeEvent"); + let carrier = event.get_carrier(); + + let expected = HashMap::from([ + ( + "x-datadog-trace-id".to_string(), + "7379586022458917877".to_string(), + ), + ( + "traceparent".to_string(), + "00-000000000000000066698e63821a03f5-24b17e9b6476c018-01".to_string(), + ), + ("x-datadog-tags".to_string(), "_dd.p.dm=-0".to_string()), + ( + "x-datadog-parent-id".to_string(), + "2644033662113726488".to_string(), + ), + ("tracestate".to_string(), "dd=t.dm:-0;s:1".to_string()), + ("x-datadog-sampling-priority".to_string(), "1".to_string()), + ]); + + assert_eq!(carrier, expected); + } } diff --git a/bottlecap/tests/payloads/eventbridge_sqs_event.json b/bottlecap/tests/payloads/eventbridge_sqs_event.json new file mode 100644 index 000000000..033740244 --- /dev/null +++ b/bottlecap/tests/payloads/eventbridge_sqs_event.json @@ -0,0 +1,21 @@ +{ + "Records": [ + { + "messageId": "e995e54f-1724-41fa-82c0-8b81821f854e", + "receiptHandle": "AQEB4mIfRcyqtzn1X5Ss+ConhTejVGc+qnAcmu3/Z9ZvbNkaPcpuDLX/bzvPD/ZkAXJUXZcemGSJmd7L3snZHKMP2Ck8runZiyl4mubiLb444pZvdiNPuGRJ6a3FvgS/GQPzho/9nNMyOi66m8Viwh70v4EUCPGO4JmD3TTDAUrrcAnqU4WSObjfC/NAp9bI6wH2CEyAYEfex6Nxplbl/jBf9ZUG0I3m3vQd0Q4l4gd4jIR4oxQUglU2Tldl4Kx5fMUAhTRLAENri6HsY81avBkKd9FAuxONlsITB5uj02kOkvLlRGEcalqsKyPJ7AFaDLrOLaL3U+yReroPEJ5R5nwhLOEbeN5HROlZRXeaAwZOIN8BjqdeooYTIOrtvMEVb7a6OPLMdH1XB+ddevtKAH8K9Tm2ZjpaA7dtBGh1zFVHzBk=", + "body": "{\"version\":\"0\",\"id\":\"af718b2a-b987-e8c0-7a2b-a188fad2661a\",\"detail-type\":\"my.Detail\",\"source\":\"my.Source\",\"account\":\"425362996713\",\"time\":\"2023-08-03T22:49:03Z\",\"region\":\"us-east-1\",\"resources\":[],\"detail\":{\"text\":\"Hello, world!\",\"_datadog\":{\"x-datadog-trace-id\":\"7379586022458917877\",\"x-datadog-parent-id\":\"2644033662113726488\",\"x-datadog-sampling-priority\":\"1\",\"x-datadog-tags\":\"_dd.p.dm=-0\",\"traceparent\":\"00-000000000000000066698e63821a03f5-24b17e9b6476c018-01\",\"tracestate\":\"dd=t.dm:-0;s:1\"}}}", + "attributes": { + "ApproximateReceiveCount": "1", + "AWSTraceHeader": "Root=1-64cc2edd-112fbf1701d1355973a11d57;Parent=7d5a9776024b2d42;Sampled=0", + "SentTimestamp": "1691102943638", + "SenderId": "AIDAJXNJGGKNS7OSV23OI", + "ApproximateFirstReceiveTimestamp": "1691102943647" + }, + "messageAttributes": {}, + "md5OfBody": "93d9f0cd8886d1e000a1a0b7007bffc4", + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:us-east-1:425362996713:lambda-eb-sqs-lambda-dev-demo-queue", + "awsRegion": "us-east-1" + } + ] +} From 6183a03154981db2466eeeae395f9ab4cc332446 Mon Sep 17 00:00:00 2001 From: alexgallotta <5581237+alexgallotta@users.noreply.github.com> Date: Tue, 12 Nov 2024 12:37:03 -0500 Subject: [PATCH 2/2] fix import --- bottlecap/src/lifecycle/invocation/triggers/sqs_event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bottlecap/src/lifecycle/invocation/triggers/sqs_event.rs b/bottlecap/src/lifecycle/invocation/triggers/sqs_event.rs index 2f17a58b5..6e748d4d9 100644 --- a/bottlecap/src/lifecycle/invocation/triggers/sqs_event.rs +++ b/bottlecap/src/lifecycle/invocation/triggers/sqs_event.rs @@ -4,10 +4,10 @@ use serde_json::Value; use std::collections::HashMap; use tracing::debug; -use crate::lifecycle::invocation::triggers::event_bridge_event::EventBridgeEvent; use crate::lifecycle::invocation::{ processor::MS_TO_NS, triggers::{ + event_bridge_event::EventBridgeEvent, get_aws_partition_by_region, sns_event::{SnsEntity, SnsRecord}, Trigger, DATADOG_CARRIER_KEY, FUNCTION_TRIGGER_EVENT_SOURCE_TAG,