

# 使用 CloudWatch 异常检测
使用异常检测

为指标启用*异常检测*时，CloudWatch 将应用统计算法和机器学习算法。这些算法只需最少的用户干预，即可持续分析系统和应用程序的指标，确定正常基线和表面异常。

这些算法会生成异常检测模型。该模型生成表示正常指标行为的预期值范围。

您可以使用 AWS 管理控制台、AWS CLI、CloudFormation 或 AWS SDK 启用异常检测。您可以对由 AWS 出售的指标以及自定义指标启用异常检测。在设置为 CloudWatch 跨账户可观测性的账户中，除了监控账户中的指标外，您还可以在源账户的指标中创建异常检测器。

您可以通过两种方式使用预期值模型：
+ 根据指标的预期值创建异常检测警报。这些类型的警报没有用于确定警报状态的静态阈值。相反，它们将根据异常检测模型将指标的值与预期值进行比较。

  您可以选择当指标值高于预期值范围和/或低于预期值范围时是否触发警报。

  有关更多信息，请参阅 [根据异常检测创建 CloudWatch 告警](Create_Anomaly_Detection_Alarm.md)。
+ 查看指标数据的图表时，将预期值叠加到图表上作为范围。这样可以清晰直观地看出图中的哪些值不在正常范围内。有关更多信息，请参阅 [创建图表](graph_a_metric.md#create-metric-graph)。

  您还可以通过将 `GetMetricData` API 请求与 `ANOMALY_DETECTION_BAND` 指标数学函数结合使用来检索模型范围的上限值和下限值。有关更多信息，请参阅 [GetMetricData](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html)。

在具有异常检测的图表中，预期的值范围显示为灰色范围。如果指标的实际值超出此范围，则在此期间将显示为红色。

异常检测算法将指标的季节性变化和趋势变化考虑在内。季节性变化可以是每小时、每天或每周，如以下示例所示。

![\[显示为 CPUUtilization 指标启用的异常检测的指标控制台。\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/Anomaly_Detection_Graph2.PNG)


![\[显示为 CPUUtilization 指标启用的异常检测的指标控制台。\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/Anomaly_Detection_Graph5.png)


![\[显示为 CPUUtilization 指标启用的异常检测的指标控制台。\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/Anomaly_Detection_Graph6.png)


较长期的趋势可能是向下或向上。

![\[显示为 CPUUtilization 指标启用的异常检测的指标控制台。\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/Anomaly_Detection_Graph3.PNG)


异常检测也适用于呈现出平稳模式的指标。

![\[显示为 CPUUtilization 指标启用的异常检测的指标控制台。\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/Anomaly_Detection_Graph7.png)


## CloudWatch 异常检测的工作原理
异常检测的工作原理

在为指标启用异常检测后，CloudWatch 会将机器学习算法应用于指标的过去数据，以创建指标的预期值模型。该模型评估指标的趋势以及每小时、每日和每周模式。算法训练最多两周的指标数据，但即使指标没有完整的两周数据，您也可以为指标启用异常检测。

您需要为异常检测阈值指定一个值，CloudWatch 使用该值和该模型确定指标值的“正常”范围。异常检测阈值的值越高，生成的“正常”值范围越大。

机器学习模型特定于指标和统计数据。例如，如果您使用 `AVG` 统计数据为指标启用异常检测，则模型特定于 `AVG` 统计数据。

当 CloudWatch 为许多 AWS 服务中的常见指标创建模型时，它可确保检测范围不会超出逻辑值。例如，EC2 实例 `MemoryUtilization` 的波段将保持在 0 到 100 之间，而跟踪 CloudFront `Requests` 的波段（不能为负）永远不会延伸到零以下。

创建模型后，CloudWatch 异常检测会持续评估模型并对其进行调整，以确保模型尽可能准确。这包括重新训练模型，以便在指标值随时间推移而变化或有突然变化时进行调整，还包括用于改进季节性、峰值或稀疏指标模型的预测器。

在为指标启用异常检测后，您可以选择排除指标的指定时间段，使其不用于训练模型。这样，您就可以排除部署或其他不寻常的事件，使其不用于训练模型，从而确保创建最精确的模型。

对警报使用异常检测模型会使您的 AWS 账户产生费用。有关更多信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing)。

## 指标数学异常检测
指标数学异常检测

指标数学异常检测是一项您可以用于针对指标数学表达式的输出创建异常检测告警的功能。您可以使用这些表达式来创建能可视化异常检测范围的图表。该功能支持基本的算术函数、比较和逻辑运算符以及大多数其他函数。有关不支持的函数的信息，请参阅 [Amazon CloudWatch 用户指南](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html#using-anomaly-detection-on-metric-math)中的*使用指标数学*。

您可以根据指标数学表达式创建异常检测模型，创建方式类似于创建异常检测模型。在 CloudWatch 控制台中，您可以将异常检测应用于指标数学表达式，并选择异常检测作为这些表达式的阈值类型。

**注意**  
仅可在最新版本的指标用户界面中启用和编辑指标数学异常检测。在新版本指标用户界面中根据指标数学表达式创建异常检测器时，您可以在旧版本中查看这些检测器，但不能对它们进行编辑。

有关如何为异常检测和指标数学创建、编辑和删除警报和模型的信息，请参阅以下部分：
+ [根据异常检测创建 CloudWatch 告警](Create_Anomaly_Detection_Alarm.md)
+ [编辑异常检测模型](Create_Anomaly_Detection_Alarm.md#Modify_Anomaly_Detection_Model)
+ [删除异常检测模型](Create_Anomaly_Detection_Alarm.md#Delete_Anomaly_Detection_Model)
+ [根据指标数学表达式创建 CloudWatch 告警](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Create-alarm-on-metric-math-expression.html)

您还可以将 CloudWatch API 与 `PutAnomalyDetector`、`DeleteAnomalyDetector` 和 `DescribeAnomalyDetectors` 结合起来使用，根据指标数学表达式创建、删除及发现异常检测模型。有关这些 API 操作的信息，请参阅 *Amazon CloudWatch API 参考*中的以下部分。
+ [PutAnomalyDetector](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutAnomalyDetector.html)
+ [DeleteAnomalyDetector](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DeleteAnomalyDetector.html)
+ [DescribeAnomalyDetectors](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DescribeAnomalyDetectors.html)

有关异常检测告警定价方式的信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing)。

## 使用 PromQL 检测异常
使用 PromQL 检测异常

您可以使用标准 PromQL 函数（例如 `quantile_over_time`、`stddev_over_time` 和 `avg_over_time`），为任何兼容 Prometheus 的指标构建异常检测范围。此方法可计算基线并加上或减去按比例调整的标准差，以定义适应指标自然模式的上限和下限。

这适用于任何返回浮点值的指标，例如 CPU 使用率、请求延迟或错误计数。有关使用 OpenTelemetry 摄取指标的信息，请参阅 [OpenTelemetry](CloudWatch-OpenTelemetry-Sections.md)。

### 定义上限和下限


要定义指标的预期范围，请使用时间窗口内的中位数或平均值计算基线，然后加上和减去标准差的倍数。乘数控制灵敏度：值越高，产生的范围越宽，误报越少；而值越低，标准差越小。

以下示例使用 60 分钟的时段和乘数 3 为广告请求指标创建上限：

```
quantile_over_time(0.5, {"app.ads.ad_requests"}[60m] offset 1m)
  + 3 * stddev_over_time({"app.ads.ad_requests"}[60m] offset 1m)
```

以下示例创建了相应的下限。对于不能为负值的指标，`clamp_min` 函数可防止下限变为负值：

```
clamp_min(
    quantile_over_time(0.5, {"app.ads.ad_requests"}[60m] offset 1m)
    - 3 * stddev_over_time({"app.ads.ad_requests"}[60m] offset 1m),
0)
```

您可以在 CloudWatch Query Studio 中同时绘制两个界限，实现指标预期范围可视化。有关更多信息，请参阅 [在 Query Studio 中运行 PromQL 查询（预览版）](CloudWatch-PromQL-QueryStudio.md)。

### 检测违规


要检测指标何时超出预期范围，请将两个界限合并到一个查询中。以下表达式仅返回指标值超过上限或低于下限的数据点：

```
1 * {"app.ads.ad_requests"} > quantile_over_time(0.5, {"app.ads.ad_requests"}[60m] offset 1m)
    + 3 * stddev_over_time({"app.ads.ad_requests"}[60m] offset 1m)
or
1 * {"app.ads.ad_requests"} < clamp_min(
    quantile_over_time(0.5, {"app.ads.ad_requests"}[60m] offset 1m)
    - 3 * stddev_over_time({"app.ads.ad_requests"}[60m] offset 1m),
0)
```

此查询适用于多个标签值，因此您可以在单个查询中检测整个实例集中的异常。您可以使用此表达式创建 PromQL 警报，当任何时间序列超出预期范围时会触发该警报。有关更多信息，请参阅 [使用 PromQL 创建 CloudWatch 警报以进行异常检测](CloudWatch-PromQL-Alarms.md#promql_alarm_anomaly_detection)。