

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用自定义指标的高级预测性扩展策略
使用自定义指标

在预测性扩展策略中，您可以使用预定义指标或自定义指标。当预定义的指标不能充分描述您的应用程序负载时，自定义指标会很有用。

使用自定义指标创建预测性扩展策略时，您可以指定由提供的其他 CloudWatch 指标 Amazon，也可以指定自己定义和发布的指标。您还可以使用公制数学来汇总现有指标并将其转换为 Amazon 不会自动跟踪的新时间序列。例如，通过计算新的总和或平均值来组合数据中的值时，该操作称为*执行聚合*。生成的数据称为*聚合*。

以下部分包含了有关如何为构造策略的 JSON 结构的最佳实践和示例。

**Topics**
+ [

## 最佳实践
](#custom-metrics-best-practices)
+ [

## 先决条件
](#custom-metrics-prerequisites)
+ [

# 构造自定义指标的 JSON
](construct-json-custom-metrics.md)
+ [

# 预测性扩展策略中自定义指标的注意事项
](custom-metrics-troubleshooting.md)

## 最佳实践


以下最佳实践可帮助您更有效地使用自定义指标：
+ 对于负载指标规范，最有用的指标是表示应用程序负载的指标。
+ 扩展指标必须与容量成反比。也就是说，如果可扩展目标增加，则扩展指标的减少比例应大致相同。为确保预测性扩展按预期采取行动，负载指标和扩展指标还必须彼此之间密切关联。
+ 目标利用率必须与扩展指标的类型匹配。对于使用 CPU 利用率的策略配置，这是目标百分比。对于使用吞吐量（例如请求数或消息数）的策略配置，这是在任何一分钟间隔内每个实例的目标请求数或目标消息数。
+ 如果未遵循这些建议，那么时间序列的预测未来值可能会不正确。要验证数据是否正确，您可以查看预测值。或者，在创建预测性扩展策略后，检查调用 [GetPredictiveScalingForecast](https://docs.amazonaws.cn/autoscaling/application/APIReference/API_GetPredictiveScalingForecast.html)API 返回的`LoadForecast`和`CapacityForecast`对象。
+ 我们强烈建议您在仅预测模式下配置预测式扩展，以便在预测式扩展开始主动扩展容量之前对预测进行评估。

## 先决条件


要将自定义指标添加到预测性扩缩策略，您必须具有 `cloudwatch:GetMetricData` 权限。

要指定您自己的指标而不是 Amazon 提供的指标，您必须先将指标发布到 CloudWatch。有关更多信息，请参阅《*Amazon CloudWatch 用户指南*》中的[发布自定义指标](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/publishingMetrics.html)。

如果发布自己的指标，请确保以至少五分钟的频率发布数据点。Application Auto Scaling CloudWatch 根据所需的周期长度从中检索数据点。例如，负载指标规范使用每小时指标来衡量应用程序的负载。 CloudWatch 使用您发布的指标数据，通过将所有数据点与每个一小时内的时间戳聚合在一起，为任何一小时的时间段提供单个数据值。

# 构造自定义指标的 JSON


以下部分包含有关如何配置预测扩展以查询 Amazon EC2 Auto Scaling 数据的示例。 CloudWatch 配置此选项有两种不同的方法，您选择的方法会影响您为预测性扩缩策略构造 JSON 时使用的格式。使用指标数学时，JSON 格式会根据所执行的指标数学进一步变化。

1. 要创建可直接从提供的其他 CloudWatch 指标 Amazon 或您发布到的指标中获取数据的策略 CloudWatch，请参阅[包含自定义负载和扩缩指标的预测性扩缩策略示例（Amazon CLI）](#custom-metrics-ex1)。

1. 要创建可查询多个 CloudWatch 指标并使用数学表达式根据这些指标创建新时间序列的策略，请参阅[使用指标数学表达式](using-math-expression-examples.md)。

## 包含自定义负载和扩缩指标的预测性扩缩策略示例（Amazon CLI）


要使用创建带有自定义负载和扩展指标的预测性扩展策略 Amazon CLI，请将的参数存储`--predictive-scaling-configuration`在名为的 JSON 文件中`config.json`。

您可以将以下示例中的可替换值替换为您的指标和目标利用率值，从而开始添加自定义指标。

```
{
  "MetricSpecifications": [
    {
      "TargetValue": 50,
      "CustomizedScalingMetricSpecification": {
        "MetricDataQueries": [
          {
            "Id": "scaling_metric",
            "MetricStat": {
              "Metric": {
                "MetricName": "MyUtilizationMetric",
                "Namespace": "MyNameSpace",
                "Dimensions": [
                  {
                    "Name": "MyOptionalMetricDimensionName",
                    "Value": "MyOptionalMetricDimensionValue"
                  }
                ]
              },
              "Stat": "Average"
            }
          }
        ]
      },
      "CustomizedLoadMetricSpecification": {
        "MetricDataQueries": [
          {
            "Id": "load_metric",
            "MetricStat": {
              "Metric": {
                "MetricName": "MyLoadMetric",
                "Namespace": "MyNameSpace",
                "Dimensions": [
                  {
                    "Name": "MyOptionalMetricDimensionName",
                    "Value": "MyOptionalMetricDimensionValue"
                  }
                ]
              },
              "Stat": "Sum"
            }
          }
        ]
      }
    }
  ]
}
```

有关更多信息，请参阅[MetricDataQuery](https://docs.amazonaws.cn/autoscaling/ec2/APIReference/API_MetricDataQuery.html)《*亚马逊 EC2 Auto Scaling API 参考*》。

**注意**  
以下是一些其他资源，可以帮助您查找指标名称、命名空间、维度和指标 CloudWatch 统计信息：  
有关 Amazon 服务的可用指标的信息，请参阅《*亚马逊 CloudWatch 用户指南*》中[发布 CloudWatch 指标的Amazon 服务](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html)。
要使用获取指标的确切指标名称、命名空间和维度（如果适用） Amazon CLI，请参阅[列表 CloudWatch ](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudwatch/list-metrics.html)指标。

要创建此策略，请使用 JSON 文件作为输入运行[put-scaling-policy](https://docs.amazonaws.cn/cli/latest/reference/autoscaling/put-scaling-policy.html)命令，如以下示例所示。

```
aws autoscaling put-scaling-policy --policy-name my-predictive-scaling-policy \
  --auto-scaling-group-name my-asg --policy-type PredictiveScaling \
  --predictive-scaling-configuration file://config.json
```

如果成功，此命令将返回策略的 Amazon 资源名称（ARN）。

```
{
  "PolicyARN": "arn:aws:autoscaling:region:account-id:scalingPolicy:2f4f5048-d8a8-4d14-b13a-d1905620f345:autoScalingGroupName/my-asg:policyName/my-predictive-scaling-policy",
  "Alarms": []
}
```

# 使用指标数学表达式


以下部分提供了预测性扩缩策略的信息和示例，这些示例演示了如何在策略中使用指标数学。

**Topics**
+ [

## 了解指标数学
](#custom-metrics-metric-math)
+ [

## Amazon EC2 Auto Scaling 的预测性扩展策略示例，该策略使用公制数学组合指标 (Amazon CLI)
](#custom-metrics-ex2)
+ [

## blue/green 部署场景中使用的预测性扩展策略示例 (Amazon CLI)
](#custom-metrics-ex3)

## 了解指标数学


如果您只想汇总现有指标数据，那么公 CloudWatch 制数学可以为您节省向其发布另一个指标的工作量和成本 CloudWatch。您可以使用 Amazon 提供的任何指标，也可以使用在应用程序中定义的指标。

有关更多信息，请参阅 *Amazon CloudWatch 用户指南*中的[使用公制数学](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/using-metric-math.html)。

如果您选择在预测性扩展策略中使用指标数学表达式，请考虑以下几点：
+ 指标数学运算使用指标名称、命名空间和维度键/值对指标的唯一组合的数据点。
+ 您可以使用任何算术运算符 (\$1-\$1/^)、统计函数（例如 AVG 或 SUM）或其他支持的函数。 CloudWatch 
+ 您可以在数学表达式的公式中同时使用指标和其他数学表达式的结果。
+ 指标数学表达式可以由不同的聚合组成。但是，得到最终聚合结果的最佳实践是针对扩展指标使用 `Average` 以及针对负载指标使用 `Sum`。
+ 指标规范中使用的任何表达式最终都必须返回一个单个时间序列。

要使用指标数学，请执行以下操作：
+ 选择一个或多个 CloudWatch 指标。然后，创建表达式。有关更多信息，请参阅 *Amazon CloudWatch 用户指南*中的[使用公制数学](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/using-metric-math.html)。
+ 使用 CloudWatch控制台或 CloudWatch [GetMetricData](https://docs.amazonaws.cn/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html)API 验证指标数学表达式是否有效。

## Amazon EC2 Auto Scaling 的预测性扩展策略示例，该策略使用公制数学组合指标 (Amazon CLI)


有时，您可能需要首先以某种方式处理其数据，而不是直接指定指标。例如，您可能有一个从 Amazon SQS 队列中提取工作的应用程序，并且可能希望使用队列中的项目数作为预测性扩展的标准。队列中的消息数不仅仅定义您需要的实例数。因此，需要执行更多工作来创建可用于计算每个实例的积压的指标。

以下示例是适用于此场景的预测扩展策略示例。它指定了基于 Amazon SQS `ApproximateNumberOfMessagesVisible` 指标的扩展和负载指标，即可从队列中获取的用于检索的消息数量。它还使用 Amazon EC2 Auto Scaling `GroupInServiceInstances` 指标和数学表达式，计算扩展指标的每个实例的积压。

```
aws autoscaling put-scaling-policy --policy-name my-sqs-custom-metrics-policy \
  --auto-scaling-group-name my-asg --policy-type PredictiveScaling \
  --predictive-scaling-configuration file://config.json
{
  "MetricSpecifications": [
    {
      "TargetValue": 100,
      "CustomizedScalingMetricSpecification": {
        "MetricDataQueries": [
          {
            "Label": "Get the queue size (the number of messages waiting to be processed)",
            "Id": "queue_size",
            "MetricStat": {
              "Metric": {
                "MetricName": "ApproximateNumberOfMessagesVisible",
                "Namespace": "AWS/SQS",
                "Dimensions": [
                  {
                    "Name": "QueueName",
                    "Value": "my-queue"
                  }
                ]
              },
              "Stat": "Sum"
            },
            "ReturnData": false
          },
          {
            "Label": "Get the group size (the number of running instances)",
            "Id": "running_capacity",
            "MetricStat": {
              "Metric": {
                "MetricName": "GroupInServiceInstances",
                "Namespace": "AWS/AutoScaling",
                "Dimensions": [
                  {
                    "Name": "AutoScalingGroupName",
                    "Value": "my-asg"
                  }
                ]
              },
              "Stat": "Sum"
            },
            "ReturnData": false
          },
          {
            "Label": "Calculate the backlog per instance",
            "Id": "scaling_metric",
            "Expression": "queue_size / running_capacity",
            "ReturnData": true
          }
        ]
      },
      "CustomizedLoadMetricSpecification": {
        "MetricDataQueries": [
          {
            "Id": "load_metric",
            "MetricStat": {
              "Metric": {
                "MetricName": "ApproximateNumberOfMessagesVisible",
                "Namespace": "AWS/SQS",
                "Dimensions": [
                  {
                    "Name": "QueueName",
                    "Value": "my-queue"
                  }
                ],
              },
              "Stat": "Sum"
            },
            "ReturnData": true
          }
        ]
      }
    }
  ]
}
```

该示例返回策略的 ARN。

```
{
  "PolicyARN": "arn:aws:autoscaling:region:account-id:scalingPolicy:2f4f5048-d8a8-4d14-b13a-d1905620f345:autoScalingGroupName/my-asg:policyName/my-sqs-custom-metrics-policy",
  "Alarms": []
}
```

## blue/green 部署场景中使用的预测性扩展策略示例 (Amazon CLI)


搜索表达式提供了一个高级选项，您可以在其中查询多个 Auto Scaling 组中的指标并对其执行数学表达式。这对于 blue/green 部署特别有用。

**注意**  
*蓝/绿部署*是一种部署方法，您可以在其中创建两个独立但相同的 Auto Scaling 组。只有其中一个组接收生产流量。用户流量最初定向到较早的Auto Scaling 组（“蓝色”），而新组（“绿色”）用于测试和评估应用程序或服务的新版本。测试并接受新部署后，用户流量将转移到“绿色”的 Auto Scaling 组。然后，您可以在部署成功后删除“蓝色”组。

在 blue/green 部署过程中创建新的 Auto Scaling 组时，每个组的指标历史记录可以自动包含在预测性扩展策略中，而无需更改其指标规范。有关更多信息，请参阅 [C Amazon ompute 博客上的将 EC2 Auto Scaling 预测性扩展策略用于蓝/绿部署](https://www.amazonaws.cn/blogs/compute/retaining-metrics-across-blue-green-deployment-for-predictive-scaling/)。

以下示例策略说明了如何执行此操作。在此示例中，策略使用 Amazon EC2 发出的 `CPUUtilization` 指标。它使用 Amazon EC2 Auto Scaling `GroupInServiceInstances` 指标和数学表达式，计算每个实例的扩展指标的值。它还指定了一个容量指标规范来获取 `GroupInServiceInstances` 指标。

根据指定的搜索条件，搜索表达式查找多个 Auto Scaling 组中实例的 `CPUUtilization`。如果您稍后创建了匹配相同搜索条件的新 Auto Scaling 组，则自动包含新 Auto Scaling 组中实例的 `CPUUtilization`。

```
aws autoscaling put-scaling-policy --policy-name my-blue-green-predictive-scaling-policy \
  --auto-scaling-group-name my-asg --policy-type PredictiveScaling \
  --predictive-scaling-configuration file://config.json
{
  "MetricSpecifications": [
    {
      "TargetValue": 25,
      "CustomizedScalingMetricSpecification": {
        "MetricDataQueries": [
          {
            "Id": "load_sum",
            "Expression": "SUM(SEARCH('{AWS/EC2,AutoScalingGroupName} MetricName=\"CPUUtilization\" ASG-myapp', 'Sum', 300))",
            "ReturnData": false
          },
          {
            "Id": "capacity_sum",
            "Expression": "SUM(SEARCH('{AWS/AutoScaling,AutoScalingGroupName} MetricName=\"GroupInServiceInstances\" ASG-myapp', 'Average', 300))",
            "ReturnData": false
          },
          {
            "Id": "weighted_average",
            "Expression": "load_sum / capacity_sum",
            "ReturnData": true
          }
        ]
      },
      "CustomizedLoadMetricSpecification": {
        "MetricDataQueries": [
          {
            "Id": "load_sum",
            "Expression": "SUM(SEARCH('{AWS/EC2,AutoScalingGroupName} MetricName=\"CPUUtilization\" ASG-myapp', 'Sum', 3600))"
          }
        ]
      },
      "CustomizedCapacityMetricSpecification": {
        "MetricDataQueries": [
          {
            "Id": "capacity_sum",
            "Expression": "SUM(SEARCH('{AWS/AutoScaling,AutoScalingGroupName} MetricName=\"GroupInServiceInstances\" ASG-myapp', 'Average', 300))"
          }
        ]
      }
    }
  ]
}
```

该示例返回策略的 ARN。

```
{
  "PolicyARN": "arn:aws:autoscaling:region:account-id:scalingPolicy:2f4f5048-d8a8-4d14-b13a-d1905620f345:autoScalingGroupName/my-asg:policyName/my-blue-green-predictive-scaling-policy",
  "Alarms": []
}
```

# 预测性扩展策略中自定义指标的注意事项
自定义指标的注意事项

如果在使用自定义指标时出现问题，建议您执行以下操作：
+ 如果提供了错误消息，请阅读该消息并解决其报告的问题（如果可能）。
+ 如果您未事先验证表达式，则该[ put-scaling-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/application-autoscaling/put-scaling-policy.html)命令会在您创建扩展策略时对其进行验证。但是，此命令有可能无法识别所检测错误的确切原因。要修复这些问题，请对您在[get-metric-data](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudwatch/get-metric-data.html)命令请求的响应中收到的错误进行故障排除。您也可以从 CloudWatch 控制台对表达式进行故障排除。
+ 如果 `MetricDataQueries` 自行指定 SEARCH() 函数，而没有像 SUM() 这样的数学函数，则必须为 `ReturnData` 指定 `false`。原因在于搜索表达式可能返回多个时间序列，而基于表达式的指标规范仅可以返回一个时间序列。
+ 搜索表达式中涉及的所有指标均应该具有相同的分辨率。

**限制**  
适用以下限制：
+ 您可以在一个指标规范中查询最多 10 个指标的数据点。
+ 为满足此限制，一个表达式算作一个指标。