@@ -280,57 +280,26 @@ export class SpanInferrer {
280280 parentSpanContext : SpanContext | undefined ,
281281 ) : SpanWrapper {
282282 const options : SpanOptions = { } ;
283- const { Records } = event as SNSEvent ;
284- const referenceRecord = Records [ 0 ] ;
285- const {
286- EventSubscriptionArn,
287- Sns : { TopicArn, Timestamp, Type, Subject, MessageId } ,
288- } = referenceRecord ;
289- const topicName = TopicArn ?. split ( ":" ) . pop ( ) || "" ;
290- const resourceName = topicName ;
291- const serviceName = SpanInferrer . determineServiceName ( topicName , "lambda_sns" , "sns" ) ;
292- options . tags = {
293- operation_name : "aws.sns" ,
294- resource_names : resourceName ,
295- request_id : context ?. awsRequestId ,
296- "span.type" : "sns" ,
297- "resource.name" : resourceName ,
298- "peer.service" : this . service ,
299- service : serviceName ,
300- _inferred_span : {
301- tag_source : "self" ,
302- synchronicity : "async" ,
303- } ,
304- type : Type ,
305- subject : Subject ,
306- message_id : MessageId ,
307- topicname : topicName ,
308- topic_arn : TopicArn ,
309- event_subscription_arn : EventSubscriptionArn ,
310- } ;
311- if ( parentSpanContext ) {
312- options . childOf = parentSpanContext ;
283+
284+ let referenceRecord : SNSMessage ;
285+ let eventSubscriptionArn = "" ;
286+ if ( event . Records ) {
287+ // Full SNS Event into Lambda
288+ const { Records } = event as SNSEvent ;
289+ ( { Sns : referenceRecord , EventSubscriptionArn : eventSubscriptionArn } = Records [ 0 ] ) ;
290+ } else {
291+ // SNS message wrapping an SQS message
292+ referenceRecord = event ;
313293 }
314- options . startTime = Date . parse ( Timestamp ) ;
315- const spanWrapperOptions = {
316- isAsync : true ,
317- } ;
318- return new SpanWrapper ( this . traceWrapper . startSpan ( "aws.sns" , options ) , spanWrapperOptions ) ;
319- }
294+ const { TopicArn, Timestamp, Type, Subject, MessageId } = referenceRecord ;
320295
321- createInferredSpanForSqsSns (
322- event : SNSMessage ,
323- context : Context | undefined ,
324- parentSpanContext : SpanContext | undefined ,
325- ) : SpanWrapper {
326- const options : SpanOptions = { } ;
327- const { TopicArn, Timestamp, Type, Subject, MessageId } = event ;
328296 const topicName = TopicArn ?. split ( ":" ) . pop ( ) || "" ;
329297 const resourceName = topicName ;
330298 const serviceName = SpanInferrer . determineServiceName ( topicName , "lambda_sns" , "sns" ) ;
331299 options . tags = {
332300 operation_name : "aws.sns" ,
333301 resource_names : resourceName ,
302+ request_id : context ?. awsRequestId ,
334303 "span.type" : "sns" ,
335304 "resource.name" : resourceName ,
336305 "peer.service" : this . service ,
@@ -345,6 +314,11 @@ export class SpanInferrer {
345314 topicname : topicName ,
346315 topic_arn : TopicArn ,
347316 } ;
317+
318+ // EventSubscriptionARN not available for direct integrations to SQS from SNS.
319+ if ( eventSubscriptionArn !== "" ) {
320+ options . tags . event_subscription_arn = eventSubscriptionArn ;
321+ }
348322 if ( parentSpanContext ) {
349323 options . childOf = parentSpanContext ;
350324 }
@@ -396,18 +370,21 @@ export class SpanInferrer {
396370 // Check if sqs message was from sns
397371 // If so, unpack and look at timestamp
398372 // create further upstream sns span and finish/attach it here
399- let upstreamSnsSpan : SpanWrapper | null = null ;
373+ let upstreamSpan : SpanWrapper | null = null ;
400374 try {
401- let upstreamSnsMessage : SNSMessage ;
402- upstreamSnsMessage = JSON . parse ( body ) ;
403- if ( upstreamSnsMessage && upstreamSnsMessage . TopicArn && upstreamSnsMessage . Timestamp ) {
404- upstreamSnsSpan = this . createInferredSpanForSqsSns ( upstreamSnsMessage , context , parentSpanContext ) ;
405- upstreamSnsSpan . finish ( Number ( SentTimestamp ) ) ;
375+ let upstreamMessage : any ;
376+ upstreamMessage = JSON . parse ( body ) ;
377+ if ( upstreamMessage && upstreamMessage . TopicArn && upstreamMessage . Timestamp ) {
378+ upstreamSpan = this . createInferredSpanForSns ( upstreamMessage , context , parentSpanContext ) ;
379+ upstreamSpan . finish ( Number ( SentTimestamp ) ) ;
380+ } else if ( upstreamMessage ?. detail ?. _datadog ) {
381+ upstreamSpan = this . createInferredSpanForEventBridge ( upstreamMessage , context , parentSpanContext ) ;
382+ upstreamSpan . finish ( Number ( SentTimestamp ) ) ;
406383 }
407384 } catch ( e ) {
408385 // Pass, it's a raw SQS message
409386 }
410- options . childOf = upstreamSnsSpan ? upstreamSnsSpan . span : parentSpanContext ;
387+ options . childOf = upstreamSpan ? upstreamSpan . span : parentSpanContext ;
411388
412389 options . startTime = Number ( SentTimestamp ) ;
413390
@@ -512,7 +489,7 @@ export class SpanInferrer {
512489 }
513490
514491 createInferredSpanForEventBridge (
515- event : any ,
492+ event : EventBridgeEvent < any , any > ,
516493 context : Context | undefined ,
517494 parentSpanContext : SpanContext | undefined ,
518495 ) : SpanWrapper {
0 commit comments