7
7
import os
8
8
import json
9
9
from datetime import datetime , timezone
10
- from typing import Optional , Literal , Dict
10
+ from typing import Optional , Dict
11
+
12
+ try :
13
+ from typing import Literal
14
+ except ImportError :
15
+ # Literal was added to typing in python 3.8
16
+ from typing_extensions import Literal
11
17
12
18
from datadog_lambda .constants import (
13
19
SamplingPriority ,
@@ -442,24 +448,30 @@ def is_api_gateway_invocation_async(event):
442
448
443
449
444
450
def create_inferred_span_from_api_gateway_websocket_event (event , context ):
445
- domain = event ["requestContext" ]["domainName" ]
446
- endpoint = event ["requestContext" ]["routeKey" ]
451
+ request_context = event ["requestContext" ]
452
+ domain = request_context ["domainName" ]
453
+ endpoint = request_context ["routeKey" ]
447
454
tags = {
448
455
"operation_name" : "aws.apigateway.websocket" ,
449
456
"http.url" : domain + endpoint ,
450
457
"endpoint" : endpoint ,
451
- "resource_names" : domain + endpoint ,
452
- "request_id" : context .aws_request_id ,
453
- "connection_id" : event ["requestContext" ]["connectionId" ],
458
+ "resource_names" : endpoint ,
459
+ "apiid" : request_context ["apiId" ],
460
+ "apiname" : request_context ["apiId" ],
461
+ "stage" : request_context ["stage" ],
462
+ "request_id" : request_context ["requestId" ],
463
+ "connection_id" : request_context ["connectionId" ],
464
+ "event_type" : request_context ["eventType" ],
465
+ "message_direction" : request_context ["messageDirection" ],
454
466
}
467
+ request_time_epoch = request_context ["requestTimeEpoch" ]
455
468
if is_api_gateway_invocation_async (event ):
456
469
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "async" )
457
470
else :
458
471
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "sync" )
459
- request_time_epoch = event ["requestContext" ]["requestTimeEpoch" ]
460
472
args = {
461
473
"service" : domain ,
462
- "resource" : domain + endpoint ,
474
+ "resource" : endpoint ,
463
475
"span_type" : "web" ,
464
476
}
465
477
tracer .set_tags ({"_dd.origin" : "lambda" })
@@ -471,24 +483,30 @@ def create_inferred_span_from_api_gateway_websocket_event(event, context):
471
483
472
484
473
485
def create_inferred_span_from_api_gateway_event (event , context ):
474
- domain = event ["requestContext" ]["domainName" ]
486
+ request_context = event ["requestContext" ]
487
+ domain = request_context ["domainName" ]
488
+ method = event ["httpMethod" ]
475
489
path = event ["path" ]
490
+ resource = "{0} {1}" .format (method , path )
476
491
tags = {
477
492
"operation_name" : "aws.apigateway.rest" ,
478
493
"http.url" : domain + path ,
479
494
"endpoint" : path ,
480
- "http.method" : event ["httpMethod" ],
481
- "resource_names" : domain + path ,
482
- "request_id" : context .aws_request_id ,
495
+ "http.method" : method ,
496
+ "resource_names" : resource ,
497
+ "apiid" : request_context ["apiId" ],
498
+ "apiname" : request_context ["apiId" ],
499
+ "stage" : request_context ["stage" ],
500
+ "request_id" : request_context ["requestId" ],
483
501
}
502
+ request_time_epoch = request_context ["requestTimeEpoch" ]
484
503
if is_api_gateway_invocation_async (event ):
485
504
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "async" )
486
505
else :
487
506
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "sync" )
488
- request_time_epoch = event ["requestContext" ]["requestTimeEpoch" ]
489
507
args = {
490
508
"service" : domain ,
491
- "resource" : domain + path ,
509
+ "resource" : resource ,
492
510
"span_type" : "http" ,
493
511
}
494
512
tracer .set_tags ({"_dd.origin" : "lambda" })
@@ -500,24 +518,33 @@ def create_inferred_span_from_api_gateway_event(event, context):
500
518
501
519
502
520
def create_inferred_span_from_http_api_event (event , context ):
503
- domain = event ["requestContext" ]["domainName" ]
521
+ request_context = event ["requestContext" ]
522
+ domain = request_context ["domainName" ]
523
+ method = request_context ["http" ]["method" ]
504
524
path = event ["rawPath" ]
525
+ resource = "{0} {1}" .format (method , path )
505
526
tags = {
506
527
"operation_name" : "aws.httpapi" ,
507
- "http.url" : domain + path ,
508
528
"endpoint" : path ,
509
- "http.method" : event ["requestContext" ]["http" ]["method" ],
510
- "resource_names" : domain + path ,
529
+ "http.url" : domain + path ,
530
+ "http.method" : request_context ["http" ]["method" ],
531
+ "http.protocol" : request_context ["http" ]["protocol" ],
532
+ "http.source_ip" : request_context ["http" ]["sourceIp" ],
533
+ "http.user_agent" : request_context ["http" ]["userAgent" ],
534
+ "resource_names" : resource ,
511
535
"request_id" : context .aws_request_id ,
536
+ "apiid" : request_context ["apiId" ],
537
+ "apiname" : request_context ["apiId" ],
538
+ "stage" : request_context ["stage" ],
512
539
}
540
+ request_time_epoch = request_context ["timeEpoch" ]
513
541
if is_api_gateway_invocation_async (event ):
514
542
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "async" )
515
543
else :
516
544
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "sync" )
517
- request_time_epoch = event ["requestContext" ]["timeEpoch" ]
518
545
args = {
519
546
"service" : domain ,
520
- "resource" : domain + path ,
547
+ "resource" : resource ,
521
548
"span_type" : "http" ,
522
549
}
523
550
tracer .set_tags ({"_dd.origin" : "lambda" })
@@ -530,10 +557,15 @@ def create_inferred_span_from_http_api_event(event, context):
530
557
531
558
def create_inferred_span_from_sqs_event (event , context ):
532
559
event_record = get_first_record (event )
533
- queue_name = event_record ["eventSourceARN" ].split (":" )[- 1 ]
560
+ event_source_arn = event_record ["eventSourceARN" ]
561
+ queue_name = event_source_arn .split (":" )[- 1 ]
534
562
tags = {
535
563
"operation_name" : "aws.sqs" ,
536
564
"resource_names" : queue_name ,
565
+ "queuename" : queue_name ,
566
+ "event_source_arn" : event_source_arn ,
567
+ "receipt_handle" : event_record ["receiptHandle" ],
568
+ "sender_id" : event_record ["attributes" ]["SenderId" ],
537
569
}
538
570
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "async" )
539
571
request_time_epoch = event_record ["attributes" ]["SentTimestamp" ]
@@ -552,10 +584,18 @@ def create_inferred_span_from_sqs_event(event, context):
552
584
553
585
def create_inferred_span_from_sns_event (event , context ):
554
586
event_record = get_first_record (event )
555
- topic_name = event_record ["Sns" ]["TopicArn" ].split (":" )[- 1 ]
587
+ sns_message = event_record ["Sns" ]
588
+ topic_arn = event_record ["Sns" ]["TopicArn" ]
589
+ topic_name = topic_arn .split (":" )[- 1 ]
556
590
tags = {
557
591
"operation_name" : "aws.sns" ,
558
592
"resource_names" : topic_name ,
593
+ "topicname" : topic_name ,
594
+ "topic_arn" : topic_arn ,
595
+ "message_id" : sns_message ["MessageId" ],
596
+ "type" : sns_message ["Type" ],
597
+ "subject" : sns_message ["Subject" ],
598
+ "event_subscription_arn" : event_record ["EventSubscriptionArn" ],
559
599
}
560
600
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "async" )
561
601
sns_dt_format = "%Y-%m-%dT%H:%M:%S.%fZ"
@@ -577,10 +617,20 @@ def create_inferred_span_from_sns_event(event, context):
577
617
578
618
def create_inferred_span_from_kinesis_event (event , context ):
579
619
event_record = get_first_record (event )
580
- stream_name = event_record ["eventSourceARN" ].split (":" )[- 1 ]
620
+ event_source_arn = event_record ["eventSourceARN" ]
621
+ event_id = event_record ["eventID" ]
622
+ stream_name = event_source_arn .split (":" )[- 1 ]
623
+ shard_id = event_id .split (":" )[0 ]
581
624
tags = {
582
625
"operation_name" : "aws.kinesis" ,
583
626
"resource_names" : stream_name ,
627
+ "streamname" : stream_name ,
628
+ "shardid" : shard_id ,
629
+ "event_source_arn" : event_source_arn ,
630
+ "event_id" : event_id ,
631
+ "event_name" : event_record ["eventName" ],
632
+ "event_version" : event_record ["eventVersion" ],
633
+ "partition_key" : event_record ["kinesis" ]["partitionKey" ],
584
634
}
585
635
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "async" )
586
636
request_time_epoch = event_record ["kinesis" ]["approximateArrivalTimestamp" ]
@@ -600,14 +650,22 @@ def create_inferred_span_from_kinesis_event(event, context):
600
650
601
651
def create_inferred_span_from_dynamodb_event (event , context ):
602
652
event_record = get_first_record (event )
603
- table_name = event_record ["eventSourceARN" ].split ("/" )[1 ]
653
+ event_source_arn = event_record ["eventSourceARN" ]
654
+ table_name = event_source_arn .split ("/" )[1 ]
655
+ dynamodb_message = event_record ["dynamodb" ]
604
656
tags = {
605
657
"operation_name" : "aws.dynamodb" ,
606
658
"resource_names" : table_name ,
659
+ "tablename" : table_name ,
660
+ "event_source_arn" : event_source_arn ,
661
+ "event_id" : event_record ["eventID" ],
662
+ "event_name" : event_record ["eventName" ],
663
+ "event_version" : event_record ["eventVersion" ],
664
+ "stream_view_type" : dynamodb_message ["StreamViewType" ],
665
+ "size_bytes" : dynamodb_message ["SizeBytes" ],
607
666
}
608
667
InferredSpanInfo .set_tags (tags , synchronicity = "async" , tag_source = "self" )
609
668
request_time_epoch = event_record ["dynamodb" ]["ApproximateCreationDateTime" ]
610
-
611
669
args = {
612
670
"service" : "dynamodb" ,
613
671
"resource" : table_name ,
@@ -617,6 +675,7 @@ def create_inferred_span_from_dynamodb_event(event, context):
617
675
span = tracer .trace ("aws.dynamodb" , ** args )
618
676
if span :
619
677
span .set_tags (tags )
678
+
620
679
span .start = int (request_time_epoch )
621
680
return span
622
681
@@ -627,6 +686,12 @@ def create_inferred_span_from_s3_event(event, context):
627
686
tags = {
628
687
"operation_name" : "aws.s3" ,
629
688
"resource_names" : bucket_name ,
689
+ "event_name" : event_record ["eventName" ],
690
+ "bucketname" : bucket_name ,
691
+ "bucket_arn" : event_record ["s3" ]["bucket" ]["arn" ],
692
+ "object_key" : event_record ["s3" ]["object" ]["key" ],
693
+ "object_size" : event_record ["s3" ]["object" ]["size" ],
694
+ "object_etag" : event_record ["s3" ]["etag" ],
630
695
}
631
696
InferredSpanInfo .set_tags (tags , synchronicity = "async" , tag_source = "self" )
632
697
dt_format = "%Y-%m-%dT%H:%M:%S.%fZ"
@@ -651,6 +716,7 @@ def create_inferred_span_from_eventbridge_event(event, context):
651
716
tags = {
652
717
"operation_name" : "aws.eventbridge" ,
653
718
"resource_names" : source ,
719
+ "detail_type" : event ["detail-type" ],
654
720
}
655
721
InferredSpanInfo .set_tags (
656
722
tags ,
0 commit comments