

# 将数学表达式与 CloudWatch 指标结合使用
<a name="using-metric-math"></a>

通过指标数学可以查询多个 CloudWatch 指标，可以使用数学表达式基于这些指标创建新的时间序列。您可以在 CloudWatch 控制台上直观显示生成的时间序列，并将其添加到控制面板中。以 Amazon Lambda 指标为例，您可以将 `Errors` 指标除以 `Invocations` 指标来获得错误率。然后，将生成的时间序列添加到 CloudWatch 控制面板上的图表中。

您也可以使用 `GetMetricData` API 操作以编程方式执行指标数学。有关更多信息，请参阅 [GetMetricData](https://docs.amazonaws.cn/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html)。

## 向 CloudWatch 图表中添加数学表达式
<a name="adding-metrics-expression-console"></a>

您可以向 CloudWatch 控制面板上的图表中添加数学表达式。每个图表限制为使用最多 500 个指标和表达式，因此仅当图表具有 499 个或更少的指标时，您才可以添加数学表达式。即使并非所有指标都显示在图表上，这一点也适用。

**向图表中添加数学表达式**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.amazonaws.cn/cloudwatch/) 打开 CloudWatch 控制台。

1. 创建或编辑图表。图表中至少需要一个指标。

1. 选择 **Graphed metrics**（已绘制图表指标）。

1. 选择 **Math expression (数学表达式)**、**Start with empty expression (从空表达式开始)**。将为表达式显示一个新行。

1. 在 **Details (详细信息)** 列下方的新行中，输入数学表达式。**指标数学语法和函数**部分中的表列出了可以在表达式中使用的函数。

   要使用一个指标或另一个表达式的结果作为此表达式的公式的一部分，请使用 **Id** 列中显示的值：例如，**m1\$1m2** 或 **e1-MIN(e1)**。

   您可以更改 **Id** 的值。它可以包括数字、字母和下划线，并且必须以小写字母开头。将 **Id** 的值更改为更有意义的名称也可以使图表更易于理解；例如，从 **m1** 和 **m2** 更改为 **errors** 和 **requests**。
**提示**  
选择 **Math Expression (数学表达式)** 旁边的向下箭头可查看受支持的函数列表，您可以在创建表达式时使用这些函数。

1. 对于表达式的 **Label (标签)** 列，输入一个描述表达式正在计算的内容的名称。

   如果某个表达式的结果是一组时间序列，则这些时间序列将在图表上单独的行中以不同的颜色显示。图表的下方是图表中的每个行的图例。对于生成多个时间序列的单个表达式，这些时间序列的图例文字的格式为 ***Expression-Label Metric-Label***。例如，如果图表包含一个具有标签 **Errors** 的指标和一个具有标签 **Filled With 0:** 的表达式 **FILL(METRICS(), 0)**，则图例中的一行将为 **Filled With 0: Errors**。要使图例仅显示原始指标标签，请将 *Expression-Label* 设置为空。

   当一个表达式在图表上生成了一组时间序列时，您无法更改用于这些时间序列的颜色。

1. 在添加所需的表达式后，您可以通过隐藏某些原始指标来简化图表。要隐藏某个指标或表达式，请清除 **Id** 字段左侧的复选框。

## 指标数学语法和函数
<a name="metric-math-syntax"></a>

以下各部分解释可用于指标数学的函数。所有函数都必须用大写字母编写（例如 **AVG**），所有指标和数学表达式的 **Id** 字段都必须以小写字母开头。

任何数学表达式的最终结果都必须是单个时间序列或一组时间序列。某些函数会生成标量数字。您可以在一个更大的函数中使用这些函数，从而最终生成一个时间序列。例如，采用单个时间序列的 **AVG** 会生成标量数字，因此它不能是最终的表达式结果。但您可以在函数 **m1-AVG(m1)** 中使用它，以显示每个单独数据点与时间序列中平均值之差的时间序列。

### 数据类型缩写
<a name="metric-math-syntax-datatypes"></a>

某些函数仅对某些类型的数据有效。在函数表中使用以下列表中的缩写来代表每个函数支持的数据类型：
+ **S** 代表标量数字，例如 2、-5 或 50.25。
+ **TS** 是时间序列（单个 CloudWatch 指标随时间变化的一系列值）：例如，实例 `i-1234567890abcdef0` 在过去三天的 `CPUUtilization` 指标。
+ **TS []** 是一个时间序列数组，例如多个指标的时间序列。
+ **String[]** 是一个字符串数组。

### METRICS() 函数
<a name="metric-math-syntax-metrics-function"></a>

**METRICS()** 函数将返回请求中的所有指标。数学表达式不包括在内。

您可以在一个更大的表达式中使用 **METRICS()**，从而最终生成单个时间序列或一组时间序列。例如，表达式 **SUM(METRICS())** 将返回作为所有绘成图表的指标值的总和的时间序列 (TS)。**METRICS()/100** 将返回一组时间序列，其中的每个时间序列都显示其中一个指标的各个数据点除以 100 的结果。

您可以将 **METRICS()** 函数与一个字符串一起使用，仅返回在其 **Id** 字段中包含该字符串的绘成图表的指标。例如，表达式 **SUM(METRICS("errors"))** 一个是所有在其 **Id** 字段中具有“errors”的绘成图表的指标值的总和的时间序列。您还可以使用 **SUM([METRICS(“4xx”), METRICS(“5xx”)])** 来匹配多个字符串。

### 基本算术函数
<a name="metric-math-syntax-arithmetic"></a>

下表列出了受支持的基本算术函数。时间序列中缺少的值被视为 0。如果数据点的值导致函数试图除以零，则会丢弃该数据点。


| 操作 | 参数 | 示例 | 
| --- | --- | --- | 
|  算术运算符: \$1 - \$1 / ^ |  S, S S, TS TS, TS S, TS[] TS, TS[]  |  PERIOD(m1)/60 **5 \$1 m1** **m1 - m2** **SUM(100/[m1, m2])** **AVG(METRICS())** **METRICS()\$1100**  | 
|  一元减法 -  |  S TS TS[]  |  **-5\$1m1** **-m1** **SUM(-[m1, m2])**  | 

### 比较运算符和逻辑运算符
<a name="metric-math-syntax-operators"></a>

您可以将比较运算符和逻辑运算符与一对时间序列或一对单标量值结合使用。在将比较运算符与一对时间序列结合使用时，运算符将返回一个时间序列，其中每个数据点为 0 (false) 或 1 (true)。如果在一对标量值上使用比较运算符，则将返回一个单标量值（0 或 1）。

如果在两个时间序列之间使用比较运算符，并且仅一个时间序列具有特定时间戳值，则该函数会将另一个时间序列中的缺失值视为 **0**。

您可以将逻辑运算符与比较运算符结合使用来创建更复杂的函数。

下表列出了受支持的运算符。


| 运算符类型 | 支持的运算符 | 
| --- | --- | 
|  比较运算符 |  == \$1= <= >= < >  | 
|  逻辑运算符 |  AND 或 && OR 或 \$1\$1  | 

为了说明如何使用这些运算符，假设我们有两个时间序列：**metric1** 具有值 `[30, 20, 0, 0]`，**metric2** 具有值 `[20, -, 20, -]`，其中 `-` 指示未提供该时间戳的值。


| Expression | Output | 
| --- | --- | 
|  **(metric1 < metric2)** |  **0, 0, 1, 0**  | 
|  **(metric1 >= 30)** |  **1, 0, 0, 0**  | 
|  **(metric1 > 15 AND metric2 > 15)** |  **1, 0, 0, 0**  | 

### 指标数学支持的函数
<a name="metric-math-syntax-functions-list"></a>

下表描述了可在数学表达式中使用的函数。用大写字母输入所有函数。

任何数学表达式的最终结果都必须是单个时间序列或一组时间序列。以下部分中的表中的某些函数会生成标量数字。您可以在一个更大的函数中使用这些函数，从而最终生成一个时间序列。例如，采用单个时间序列的 **AVG** 会生成标量数字，因此它不能是最终的表达式结果。但您可以在函数 **m1-AVG(m1)** 中使用它来显示每个数据点和该数据点的平均值之间的差异的时间序列。

在下表中，**Examples (示例)** 列中的每个示例都是一个表达式，用于生成单个时间序列或一组时间序列。这些示例说明如何将返回标量数字的函数用作生成单个时间序列的有效表达式的一部分。


| 函数 | 参数 | 返回类型**\$1** | 说明 | 示例 | 支持跨账户？ | 
| --- | --- | --- | --- | --- | --- | 
|  **ABS** |  TS TS[]  |  TS TS[]  | 返回每个数据点的绝对值。 |  **ABS(m1-m2)** **MIN(ABS([m1, m2]))** **ABS(METRICS())**  | ✓ | 
|  **ANOMALY\$1DETECTION\$1BAND** |  TS TS、S  |  TS[]  | 返回指定指标的异常检测范围。该范围由两个时间序列组成，一个表示指标的“正常”预期值的上限，另一个表示下限。该函数可接受两个参数。第一个参数是要为其创建范围的指标的 ID。第二个参数是要用于范围的标准差的数目。如果您不指定此参数，则使用默认值 2。有关更多信息，请参阅 [使用 CloudWatch 异常检测](CloudWatch_Anomaly_Detection.md)。 |  **ANOMALY\$1DETECTION\$1BAND(m1)** **ANOMALY\$1DETECTION\$1BAND(m1,4)**  |  | 
|  **AVG** |  TS TS[]  |  S TS  | 单个时间序列的 **AVG** 将返回一个标量，表示指标中所有数据点的平均值。一组时间序列的 **AVG** 将返回单个时间序列。缺少的值被视为 0。  如果您希望函数返回一个标量，则建议您不要在 CloudWatch 警报中使用此函数。例如 `AVG(m2)`。每当告警评估是否更改状态时，CloudWatch 都会尝试检索高于评估期指定的数量的数据点数。当请求了额外数据时，此函数的行为将有所不同。 要将此功能与警报配合使用，尤其是包含自动扩缩操作的警报，我们建议您将警报设置为使用 N 个数据点中的 M 个，其中 M < N。   |  **SUM([m1,m2])/AVG(m2)** **AVG(METRICS())**  | ✓ | 
|  **CEIL** |  TSTS[]  |  TS TS[]  | 返回每个指标的上限。上限是大于或等于每个值的最小整数。 |  **CEIL(m1)** **CEIL(METRICS())** **SUM(CEIL(METRICS()))**  | ✓ | 
|  **DATAPOINT\$1COUNT** |  TS TS[]  |  S TS  | 返回报告了值的数据点的计数。这对于计算稀疏指标的平均值非常有用。  我们建议您不要在 CloudWatch 告警中使用此函数。每当告警评估是否更改状态时，CloudWatch 都会尝试检索高于评估期指定的数量的数据点数。当请求了额外数据时，此函数的行为将有所不同。  |  **SUM(m1)/DATAPOINT\$1COUNT(m1)** **DATAPOINT\$1COUNT(METRICS())**  | ✓ | 
|  **DB\$1PERF\$1INSIGHTS** |  字符串, 字符串, 字符串 String, String, String[]  |  TS（如果给定单个字符串） TS[]（如果给定字符串数组）  | 返回 Amazon Relational Database Service 和 Amazon DocumentDB（与 MongoDB 兼容）等数据库的性能详情计数器指标。此函数返回的数据量与您直接查询性能详情 API 所获得的数据量相同。您可以在 CloudWatch 中使用这些指标来绘制图表和创建警报。  使用此函数时，必须指定数据库的唯一数据库资源 ID。这与数据库标识符不同。要在 Amazon RDS 控制台中查找数据库资源 ID，请选择数据库实例以查看其详细信息。然后，选择**配置**选项卡。**资源 ID** 将显示在**配置**部分中。  **DB\$1PERF\$1INSIGHTS** 还以亚分钟为间隔引入 `DBLoad` 指标。 使用此函数检索的性能详情指标不会存储在 CloudWatch 中。因此，某些 CloudWatch 功能（例如跨账户可观测性、异常检测、指标流、Metrics Explorer 和 Metric Insights）不适用于您通过 **DB\$1PERF\$1INSIGHTS** 检索的性能详情指标。 使用 **DB\$1PERF\$1INSIGHTS** 函数的单个请求可以检索以下数量的数据点。 [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/using-metric-math.html) **DB\$1PERF\$1INSIGHTS** 函数仅支持以下周期长度： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/using-metric-math.html) 有关 Amazon RDS 性能详情计数器指标的更多信息，请参阅[性能详情计数器指标](https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/USER_PerfInsights_Counters.html)。 有关 Amazon DocumentDB 性能详情计数器指标的更多信息，请参阅[性能详情计数器指标](https://docs.amazonaws.cn/documentdb/latest/developerguide/performance-insights-counter-metrics.html)。  **DB\$1PERF\$1INSIGHTS** 检索的精度为亚分钟的高分辨率指标仅适用于 **DBLoad** 指标，或者如果您启用了更高分辨率的增强监控，则适用于操作系统指标。有关 Amazon RDS 增强监控的更多信息，请参阅[使用增强监控监控操作系统指标](https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/USER_Monitoring.OS.html)。 您可以使用 **DB\$1PERF\$1INSIGHTS** 函数创建最长时间范围为三小时的高分辨率警报。您可以使用 CloudWatch 控制台绘制任何时间范围内通过 **DB\$1PERF\$1INSIGHTS** 函数检索到的指标的图表。  |  **DB\$1PERF\$1INSIGHTS(‘RDS’, ‘db-ABCDEFGHIJKLMNOPQRSTUVWXY1’, ‘os.cpuUtilization.user.avg’)** **DB\$1PERF\$1INSIGHTS(‘DOCDB, ‘db-ABCDEFGHIJKLMNOPQRSTUVWXY1’, [‘os.cpuUtilization.idle.avg’, ‘os.cpuUtilization.user.max’])**  |  | 
|  **DIFF** |  TSTS[]  |  TS TS[]  | 返回时间序列中各值与该时间序列中的先前值之间的差值。 |  **DIFF(m1)**  | ✓ | 
|  **DIFF\$1TIME** |  TSTS[]  |  TS TS[]  | 返回时间序列中各值的时间戳与该时间序列中的先前值的时间戳之间的差值（以秒为单位）。 |  **DIFF\$1TIME(METRICS())**  | ✓ | 
|  **FILL** |  TS, [S \$1 REPEAT \$1 LINEAR] TS[], [TS \$1 S \$1 REPEAT \$1 LINEAR]  |  TS TS[]  | 填充时间序列的缺失值。有几个选择可用作缺失值的填充内容： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/using-metric-math.html)  当您在告警中使用此函数时，如果您的指标发布稍有延迟，且最近一分钟从未有数据，则可能会出现问题。在这种情况下，**FILL** 将会以请求的值来替代缺失的数据点。这会导致指标的最新数据点始终为 FILL 值，从而导致告警卡在 OK（正常）或 ALARM（告警）状态。您可以通过使用 M 个告警（共 N 个）来解决此问题。有关更多信息，请参阅 [告警评估](alarm-evaluation.md)。  |  **FILL(m1,10)** **FILL(METRICS(), 0)** **FILL(METRICS(), m1)** **FILL(m1, MIN(m1))** **FILL(m1, REPEAT)** **FILL(METRICS(), LINEAR)**  | ✓ | 
|  **FIRST** **LAST** |  TS[]  |  TS  | 返回时间序列数组中的第一个或最后一个时间序列。这在与 **SORT** 函数结合使用时非常有用。它还可用于从 **ANOMALY\$1DETECTION\$1BAND** 函数中获取高阈值和低阈值。 |  **IF(FIRST(SORT(METRICS(), AVG, DESC))>100, 1, 0)** 查看数组中的最高指标，该指标通过 AVG 进行排序。然后，它为每个数据点返回 1 或 0，具体取决于相应数据点的值是否大于 100。 **LAST(ANOMALY\$1DETECTION\$1BAND(m1))** 将返回异常预测带的上限。  | ✓ | 
|  **FLOOR** |  TSTS[]  |  TS TS[]  | 返回每个指标的下限。下限是小于或等于每个值的最大整数。 |  **FLOOR(m1)** **FLOOR(METRICS())**  | ✓ | 
|  **IF** |  **IF** 表达式  |  TS  | 通过将 **IF** 与比较运算符结合使用，可以从时间序列中筛选出数据点或创建由多个已整理的时间序列组成的混合时间序列。有关更多信息，请参阅 [使用 IF 表达式](#using-IF-expressions)。 | 有关示例，请参阅 [使用 IF 表达式](#using-IF-expressions)。  | ✓ | 
|  **INSIGHT\$1RULE\$1METRIC** |  **INSIGHT\$1RULE\$1METRIC(ruleName, metricName)**  |  TS  | 使用 **INSIGHT\$1RULE\$1METRIC** 可在 Contributor Insights 中从规则提取统计数据。有关更多信息，请参阅 [绘制 CloudWatch 中规则生成的指标的图表为 Contributor Insights 指标数据设置告警](ContributorInsights-GraphReportData.md)。 |   |  | 
|  **LAMBDA** |  **LAMBDA(LambdaFunctionName [, optional-arg]\$1)**  |  TS TS[]  | 调用 Lambda 函数以查询源自非 CloudWatch 数据来源的指标。有关更多信息，请参阅 [如何将参数传递给您的 Lambda 函数](CloudWatch_MultiDataSources-Custom-Use.md#MultiDataSources-Connect-Custom-Lambda-arguments)。 |   |  | 
|  **LOG** |  TS TS[]  |  TS TS[]  | 时间序列的 **LOG** 返回的是该时间序列中每个值的自然对数值。 |  **LOG(METRICS())**  | ✓ | 
|  **LOG10** |  TS TS[]  |  TS TS[]  | 时间序列的 **LOG10** 返回的是该时间序列中每个值的以 10 为底的对数值。 |  **LOG10(m1)**  | ✓ | 
|  **MAX** |  TS TS[]  |  S TS  | 单个时间序列的 **MAX** 将返回一个标量，表示指标中所有数据点的最大值。 如果输入时间序列数组，则 **MAX** 函数会创建并返回一个时间序列，其中包含用作输入的时间序列中每个数据点的最大值。  如果您希望函数返回一个标量，则建议您不要在 CloudWatch 警报中使用此函数。例如，`MAX(m2)` 每当警报评估是否更改状态时，CloudWatch 都会尝试检索高于评估期指定的数量的数据点数。当请求了额外数据时，此函数的行为将有所不同。  |  **MAX(m1)/m1** **MAX(METRICS())**  | ✓ | 
|  **METRIC\$1COUNT** |  TS[]  |  S  | 返回时间序列数组中的指标数量。 |  **m1/METRIC\$1COUNT(METRICS())**  | ✓ | 
|  **METRICS** |  null 字符串  |  TS[]  | **METRICS()** 函数返回的是请求中的所有 CloudWatch 指标。数学表达式不包括在内。 您可以在一个更大的表达式中使用 **METRICS()**，从而最终生成单个时间序列或一组时间序列。 您可以将 **METRICS()** 函数与一个字符串一起使用，仅返回在其 **Id** 字段中包含该字符串的绘成图表的指标。例如，表达式 **SUM(METRICS("errors"))** 一个是所有在其 **Id** 字段中具有“errors”的绘成图表的指标值的总和的时间序列。您还可以使用 **SUM([METRICS(“4xx”), METRICS(“5xx”)])** 来匹配多个字符串。 |  **AVG(METRICS())** **SUM(METRICS("errors"))**  | ✓ | 
|  **MIN** |  TS TS[]  |  S TS  | 单个时间序列的 **MIN** 将返回一个标量，表示指标中所有数据点的最小值。 如果输入时间序列数组，则 **MIN** 函数会创建并返回一个时间序列，其中包含用作输入的时间序列中每个数据点的最小值。 如果输入时间序列数组，则 **MIN** 函数会创建并返回一个时间序列，其中包含用作输入的时间序列中每个数据点的最小值。  如果您希望函数返回一个标量，则建议您不要在 CloudWatch 警报中使用此函数。例如，`MIN(m2)` 每当警报评估是否更改状态时，CloudWatch 都会尝试检索高于评估期指定的数量的数据点数。当请求了额外数据时，此函数的行为将有所不同。  |  **m1-MIN(m1)** **MIN(METRICS())**  | ✓ | 
|  **MINUTE** **HOUR** **DAY** **DATE** **MONTH** **YEAR** **EPOCH** |  TS  |  TS  | 这些函数采用时间序列的周期和范围，并返回一个新的非稀疏时间序列，其中每个值都基于其时间戳。 [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/using-metric-math.html) |  **MINUTE(m1)** **IF(DAY(m1)<6,m1)** 仅返回工作日（即星期一到星期五）的指标。 **IF(MONTH(m1) == 4,m1)** 仅返回 4 月发布的指标。  | ✓ | 
|  **PERIOD** |  TS  |  S  | 以秒为单位返回度量的时间段。有效输入是指标，而不是其他表达式的结果。 |  **m1/PERIOD(m1)**  | ✓ | 
|  **RATE** |  TS TS[]  |  TS TS[] | 返回指标每秒的变化率。此项的计算结果是最新数据点值和上一个数据点值之差除以两个值的秒数之差。  对表达式（此类表达式将 RATE 函数用于具有稀疏数据的指标）设置警报可能会产生无法预测的行为，因为评估告警时获取的数据点范围可能会因上次发布数据点的时间而异。  |  **RATE(m1)** **RATE(METRICS())**  | ✓ | 
|  **REMOVE\$1EMPTY** |  TS[]  |  TS[] | 从时间序列数组中删除所有不带数据点的时间序列。最终将获得一个时间序列数组，其中每个时间序列包含至少一个数据点。  我们建议您不要在 CloudWatch 告警中使用此函数。每当告警评估是否更改状态时，CloudWatch 都会尝试检索高于评估期指定的数量的数据点数。当请求了额外数据时，此函数的行为将有所不同。  |  **REMOVE\$1EMPTY(METRICS())**   | ✓ | 
|  **RUNNING\$1SUM** |  TS TS[]  |  TS TS[]  | 返回一个时间序列，其中包含原始时间序列中值的运行总和。  我们建议您不要在 CloudWatch 告警中使用此函数。每当告警评估是否更改状态时，CloudWatch 都会尝试检索高于评估期指定的数量的数据点数。当请求了额外数据时，此函数的行为将有所不同。  |  **RUNNING\$1SUM([m1,m2])**  | ✓ | 
|  **SEARCH** |  搜索表达式  |  一个或多个 TS  | 返回一个或多个与您指定的搜索条件匹配的时间系列。**SEARCH** 函数使您能够使用一个表达式将多个相关时间序列添加到图表中。该图表会动态更新，以包含稍后添加并与搜索条件匹配的新指标。有关更多信息，请参阅 [在图表中使用搜索表达式](using-search-expressions.md)。 您无法根据 **SEARCH** 表达式创建告警。原因在于搜索表达式会返回多个时间序列，而基于数学表达式的告警只能监视一个时间序列。 如果您登录 CloudWatch 跨账户可观测性中的监控账户，则 **SEARCH** 函数将在源账户和该监控账户中查找指标。 |   | ✓ | 
|  **SERVICE\$1QUOTA** |  作为使用指标的 TS  |  TS  | 返回给定使用指标的服务配额。您可以使用此选项来可视化当前用量与配额的比较情况，并设置在接近配额时向您发送警告的警报。有关更多信息，请参阅 [Amazon 使用情况指标](CloudWatch-Service-Quota-Integration.md)。 |   | ✓ | 
|  **SLICE** |  (TS[], S, S) 或 (TS[], S)  |  TS[] TS  | 检索时间序列数组的一部分。这在与 **SORT** 结合使用时特别有用。例如，可以从时间序列数组中排除顶部结果。 可以使用两个标量参数来定义要返回的时间序列集。这两个标量将定义要返回的数组的开始（包含）和结束（不包含）。该数组从零开始建立索引，因此，数组中的第一个时间序列是时间序列 0。或者，可以仅指定一个值，CloudWatch 将返回以该值开头的所有时间序列。  | **SLICE(SORT(METRICS(), SUM, DESC), 0, 10)** 从请求中的指标数组返回具有最高 SUM 值的 10 个指标。 **SLICE(SORT(METRICS(), AVG, ASC), 5)** 按 AVG 统计数据对指标数组进行排序，然后返回所有时间序列（具有最低 AVG 的 5 个时间序列除外）。  | ✓ | 
|  **SORT** |  (TS[], FUNCTION, SORT\$1ORDER) (TS[], FUNCTION, SORT\$1ORDER, S)  |  TS[]  | 根据您指定的函数，对时间序列数组进行排序。您使用的函数可以是 **AVG**、**MIN**、**MAX** 或 **SUM**。排序顺序可以是 **ASC**（升序，最低值排第一位）或 **DESC**（降序，最高值排第一位）。您可以选择在排序顺序后指定一个数字来充当限制。例如，如果指定的限制为 5，则仅返回排序中的前 5 个时间序列。 当图表上显示此数学函数时，图表中每个指标的标签也将进行排序和编号。  | **SORT(METRICS(), AVG, DESC, 10)** 计算每个时间序列的平均值，对时间序列进行排序（开头为最高值），并仅返回具有最高平均值的 10 个时间序列。 **SORT(METRICS(), MAX, ASC)** 根据 MAX 统计数据对指标数组进行排序，然后以升序顺序返回所有指标。  | ✓ | 
|  **STDDEV** |  TS TS[]  |  S TS  | 单个时间序列的 **STDDEV** 将返回一个标量，表示指标中所有数据点的标准偏差。一组时间序列的 **STDDEV** 将返回单个时间序列。  如果您希望函数返回一个标量，则建议您不要在 CloudWatch 警报中使用此函数。例如，`STDDEV(m2)` 每当警报评估是否更改状态时，CloudWatch 都会尝试检索高于评估期指定的数量的数据点数。当请求了额外数据时，此函数的行为将有所不同。  |  **m1/STDDEV(m1)** **STDDEV(METRICS())**  | ✓ | 
|  **SUM** |  TS TS[]  |  S TS  | 单个时间序列的 **SUM** 将返回一个标量，表示指标中所有数据点的值的总和。一组时间序列的 **SUM** 将返回单个时间序列。  如果您希望函数返回一个标量，则建议您不要在 CloudWatch 警报中使用此函数。例如 `SUM(m1)`。每当告警评估是否更改状态时，CloudWatch 都会尝试检索高于评估期指定的数量的数据点数。当请求了额外数据时，此函数的行为将有所不同。  |  **SUM(METRICS())/SUM(m1)** **SUM([m1,m2])** **SUM(METRICS("errors"))/SUM(METRICS("requests"))\$1100**  | ✓ | 
|  **TIME\$1SERIES** |  S  |  TS  | 返回一个非稀疏时间序列，其中每个值都设置为标量参数。 |  **TIME\$1SERIES(MAX(m1))** **TIME\$1SERIES(5\$1AVG(m1))** **TIME\$1SERIES(10)**  | ✓ | 

**\$1**使用仅返回标量数字的函数是无效的，因为表达式的所有最终结果都必须是单个时间序列或一组时间序列。而应将这些函数用作返回时间序列的较大表达式的一部分。

## 使用 IF 表达式
<a name="using-IF-expressions"></a>

通过将 **IF** 与比较运算符结合使用，可以从时间序列中筛选出数据点或创建由多个已整理的时间序列组成的混合时间序列。

**IF** 使用以下参数：

```
IF(condition, trueValue, falseValue)
```

如果条件数据点的值为 0，则条件的计算结果为 FALSE；如果条件的值为任何其他值（无论该值是正值还是负值），则条件的计算结果为 TRUE。如果条件是一个时间序列，则会为每个时间戳单独计算该条件。

下面列出了有效语法。对于其中的每个语法，输出是单时间序列。
+ **IF(TS *比较运算符* S, S \$1 TS, *S \$1 TS*)**
**注意**  
如果 `TS comparison operator S` 为 TRUE 但 `metric2` 没有对应的数据点，则输出将为 0。
+ **IF(TS, TS, *TS*)**
+ **IF(TS, S, *TS*)**
+ **IF(TS, TS, S)**
+ **IF(TS, S, S)**
+ **IF(S, TS, *TS*)**

以下部分提供了这些语法的更多详细信息和示例。

**IF(TS *比较运算符* S, scalar2 \$1 metric2, scalar3 \$1 metric3)**

对应的输出时间序列值：
+ 如果 **TS* 比较运算符* S** 为 TRUE，则值为 **scalar2** 或 **metric2**
+ 如果 **TS* 比较运算符* S** 为 FALSE，则值为 **scalar3** 或 **metric3**
+ 如果 **TS *比较运算符***为 TRUE 且 **metric2** 中不存在对应的数据点，则值为 **0**。
+ 如果 **TS *比较运算符***为 FALSE 且 **metric3** 中不存在对应的数据点，则值为 **0**。
+ 是一个空白时间序列（如果 **metric3** 中没有对应的数据点，或者如果表达式中省略了 **scalar3**/**metric3**）

**IF(metric1, metric2, *metric3*)**

对于 **metric1** 的每个数据点，对应的输出时间序列值：
+ 值为 **metric2**（如果 **metric1** 的对应数据点为 TRUE）。
+ 值为 **metric3**（如果 **metric1** 的对应数据点为 FALSE）。
+ 值为 **0**（如果 **metric1** 的对应数据点为 TRUE 且 **metric2** 中没有对应的数据点）。
+ 值为 **0**（如果 **metric1** 的对应数据点为 FALSE 且 **metric3** 中没有对应的数据点） 
+ 如果 **metric1** 的对应数据点为 FALSE 且表达式中忽略了 **metric3**，则将被删除
+ 如果 **metric1** 对应的数据点缺失，则将被删除。

下表显示了此语法示例。


| 指标或函数 | 值 | 
| --- | --- | 
|  **(metric1)** |  **[1, 1, 0, 0, -]**  | 
|  **(metric2)** |  **[30, -, 0, 0, 30]**  | 
|  **(metric3)** |  **[0, 0, 20, -, 20]**  | 
|  **IF(metric1, metric2, metric3)** |  **[30, 0, 20, 0, -]**  | 

**IF(metric1, scalar2, metric3)**

对于 **metric1** 的每个数据点，对应的输出时间序列值：
+ 值为 **scalar2**（如果 **metric1** 的对应数据点为 TRUE）。
+ 值为 **metric3**（如果 **metric1** 的对应数据点为 FALSE）。
+ 被删除（如果 **metric1** 的对应数据点为 FALSE 且 **metric3** 中没有对应的数据点，或者如果表达式中省略了 **metric3**）。


| 指标或函数 | 值 | 
| --- | --- | 
|  **(metric1)** |  **[1, 1, 0, 0, -]**  | 
|  **scalar2** |  **5**  | 
|  **(metric3)** |  **[0, 0, 20, -, 20]**  | 
|  **IF(metric1, scalar2, metric3)** |  **[5, 5, 20, -, -]**  | 

**IF(metric1, metric2, scalar3)**

对于 **metric1** 的每个数据点，对应的输出时间序列值：
+ 值为 **metric2**（如果 **metric1** 的对应数据点为 TRUE）。
+ 值为 **scalar3**（如果 **metric1** 的对应数据点为 FALSE）。
+ 值为 **0**（如果 **metric1** 的对应数据点为 TRUE 且 **metric2** 中没有对应的数据点）。
+ 如果 **metric1** 中的相应数据点不存在，则被删除。


| 指标或函数 | 值 | 
| --- | --- | 
|  **(metric1)** |  **[1, 1, 0, 0, -]**  | 
|  **(metric2)** |  **[30, -, 0, 0, 30]**  | 
|  **scalar3** |  **5**  | 
|  **IF(metric1, metric2, scalar3)** |  **[30, 0, 5, 5, -]**  | 

**IF(scalar1, metric2, *metric3*)**

对应的输出时间序列值：
+ 值为 **metric2**（如果 **scalar1** 为 TRUE）。
+ 值为 **metric3**（如果 **scalar1** 为 FALSE）。
+ 是一个空白时间序列（如果表达式中省略了 **metric3**）。

### IF 表达式的使用案例示例
<a name="using-IF-expressions-use-cases"></a>

以下示例说明 **IF** 函数的可能用法。
+ 要仅显示指标的低值，请使用：

  **IF(metric1<400, metric1)**
+ 要将指标中的每个数据点更改为两个值之一，以显示原始指标的相对高值和低值，请使用：

  **IF(metric1<400, 10, 2)**
+ 要为延迟超过阈值的每个时间戳显示 1，并为所有其他数据点显示 0，请使用：

  **IF(latency>threshold, 1, 0)**

### 将指标数学与 GetMetricData API 操作配合使用
<a name="using-metrics-expression-api"></a>

您可以使用 `GetMetricData` 来通过数学表达式执行计算，还可以在一个 API 调用中检索大量指标数据。有关更多信息，请参阅 [GetMetricData](https://docs.amazonaws.cn/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html)。

## 指标数学异常检测
<a name="using-anomaly-detection-on-metric-math"></a>

指标数学异常检测是一项功能，您可以使用该功能针对单个指标和指标数学表达式的输出创建异常检测告警。您可以使用这些表达式来创建能可视化异常检测范围的图表。该功能支持基本的算术函数、比较和逻辑运算符以及大多数其他函数。

**指标数学异常检测不支持以下功能：**
+ 在同一行中包含多个 **ANOMALY\$1DETECTION\$1BAND** 的表达式。
+ 包含 10 个以上指标或数学表达式的表达式。
+ 包含 **METRICS** 表达式的表达式。
+ 包含 **SEARCH** 函数的表达式。
+ 使用 **DP\$1PERF\$1INSIGHTS** 函数的表达式。
+ 以不同时段使用指标的表达式。
+ 使用超过一小时的时段作为输入的表达式。
+ 使用高精度指标作为输入的表达式。

有关此功能的更多信息，请参阅 *Amazon CloudWatch 用户指南*中的[使用 CloudWatch 异常检测](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/CloudWatch_Anomaly_Detection.html#anomaly_detection_on_metric_math)。