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"]