diff --git a/moto/core/responses.py b/moto/core/responses.py index 73f2b37c2..54b575912 100644 --- a/moto/core/responses.py +++ b/moto/core/responses.py @@ -343,8 +343,6 @@ class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin): if hasattr(self.body, "read"): self.body = self.body.read() - raw_body = self.body - # https://github.com/getmoto/moto/issues/6692 # Content coming from SDK's can be GZipped for performance reasons if ( @@ -379,7 +377,7 @@ class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin): OrderedDict( (key, [value]) for key, value in parse_qsl( - raw_body, keep_blank_values=True + self.body, keep_blank_values=True ) ) ) diff --git a/tests/test_cloudwatch/test_cloudwatch_boto3.py b/tests/test_cloudwatch/test_cloudwatch_boto3.py index a5d881ac5..7de4cb844 100644 --- a/tests/test_cloudwatch/test_cloudwatch_boto3.py +++ b/tests/test_cloudwatch/test_cloudwatch_boto3.py @@ -2,6 +2,7 @@ import copy from datetime import datetime, timedelta, timezone from decimal import Decimal from operator import itemgetter +from unittest import SkipTest from uuid import uuid4 import boto3 @@ -10,7 +11,7 @@ from botocore.exceptions import ClientError from dateutil.tz import tzutc from freezegun import freeze_time -from moto import mock_aws +from moto import mock_aws, settings from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID from moto.core.utils import utcnow @@ -27,6 +28,43 @@ def test_put_metric_data_no_dimensions(): assert {"Namespace": "tester", "MetricName": "metric", "Dimensions": []} in metrics +@mock_aws +def test_put_a_ton_of_metric_data(): + """ + A sufficiently large call with metric data triggers request compression + Moto should decompress the request if this is the case, and the request should succeed + """ + if not settings.TEST_DECORATOR_MODE: + raise SkipTest("Can't test large requests in ServerMode") + cloudwatch = boto3.client("cloudwatch", "us-east-1") + + metrics = [] + metric_dimensions = [{"Name": "Environment", "Value": "env1"}] + metric_args = {"Unit": "Seconds", "MetricName": "TestCWMetrics"} + + for type, licences in { + k: v + for k, v in { + "userTypes": [{"id": f"UserType{x}"} for x in range(0, 50)] + }.items() + if k in ["userTypes", "appBundles", "apps", "extensions", "portalCapabilities"] + }.items(): + for licence in licences: + metrics.append( + { + **metric_args, + "Dimensions": [ + *metric_dimensions, + {"Name": "Type", "Value": f"{type}/{licence['id']}"}, + ], + "Value": 1, + } + ) + + cloudwatch.put_metric_data(Namespace="acme", MetricData=metrics) + # We don't really need any assertions - we just need to know that the call succeeds + + @mock_aws def test_put_metric_data_can_not_have_nan(): client = boto3.client("cloudwatch", region_name="us-west-2")