|
3 | 3 |
|
4 | 4 | # pylint: disable=too-many-lines
|
5 | 5 |
|
| 6 | +import os |
6 | 7 | from typing import Dict, List, Optional
|
7 | 8 | from unittest import TestCase
|
8 | 9 | from unittest.mock import MagicMock
|
|
12 | 13 | AWS_BEDROCK_DATA_SOURCE_ID,
|
13 | 14 | AWS_BEDROCK_GUARDRAIL_ID,
|
14 | 15 | AWS_BEDROCK_KNOWLEDGE_BASE_ID,
|
| 16 | + AWS_CLOUDFORMATION_PRIMARY_IDENTIFIER, |
15 | 17 | AWS_CONSUMER_PARENT_SPAN_KIND,
|
16 | 18 | AWS_KINESIS_STREAM_NAME,
|
| 19 | + AWS_LAMBDA_FUNCTION_ARN, |
| 20 | + AWS_LAMBDA_FUNCTION_NAME, |
17 | 21 | AWS_LAMBDA_RESOURCEMAPPING_ID,
|
18 | 22 | AWS_LOCAL_OPERATION,
|
19 | 23 | AWS_LOCAL_SERVICE,
|
20 | 24 | AWS_REMOTE_DB_USER,
|
| 25 | + AWS_REMOTE_ENVIRONMENT, |
21 | 26 | AWS_REMOTE_OPERATION,
|
22 | 27 | AWS_REMOTE_RESOURCE_IDENTIFIER,
|
23 | 28 | AWS_REMOTE_RESOURCE_TYPE,
|
@@ -1152,6 +1157,78 @@ def test_sdk_client_span_with_remote_resource_attributes(self):
|
1152 | 1157 | self._validate_remote_resource_attributes("AWS::Lambda::EventSourceMapping", "aws_event_source_mapping_id")
|
1153 | 1158 | self._mock_attribute([AWS_LAMBDA_RESOURCEMAPPING_ID], [None])
|
1154 | 1159 |
|
| 1160 | + # Test AWS Lambda Invoke scenario with default lambda remote environment |
| 1161 | + self.span_mock.kind = SpanKind.CLIENT |
| 1162 | + self._mock_attribute( |
| 1163 | + [AWS_LAMBDA_FUNCTION_NAME, SpanAttributes.RPC_METHOD], |
| 1164 | + ["test_downstream_lambda1", "Invoke"], |
| 1165 | + keys, |
| 1166 | + values, |
| 1167 | + ) |
| 1168 | + dependency_attributes = _GENERATOR.generate_metric_attributes_dict_from_span(self.span_mock, self.resource).get( |
| 1169 | + DEPENDENCY_METRIC |
| 1170 | + ) |
| 1171 | + self.assertEqual(dependency_attributes.get(AWS_REMOTE_SERVICE), "test_downstream_lambda1") |
| 1172 | + self.assertEqual(dependency_attributes.get(AWS_REMOTE_ENVIRONMENT), "lambda:default") |
| 1173 | + self.assertNotIn(AWS_REMOTE_RESOURCE_TYPE, dependency_attributes) |
| 1174 | + self.assertNotIn(AWS_REMOTE_RESOURCE_IDENTIFIER, dependency_attributes) |
| 1175 | + self.assertNotIn(AWS_CLOUDFORMATION_PRIMARY_IDENTIFIER, dependency_attributes) |
| 1176 | + self._mock_attribute([AWS_LAMBDA_FUNCTION_NAME, SpanAttributes.RPC_METHOD], [None, None]) |
| 1177 | + |
| 1178 | + # Test AWS Lambda Invoke scenario with user-configured lambda remote environment |
| 1179 | + os.environ["LAMBDA_APPLICATION_SIGNALS_REMOTE_ENVIRONMENT"] = "test" |
| 1180 | + self.span_mock.kind = SpanKind.CLIENT |
| 1181 | + self._mock_attribute( |
| 1182 | + [AWS_LAMBDA_FUNCTION_NAME, SpanAttributes.RPC_METHOD], |
| 1183 | + ["testLambdaFunction", "Invoke"], |
| 1184 | + keys, |
| 1185 | + values, |
| 1186 | + ) |
| 1187 | + dependency_attributes = _GENERATOR.generate_metric_attributes_dict_from_span(self.span_mock, self.resource).get( |
| 1188 | + DEPENDENCY_METRIC |
| 1189 | + ) |
| 1190 | + self.assertEqual(dependency_attributes.get(AWS_REMOTE_SERVICE), "testLambdaFunction") |
| 1191 | + self.assertEqual(dependency_attributes.get(AWS_REMOTE_ENVIRONMENT), "lambda:test") |
| 1192 | + self.assertNotIn(AWS_REMOTE_RESOURCE_TYPE, dependency_attributes) |
| 1193 | + self.assertNotIn(AWS_REMOTE_RESOURCE_IDENTIFIER, dependency_attributes) |
| 1194 | + self.assertNotIn(AWS_CLOUDFORMATION_PRIMARY_IDENTIFIER, dependency_attributes) |
| 1195 | + self._mock_attribute([AWS_LAMBDA_FUNCTION_NAME, SpanAttributes.RPC_METHOD], [None, None]) |
| 1196 | + os.environ.pop("LAMBDA_APPLICATION_SIGNALS_REMOTE_ENVIRONMENT", None) |
| 1197 | + |
| 1198 | + # Test AWS Lambda Invoke scenario with user-configured lambda remote service |
| 1199 | + os.environ["LAMBDA_APPLICATION_SIGNALS_REMOTE_SERVICE"] = "test_downstream_lambda2" |
| 1200 | + self.span_mock.kind = SpanKind.CLIENT |
| 1201 | + self._mock_attribute( |
| 1202 | + [AWS_LAMBDA_FUNCTION_NAME, SpanAttributes.RPC_METHOD], |
| 1203 | + ["testLambdaFunction", "Invoke"], |
| 1204 | + keys, |
| 1205 | + values, |
| 1206 | + ) |
| 1207 | + dependency_attributes = _GENERATOR.generate_metric_attributes_dict_from_span(self.span_mock, self.resource).get( |
| 1208 | + DEPENDENCY_METRIC |
| 1209 | + ) |
| 1210 | + self.assertEqual(dependency_attributes.get(AWS_REMOTE_SERVICE), "test_downstream_lambda2") |
| 1211 | + self.assertEqual(dependency_attributes.get(AWS_REMOTE_ENVIRONMENT), "lambda:default") |
| 1212 | + self.assertNotIn(AWS_REMOTE_RESOURCE_TYPE, dependency_attributes) |
| 1213 | + self.assertNotIn(AWS_REMOTE_RESOURCE_IDENTIFIER, dependency_attributes) |
| 1214 | + self.assertNotIn(AWS_CLOUDFORMATION_PRIMARY_IDENTIFIER, dependency_attributes) |
| 1215 | + self._mock_attribute([AWS_LAMBDA_FUNCTION_NAME, SpanAttributes.RPC_METHOD], [None, None]) |
| 1216 | + os.environ.pop("LAMBDA_APPLICATION_SIGNALS_REMOTE_SERVICE", None) |
| 1217 | + |
| 1218 | + # Test AWS Lambda non-Invoke scenario |
| 1219 | + self.span_mock.kind = SpanKind.CLIENT |
| 1220 | + lambda_arn = "arn:aws:lambda:us-east-1:123456789012:function:testLambda" |
| 1221 | + self._mock_attribute( |
| 1222 | + [AWS_LAMBDA_FUNCTION_NAME, AWS_LAMBDA_FUNCTION_ARN, SpanAttributes.RPC_METHOD], |
| 1223 | + ["testLambdaFunction", lambda_arn, "GetFunction"], |
| 1224 | + keys, |
| 1225 | + values, |
| 1226 | + ) |
| 1227 | + self._validate_remote_resource_attributes("AWS::Lambda::Function", "testLambdaFunction") |
| 1228 | + self._mock_attribute( |
| 1229 | + [AWS_LAMBDA_FUNCTION_NAME, AWS_LAMBDA_FUNCTION_ARN, SpanAttributes.RPC_METHOD], [None, None, None] |
| 1230 | + ) |
| 1231 | + |
1155 | 1232 | self._mock_attribute([SpanAttributes.RPC_SYSTEM], [None])
|
1156 | 1233 |
|
1157 | 1234 | def test_client_db_span_with_remote_resource_attributes(self):
|
|
0 commit comments