def test_generate_enhanced_lambda_metrics_once_with_missing_arn( self, mock_build_cache ): mock_build_cache.return_value = {} tags_cache = LambdaTagsCache() logs_input = { "message": "REPORT RequestId: fe1467d6-1458-4e20-8e40-9aaa4be7a0f4\tDuration: 3470.65 ms\tBilled Duration: 3500 ms\tMemory Size: 128 MB\tMax Memory Used: 89 MB\t\nXRAY TraceId: 1-5d8bba5a-dc2932496a65bab91d2d42d4\tSegmentId: 5ff79d2a06b82ad6\tSampled: true\t\n", "aws": { "awslogs": { "logGroup": "/aws/lambda/post-coupon-prod-us", "logStream": "2019/09/25/[$LATEST]d6c10ebbd9cb48dba94a7d9b874b49bb", "owner": "172597598159", }, "function_version": "$LATEST", "invoked_function_arn": "arn:aws:lambda:us-east-1:172597598159:function:collect_logs_datadog_demo", }, "lambda": { "arn": "arn:aws:lambda:us-east-1:172597598159:function:post-coupon-prod-us" }, "timestamp": 10000, } os.environ["DD_FETCH_LAMBDA_TAGS"] = "True" generated_metrics = generate_enhanced_lambda_metrics(logs_input, tags_cache) mock_build_cache.assert_called_once() mock_build_cache.reset_mock() generated_metrics = generate_enhanced_lambda_metrics(logs_input, tags_cache) mock_build_cache.assert_not_called() del os.environ["DD_FETCH_LAMBDA_TAGS"]
def test_generate_enhanced_lambda_metrics_refresh_s3_cache( self, mock_get_s3_cache, mock_forward_metrics, mock_build_cache, mock_write_cache, mock_acquire_lock, mock_release_lock, ): mock_acquire_lock.return_value = True mock_get_s3_cache.return_value = ( {}, 1000, ) mock_build_cache.return_value = ( True, { "arn:aws:lambda:us-east-1:172597598159:function:post-coupon-prod-us": [ "team:metrics", "monitor:datadog", "env:prod", "creator:swf", ] }, ) tags_cache = LambdaTagsCache() logs_input = { "message": "REPORT RequestId: fe1467d6-1458-4e20-8e40-9aaa4be7a0f4\tDuration: 3470.65 ms\tBilled Duration: 3500 ms\tMemory Size: 128 MB\tMax Memory Used: 89 MB\t\nXRAY TraceId: 1-5d8bba5a-dc2932496a65bab91d2d42d4\tSegmentId: 5ff79d2a06b82ad6\tSampled: true\t\n", "aws": { "awslogs": { "logGroup": "/aws/lambda/post-coupon-prod-us", "logStream": "2019/09/25/[$LATEST]d6c10ebbd9cb48dba94a7d9b874b49bb", "owner": "172597598159", }, "function_version": "$LATEST", "invoked_function_arn": "arn:aws:lambda:us-east-1:172597598159:function:collect_logs_datadog_demo", }, "lambda": { "arn": "arn:aws:lambda:us-east-1:172597598159:function:post-coupon-prod-us" }, "timestamp": 10000, } os.environ["DD_FETCH_LAMBDA_TAGS"] = "True" generate_enhanced_lambda_metrics(logs_input, tags_cache) mock_get_s3_cache.assert_called_once() mock_build_cache.assert_called_once() mock_write_cache.assert_called_once() mock_get_s3_cache.reset_mock() assert mock_forward_metrics.call_count == 2 del os.environ["DD_FETCH_LAMBDA_TAGS"]
def test_generate_enhanced_lambda_metrics_client_error( self, mock_get_s3_cache, mock_forward_metrics, mock_parse_responses, mock_write_cache, mock_boto3, mock_acquire_lock, mock_release_lock, ): mock_acquire_lock.return_value = True mock_get_s3_cache.return_value = ( {}, 1000, ) paginator = mock.MagicMock() paginator.paginate.return_value = ["foo"] mock_boto3.get_paginator.return_value = paginator mock_parse_responses.side_effect = ClientError( {"ResponseMetadata": { "HTTPStatusCode": 429 }}, "Client Error") tags_cache = LambdaTagsCache() logs_input = { "message": "REPORT RequestId: fe1467d6-1458-4e20-8e40-9aaa4be7a0f4\tDuration: 3470.65 ms\tBilled Duration: 3500 ms\tMemory Size: 128 MB\tMax Memory Used: 89 MB\t\nXRAY TraceId: 1-5d8bba5a-dc2932496a65bab91d2d42d4\tSegmentId: 5ff79d2a06b82ad6\tSampled: true\t\n", "aws": { "awslogs": { "logGroup": "/aws/lambda/post-coupon-prod-us", "logStream": "2019/09/25/[$LATEST]d6c10ebbd9cb48dba94a7d9b874b49bb", "owner": "172597598159", }, "function_version": "$LATEST", "invoked_function_arn": "arn:aws:lambda:us-east-1:172597598159:function:collect_logs_datadog_demo", }, "lambda": { "arn": "arn:aws:lambda:us-east-1:172597598159:function:post-coupon-prod-us" }, "timestamp": 10000, } os.environ["DD_FETCH_LAMBDA_TAGS"] = "True" generate_enhanced_lambda_metrics(logs_input, tags_cache) mock_get_s3_cache.assert_called_once() mock_boto3.get_paginator.assert_called_once() paginator.paginate.assert_called_once() mock_get_s3_cache.reset_mock() print(mock_forward_metrics.call_count) assert mock_forward_metrics.call_count == 4 del os.environ["DD_FETCH_LAMBDA_TAGS"]
def test_generate_enhanced_lambda_metrics_out_of_memory( self, mock_build_cache): mock_build_cache.return_value = { "arn:aws:lambda:us-east-1:0:function:cloudwatch-event": [ "team:metrics", "monitor:datadog", "env:prod", "creator:swf", ] } tags_cache = LambdaTagsCache() logs_input = { "message": "2020-06-09T15:02:26.150Z 7c9567b5-107b-4a6c-8798-0157ac21db52 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory\n\n", "aws": { "awslogs": { "logGroup": "/aws/lambda/cloudwatch-event", "logStream": "2020/06/09/[$LATEST]b249865adaaf4fad80f95f8ad09725b8", "owner": "601427279990", }, "function_version": "$LATEST", "invoked_function_arn": "arn:aws:lambda:us-east-1:0:function:test", }, "lambda": { "arn": "arn:aws:lambda:us-east-1:0:function:cloudwatch-event" }, "timestamp": 1591714946151, } os.environ["DD_FETCH_LAMBDA_TAGS"] = "True" generated_metrics = generate_enhanced_lambda_metrics( logs_input, tags_cache) self.assertEqual( [metric.__dict__ for metric in generated_metrics], [{ "name": "aws.lambda.enhanced.out_of_memory", "tags": [ "region:us-east-1", "account_id:0", "aws_account:0", "functionname:cloudwatch-event", "team:metrics", "monitor:datadog", "env:prod", "creator:swf", ], "timestamp": 1591714946151, "value": 1.0, }], ) del os.environ["DD_FETCH_LAMBDA_TAGS"]
def test_generate_enhanced_lambda_metrics_timeout(self, mock_get_s3_cache, mock_forward_metrics): mock_get_s3_cache.return_value = ( { "arn:aws:lambda:us-east-1:0:function:cloudwatch-event": [ "team:metrics", "monitor:datadog", "env:prod", "creator:swf", ] }, time(), ) tags_cache = LambdaTagsCache() logs_input = { "message": "2020-06-09T15:02:26.150Z 7c9567b5-107b-4a6c-8798-0157ac21db52 Task timed out after 3.00 seconds\n\n", "aws": { "awslogs": { "logGroup": "/aws/lambda/cloudwatch-event", "logStream": "2020/06/09/[$LATEST]b249865adaaf4fad80f95f8ad09725b8", "owner": "601427279990", }, "function_version": "$LATEST", "invoked_function_arn": "arn:aws:lambda:us-east-1:0:function:test", }, "lambda": { "arn": "arn:aws:lambda:us-east-1:0:function:cloudwatch-event" }, "timestamp": 1591714946151, } os.environ["DD_FETCH_LAMBDA_TAGS"] = "True" generated_metrics = generate_enhanced_lambda_metrics( logs_input, tags_cache) self.assertEqual( [metric.__dict__ for metric in generated_metrics], [{ "name": "aws.lambda.enhanced.timeouts", "tags": [ "region:us-east-1", "account_id:0", "aws_account:0", "functionname:cloudwatch-event", "team:metrics", "monitor:datadog", "env:prod", "creator:swf", ], "timestamp": 1591714946151, "value": 1.0, }], ) del os.environ["DD_FETCH_LAMBDA_TAGS"]
def test_generate_enhanced_lambda_metrics_with_tags( self, mock_get_s3_cache, mock_forward_metrics): mock_get_s3_cache.return_value = ( { "arn:aws:lambda:us-east-1:172597598159:function:post-coupon-prod-us": [ "team:metrics", "monitor:datadog", "env:prod", "creator:swf", ] }, time(), ) tags_cache = LambdaTagsCache() logs_input = { "message": "REPORT RequestId: fe1467d6-1458-4e20-8e40-9aaa4be7a0f4\tDuration: 3470.65 ms\tBilled Duration: 3500 ms\tMemory Size: 128 MB\tMax Memory Used: 89 MB\t\nXRAY TraceId: 1-5d8bba5a-dc2932496a65bab91d2d42d4\tSegmentId: 5ff79d2a06b82ad6\tSampled: true\t\n", "aws": { "awslogs": { "logGroup": "/aws/lambda/post-coupon-prod-us", "logStream": "2019/09/25/[$LATEST]d6c10ebbd9cb48dba94a7d9b874b49bb", "owner": "172597598159", }, "function_version": "$LATEST", "invoked_function_arn": "arn:aws:lambda:us-east-1:172597598159:function:collect_logs_datadog_demo", }, "lambda": { "arn": "arn:aws:lambda:us-east-1:172597598159:function:post-coupon-prod-us" }, "timestamp": 10000, } os.environ["DD_FETCH_LAMBDA_TAGS"] = "True" generated_metrics = generate_enhanced_lambda_metrics( logs_input, tags_cache) self.assertEqual( [metric.__dict__ for metric in generated_metrics], [ { "name": "aws.lambda.enhanced.duration", "tags": [ "memorysize:128", "cold_start:false", "region:us-east-1", "account_id:172597598159", "aws_account:172597598159", "functionname:post-coupon-prod-us", "team:metrics", "monitor:datadog", "env:prod", "creator:swf", ], "timestamp": 10000, "value": 3.47065, }, { "name": "aws.lambda.enhanced.billed_duration", "tags": [ "memorysize:128", "cold_start:false", "region:us-east-1", "account_id:172597598159", "aws_account:172597598159", "functionname:post-coupon-prod-us", "team:metrics", "monitor:datadog", "env:prod", "creator:swf", ], "timestamp": 10000, "value": 3.5, }, { "name": "aws.lambda.enhanced.max_memory_used", "tags": [ "memorysize:128", "cold_start:false", "region:us-east-1", "account_id:172597598159", "aws_account:172597598159", "functionname:post-coupon-prod-us", "team:metrics", "monitor:datadog", "env:prod", "creator:swf", ], "timestamp": 10000, "value": 89.0, }, { "name": "aws.lambda.enhanced.estimated_cost", "tags": [ "memorysize:128", "cold_start:false", "region:us-east-1", "account_id:172597598159", "aws_account:172597598159", "functionname:post-coupon-prod-us", "team:metrics", "monitor:datadog", "env:prod", "creator:swf", ], "timestamp": 10000, "value": 0.00000749168125, }, ], ) del os.environ["DD_FETCH_LAMBDA_TAGS"]