@@ -684,9 +684,36 @@ def create_inferred_span(
684
684
return None
685
685
686
686
687
+ def create_service_mapping (val ):
688
+ new_service_mapping = {}
689
+ for entry in val .split ("," ):
690
+ parts = entry .split (":" )
691
+ if len (parts ) == 2 :
692
+ key = parts [0 ].strip ()
693
+ value = parts [1 ].strip ()
694
+ if key != value and key and value :
695
+ new_service_mapping [key ] = value
696
+ return new_service_mapping
697
+
698
+
699
+ def determine_service_name (service_mapping , specific_key , generic_key , default_value ):
700
+ service_name = service_mapping .get (specific_key )
701
+ if service_name is None :
702
+ service_name = service_mapping .get (generic_key , default_value )
703
+ return service_name
704
+
705
+
706
+ service_mapping = {}
707
+ # Initialization code
708
+ service_mapping_str = os .getenv ("DD_SERVICE_MAPPING" , "" )
709
+ service_mapping = create_service_mapping (service_mapping_str )
710
+
711
+
687
712
def create_inferred_span_from_lambda_function_url_event (event , context ):
688
713
request_context = event .get ("requestContext" )
714
+ api_id = request_context .get ("apiId" )
689
715
domain = request_context .get ("domainName" )
716
+ service_name = determine_service_name (service_mapping , api_id , "lambda_url" , domain )
690
717
method = request_context .get ("http" , {}).get ("method" )
691
718
path = request_context .get ("http" , {}).get ("path" )
692
719
resource = "{0} {1}" .format (method , path )
@@ -700,7 +727,7 @@ def create_inferred_span_from_lambda_function_url_event(event, context):
700
727
}
701
728
request_time_epoch = request_context .get ("timeEpoch" )
702
729
args = {
703
- "service" : domain ,
730
+ "service" : service_name ,
704
731
"resource" : resource ,
705
732
"span_type" : "http" ,
706
733
}
@@ -789,13 +816,18 @@ def create_inferred_span_from_api_gateway_websocket_event(
789
816
request_context = event .get ("requestContext" )
790
817
domain = request_context .get ("domainName" )
791
818
endpoint = request_context .get ("routeKey" )
819
+ api_id = request_context .get ("apiId" )
820
+
821
+ service_name = determine_service_name (
822
+ service_mapping , api_id , "lambda_api_gateway" , domain
823
+ )
792
824
tags = {
793
825
"operation_name" : "aws.apigateway.websocket" ,
794
826
"http.url" : domain + endpoint ,
795
827
"endpoint" : endpoint ,
796
828
"resource_names" : endpoint ,
797
- "apiid" : request_context . get ( "apiId" ) ,
798
- "apiname" : request_context . get ( "apiId" ) ,
829
+ "apiid" : api_id ,
830
+ "apiname" : api_id ,
799
831
"stage" : request_context .get ("stage" ),
800
832
"request_id" : context .aws_request_id ,
801
833
"connection_id" : request_context .get ("connectionId" ),
@@ -808,7 +840,7 @@ def create_inferred_span_from_api_gateway_websocket_event(
808
840
else :
809
841
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "sync" )
810
842
args = {
811
- "service" : domain ,
843
+ "service" : service_name ,
812
844
"resource" : endpoint ,
813
845
"span_type" : "web" ,
814
846
}
@@ -837,6 +869,10 @@ def create_inferred_span_from_api_gateway_event(
837
869
):
838
870
request_context = event .get ("requestContext" )
839
871
domain = request_context .get ("domainName" , "" )
872
+ api_id = request_context .get ("apiId" )
873
+ service_name = determine_service_name (
874
+ service_mapping , api_id , "lambda_api_gateway" , domain
875
+ )
840
876
method = event .get ("httpMethod" )
841
877
path = event .get ("path" )
842
878
resource = "{0} {1}" .format (method , path )
@@ -846,8 +882,8 @@ def create_inferred_span_from_api_gateway_event(
846
882
"endpoint" : path ,
847
883
"http.method" : method ,
848
884
"resource_names" : resource ,
849
- "apiid" : request_context . get ( "apiId" ) ,
850
- "apiname" : request_context . get ( "apiId" ) ,
885
+ "apiid" : api_id ,
886
+ "apiname" : api_id ,
851
887
"stage" : request_context .get ("stage" ),
852
888
"request_id" : context .aws_request_id ,
853
889
}
@@ -857,7 +893,7 @@ def create_inferred_span_from_api_gateway_event(
857
893
else :
858
894
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "sync" )
859
895
args = {
860
- "service" : domain ,
896
+ "service" : service_name ,
861
897
"resource" : resource ,
862
898
"span_type" : "http" ,
863
899
}
@@ -887,6 +923,10 @@ def create_inferred_span_from_http_api_event(
887
923
):
888
924
request_context = event .get ("requestContext" )
889
925
domain = request_context .get ("domainName" )
926
+ api_id = request_context .get ("apiId" )
927
+ service_name = determine_service_name (
928
+ service_mapping , api_id , "lambda_api_gateway" , domain
929
+ )
890
930
method = request_context .get ("http" , {}).get ("method" )
891
931
path = event .get ("rawPath" )
892
932
resource = "{0} {1}" .format (method , path )
@@ -900,8 +940,8 @@ def create_inferred_span_from_http_api_event(
900
940
"http.user_agent" : request_context .get ("http" , {}).get ("userAgent" ),
901
941
"resource_names" : resource ,
902
942
"request_id" : context .aws_request_id ,
903
- "apiid" : request_context . get ( "apiId" ) ,
904
- "apiname" : request_context . get ( "apiId" ) ,
943
+ "apiid" : api_id ,
944
+ "apiname" : api_id ,
905
945
"stage" : request_context .get ("stage" ),
906
946
}
907
947
request_time_epoch_ms = int (request_context .get ("timeEpoch" ))
@@ -910,7 +950,7 @@ def create_inferred_span_from_http_api_event(
910
950
else :
911
951
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "sync" )
912
952
args = {
913
- "service" : domain ,
953
+ "service" : service_name ,
914
954
"resource" : resource ,
915
955
"span_type" : "http" ,
916
956
}
@@ -935,6 +975,9 @@ def create_inferred_span_from_sqs_event(event, context):
935
975
event_record = get_first_record (event )
936
976
event_source_arn = event_record .get ("eventSourceARN" )
937
977
queue_name = event_source_arn .split (":" )[- 1 ]
978
+ service_name = determine_service_name (
979
+ service_mapping , queue_name , "lambda_sqs" , "sqs"
980
+ )
938
981
tags = {
939
982
"operation_name" : "aws.sqs" ,
940
983
"resource_names" : queue_name ,
@@ -946,7 +989,7 @@ def create_inferred_span_from_sqs_event(event, context):
946
989
InferredSpanInfo .set_tags (tags , tag_source = "self" , synchronicity = "async" )
947
990
request_time_epoch = event_record .get ("attributes" , {}).get ("SentTimestamp" )
948
991
args = {
949
- "service" : "sqs" ,
992
+ "service" : service_name ,
950
993
"resource" : queue_name ,
951
994
"span_type" : "web" ,
952
995
}
@@ -989,6 +1032,9 @@ def create_inferred_span_from_sns_event(event, context):
989
1032
sns_message = event_record .get ("Sns" )
990
1033
topic_arn = event_record .get ("Sns" , {}).get ("TopicArn" )
991
1034
topic_name = topic_arn .split (":" )[- 1 ]
1035
+ service_name = determine_service_name (
1036
+ service_mapping , topic_name , "lambda_sns" , "sns"
1037
+ )
992
1038
tags = {
993
1039
"operation_name" : "aws.sns" ,
994
1040
"resource_names" : topic_name ,
@@ -1008,7 +1054,7 @@ def create_inferred_span_from_sns_event(event, context):
1008
1054
dt = datetime .strptime (timestamp , sns_dt_format )
1009
1055
1010
1056
args = {
1011
- "service" : "sns" ,
1057
+ "service" : service_name ,
1012
1058
"resource" : topic_name ,
1013
1059
"span_type" : "web" ,
1014
1060
}
@@ -1026,6 +1072,9 @@ def create_inferred_span_from_kinesis_event(event, context):
1026
1072
event_id = event_record .get ("eventID" )
1027
1073
stream_name = event_source_arn .split (":" )[- 1 ]
1028
1074
shard_id = event_id .split (":" )[0 ]
1075
+ service_name = determine_service_name (
1076
+ service_mapping , stream_name , "lambda_kinesis" , "kinesis"
1077
+ )
1029
1078
tags = {
1030
1079
"operation_name" : "aws.kinesis" ,
1031
1080
"resource_names" : stream_name ,
@@ -1043,7 +1092,7 @@ def create_inferred_span_from_kinesis_event(event, context):
1043
1092
)
1044
1093
1045
1094
args = {
1046
- "service" : "kinesis" ,
1095
+ "service" : service_name ,
1047
1096
"resource" : stream_name ,
1048
1097
"span_type" : "web" ,
1049
1098
}
@@ -1059,6 +1108,9 @@ def create_inferred_span_from_dynamodb_event(event, context):
1059
1108
event_record = get_first_record (event )
1060
1109
event_source_arn = event_record .get ("eventSourceARN" )
1061
1110
table_name = event_source_arn .split ("/" )[1 ]
1111
+ service_name = determine_service_name (
1112
+ service_mapping , table_name , "lambda_dynamodb" , "dynamodb"
1113
+ )
1062
1114
dynamodb_message = event_record .get ("dynamodb" )
1063
1115
tags = {
1064
1116
"operation_name" : "aws.dynamodb" ,
@@ -1076,7 +1128,7 @@ def create_inferred_span_from_dynamodb_event(event, context):
1076
1128
"ApproximateCreationDateTime"
1077
1129
)
1078
1130
args = {
1079
- "service" : "dynamodb" ,
1131
+ "service" : service_name ,
1080
1132
"resource" : table_name ,
1081
1133
"span_type" : "web" ,
1082
1134
}
@@ -1092,6 +1144,9 @@ def create_inferred_span_from_dynamodb_event(event, context):
1092
1144
def create_inferred_span_from_s3_event (event , context ):
1093
1145
event_record = get_first_record (event )
1094
1146
bucket_name = event_record .get ("s3" , {}).get ("bucket" , {}).get ("name" )
1147
+ service_name = determine_service_name (
1148
+ service_mapping , bucket_name , "lambda_s3" , "s3"
1149
+ )
1095
1150
tags = {
1096
1151
"operation_name" : "aws.s3" ,
1097
1152
"resource_names" : bucket_name ,
@@ -1108,7 +1163,7 @@ def create_inferred_span_from_s3_event(event, context):
1108
1163
dt = datetime .strptime (timestamp , dt_format )
1109
1164
1110
1165
args = {
1111
- "service" : "s3" ,
1166
+ "service" : service_name ,
1112
1167
"resource" : bucket_name ,
1113
1168
"span_type" : "web" ,
1114
1169
}
@@ -1122,6 +1177,9 @@ def create_inferred_span_from_s3_event(event, context):
1122
1177
1123
1178
def create_inferred_span_from_eventbridge_event (event , context ):
1124
1179
source = event .get ("source" )
1180
+ service_name = determine_service_name (
1181
+ service_mapping , source , "lambda_eventbridge" , "eventbridge"
1182
+ )
1125
1183
tags = {
1126
1184
"operation_name" : "aws.eventbridge" ,
1127
1185
"resource_names" : source ,
@@ -1137,7 +1195,7 @@ def create_inferred_span_from_eventbridge_event(event, context):
1137
1195
dt = datetime .strptime (timestamp , dt_format )
1138
1196
1139
1197
args = {
1140
- "service" : "eventbridge" ,
1198
+ "service" : service_name ,
1141
1199
"resource" : source ,
1142
1200
"span_type" : "web" ,
1143
1201
}
0 commit comments