

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

# 异常检测
<a name="prometheus-anomaly-detection"></a>

Amazon Managed Service for Prometheus 提供异常检测功能，该功能使用机器学习算法自动识别指标数据中的异常模式。此功能有助于您主动检测潜在问题，减少警报疲劳，并通过关注真正的异常行为而不是静态阈值来提高监控有效性。

Amazon Managed Service for Prometheus 中的异常检测使用随机森林砍伐（RCF）算法，该算法分析时间序列数据以建立正常行为模式，并识别与这些模式的偏差。该算法可适应季节性趋势，从容地处理缺失的数据，并为检测到的异常提供置信度分数。

## 异常检测的工作原理
<a name="amp-anomaly-detection-how-it-works"></a>

Amazon Managed Service for Prometheus 异常检测使用机器学习来识别指标数据中的异常模式，而无需手动配置阈值。该系统学习正常行为模式和季节性变化，从而减少误报并实现早期问题检测。它不断地适应应用程序变化，使其适用于动态云环境。

异常检测可监控应用程序性能指标（例如响应时间和错误率），通过 CPU 和内存使用情况跟踪基础设施运行状况，检测异常用户行为，通过流量分析确定容量规划需求，并监控业务指标以了解意外变化。它最适合可预测的模式、季节性变化或渐进的增长趋势。

使用随机森林砍伐（RCF）算法来分析时间序列数据。RCF 创建决策树，用于对数据空间进行分区并识别远离正态分布的孤立点。该算法从传入的数据中学习，来为每个指标建立正常行为的动态模型。

启用后，它会分析历史数据以确定基准模式和季节性趋势，然后生成对预期值的预测并识别偏差。该算法产生四个关键输出：
+ *upper\$1band*：预期正常值的上限
+ *lower\$1band*：预期正常值的下限
+ *score*：表示数据点异常程度的数值异常分数
+ *value*：实际观测到的指标值

## 异常检测入门
<a name="anomaly-detection-getting-started"></a>

要开始对 Prometheus 指标使用异常检测，您需要足够的历史数据让算法学习正常模式。我们建议在启用异常检测之前至少保持 14 天的一致指标数据，以获得最佳结果。

您可以使用 `PreviewAnomalyDetector` API 预览异常检测将如何与您的指标结合使用。使用 `PreviewAnomalyDetector` 根据历史数据测试算法并评估其有效性，然后再将其实施到生产监控中。有关更多信息，请参阅 [PreviewAnomalyDetector API](anomaly-detection-api.md)。

在实施异常检测时，请考虑以下最佳实践：
+ **从稳定的指标开始**：从具有一致模式的指标开始，最初避免高度不稳定或稀疏的数据。
+ **使用聚合数据**：将异常检测应用于聚合指标（例如平均值或总和），而不是原始的高基数数据，以提高性能和准确性。
+ **调整灵敏度**：根据您的特定使用案例和对误报与漏报异常的容忍度调整算法参数。
+ **监控算法性能**：定期检查检测到的异常，以确保算法随着系统的发展持续提供有价值的见解。

# PreviewAnomalyDetector API
<a name="anomaly-detection-api"></a>

使用 `PreviewAnomalyDetector` 操作创建端点，用于演示异常检测算法在指定时间段内如何分析您的指标数据。此端点有助于您在实施之前评估和验证检测器的性能。

有效的 HTTP 动词  
`GET`, `POST`

支持的有效载荷类型  
URL 编码的参数  
`POST` 的 `application/x-www-form-urlencoded`

支持的参数  
`query=<string>` Prometheus 表达式查询字符串。  
`start=<rfc3339 | unix_timestamp>` 如果您使用 `query_range` 查询一段时间范围，则为开始时间戳。  
`end=<rfc3339 | unix_timestamp>` 如果您使用 `query_range` 查询一段时间范围，则为结束时间戳。  
`step=<duration | float>` `duration` 格式的查询解析步长，或者是 `float` 秒数。仅在您使用 `query_range` 查询一段时间范围时使用，并且对于此类查询是必需的。

## 查询参数格式
<a name="anomaly-detection-query-formatting"></a>

在查询参数中用 RandomCutForest (RCF) 伪函数包装原始 PromQL 表达式。有关更多信息，请参阅适用于 *Prometheus 的亚马逊托管服务* API 参考[RandomCutForestConfiguration](https://docs.aws.amazon.com/prometheus/latest/APIReference/API_RandomCutForestConfiguration.html)中。

RCF 函数使用此格式：

```
RCF(<query>
[,shingle size
[,sample size
[,ignore near expected from above
[,ignore near expected from below
[,ignore near expected from above ratio
[,ignore near expected from below ratio]]]]])
```

除查询之外的所有参数都是可选的，省略时使用默认值。最小语法为：

```
RCF(<query>)
```

必须使用聚合函数包装查询。要使用特定的可选参数，同时忽略其他可选参数，请在函数中保留空位置：

```
RCF(<query>,,,,,1.0,1.0)
```

此示例仅根据预期值和观测值之间的比率来设置忽略异常检测峰值和下降的比率参数。

## API 请求和响应
<a name="anomaly-detection-query-formatting"></a>

成功的调用返回的格式与 [QueryMetrics API](AMP-APIReference-QueryMetrics.md) 相同。除了原始时间序列外，当有足够的样本可用时，API 还会返回以下新的时间序列：
+ `anomaly_detector_preview:lower_band`：PromQL 表达式结果的预期值的下限
+ `anomaly_detector_preview:score`：异常分数介于 0 和 1 之间，其中 1 表示该数据点的异常可信度较高
+ `anomaly_detector_preview:upper_band`：PromQL 表达式结果的预期值的上限

 **示例请求** 

```
POST /workspaces/workspace-id/anomalydetectors/preview
Content-Type: application/x-www-form-urlencoded

query=RCF%28avg%28vector%28time%28%29%29%29%2C%208%2C%20256%29&start=1735689600&end=1735695000&step=1m
```

 **示例响应** 

```
200 OK
...

{
  "status": "success",
  "data": {
    "result": [
      {
        "metric": {},
        "values": [
          [
            1735689600,
            "1735689600"
          ],
          [
            1735689660,
            "1735689660"
          ],
          .........
        ]
      },
      {
        "metric": {
          "anomaly_detector_preview": "upper_band"
        },
        "values": [
          [
            1735693500,
            "1.7356943E9"
          ],
          [
            1735693560,
            "1.7356945E9"
          ]
          ],
          .........
        ]
      },
      {
        "metric": {
          "anomaly_detector_preview": "lower_band"
        },
        "values": [
          [
            1735693500,
            "1.7356928E9"
          ],
          [
            1735693560,
            "1.7356929E9"
          ],
          ......... 
        ]
      },
      {
        "metric": {
          "anomaly_detector_preview": "score"
        },
        "values": [
          [
            1735693500,
            "0.0"
          ],
          [
            1735695000,
            "0.0"
          ],
          .........
        ]
      }
    ],
    "resultType": "matrix"
  }
}
```