prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Add support for high resolution metrics in CloudWatch
  Cloudwatch API supports high-resolution metrics, AWS CLI does not.
  
  https://aws.amazon.com/blogs/aws/new-high-resolution-custom-metrics-and-alarms-for-amazon-cloudwatch/
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `awscli/customizations/putmetricdata.py`
  Content:
  ```
  1 # Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
  2 #
  3 # Licensed under the Apache License, Version 2.0 (the "License"). You
  4 # may not use this file except in compliance with the License. A copy of
  5 # the License is located at
  6 #
  7 #     http://aws.amazon.com/apache2.0/
  8 #
  9 # or in the "license" file accompanying this file. This file is
  10 # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
  11 # ANY KIND, either express or implied. See the License for the specific
  12 # language governing permissions and limitations under the License.
  13 """
  14 This customization adds the following scalar parameters to the
  15 cloudwatch put-metric-data operation:
  16 
  17 * --metric-name
  18 * --dimensions
  19 * --timestamp
  20 * --value
  21 * --statistic-values
  22 * --unit
  23 
  24 """
  25 import decimal
  26 
  27 from awscli.arguments import CustomArgument
  28 from awscli.utils import split_on_commas
  29 from awscli.customizations.utils import validate_mutually_exclusive_handler
  30 
  31 
  32 def register_put_metric_data(event_handler):
  33     event_handler.register('building-argument-table.cloudwatch.put-metric-data',
  34                            _promote_args)
  35     event_handler.register(
  36         'operation-args-parsed.cloudwatch.put-metric-data',
  37         validate_mutually_exclusive_handler(
  38             ['metric_data'], ['metric_name', 'timestamp', 'unit', 'value',
  39                               'dimensions', 'statistic_values']))
  40 
  41 
  42 def _promote_args(argument_table, **kwargs):
  43     # We're providing top level params for metric-data.  This means
  44     # that metric-data is now longer a required arg.  We do need
  45     # to check that either metric-data or the complex args we've added
  46     # have been provided.
  47     argument_table['metric-data'].required = False
  48 
  49     argument_table['metric-name'] = PutMetricArgument(
  50         'metric-name', help_text='The name of the metric.')
  51     argument_table['timestamp'] = PutMetricArgument(
  52         'timestamp', help_text='The time stamp used for the metric.  '
  53                                'If not specified, the default value is '
  54                                'set to the time the metric data was '
  55                                'received.')
  56     argument_table['unit'] = PutMetricArgument(
  57         'unit', help_text='The unit of metric.')
  58     argument_table['value'] = PutMetricArgument(
  59         'value', help_text='The value for the metric.  Although the --value '
  60                            'parameter accepts numbers of type Double, '
  61                            'Amazon CloudWatch truncates values with very '
  62                            'large exponents.  Values with base-10 exponents '
  63                            'greater than 126 (1 x 10^126) are truncated.  '
  64                            'Likewise, values with base-10 exponents less '
  65                            'than -130 (1 x 10^-130) are also truncated.')
  66 
  67     argument_table['dimensions'] = PutMetricArgument(
  68         'dimensions', help_text=(
  69             'The --dimensions argument further expands '
  70             'on the identity of a metric using a Name=Value '
  71             'pair, separated by commas, for example: '
  72             '<code>--dimensions InstanceID=1-23456789 InstanceType=m1.small</code>. '
  73             'Note that the <code>--dimensions</code> argument has a different '
  74             'format when used in <code>get-metric-data</code>, where for the same example you would '
  75             'use the format <code>--dimensions Name=InstanceID,Value=i-aaba32d4 Name=InstanceType,value=m1.small </code>.'))
  76     argument_table['statistic-values'] = PutMetricArgument(
  77         'statistic-values', help_text='A set of statistical values describing '
  78                                       'the metric.')
  79 
  80 
  81 def insert_first_element(name):
  82     def _wrap_add_to_params(func):
  83         def _add_to_params(self, parameters, value):
  84             if value is None:
  85                 return
  86             if name not in parameters:
  87                 # We're taking a shortcut here and assuming that the first
  88                 # element is a struct type, hence the default value of
  89                 # a dict.  If this was going to be more general we'd need
  90                 # to have this paramterized, i.e. you pass in some sort of
  91                 # factory function that creates the initial starting value.
  92                 parameters[name] = [{}]
  93             first_element = parameters[name][0]
  94             return func(self, first_element, value)
  95         return _add_to_params
  96     return _wrap_add_to_params
  97 
  98 
  99 class PutMetricArgument(CustomArgument):
  100     def add_to_params(self, parameters, value):
  101         method_name = '_add_param_%s' % self.name.replace('-', '_')
  102         return getattr(self, method_name)(parameters, value)
  103 
  104     @insert_first_element('MetricData')
  105     def _add_param_metric_name(self, first_element, value):
  106         first_element['MetricName'] = value
  107 
  108     @insert_first_element('MetricData')
  109     def _add_param_unit(self, first_element, value):
  110         first_element['Unit'] = value
  111 
  112     @insert_first_element('MetricData')
  113     def _add_param_timestamp(self, first_element, value):
  114         first_element['Timestamp'] = value
  115 
  116     @insert_first_element('MetricData')
  117     def _add_param_value(self, first_element, value):
  118         # Use a Decimal to avoid loss in precision.
  119         first_element['Value'] = decimal.Decimal(value)
  120 
  121     @insert_first_element('MetricData')
  122     def _add_param_dimensions(self, first_element, value):
  123         # Dimensions needs a little more processing.  We support
  124         # the key=value,key2=value syntax so we need to parse
  125         # that.
  126         dimensions = []
  127         for pair in split_on_commas(value):
  128             key, value = pair.split('=')
  129             dimensions.append({'Name': key, 'Value': value})
  130         first_element['Dimensions'] = dimensions
  131 
  132     @insert_first_element('MetricData')
  133     def _add_param_statistic_values(self, first_element, value):
  134         # StatisticValues is a struct type so we are parsing
  135         # a csv keyval list into a dict.
  136         statistics = {}
  137         for pair in split_on_commas(value):
  138             key, value = pair.split('=')
  139             # There are four supported values: Maximum, Minimum, SampleCount,
  140             # and Sum.  All of them are documented as a type double so we can
  141             # convert these to a decimal value to preserve precision.
  142             statistics[key] = decimal.Decimal(value)
  143         first_element['StatisticValues'] = statistics
  144
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/awscli/customizations/putmetricdata.py b/awscli/customizations/putmetricdata.py
  --- a/awscli/customizations/putmetricdata.py
  +++ b/awscli/customizations/putmetricdata.py
  @@ -20,6 +20,7 @@
   * --value
   * --statistic-values
   * --unit
  +* --storage-resolution
   
   """
   import decimal
  @@ -30,8 +31,8 @@
   
   
   def register_put_metric_data(event_handler):
  -    event_handler.register('building-argument-table.cloudwatch.put-metric-data',
  -                           _promote_args)
  +    event_handler.register(
  +        'building-argument-table.cloudwatch.put-metric-data', _promote_args)
       event_handler.register(
           'operation-args-parsed.cloudwatch.put-metric-data',
           validate_mutually_exclusive_handler(
  @@ -39,7 +40,7 @@
                                 'dimensions', 'statistic_values']))
   
   
  -def _promote_args(argument_table, **kwargs):
  +def _promote_args(argument_table, operation_model, **kwargs):
       # We're providing top level params for metric-data.  This means
       # that metric-data is now longer a required arg.  We do need
       # to check that either metric-data or the complex args we've added
  @@ -69,14 +70,25 @@
               'The --dimensions argument further expands '
               'on the identity of a metric using a Name=Value '
               'pair, separated by commas, for example: '
  -            '<code>--dimensions InstanceID=1-23456789 InstanceType=m1.small</code>. '
  -            'Note that the <code>--dimensions</code> argument has a different '
  -            'format when used in <code>get-metric-data</code>, where for the same example you would '
  -            'use the format <code>--dimensions Name=InstanceID,Value=i-aaba32d4 Name=InstanceType,value=m1.small </code>.'))
  +            '<code>--dimensions InstanceID=1-23456789 '
  +            'InstanceType=m1.small</code>. Note that the '
  +            '<code>--dimensions</code> argument has a different format when '
  +            'used in <code>get-metric-data</code>, where for the same example '
  +            'you would use the format <code>--dimensions '
  +            'Name=InstanceID,Value=i-aaba32d4 '
  +            'Name=InstanceType,value=m1.small </code>.'
  +        )
  +    )
       argument_table['statistic-values'] = PutMetricArgument(
           'statistic-values', help_text='A set of statistical values describing '
                                         'the metric.')
   
  +    metric_data = operation_model.input_shape.members['MetricData'].member
  +    storage_resolution = metric_data.members['StorageResolution']
  +    argument_table['storage-resolution'] = PutMetricArgument(
  +        'storage-resolution', help_text=storage_resolution.documentation
  +    )
  +
   
   def insert_first_element(name):
       def _wrap_add_to_params(func):
  @@ -141,3 +153,7 @@
               # convert these to a decimal value to preserve precision.
               statistics[key] = decimal.Decimal(value)
           first_element['StatisticValues'] = statistics
  +
  +    @insert_first_element('MetricData')
  +    def _add_param_storage_resolution(self, first_element, value):
  +        first_element['StorageResolution'] = int(value)
  
verification_info: {"golden_diff": "diff --git a/awscli/customizations/putmetricdata.py b/awscli/customizations/putmetricdata.py\n--- a/awscli/customizations/putmetricdata.py\n+++ b/awscli/customizations/putmetricdata.py\n@@ -20,6 +20,7 @@\n * --value\n * --statistic-values\n * --unit\n+* --storage-resolution\n \n \"\"\"\n import decimal\n@@ -30,8 +31,8 @@\n \n \n def register_put_metric_data(event_handler):\n-    event_handler.register('building-argument-table.cloudwatch.put-metric-data',\n-                           _promote_args)\n+    event_handler.register(\n+        'building-argument-table.cloudwatch.put-metric-data', _promote_args)\n     event_handler.register(\n         'operation-args-parsed.cloudwatch.put-metric-data',\n         validate_mutually_exclusive_handler(\n@@ -39,7 +40,7 @@\n                               'dimensions', 'statistic_values']))\n \n \n-def _promote_args(argument_table, **kwargs):\n+def _promote_args(argument_table, operation_model, **kwargs):\n     # We're providing top level params for metric-data.  This means\n     # that metric-data is now longer a required arg.  We do need\n     # to check that either metric-data or the complex args we've added\n@@ -69,14 +70,25 @@\n             'The --dimensions argument further expands '\n             'on the identity of a metric using a Name=Value '\n             'pair, separated by commas, for example: '\n-            '<code>--dimensions InstanceID=1-23456789 InstanceType=m1.small</code>. '\n-            'Note that the <code>--dimensions</code> argument has a different '\n-            'format when used in <code>get-metric-data</code>, where for the same example you would '\n-            'use the format <code>--dimensions Name=InstanceID,Value=i-aaba32d4 Name=InstanceType,value=m1.small </code>.'))\n+            '<code>--dimensions InstanceID=1-23456789 '\n+            'InstanceType=m1.small</code>. Note that the '\n+            '<code>--dimensions</code> argument has a different format when '\n+            'used in <code>get-metric-data</code>, where for the same example '\n+            'you would use the format <code>--dimensions '\n+            'Name=InstanceID,Value=i-aaba32d4 '\n+            'Name=InstanceType,value=m1.small </code>.'\n+        )\n+    )\n     argument_table['statistic-values'] = PutMetricArgument(\n         'statistic-values', help_text='A set of statistical values describing '\n                                       'the metric.')\n \n+    metric_data = operation_model.input_shape.members['MetricData'].member\n+    storage_resolution = metric_data.members['StorageResolution']\n+    argument_table['storage-resolution'] = PutMetricArgument(\n+        'storage-resolution', help_text=storage_resolution.documentation\n+    )\n+\n \n def insert_first_element(name):\n     def _wrap_add_to_params(func):\n@@ -141,3 +153,7 @@\n             # convert these to a decimal value to preserve precision.\n             statistics[key] = decimal.Decimal(value)\n         first_element['StatisticValues'] = statistics\n+\n+    @insert_first_element('MetricData')\n+    def _add_param_storage_resolution(self, first_element, value):\n+        first_element['StorageResolution'] = int(value)\n", "issue": "Add support for high resolution metrics in CloudWatch\nCloudwatch API supports high-resolution metrics, AWS CLI does not.\r\n\r\nhttps://aws.amazon.com/blogs/aws/new-high-resolution-custom-metrics-and-alarms-for-amazon-cloudwatch/\n", "before_files": [{"content": "# Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"). You\n# may not use this file except in compliance with the License. A copy of\n# the License is located at\n#\n#     http://aws.amazon.com/apache2.0/\n#\n# or in the \"license\" file accompanying this file. This file is\n# distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n# ANY KIND, either express or implied. See the License for the specific\n# language governing permissions and limitations under the License.\n\"\"\"\nThis customization adds the following scalar parameters to the\ncloudwatch put-metric-data operation:\n\n* --metric-name\n* --dimensions\n* --timestamp\n* --value\n* --statistic-values\n* --unit\n\n\"\"\"\nimport decimal\n\nfrom awscli.arguments import CustomArgument\nfrom awscli.utils import split_on_commas\nfrom awscli.customizations.utils import validate_mutually_exclusive_handler\n\n\ndef register_put_metric_data(event_handler):\n    event_handler.register('building-argument-table.cloudwatch.put-metric-data',\n                           _promote_args)\n    event_handler.register(\n        'operation-args-parsed.cloudwatch.put-metric-data',\n        validate_mutually_exclusive_handler(\n            ['metric_data'], ['metric_name', 'timestamp', 'unit', 'value',\n                              'dimensions', 'statistic_values']))\n\n\ndef _promote_args(argument_table, **kwargs):\n    # We're providing top level params for metric-data.  This means\n    # that metric-data is now longer a required arg.  We do need\n    # to check that either metric-data or the complex args we've added\n    # have been provided.\n    argument_table['metric-data'].required = False\n\n    argument_table['metric-name'] = PutMetricArgument(\n        'metric-name', help_text='The name of the metric.')\n    argument_table['timestamp'] = PutMetricArgument(\n        'timestamp', help_text='The time stamp used for the metric.  '\n                               'If not specified, the default value is '\n                               'set to the time the metric data was '\n                               'received.')\n    argument_table['unit'] = PutMetricArgument(\n        'unit', help_text='The unit of metric.')\n    argument_table['value'] = PutMetricArgument(\n        'value', help_text='The value for the metric.  Although the --value '\n                           'parameter accepts numbers of type Double, '\n                           'Amazon CloudWatch truncates values with very '\n                           'large exponents.  Values with base-10 exponents '\n                           'greater than 126 (1 x 10^126) are truncated.  '\n                           'Likewise, values with base-10 exponents less '\n                           'than -130 (1 x 10^-130) are also truncated.')\n\n    argument_table['dimensions'] = PutMetricArgument(\n        'dimensions', help_text=(\n            'The --dimensions argument further expands '\n            'on the identity of a metric using a Name=Value '\n            'pair, separated by commas, for example: '\n            '<code>--dimensions InstanceID=1-23456789 InstanceType=m1.small</code>. '\n            'Note that the <code>--dimensions</code> argument has a different '\n            'format when used in <code>get-metric-data</code>, where for the same example you would '\n            'use the format <code>--dimensions Name=InstanceID,Value=i-aaba32d4 Name=InstanceType,value=m1.small </code>.'))\n    argument_table['statistic-values'] = PutMetricArgument(\n        'statistic-values', help_text='A set of statistical values describing '\n                                      'the metric.')\n\n\ndef insert_first_element(name):\n    def _wrap_add_to_params(func):\n        def _add_to_params(self, parameters, value):\n            if value is None:\n                return\n            if name not in parameters:\n                # We're taking a shortcut here and assuming that the first\n                # element is a struct type, hence the default value of\n                # a dict.  If this was going to be more general we'd need\n                # to have this paramterized, i.e. you pass in some sort of\n                # factory function that creates the initial starting value.\n                parameters[name] = [{}]\n            first_element = parameters[name][0]\n            return func(self, first_element, value)\n        return _add_to_params\n    return _wrap_add_to_params\n\n\nclass PutMetricArgument(CustomArgument):\n    def add_to_params(self, parameters, value):\n        method_name = '_add_param_%s' % self.name.replace('-', '_')\n        return getattr(self, method_name)(parameters, value)\n\n    @insert_first_element('MetricData')\n    def _add_param_metric_name(self, first_element, value):\n        first_element['MetricName'] = value\n\n    @insert_first_element('MetricData')\n    def _add_param_unit(self, first_element, value):\n        first_element['Unit'] = value\n\n    @insert_first_element('MetricData')\n    def _add_param_timestamp(self, first_element, value):\n        first_element['Timestamp'] = value\n\n    @insert_first_element('MetricData')\n    def _add_param_value(self, first_element, value):\n        # Use a Decimal to avoid loss in precision.\n        first_element['Value'] = decimal.Decimal(value)\n\n    @insert_first_element('MetricData')\n    def _add_param_dimensions(self, first_element, value):\n        # Dimensions needs a little more processing.  We support\n        # the key=value,key2=value syntax so we need to parse\n        # that.\n        dimensions = []\n        for pair in split_on_commas(value):\n            key, value = pair.split('=')\n            dimensions.append({'Name': key, 'Value': value})\n        first_element['Dimensions'] = dimensions\n\n    @insert_first_element('MetricData')\n    def _add_param_statistic_values(self, first_element, value):\n        # StatisticValues is a struct type so we are parsing\n        # a csv keyval list into a dict.\n        statistics = {}\n        for pair in split_on_commas(value):\n            key, value = pair.split('=')\n            # There are four supported values: Maximum, Minimum, SampleCount,\n            # and Sum.  All of them are documented as a type double so we can\n            # convert these to a decimal value to preserve precision.\n            statistics[key] = decimal.Decimal(value)\n        first_element['StatisticValues'] = statistics\n", "path": "awscli/customizations/putmetricdata.py"}], "after_files": [{"content": "# Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"). You\n# may not use this file except in compliance with the License. A copy of\n# the License is located at\n#\n#     http://aws.amazon.com/apache2.0/\n#\n# or in the \"license\" file accompanying this file. This file is\n# distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n# ANY KIND, either express or implied. See the License for the specific\n# language governing permissions and limitations under the License.\n\"\"\"\nThis customization adds the following scalar parameters to the\ncloudwatch put-metric-data operation:\n\n* --metric-name\n* --dimensions\n* --timestamp\n* --value\n* --statistic-values\n* --unit\n* --storage-resolution\n\n\"\"\"\nimport decimal\n\nfrom awscli.arguments import CustomArgument\nfrom awscli.utils import split_on_commas\nfrom awscli.customizations.utils import validate_mutually_exclusive_handler\n\n\ndef register_put_metric_data(event_handler):\n    event_handler.register(\n        'building-argument-table.cloudwatch.put-metric-data', _promote_args)\n    event_handler.register(\n        'operation-args-parsed.cloudwatch.put-metric-data',\n        validate_mutually_exclusive_handler(\n            ['metric_data'], ['metric_name', 'timestamp', 'unit', 'value',\n                              'dimensions', 'statistic_values']))\n\n\ndef _promote_args(argument_table, operation_model, **kwargs):\n    # We're providing top level params for metric-data.  This means\n    # that metric-data is now longer a required arg.  We do need\n    # to check that either metric-data or the complex args we've added\n    # have been provided.\n    argument_table['metric-data'].required = False\n\n    argument_table['metric-name'] = PutMetricArgument(\n        'metric-name', help_text='The name of the metric.')\n    argument_table['timestamp'] = PutMetricArgument(\n        'timestamp', help_text='The time stamp used for the metric.  '\n                               'If not specified, the default value is '\n                               'set to the time the metric data was '\n                               'received.')\n    argument_table['unit'] = PutMetricArgument(\n        'unit', help_text='The unit of metric.')\n    argument_table['value'] = PutMetricArgument(\n        'value', help_text='The value for the metric.  Although the --value '\n                           'parameter accepts numbers of type Double, '\n                           'Amazon CloudWatch truncates values with very '\n                           'large exponents.  Values with base-10 exponents '\n                           'greater than 126 (1 x 10^126) are truncated.  '\n                           'Likewise, values with base-10 exponents less '\n                           'than -130 (1 x 10^-130) are also truncated.')\n\n    argument_table['dimensions'] = PutMetricArgument(\n        'dimensions', help_text=(\n            'The --dimensions argument further expands '\n            'on the identity of a metric using a Name=Value '\n            'pair, separated by commas, for example: '\n            '<code>--dimensions InstanceID=1-23456789 '\n            'InstanceType=m1.small</code>. Note that the '\n            '<code>--dimensions</code> argument has a different format when '\n            'used in <code>get-metric-data</code>, where for the same example '\n            'you would use the format <code>--dimensions '\n            'Name=InstanceID,Value=i-aaba32d4 '\n            'Name=InstanceType,value=m1.small </code>.'\n        )\n    )\n    argument_table['statistic-values'] = PutMetricArgument(\n        'statistic-values', help_text='A set of statistical values describing '\n                                      'the metric.')\n\n    metric_data = operation_model.input_shape.members['MetricData'].member\n    storage_resolution = metric_data.members['StorageResolution']\n    argument_table['storage-resolution'] = PutMetricArgument(\n        'storage-resolution', help_text=storage_resolution.documentation\n    )\n\n\ndef insert_first_element(name):\n    def _wrap_add_to_params(func):\n        def _add_to_params(self, parameters, value):\n            if value is None:\n                return\n            if name not in parameters:\n                # We're taking a shortcut here and assuming that the first\n                # element is a struct type, hence the default value of\n                # a dict.  If this was going to be more general we'd need\n                # to have this paramterized, i.e. you pass in some sort of\n                # factory function that creates the initial starting value.\n                parameters[name] = [{}]\n            first_element = parameters[name][0]\n            return func(self, first_element, value)\n        return _add_to_params\n    return _wrap_add_to_params\n\n\nclass PutMetricArgument(CustomArgument):\n    def add_to_params(self, parameters, value):\n        method_name = '_add_param_%s' % self.name.replace('-', '_')\n        return getattr(self, method_name)(parameters, value)\n\n    @insert_first_element('MetricData')\n    def _add_param_metric_name(self, first_element, value):\n        first_element['MetricName'] = value\n\n    @insert_first_element('MetricData')\n    def _add_param_unit(self, first_element, value):\n        first_element['Unit'] = value\n\n    @insert_first_element('MetricData')\n    def _add_param_timestamp(self, first_element, value):\n        first_element['Timestamp'] = value\n\n    @insert_first_element('MetricData')\n    def _add_param_value(self, first_element, value):\n        # Use a Decimal to avoid loss in precision.\n        first_element['Value'] = decimal.Decimal(value)\n\n    @insert_first_element('MetricData')\n    def _add_param_dimensions(self, first_element, value):\n        # Dimensions needs a little more processing.  We support\n        # the key=value,key2=value syntax so we need to parse\n        # that.\n        dimensions = []\n        for pair in split_on_commas(value):\n            key, value = pair.split('=')\n            dimensions.append({'Name': key, 'Value': value})\n        first_element['Dimensions'] = dimensions\n\n    @insert_first_element('MetricData')\n    def _add_param_statistic_values(self, first_element, value):\n        # StatisticValues is a struct type so we are parsing\n        # a csv keyval list into a dict.\n        statistics = {}\n        for pair in split_on_commas(value):\n            key, value = pair.split('=')\n            # There are four supported values: Maximum, Minimum, SampleCount,\n            # and Sum.  All of them are documented as a type double so we can\n            # convert these to a decimal value to preserve precision.\n            statistics[key] = decimal.Decimal(value)\n        first_element['StatisticValues'] = statistics\n\n    @insert_first_element('MetricData')\n    def _add_param_storage_resolution(self, first_element, value):\n        first_element['StorageResolution'] = int(value)\n", "path": "awscli/customizations/putmetricdata.py"}]}