|
16 | 16 | import json
|
17 | 17 | import sys
|
18 | 18 | import zipfile
|
| 19 | +from typing import Final |
19 | 20 | from unittest import mock
|
20 | 21 |
|
21 | 22 | import botocore.session
|
|
27 | 28 | _LambdaExtension,
|
28 | 29 | )
|
29 | 30 | from opentelemetry.propagate import get_global_textmap, set_global_textmap
|
| 31 | +from opentelemetry.semconv._incubating.attributes.aws_attributes import ( |
| 32 | + AWS_LAMBDA_RESOURCE_MAPPING_ID, |
| 33 | +) |
30 | 34 | from opentelemetry.semconv.trace import SpanAttributes
|
31 | 35 | from opentelemetry.test.mock_textmap import MockTextMapPropagator
|
32 | 36 | from opentelemetry.test.test_base import TestBase
|
33 | 37 | from opentelemetry.trace.span import Span
|
34 | 38 |
|
| 39 | +AWS_LAMBDA_FUNCTION_ARN: Final = "aws.lambda.function.arn" |
| 40 | +AWS_LAMBDA_FUNCTION_NAME: Final = "aws.lambda.function.name" |
| 41 | + |
35 | 42 |
|
36 | 43 | def get_as_zip_file(file_name, content):
|
37 | 44 | zip_output = io.BytesIO()
|
@@ -126,6 +133,18 @@ def _create_lambda_function(self, function_name: str, function_code: str):
|
126 | 133 | Publish=True,
|
127 | 134 | )
|
128 | 135 |
|
| 136 | + def _create_sqs_queue_and_get_arn(self) -> str: |
| 137 | + """Helper method to create SQS queue and return ARN""" |
| 138 | + session = botocore.session.get_session() |
| 139 | + session.set_credentials( |
| 140 | + access_key="access-key", secret_key="secret-key" |
| 141 | + ) |
| 142 | + sqs_client = session.create_client("sqs", region_name=self.region) |
| 143 | + sqs_client.create_queue( |
| 144 | + QueueName="MyTestQueue.fifo", Attributes={"FifoQueue": "true"} |
| 145 | + ) |
| 146 | + return f"arn:aws:sqs:{self.region}:123456789012:MyTestQueue.fifo" |
| 147 | + |
129 | 148 | @mark.skip(reason="Docker error, unblocking builds for now.")
|
130 | 149 | @mark.skipif(
|
131 | 150 | sys.platform == "win32",
|
@@ -185,3 +204,91 @@ def test_invoke_parse_arn(self):
|
185 | 204 | self.assertEqual(
|
186 | 205 | function_name, attributes[SpanAttributes.FAAS_INVOKED_NAME]
|
187 | 206 | )
|
| 207 | + |
| 208 | + @mock_aws |
| 209 | + def test_get_function(self): |
| 210 | + function_name = "lambda-function-name-foo" |
| 211 | + self._create_lambda_function( |
| 212 | + function_name, return_headers_lambda_str() |
| 213 | + ) |
| 214 | + |
| 215 | + self.memory_exporter.clear() |
| 216 | + self.client.get_function(FunctionName=function_name) |
| 217 | + spans = self.memory_exporter.get_finished_spans() |
| 218 | + self.assertEqual(1, len(spans)) |
| 219 | + span = spans[0] |
| 220 | + self.assertEqual( |
| 221 | + "GetFunction", span.attributes[SpanAttributes.RPC_METHOD] |
| 222 | + ) |
| 223 | + self.assertEqual( |
| 224 | + "lambda-function-name-foo", |
| 225 | + span.attributes[AWS_LAMBDA_FUNCTION_NAME], |
| 226 | + ) |
| 227 | + |
| 228 | + function_arn = span.attributes.get(AWS_LAMBDA_FUNCTION_ARN) |
| 229 | + self.assertIsNotNone(function_arn) |
| 230 | + self.assertIn("lambda-function-name-foo", function_arn) |
| 231 | + |
| 232 | + @mock_aws |
| 233 | + def test_create_event_source_mapping(self): |
| 234 | + function_name = "MyLambdaFnFoo" |
| 235 | + self._create_lambda_function( |
| 236 | + function_name, return_headers_lambda_str() |
| 237 | + ) |
| 238 | + |
| 239 | + queue_arn = self._create_sqs_queue_and_get_arn() |
| 240 | + self.memory_exporter.clear() |
| 241 | + response = self.client.create_event_source_mapping( |
| 242 | + EventSourceArn=queue_arn, FunctionName=function_name, BatchSize=10 |
| 243 | + ) |
| 244 | + expected_uuid = response["UUID"] |
| 245 | + self.assertIsNotNone(expected_uuid) |
| 246 | + self.assertTrue(expected_uuid) |
| 247 | + |
| 248 | + spans = self.memory_exporter.get_finished_spans() |
| 249 | + self.assertEqual(1, len(spans)) |
| 250 | + span = spans[0] |
| 251 | + self.assertEqual( |
| 252 | + "CreateEventSourceMapping", |
| 253 | + span.attributes[SpanAttributes.RPC_METHOD], |
| 254 | + ) |
| 255 | + self.assertEqual( |
| 256 | + "MyLambdaFnFoo", span.attributes[AWS_LAMBDA_FUNCTION_NAME] |
| 257 | + ) |
| 258 | + |
| 259 | + uuid = span.attributes.get(AWS_LAMBDA_RESOURCE_MAPPING_ID) |
| 260 | + self.assertIsNotNone(uuid) |
| 261 | + self.assertEqual(expected_uuid, uuid) |
| 262 | + |
| 263 | + @mock_aws |
| 264 | + def test_get_event_source_mapping(self): |
| 265 | + function_name = "MyLambdaFnBar" |
| 266 | + self._create_lambda_function( |
| 267 | + function_name, return_headers_lambda_str() |
| 268 | + ) |
| 269 | + |
| 270 | + queue_arn = self._create_sqs_queue_and_get_arn() |
| 271 | + |
| 272 | + # Create event source mapping first |
| 273 | + create_response = self.client.create_event_source_mapping( |
| 274 | + EventSourceArn=queue_arn, FunctionName=function_name, BatchSize=10 |
| 275 | + ) |
| 276 | + mapping_uuid = create_response["UUID"] |
| 277 | + |
| 278 | + self.memory_exporter.clear() |
| 279 | + response = self.client.get_event_source_mapping(UUID=mapping_uuid) |
| 280 | + expected_uuid = response["UUID"] |
| 281 | + self.assertIsNotNone(expected_uuid) |
| 282 | + self.assertTrue(expected_uuid) |
| 283 | + |
| 284 | + spans = self.memory_exporter.get_finished_spans() |
| 285 | + self.assertEqual(1, len(spans)) |
| 286 | + span = spans[0] |
| 287 | + self.assertEqual( |
| 288 | + "GetEventSourceMapping", |
| 289 | + span.attributes[SpanAttributes.RPC_METHOD], |
| 290 | + ) |
| 291 | + |
| 292 | + uuid = span.attributes.get(AWS_LAMBDA_RESOURCE_MAPPING_ID) |
| 293 | + self.assertIsNotNone(uuid) |
| 294 | + self.assertEqual(expected_uuid, uuid) |
0 commit comments