4
4
# Copyright 2019 Datadog, Inc.
5
5
import logging
6
6
import os
7
+ import re
7
8
import traceback
8
9
import ujson as json
9
10
from datetime import datetime , timezone
@@ -856,15 +857,31 @@ def create_service_mapping(val):
856
857
return new_service_mapping
857
858
858
859
859
- def determine_service_name (service_mapping , specific_key , generic_key , default_value ):
860
- service_name = service_mapping .get (specific_key )
861
- if service_name is None :
862
- service_name = service_mapping .get (generic_key , default_value )
863
- return service_name
860
+ def determine_service_name (
861
+ service_mapping , specific_key , generic_key , extracted_key , fallback = None
862
+ ):
863
+ # Check for mapped service (specific key first, then generic key)
864
+ mapped_service = service_mapping .get (specific_key ) or service_mapping .get (
865
+ generic_key
866
+ )
867
+ if mapped_service :
868
+ return mapped_service
869
+
870
+ # Check if AWS service representation is disabled
871
+ aws_service_representation = os .environ .get (
872
+ "DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED" , ""
873
+ ).lower ()
874
+ if aws_service_representation in ("false" , "0" ):
875
+ return fallback
876
+
877
+ # Use extracted_key if it exists and is not empty, otherwise use fallback
878
+ return (
879
+ extracted_key .strip () if extracted_key and extracted_key .strip () else fallback
880
+ )
864
881
865
882
866
883
# Initialization code
867
- service_mapping_str = os .getenv ("DD_SERVICE_MAPPING" , "" )
884
+ service_mapping_str = os .environ . get ("DD_SERVICE_MAPPING" , "" )
868
885
service_mapping = create_service_mapping (service_mapping_str )
869
886
870
887
_dd_origin = {"_dd.origin" : "lambda" }
@@ -988,6 +1005,7 @@ def create_inferred_span_from_api_gateway_websocket_event(
988
1005
"http.url" : http_url ,
989
1006
"endpoint" : endpoint ,
990
1007
"resource_names" : endpoint ,
1008
+ "span.kind" : "server" ,
991
1009
"apiid" : api_id ,
992
1010
"apiname" : api_id ,
993
1011
"stage" : request_context .get ("stage" ),
@@ -1046,6 +1064,7 @@ def create_inferred_span_from_api_gateway_event(
1046
1064
"endpoint" : path ,
1047
1065
"http.method" : method ,
1048
1066
"resource_names" : resource ,
1067
+ "span.kind" : "server" ,
1049
1068
"apiid" : api_id ,
1050
1069
"apiname" : api_id ,
1051
1070
"stage" : request_context .get ("stage" ),
@@ -1150,12 +1169,13 @@ def create_inferred_span_from_sqs_event(event, context):
1150
1169
event_source_arn = event_record .get ("eventSourceARN" )
1151
1170
queue_name = event_source_arn .split (":" )[- 1 ]
1152
1171
service_name = determine_service_name (
1153
- service_mapping , queue_name , "lambda_sqs" , "sqs"
1172
+ service_mapping , queue_name , "lambda_sqs" , queue_name , "sqs"
1154
1173
)
1155
1174
attrs = event_record .get ("attributes" ) or {}
1156
1175
tags = {
1157
1176
"operation_name" : "aws.sqs" ,
1158
1177
"resource_names" : queue_name ,
1178
+ "span.kind" : "server" ,
1159
1179
"queuename" : queue_name ,
1160
1180
"event_source_arn" : event_source_arn ,
1161
1181
"receipt_handle" : event_record .get ("receiptHandle" ),
@@ -1217,11 +1237,12 @@ def create_inferred_span_from_sns_event(event, context):
1217
1237
topic_arn = sns_message .get ("TopicArn" )
1218
1238
topic_name = topic_arn .split (":" )[- 1 ]
1219
1239
service_name = determine_service_name (
1220
- service_mapping , topic_name , "lambda_sns" , "sns"
1240
+ service_mapping , topic_name , "lambda_sns" , topic_name , "sns"
1221
1241
)
1222
1242
tags = {
1223
1243
"operation_name" : "aws.sns" ,
1224
1244
"resource_names" : topic_name ,
1245
+ "span.kind" : "server" ,
1225
1246
"topicname" : topic_name ,
1226
1247
"topic_arn" : topic_arn ,
1227
1248
"message_id" : sns_message .get ("MessageId" ),
@@ -1252,15 +1273,16 @@ def create_inferred_span_from_kinesis_event(event, context):
1252
1273
event_record = get_first_record (event )
1253
1274
event_source_arn = event_record .get ("eventSourceARN" )
1254
1275
event_id = event_record .get ("eventID" )
1255
- stream_name = event_source_arn .split (":" )[- 1 ]
1276
+ stream_name = re . sub ( r"^stream/" , "" , ( event_source_arn or "" ) .split (":" )[- 1 ])
1256
1277
shard_id = event_id .split (":" )[0 ]
1257
1278
service_name = determine_service_name (
1258
- service_mapping , stream_name , "lambda_kinesis" , "kinesis"
1279
+ service_mapping , stream_name , "lambda_kinesis" , stream_name , "kinesis"
1259
1280
)
1260
1281
kinesis = event_record .get ("kinesis" ) or {}
1261
1282
tags = {
1262
1283
"operation_name" : "aws.kinesis" ,
1263
1284
"resource_names" : stream_name ,
1285
+ "span.kind" : "server" ,
1264
1286
"streamname" : stream_name ,
1265
1287
"shardid" : shard_id ,
1266
1288
"event_source_arn" : event_source_arn ,
@@ -1287,12 +1309,13 @@ def create_inferred_span_from_dynamodb_event(event, context):
1287
1309
event_source_arn = event_record .get ("eventSourceARN" )
1288
1310
table_name = event_source_arn .split ("/" )[1 ]
1289
1311
service_name = determine_service_name (
1290
- service_mapping , table_name , "lambda_dynamodb" , "dynamodb"
1312
+ service_mapping , table_name , "lambda_dynamodb" , table_name , "dynamodb"
1291
1313
)
1292
1314
dynamodb_message = event_record .get ("dynamodb" ) or {}
1293
1315
tags = {
1294
1316
"operation_name" : "aws.dynamodb" ,
1295
1317
"resource_names" : table_name ,
1318
+ "span.kind" : "server" ,
1296
1319
"tablename" : table_name ,
1297
1320
"event_source_arn" : event_source_arn ,
1298
1321
"event_id" : event_record .get ("eventID" ),
@@ -1321,11 +1344,12 @@ def create_inferred_span_from_s3_event(event, context):
1321
1344
obj = s3 .get ("object" ) or {}
1322
1345
bucket_name = bucket .get ("name" )
1323
1346
service_name = determine_service_name (
1324
- service_mapping , bucket_name , "lambda_s3" , "s3"
1347
+ service_mapping , bucket_name , "lambda_s3" , bucket_name , "s3"
1325
1348
)
1326
1349
tags = {
1327
1350
"operation_name" : "aws.s3" ,
1328
1351
"resource_names" : bucket_name ,
1352
+ "span.kind" : "server" ,
1329
1353
"event_name" : event_record .get ("eventName" ),
1330
1354
"bucketname" : bucket_name ,
1331
1355
"bucket_arn" : bucket .get ("arn" ),
@@ -1351,11 +1375,12 @@ def create_inferred_span_from_s3_event(event, context):
1351
1375
def create_inferred_span_from_eventbridge_event (event , context ):
1352
1376
source = event .get ("source" )
1353
1377
service_name = determine_service_name (
1354
- service_mapping , source , "lambda_eventbridge" , "eventbridge"
1378
+ service_mapping , source , "lambda_eventbridge" , source , "eventbridge"
1355
1379
)
1356
1380
tags = {
1357
1381
"operation_name" : "aws.eventbridge" ,
1358
1382
"resource_names" : source ,
1383
+ "span.kind" : "server" ,
1359
1384
"detail_type" : event .get ("detail-type" ),
1360
1385
}
1361
1386
InferredSpanInfo .set_tags (
@@ -1429,9 +1454,21 @@ def create_function_execution_span(
1429
1454
tags ["_dd.parent_source" ] = trace_context_source
1430
1455
tags .update (trigger_tags )
1431
1456
tracer .set_tags (_dd_origin )
1457
+ # Determine service name based on config and env var
1458
+ if config .service :
1459
+ service_name = config .service
1460
+ else :
1461
+ aws_service_representation = os .environ .get (
1462
+ "DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED" , ""
1463
+ ).lower ()
1464
+ if aws_service_representation in ("false" , "0" ):
1465
+ service_name = "aws.lambda"
1466
+ else :
1467
+ service_name = function_name if function_name else "aws.lambda"
1468
+
1432
1469
span = tracer .trace (
1433
1470
"aws.lambda" ,
1434
- service = "aws.lambda" ,
1471
+ service = service_name ,
1435
1472
resource = function_name ,
1436
1473
span_type = "serverless" ,
1437
1474
)
0 commit comments