44# Copyright 2019 Datadog, Inc.
55import logging
66import os
7+ import re
78import traceback
89import ujson as json
910from datetime import datetime , timezone
@@ -828,15 +829,31 @@ def create_service_mapping(val):
828829 return new_service_mapping
829830
830831
831- def determine_service_name (service_mapping , specific_key , generic_key , default_value ):
832- service_name = service_mapping .get (specific_key )
833- if service_name is None :
834- service_name = service_mapping .get (generic_key , default_value )
835- return service_name
832+ def determine_service_name (
833+ service_mapping , specific_key , generic_key , extracted_key , fallback = None
834+ ):
835+ # Check for mapped service (specific key first, then generic key)
836+ mapped_service = service_mapping .get (specific_key ) or service_mapping .get (
837+ generic_key
838+ )
839+ if mapped_service :
840+ return mapped_service
841+
842+ # Check if AWS service representation is disabled
843+ aws_service_representation = os .environ .get (
844+ "DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED" , ""
845+ ).lower ()
846+ if aws_service_representation in ("false" , "0" ):
847+ return fallback
848+
849+ # Use extracted_key if it exists and is not empty, otherwise use fallback
850+ return (
851+ extracted_key .strip () if extracted_key and extracted_key .strip () else fallback
852+ )
836853
837854
838855# Initialization code
839- service_mapping_str = os .getenv ("DD_SERVICE_MAPPING" , "" )
856+ service_mapping_str = os .environ . get ("DD_SERVICE_MAPPING" , "" )
840857service_mapping = create_service_mapping (service_mapping_str )
841858
842859_dd_origin = {"_dd.origin" : "lambda" }
@@ -960,6 +977,7 @@ def create_inferred_span_from_api_gateway_websocket_event(
960977 "http.url" : http_url ,
961978 "endpoint" : endpoint ,
962979 "resource_names" : endpoint ,
980+ "span.kind" : "server" ,
963981 "apiid" : api_id ,
964982 "apiname" : api_id ,
965983 "stage" : request_context .get ("stage" ),
@@ -1018,6 +1036,7 @@ def create_inferred_span_from_api_gateway_event(
10181036 "endpoint" : path ,
10191037 "http.method" : method ,
10201038 "resource_names" : resource ,
1039+ "span.kind" : "server" ,
10211040 "apiid" : api_id ,
10221041 "apiname" : api_id ,
10231042 "stage" : request_context .get ("stage" ),
@@ -1122,12 +1141,13 @@ def create_inferred_span_from_sqs_event(event, context):
11221141 event_source_arn = event_record .get ("eventSourceARN" )
11231142 queue_name = event_source_arn .split (":" )[- 1 ]
11241143 service_name = determine_service_name (
1125- service_mapping , queue_name , "lambda_sqs" , "sqs"
1144+ service_mapping , queue_name , "lambda_sqs" , queue_name , "sqs"
11261145 )
11271146 attrs = event_record .get ("attributes" ) or {}
11281147 tags = {
11291148 "operation_name" : "aws.sqs" ,
11301149 "resource_names" : queue_name ,
1150+ "span.kind" : "server" ,
11311151 "queuename" : queue_name ,
11321152 "event_source_arn" : event_source_arn ,
11331153 "receipt_handle" : event_record .get ("receiptHandle" ),
@@ -1189,11 +1209,12 @@ def create_inferred_span_from_sns_event(event, context):
11891209 topic_arn = sns_message .get ("TopicArn" )
11901210 topic_name = topic_arn .split (":" )[- 1 ]
11911211 service_name = determine_service_name (
1192- service_mapping , topic_name , "lambda_sns" , "sns"
1212+ service_mapping , topic_name , "lambda_sns" , topic_name , "sns"
11931213 )
11941214 tags = {
11951215 "operation_name" : "aws.sns" ,
11961216 "resource_names" : topic_name ,
1217+ "span.kind" : "server" ,
11971218 "topicname" : topic_name ,
11981219 "topic_arn" : topic_arn ,
11991220 "message_id" : sns_message .get ("MessageId" ),
@@ -1224,15 +1245,16 @@ def create_inferred_span_from_kinesis_event(event, context):
12241245 event_record = get_first_record (event )
12251246 event_source_arn = event_record .get ("eventSourceARN" )
12261247 event_id = event_record .get ("eventID" )
1227- stream_name = event_source_arn .split (":" )[- 1 ]
1248+ stream_name = re . sub ( r"^stream/" , "" , ( event_source_arn or "" ) .split (":" )[- 1 ])
12281249 shard_id = event_id .split (":" )[0 ]
12291250 service_name = determine_service_name (
1230- service_mapping , stream_name , "lambda_kinesis" , "kinesis"
1251+ service_mapping , stream_name , "lambda_kinesis" , stream_name , "kinesis"
12311252 )
12321253 kinesis = event_record .get ("kinesis" ) or {}
12331254 tags = {
12341255 "operation_name" : "aws.kinesis" ,
12351256 "resource_names" : stream_name ,
1257+ "span.kind" : "server" ,
12361258 "streamname" : stream_name ,
12371259 "shardid" : shard_id ,
12381260 "event_source_arn" : event_source_arn ,
@@ -1259,12 +1281,13 @@ def create_inferred_span_from_dynamodb_event(event, context):
12591281 event_source_arn = event_record .get ("eventSourceARN" )
12601282 table_name = event_source_arn .split ("/" )[1 ]
12611283 service_name = determine_service_name (
1262- service_mapping , table_name , "lambda_dynamodb" , "dynamodb"
1284+ service_mapping , table_name , "lambda_dynamodb" , table_name , "dynamodb"
12631285 )
12641286 dynamodb_message = event_record .get ("dynamodb" ) or {}
12651287 tags = {
12661288 "operation_name" : "aws.dynamodb" ,
12671289 "resource_names" : table_name ,
1290+ "span.kind" : "server" ,
12681291 "tablename" : table_name ,
12691292 "event_source_arn" : event_source_arn ,
12701293 "event_id" : event_record .get ("eventID" ),
@@ -1293,11 +1316,12 @@ def create_inferred_span_from_s3_event(event, context):
12931316 obj = s3 .get ("object" ) or {}
12941317 bucket_name = bucket .get ("name" )
12951318 service_name = determine_service_name (
1296- service_mapping , bucket_name , "lambda_s3" , "s3"
1319+ service_mapping , bucket_name , "lambda_s3" , bucket_name , "s3"
12971320 )
12981321 tags = {
12991322 "operation_name" : "aws.s3" ,
13001323 "resource_names" : bucket_name ,
1324+ "span.kind" : "server" ,
13011325 "event_name" : event_record .get ("eventName" ),
13021326 "bucketname" : bucket_name ,
13031327 "bucket_arn" : bucket .get ("arn" ),
@@ -1323,11 +1347,12 @@ def create_inferred_span_from_s3_event(event, context):
13231347def create_inferred_span_from_eventbridge_event (event , context ):
13241348 source = event .get ("source" )
13251349 service_name = determine_service_name (
1326- service_mapping , source , "lambda_eventbridge" , "eventbridge"
1350+ service_mapping , source , "lambda_eventbridge" , source , "eventbridge"
13271351 )
13281352 tags = {
13291353 "operation_name" : "aws.eventbridge" ,
13301354 "resource_names" : source ,
1355+ "span.kind" : "server" ,
13311356 "detail_type" : event .get ("detail-type" ),
13321357 }
13331358 InferredSpanInfo .set_tags (
@@ -1401,9 +1426,21 @@ def create_function_execution_span(
14011426 tags ["_dd.parent_source" ] = trace_context_source
14021427 tags .update (trigger_tags )
14031428 tracer .set_tags (_dd_origin )
1429+ # Determine service name based on config and env var
1430+ if config .service :
1431+ service_name = config .service
1432+ else :
1433+ aws_service_representation = os .environ .get (
1434+ "DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED" , ""
1435+ ).lower ()
1436+ if aws_service_representation in ("false" , "0" ):
1437+ service_name = "aws.lambda"
1438+ else :
1439+ service_name = function_name if function_name else "aws.lambda"
1440+
14041441 span = tracer .trace (
14051442 "aws.lambda" ,
1406- service = "aws.lambda" ,
1443+ service = service_name ,
14071444 resource = function_name ,
14081445 span_type = "serverless" ,
14091446 )
0 commit comments