

# Amazon CloudWatch 中的指标
<a name="working_with_metrics"></a>

指标是关于您的系统性能的数据。Amazon CloudWatch 通过两种途径收集指标：来自 Amazon EC2、Amazon EBS 和 Amazon RDS 等服务的 AWS 已出售指标，以及您使用 OpenTelemetry Protocol（OTLP）或 CloudWatch API 发布的自定义指标。默认情况下，许多 AWS 服务都提供免费的资源指标。您也可以对某些资源（例如 Amazon EC2 实例）启用详细监控。

CloudWatch 支持两种指标查询语言。Prometheus 查询语言（PromQL）为以 OpenTelemetry 格式发布的 OpenTelemetry 指标和 AWS 已出售指标提供灵活的分析。CloudWatch Metrics Insights 为传统 CloudWatch 指标提供了基于 SQL 的查询引擎。两者都支持绘图、控制面板和警报。

关键主题：
+ [指标概念](cloudwatch_concepts.md)
+ [CloudWatch 中的基本监控和详细监控](cloudwatch-metrics-basic-detailed.md)
+ [发布自定义指标](publishingMetrics.md)
+ [使用 OpenTelemetry 发送指标（新增）](CloudWatch-OpenTelemetry-Sections.md)
+ [将 AWS 已出售指标作为 OpenTelemetry 指标发布（新增）](publishingMetrics.md)
+ [使用 PromQL 查询指标（新增）](CloudWatch-PromQL.md)
+ [使用 CloudWatch Metrics Insights 查询 CloudWatch 指标](query_with_cloudwatch-metrics-insights.md)
+ [使用 Metrics Explorer 按标签和属性监控资源](CloudWatch-Metrics-Explorer.md)
+ [使用指标流](CloudWatch-Metric-Streams.md)
+ [查看可用的指标](viewing_metrics_with_cloudwatch.md)
+ [绘制指标的图表](graph_metrics.md)
+ [使用 CloudWatch 异常检测](CloudWatch_Anomaly_Detection.md)
+ [将数学表达式与 CloudWatch 指标结合使用](using-metric-math.md)
+ [在图表中使用搜索表达式](using-search-expressions.md)
+ [获取指标的统计数据](getting-metric-statistics.md)

# 指标概念
<a name="cloudwatch_concepts"></a>

下面是便于您了解和使用 Amazon CloudWatch 的核心术语和概念：
+ [OpenTelemetry 指标](#OpenTelemetry_metrics)
+ [命名空间](#Namespace)
+ [指标](#Metric)
+ [Dimensions](#Dimension)
+ [解决方案](#Resolution_definition)
+ [统计信息](#Statistic)
+ [百分位数](#Percentiles)
+ [警报](#CloudWatchAlarms)

 有关 CloudWatch 指标、警报、API 请求和警报电子邮件通知的服务限额的信息，请参阅 [CloudWatch 服务限额](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_limits.html)。

## OpenTelemetry 指标
<a name="OpenTelemetry_metrics"></a>

CloudWatch 还支持使用 OpenTelemetry Protocol（OTLP）发送的指标。OpenTelemetry 指标使用的数据模型与传统 CloudWatch 指标不同。OpenTelemetry 指标不使用命名空间和维度，而是使用带有遵循 OpenTelemetry 语义惯例的描述性标签（键值对）的指标名称。OpenTelemetry 指标支持每个指标多达 150 个标签，并支持包括量度类型，包括仪表、总和、直方图和指数直方图在内的指标类型。

OpenTelemetry 指标使用 CloudWatch Query Studio 中的 Prometheus 查询语言（PromQL）或通过兼容 Prometheus 的查询 API 进行查询。您可以在 OpenTelemetry 指标上设置基于 PromQL 的 CloudWatch 警报。

下表总结了 OpenTelemetry 指标与传统 CloudWatch 指标之间的主要区别。


| 概念 | 传统 CloudWatch 指标 | OpenTelemetry 指标 | 
| --- | --- | --- | 
| 身份 | 命名空间，指标名称，最多 30 个维度 | 指标名称，最多 150 个标签 | 
| 指标类型 | 单个值，统计数据集 | 仪表、总和、直方图、指数直方图 | 
| 摄取 | PutMetricData API 或 AWS CLI | OpenTelemetry Protocol（OTLP） | 
| 查询语言 | GetMetricStatistics、Metrics Insights | Prometheus 查询语言（PromQL） | 
| 警报 | 标准 CloudWatch 警报 | 基于 PromQL 的 CloudWatch 警报 | 
| 控制台体验 | CloudWatch Metrics 控制台 | CloudWatch Query Studio | 
| 保留 | 最长达 15 个月，自动汇总 | 30 天（公开预览版） | 

有关更多信息，请参阅[使用 OpenTelemetry 发送指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-OpenTelemetry-Sections.html)。

## 命名空间
<a name="Namespace"></a>

*命名空间*是用于 CloudWatch 指标的容器。不同命名空间中的指标彼此独立，因此来自不同应用程序的指标不会被错误地聚合到相同的统计信息中。

无默认命名空间。您必须为发布到 CloudWatch 的每个数据点指定命名空间。在创建指标时，您可以指定命名空间名称。这些名称必须包含有效的 ASCII 字符，且长度必须等于或少于 255 个字符。可用字符包括：字母数字字符（0-9A-Za-z）、句点（.）、连字符（-）、下划线（\$1）、正斜杠（/）、井号（\$1）、冒号（:）和空格符号。一个命名空间必须包含至少一个非空格字符。

AWS 命名空间通常使用以下命名约定：`AWS/service`。例如，Amazon EC2 使用 `AWS/EC2` 命名空间。有关 AWS 命名空间的列表，请参阅 [发布 CloudWatch 指标的 AWS 服务](aws-services-cloudwatch-metrics.md)。

## 指标
<a name="Metric"></a>

*指标*是 CloudWatch 中的基本概念。指标表示一个发布到 CloudWatch 并按时间排序的数据点集。可将指标视为要监控的变量，而数据点代表该变量随时间变化的值。例如，特定 EC2 实例的 CPU 使用率是 Amazon EC2 提供的一个指标。数据点本身可来自于您从中收集数据的任何应用程序或业务活动。

预设情况下，许多 AWS 服务免费提供资源（例如 Amazon EC2 实例、Amazon EBS 卷和 Amazon RDS 数据库实例）的指标。如需收费，您也可以对某些资源（例如 Amazon EC2 实例）或您自己的应用程序指标启用详细监控。关于自定义指标，您可以您选择的任何顺序和任何速率添加数据点。您可以按一组有序的时间序列数据来检索关于这些数据点的统计数据。

指标仅存在于创建它们的区域中。指标无法删除，但如果在 15 个月后没有向指标发布新数据，这些指标将自动过期。依据滚动机制，15 个月之前的数据点将过期；当新的数据点进入时，15 个月之前的数据将被丢弃。

指标是通过一个名称、一个命名空间以及零个或多个维度进行唯一定义的。指标中的每个数据点都有一个时间戳和一个度量单位（可选）。您可以从 CloudWatch 中检索任何指标的统计数据。

有关更多信息，请参阅 [查看可用的指标](viewing_metrics_with_cloudwatch.md) 和 [发布自定义指标](publishingMetrics.md)。

### 时间戳
<a name="about_timestamp"></a>

每个指标数据点必须与一个时间戳关联。时间戳最长可以为过去的两周和将来的两小时。如果不提供时间戳，CloudWatch 会根据收到数据点的时间创建一个时间戳。

时间戳为 `dateTime` 对象，包含完整的日期以及小时、分钟和秒 (例如，2016-10-31T23:59:59Z)。有关更多信息，请参阅 [dateTime](http://www.w3.org/TR/xmlschema-2/#dateTime)。尽管没有强制要求，但我们建议您使用协调世界时 (UTC)。从 CloudWatch 检索统计数据时，所有时间均采用 UTC。

CloudWatch 告警会基于当前时间 (UTC) 检查指标。发送到 CloudWatch 并且时间戳为非 UTC 时间的自定义指标会导致告警显示**数据不足**状态或产生延迟告警。

### 指标保留
<a name="metrics-retention"></a>

CloudWatch 将保留指标数据，如下所示：
+ 时间段短于 60 秒的数据点的可用时间为 3 小时。这些数据点是高精度自定义指标。
+ 时间段为 60 秒 (1 分钟) 的数据点可用 15 天
+ 时间段为 300 秒（5 分钟）的数据点可用 63 天
+ 时间段为 3600 秒 (1 小时) 的数据点可用 455 天 (15 个月)

最初以较短时间段发布的数据点汇总在一起，可实现长期存储。例如，如果您使用 1 分钟的时间段收集数据，数据以 1 分钟的精度保持 15 天可用。15 天之后，此数据仍可用，但汇总在一起，只能以 5 分钟的精度检索。63 天之后，数据进一步汇总，以 1 小时的精度提供。

**注意**  
控制台中不会显示在过去两周内没有任何新数据点的指标。当您在控制台的 **All metrics**（全部指标）选项卡的搜索框中键入指标名称或维度名称时，它们也不会显示，并且 [list-metrics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/list-metrics.html) 命令的结果中不会返回它们。检索这些指标的最佳方法是使用 AWS CLI 中的 [get-metric-data](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-data.html) 或者 [get-metric-statistics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html) 命令。

## Dimensions
<a name="Dimension"></a>

*维度*是一个名称/值对，它是指标标识的一部分。您可以为一个指标分配最多 30 个维度。

每个指标包含用于描述该指标的特定特征，您可以将维度理解为这些特征的类别。维度可以帮助您设计统计数据计划的结构。因为维度是指标的唯一标识符的一部分，因此无论您在何时向一个指标添加唯一名称/值对，都会创建该指标的一个新变体。

向 CloudWatch 发送数据的 AWS 服务会向每个指标附加维度。您可使用维度筛选 CloudWatch 返回的结果。例如，您可通过在搜索指标时指定 `InstanceId` 维度来获取特定 EC2 实例的统计数据。

对于由特定 AWS 服务（如 Amazon EC2）生成的指标，CloudWatch 可以聚合多个维度的数据。例如，如果您在 `AWS/EC2` 命名空间中搜索指标但不指定任何维度，则 CloudWatch 会聚合指定指标的所有数据以创建您请求的统计数据。CloudWatch 不会跨多个维度聚合自定义指标的数据。

### 维度组合
<a name="dimension-combinations"></a>

CloudWatch 将维度的每种唯一组合视为一个单独的指标，即使指标具有相同的指标名称也是如此。您只能使用已发布的特定维度组合检索统计数据。当您检索统计数据时，为命名空间、指标名称和维度参数指定创建指标时使用的相同值。您还可指定 CloudWatch 要用于聚合的开始和结束时间。

例如，假设您在具有以下属性的 DataCenterMetric 命名空间中发布了 4 个名为 ServerStats 的不同指标：

```
Dimensions: Server=Prod, Domain=Frankfurt, Unit: Count, Timestamp: 2016-10-31T12:30:00Z, Value: 105
Dimensions: Server=Beta, Domain=Frankfurt, Unit: Count, Timestamp: 2016-10-31T12:31:00Z, Value: 115
Dimensions: Server=Prod, Domain=Rio,       Unit: Count, Timestamp: 2016-10-31T12:32:00Z, Value: 95
Dimensions: Server=Beta, Domain=Rio,       Unit: Count, Timestamp: 2016-10-31T12:33:00Z, Value: 97
```

如果您仅发布这 4 个指标，则可检索这些维度组合的统计数据：
+ `Server=Prod,Domain=Frankfurt`
+ `Server=Prod,Domain=Rio`
+ `Server=Beta,Domain=Frankfurt`
+ `Server=Beta,Domain=Rio`

如果您未指定任何维度，则无法检索以下维度的统计数据。（使用指标数学 **SEARCH** 函数时例外，该函数可以检索多个指标的统计数据。有关更多信息，请参阅 [在图表中使用搜索表达式](using-search-expressions.md)。）
+ `Server=Prod`
+ `Server=Beta`
+ `Domain=Frankfurt`
+ `Domain=Rio`

**注意**  
OpenTelemetry 指标使用标签而不是维度。标签的用途类似，但遵循 OpenTelemetry 语义惯例，每个指标最多支持 150 个标签。有关更多信息，请参阅 [OpenTelemetry 指标](#OpenTelemetry_metrics)。

## 解决方案
<a name="Resolution_definition"></a>

每个指标均为以下类型之一：
+ 标准精度，数据粒度为一分钟
+ 高精度，数据粒度为一秒

AWS 服务生成的指标在默认情况下为标准精度。在发布自定义指标时，您可以将其定义为标准精度或高精度。发布高精度指标时，CloudWatch 使用 1 秒的精度来存储指标，您可以按照 1 秒、5 秒、10 秒、30 秒或 60 秒的任意倍数的时间段读取和检索。

高精度指标让您对应用程序的亚分钟级活动有着更详细的直观认识。请记住，每次对自定义指标的 `PutMetricData` 调用都会收取费用，因此对高精度指标频繁调用 `PutMetricData` 会导致较高的费用。有关 CloudWatch 定价的信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

如果对高精度指标设置告警，您可以指定 10 秒或 30 秒时间段的高精度告警，也可以设置 60 秒的任意倍数时间段的定期告警。10 秒或 30 秒时间段的高精度警报会产生较高的费用。

**注意**  
OpenTelemetry 指标以发送的分辨率进行摄取，没有最低粒度限制。OpenTelemetry 指标的分辨率和汇总行为与传统 CloudWatch 指标不同。

## 统计信息
<a name="Statistic"></a>

*统计数据*是指定时间段内的指标数据汇总。CloudWatch 提供统计数据的依据是您的自定义数据所提供的指标数据点，或其他 AWS 服务向 CloudWatch 提供的指标数据点。聚合通过使用命名空间、指标名称、维度以及数据点度量单位在您指定的时间段内完成。

有关 CloudWatch 支持的统计数据的详细定义，请参阅 [CloudWatch 统计数据定义](Statistics-definitions.md)。

## 单位
<a name="Unit"></a>

所有统计数据都有度量单位。示例单位包括 `Bytes`、`Seconds`、`Count` 和 `Percent`。有关 CloudWatch 支持的单位的完整列表，请参阅 *Amazon CloudWatch API 参考*中的 [MetricDatum](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html) 数据类型。

您可在创建自定义指标时指定单位。如果未指定单位，CloudWatch 将使用 `None` 作为单位。单位帮助为数据提供概念意义。尽管在内部单位对于 CloudWatch 无重大意义，但其他应用程序还是可以根据单位得到语义信息。

指定度量单位的指标数据点是单独聚合的。当获得统计数据而不指定单位时，CloudWatch 会将相同单位的所有数据点聚合在一起。如果有两个完全相同的指标包含不同的单位，则每个单位会各返回一个数据流。

## 时间段
<a name="CloudWatchPeriods"></a>

*时间段*是与特定 Amazon CloudWatch 统计数据关联的时间的长度。每项统计信息代表在指定时间段内对收集的指标数据的聚合。时间段以秒为单位定义，时间段的有效值为 1、5、10、30 或 60 的任意倍数。例如，要指定六分钟的时间段，时间段的值应为 360。通过改变时间段的长度可以调整数据聚合的方式。该期限的默认值为 60 秒。期限可以短至一秒，如果期限大于默认值 60 秒，则必须为 60 的倍数。

只有您使用 1 秒的存储精度定义的自定义指标支持亚分钟级时间段。虽然设置为低于 60 的时间段的选项在控制台中始终可用，但您应选择与指标存储方式相符的时间段。有关支持亚分钟级时间段的指标的更多信息，请参阅[高精度指标](publishingMetrics.md#high-resolution-metrics)。

当您检索统计数据时，可指定时间段、开始时间和结束时间。这些参数决定了与统计数据关联的时间的总长度。开始时间和结束时间的默认值将让您获得上一小时的统计数据。您指定的开始时间值和结束时间值将确定 CloudWatch 返回的时间段的数量。例如，使用时间段、开始时间和结束时间的默认值检索统计数据将返回上一小时内每分钟的聚合统计数据集。如果您想要以 10 分钟为一块来聚合统计信息，请指定时间段 600。对于一个完整小时内聚合的统计数据，请指定时间段 3600。

当对某个时段的统计数据进行聚合时，将为聚合的数据标记上对应的时段起始时间。例如，从晚上 7:00 到晚上 8:00 聚合的数据将会加上晚上 7:00 的时间戳。此外，在晚上 7:00 和晚上 8:00 之间聚合的数据将在晚上 7:00 开始可见，然后该聚合数据的值可能会随着 CloudWatch 收集该时间段内的更多样本而发生更改。

时间段对 CloudWatch 告警也很重要。当您创建告警以监控特定指标时，您是在要求 CloudWatch 将该指标与指定的阈值进行比较。您对 CloudWatch 如何进行此比较拥有广泛的控制力。您不仅能够指定进行比较的时间段，还能够指定用于得出结论的评估期间的数目。例如，如果您指定三个评估期间，则 CloudWatch 将比较三个数据点的时间段。CloudWatch 仅告知您最旧的数据点是否超出阈值以及其他数据点是否超出阈值或丢失。

## 聚合
<a name="CloudWatchAggregation"></a>

Amazon CloudWatch 将根据您在检索统计数据时指定的时间段长度聚合统计数据。您可以根据需要发布任意数量包含相同或类似时间戳的数据点。CloudWatch 会根据指定周期长度聚合这些数据点。CloudWatch 不会跨区域自动聚合数据，但您可以使用指标数学来聚合来自不同区域的指标。

您可以为具有相同时间戳、相同命名空间和维度的指标发布数据点。CloudWatch 会返回这些数据点的聚合统计数据。还可以为包含任意时间戳的相同或不同指标发布多个数据点。

对于大型数据集，您可插入称为*统计数据集*的预先汇总数据集。通过统计数据集，可以让 CloudWatch 为一定数量的数据点提供 Min、Max、Sum 和 SampleCount。当您需要在一分钟内多次收集数据时，通常可以使用它。例如，假设您拥有一个关于网页请求延迟的指标。对命中的每一个网页都发布数据毫无意义。建议您收集该网页的所有点击延迟，每分钟汇总一次，然后将统计数据集发送到 CloudWatch。

Amazon CloudWatch 不会区分指标的来源。如果从不同的来源发布包含相同命名空间和维度的一个指标，则 CloudWatch 会将其视为一个单独的指标。这对分布式扩展型系统中的服务指标有其作用。例如，Web 服务器应用程序中的所有主机都可以发布表示其正在处理的请求延迟的相同指标。CloudWatch 会将这些指标视为单一指标，以便您可以获取应用程序中所有请求的最小值、最大值、平均值和总和的统计数据。

## 百分位数
<a name="Percentiles"></a>

*百分位数*指示某个值在数据集中的相对位置。例如，第 95 个百分位数表示 95% 的数据低于此值，5% 的数据高于此值。百分位数可帮助您更好地了解指标数据的分布情况。

百分位数通常用于隔离异常值。在正态分布中，95% 的数据在平均值的两个标准偏差范围内，99.7% 的数据在平均值的三个标准偏差范围内。落在三个标准偏差之外的任何数据通常被认为是异常值，因为它与平均值相差很多。例如，假设您正在监控 EC2 实例的 CPU 使用率，以确保客户有良好的体验。如果您监控平均值，这可以隐藏异常值。如果您监控最大值，单个异常值可能会使结果出现偏差。使用百分位数，您可以监控 CPU 使用率的第 95 个百分位数，以检查负载异常重的实例。

某些 CloudWatch 指标支持百分位数作为统计数据。对于这些指标，您可以使用百分位数监控您的系统和应用程序，就像使用其他 CloudWatch 统计数据（平均值、最小值、最大值和总和）一样。例如，在创建警报时，可以使用百分位数作为统计函数。您可以指定最多十个小数位的百分位数（例如 p95.0123456789）。

百分位数统计数据可用于自定义指标，只要您为自定义指标发布原始、未经汇总的数据点即可。当任何指标值为负数时，百分位数统计数据不可用于指标。

CloudWatch 需要原始数据点来计算百分位数。如果您改用统计数据集发布数据，只有满足以下条件之一，才能检索此数据的百分位数统计数据：
+ 统计数据集的 SampleCount 值为 1，且最小值、最大值和总和均相等。
+ 最小值和最大值相等，总和等于最小值乘以 SampleCount。

以下 AWS 服务包含支持百分位数统计的指标。
+ API Gateway
+ Application Load Balancer
+ Amazon EC2
+ Elastic Load Balancing
+ Kinesis
+ Lambda
+ Amazon RDS

CloudWatch 还支持切尾均值和其他性能统计数据，这些统计数据的使用与百分位数类似。有关更多信息，请参阅 [CloudWatch 统计数据定义](Statistics-definitions.md)。

## 警报
<a name="CloudWatchAlarms"></a>

您可使用*警报* 代表您自动发起操作。警报在指定的时间段内监控单个指标，并根据指标值相对于阈值的变化情况执行一项或多项指定操作。操作是一个发送到 Amazon SNS 主题或 Auto Scaling 策略的通知。您还可以将警报添加到控制面板。

告警仅为持续状态更改调用操作。CloudWatch 告警将不会调用操作，因为这些操作处于特定状态。该状态必须已改变并在指定的若干个时间段内保持不变。

创建警报时，请选择一个大于或等于指标的精度的警报监控周期。例如，对 Amazon EC2 进行的基本监控每隔 5 分钟提供一次实例指标。为基本监控指标设置警报时，选择的时间段至少应为 300 秒（5 分钟）。对 Amazon EC2 的详细监控以 1 分钟的精度提供实例指标。当为详细监控指标设置警报时，选择的时间段至少为 60 秒 (1 分钟)。

 如果对高精度指标设置告警，您可以指定 10 秒或 30 秒时间段的高精度告警，也可以设置 60 秒的任意倍数时间段的定期告警。高精度告警的费用较高。有关高精度指标的更多信息，请参阅 [发布自定义指标](publishingMetrics.md)。

有关更多信息，请参阅[使用 Amazon CloudWatch 告警](CloudWatch_Alarms.md)和[从图表上的指标创建告警](create_alarm_metric_graph.md)。

对于 OpenTelemetry 指标，可以创建基于 PromQL 的 CloudWatch 警报。这些警报使用 PromQL 查询来定义警报条件，使用的查询语言与 CloudWatch Query Studio 中提供的查询语言相同。

# CloudWatch 中的基本监控和详细监控
<a name="cloudwatch-metrics-basic-detailed"></a>

CloudWatch 提供两类监控：*基本监控*和*详细监控*。

很多 AWS 服务通过向 CloudWatch 发布一组默认指标来提供基本监控，而不会为客户产生费用。默认情况下，当您开始使用其中某一 AWS 服务 时，将自动启用基本监控。有关提供基本监控的服务的列表，请参阅 [发布 CloudWatch 指标的 AWS 服务](aws-services-cloudwatch-metrics.md)。

仅有一些服务提供详细监控。它还会产生费用。要将其用于 AWS 服务，您必须选择激活它。有关定价的更多信息，请参见 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing)。

详细监控选项因提供这种监控的服务而异。例如，Amazon EC2 详细监控提供了更频繁的指标，每隔一分钟发布一次，而不是 Amazon EC2 基本监控中每五分钟发布一次。针对 Amazon S3 和 Amazon Managed Streaming for Apache Kafka 进行详细监控，意味着指标会更精细。

在不同 AWS 服务中，详细监控也有不同名称。例如，在 Amazon EC2 中，它被称为详细监控；在 AWS Elastic Beanstalk 中，它被称为增强监控；而在 Amazon S3 中，它被称为请求指标。

针对 Amazon EC2 使用详细监控，可帮助您更好地管理 Amazon EC2 资源，以便您可以找到趋势并更快地采取措施。对于 Amazon S3，请求指标每隔一分钟可以使用一次，可帮助您快速识别运行问题，并针对其采取措施。在 Amazon MSK 上，当您启用 `PER_BROKER`、`PER_TOPIC_PER_BROKER` 或 `PER_TOPIC_PER_PARTITION` 级别监控时，您将获得可以提供更多可见性的额外指标。

下表列出了提供详细监控的服务。它还包括指向这些服务的文档的链接，这些文档说明了关于详细监控的更多信息，并提供了如何激活该功能的说明。


| 服务 | 文档 | 
| --- | --- | 
|  Amazon API Gateway  |  [ API Gateway 指标的维度](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-metrics-and-dimensions.html#api-gateway-metricdimensions)  | 
|  AWS AppSync  |  [CloudWatch 指标](https://docs.aws.amazon.com/appsync/latest/devguide/monitoring.html#cw-metrics)  | 
|  Amazon CloudFront  |  [ 查看其他 CloudFront 分配指标](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/viewing-cloudfront-metrics.html#monitoring-console.distributions-additional)  | 
|  Amazon EC2  |  [管理 EC2 实例的详细监测](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/manage-detailed-monitoring.html)  | 
|  Elastic Beanstalk  | [ 增强型运行状况报告和监控](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/health-enhanced.html)  | 
|  Amazon Kinesis Data Streams  |  [ 增强的分片级指标](https://docs.aws.amazon.com/streams/latest/dev/monitoring-with-cloudwatch.html#kinesis-metrics-shard)  | 
|  AWS Lambda  |  [事件源映射指标](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics-types.html#event-source-mapping-metrics)  | 
|  Amazon MSK  |  [用于使用 CloudWatch 进行监控的 Amazon MSK 指标](https://docs.aws.amazon.com/msk/latest/developerguide/metrics-details.html)  | 
|  Amazon S3  |  [CloudWatch 中的 Amazon S3 请求指标](https://docs.aws.amazon.com/AmazonS3/latest/userguide/metrics-dimensions.html#s3-request-cloudwatch-metrics)  | 
|  Amazon SES  |  [使用 Amazon SES 事件发布功能收集 CloudWatch 详细监控指标](https://docs.aws.amazon.com/ses/latest/dg/event-publishing-add-event-destination-cloudwatch.html#event-publishing-add-event-destination-cloudwatch-dimensions)。  | 

此外，CloudWatch 还提供开箱即用的监测解决方案，其中包含更详细的指标和为某些 AWS 服务预创建的控制面板，如下表所示。


| 服务 | 功能文档 | 
| --- | --- | 
|  Lambda  |  [ Lambda Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Lambda-Insights.html)  | 
|  Amazon ECS  |  [ 适用于 Amazon ECS 的 Container Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/deploy-container-insights-ECS.html)  | 
|  Amazon EKS  |  [ 适用于 Amazon EKS 和 Kubernetes 的 Container Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/deploy-container-insights-EKS.html)  | 
|  Amazon RDS  |  [CloudWatch Database Insights](Database-Insights.md)  | 
|  Amazon Aurora  |  [CloudWatch Database Insights](Database-Insights.md)  | 

# 使用 CloudWatch Metrics Insights 查询 CloudWatch 指标
<a name="query_with_cloudwatch-metrics-insights"></a>

CloudWatch Metrics Insights 是一个功能强大的高性能 SQL 查询引擎，您可以使用它来大规模查询指标。您可以实时识别 CloudWatch 所有指标的趋势和模式，并可访问长达两周的历史数据，开展全面的趋势分析。

您还可以对返回单个时间序列的任何 Metrics Insights 查询设置告警。这对于创建告警以监视基础设施或应用程序实例集的聚合指标特别有用。只需创建一次告警，它就会随着实例集添加或删除资源而动态调整。

 您可以使用 CloudWatch Metrics Insights 查询编辑器在控制台中执行 CloudWatch Metrics Insights 查询。您还可以通过运行 `GetMetricData` 或 `PutDashboard` 来使用 AWS CLI 或 AWS SDK 执行 CloudWatch Metrics Insights 查询。使用 CloudWatch Metrics Insights 查询编辑器运行的查询不收取任何费用。有关 CloudWatch 定价的信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

 通过 CloudWatch Metris Insights 查询编辑器，您可以从各种预构建的示例查询中进行选择，也可以创建自己的查询。在创建查询时，您可以利用构建器视图浏览现有的指标和维度。或者，也可以利用编辑器视图手动编写查询。

借助 Metric Insights，您可以大规模运行查询。通过 **GROUP BY** 子句，您可以将指标实时分组为每个特定维度值的不同时间序列。Metrics Insights 查询包含**排序依据**功能，因此您可以使用 Metrics Insights 执行“前 N 个”类型的查询。例如，“前 N 个”类型的查询可以扫描账户中的数百万个指标，并返回 CPU 占用量最大的前 10 个实例。这有助于查明和修复应用程序中的延迟问题。若要为警报添加标签功能，需通过 CloudWatch 设置启用该功能。标签功能启用后，还可借助 AWS 资源标签对指标进行筛选和分组，从而能够按组织架构维度（如按应用程序、环境或团队）查询指标数据，实现指标与组织架构的精准匹配。

**Topics**
+ [在 CloudWatch Metrics Insights 中构建查询](cloudwatch-metrics-insights-buildquery.md)
+ [CloudWatch Metrics Insights 中的查询组件和语法](cloudwatch-metrics-insights-querylanguage.md)
+ [CloudWatch 中的 CloudWatch Metrics Insights 查询警报](cloudwatch-metrics-insights-alarms.md)
+ [将 Metrics Insights 查询与指标数学配合使用](cloudwatch-metrics-insights-math.md)
+ [使用自然语言生成与更新 CloudWatch Metrics Insights 查询](cloudwatch-metrics-insights-query-assist.md)
+ [SQL 推理](cloudwatch-metrics-insights-inference.md)
+ [Metrics Insights 配额](cloudwatch-metrics-insights-limits.md)
+ [Metrics Insights 示例查询](cloudwatch-metrics-insights-queryexamples.md)
+ [Metrics Insights 术语表](cloudwatch-metrics-insights-glossary.md)
+ [Metrics Insights 问题排查](cloudwatch-metrics-insights-troubleshooting.md)

# 在 CloudWatch Metrics Insights 中构建查询
<a name="cloudwatch-metrics-insights-buildquery"></a>

您可以使用 CloudWatch 控制台、AWS CLI 或者 AWS SDK 来运行 CloudWatch Metrics Insights 查询。在控制台中运行的查询免费。有关 CloudWatch 定价的信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

借助 CloudWatch Metrics Insights，您可以分析长达两周的指标数据，与较短的保留期相比，可以实现更全面的历史分析和趋势识别。为了在查询较长的时间范围时获得最佳效果，建议采用更大的时间粒度（例如 5 分钟或 1 小时）来减少返回的数据点数。在分析整整两周的趋势时，请在 ORDER BY 子句中使用 AVG() 或 MAX() 之类的聚合函数来有效地识别模式。

有关使用 AWS SDK 执行 Metrics Insights 查询的更多信息，请参阅 [GetMetricData](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html)。

要使用 CloudWatch 控制台运行查询，请执行以下步骤：

**使用 Metrics Insights 查询指标**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. （可选）要运行预构建的示例查询，请选择 **Add query**（添加查询），然后选择要运行的查询。如果您对此查询满意，您可以跳过此过程的其余部分。或者，您可以选择 **Editor**（编辑器）来编辑示例查询，然后选择 **Run**（运行）以运行修改后的查询。

1. 要创建您自己的查询，请选择**多来源查询**。您可通过**构建器**视图（默认视图）获得向导式操作体验；若希望直接编写查询语法，可切换到**编辑器**视图。您可以随时在两个视图之间切换，并在两个视图中查看正在进行的工作。

   在**构建器**视图中，单击命名空间、指标名称、筛选条件、分组、排序及限制条件对应的输入框，即可浏览并选择可选值。您也可在输入框中输入目标值的任意部分，对构建器展示的候选列表进行筛选。筛选条件和分组的输入框中可引用资源标签。

   在**编辑器**视图中，您可使用 Metrics Insights 支持的 SQL 子集编写查询语句。编辑器会根据您已输入的字符提供自动补全建议，包括支持标签的指标对应的资源标签名称。

   CloudWatch Metrics Insights 支持按 AWS 资源标签查询指标。您可通过标签对指标数据进行筛选和分组，实现更具针对性的监控与分析。

   以下示例将演示如何在查询语句中结合标签使用。

   查看生产环境中 Amazon EC2 实例的 CPU 利用率：

   ```
   SELECT MAX(CPUUtilization) FROM SCHEMA("AWS/EC2") WHERE tag.env='prod'
   ```

   使用 GROUP BY 子句按环境维度对指标进行分组：

   ```
   SELECT MAX(CPUUtilization) FROM SCHEMA("AWS/EC2") GROUP BY tag.env
   ```

   在 GROUP BY 子句中指定标签名的用法：

   ```
   SELECT AVG(CPUUtilization) FROM "AWS/EC2" GROUP BY tag."aws:cloudformation:stack-name"
   ```

   将标签查询与现有指标维度相结合：

   ```
   SELECT MAX(CPUUtilization) FROM SCHEMA("AWS/EC2") WHERE tag.env='prod' AND InstanceId='i-1234567890abcdef0'
   ```

1. 如果对查询感到满意，请选择 **Run**（运行）。

1. （可选）编辑已绘制图表查询的另一种方法是选择 **Graphed metrics**（已绘制图表指标）选项卡，然后选择 **Details**（详细信息）列中查询公式旁边的编辑图标。

1. （可选）要从图表中删除查询，请选择 **Graphed metrics**（已绘制图表指标），然后选择显示查询一行右侧的 **X** 图标。

# CloudWatch Metrics Insights 中的查询组件和语法
<a name="cloudwatch-metrics-insights-querylanguage"></a>

CloudWatch Metrics Insights 语法如下。

```
SELECT FUNCTION(metricName)
FROM namespace | SCHEMA(...)
[ WHERE labelKey OPERATOR labelValue [AND ... ] ]
[ GROUP BY labelKey [ , ... ] ]
[ ORDER BY FUNCTION() [ DESC | ASC ] ]
[ LIMIT number ]
```

Metrics Insights 查询中可能的子句如下。关键字不区分大小写，但是指标名称、命名空间和维度等标识符需区分大小写。

**SELECT**  
必需。指定用于聚合每个时间段的观测值的函数（由提供的时段确定）。还可以指定要查询的指标的名称。  
**FUNCTION** 的有效值为 `AVG`、`COUNT`、`MAX`、`MIN` 和 `SUM`。  
+ `AVG` 计算查询匹配的观测值的平均值。
+ `COUNT` 返回查询匹配的观测值的计数。
+ `MAX` 返回查询匹配的观测值的最大值。
+ `MIN` 返回查询匹配的观测值的最小值。
+ `SUM` 计算查询匹配的观测值的总和。

**FROM**  
必需。指定指标源。您可以指定包含要查询的指标的指标命名空间，也可以指定 **SCHEMA** 表函数。指标命名空间的示例包括：`"AWS/EC2"`、`"AWS/Lambda"` 以及您为自定义指标创建的指标命名空间。  
包括 **/** 或任何其他不是字母、数字或下划线的字符在内的指标命名空间必须放在双引号中。有关更多信息，请参阅 [什么内容需要引号或转义字符？](#cloudwatch-metrics-insights-syntaxdetails)。  
**SCHEMA**  
一个可以在 **FROM** 子句中使用的可选表函数。使用 **SCHEMA** 将查询结果范围缩小到仅与维度列表完全匹配的指标或没有维度的指标。  
如果您使用 **SCHEMA** 子句，它必须包含至少一个参数，并且第一个参数必须是被查询的指标命名空间。如果您仅用此命名空间参数指定 **SCHEMA**，则结果范围只限于没有任何维度的指标。  
如果您使用其他参数指定 **SCHEMA**，命名空间参数之后的其他参数必须为*标注*键。标签键必须是维度名称。如果您指定了一个或多个标签键，则结果范围仅限于具有该确切维度集的指标。这些标签键的顺序无关紧要。  
例如：  
+ **SELECT AVG(CPUUtilization) FROM "AWS/EC2"** 匹配 `AWS/EC2` 命名空间中的所有 `CPUUtilization` 指标（无论它们的维度如何），并且会返回单个聚合时间序列。
+ **SELECT AVG(CPUUtilization) FROM SCHEMA("AWS/EC2")** 只匹配 `AWS/EC2` 命名空间中没有定义任何维度的 `CPUUtilization` 指标。
+ **SELECT AVG(CPUUtilization) FROM SCHEMA("AWS/EC2", InstanceId)** 只匹配向 CloudWatch 报告且只有一个维度（即 `CPUUtilization`）的 `InstanceId` 指标。
+ **SELECT SUM(RequestCount) FROM SCHEMA("AWS/ApplicationELB", LoadBalancer, AvailabilityZone)** 只匹配从 `AWS/ApplicationELB` 向 CloudWatch 报告且只带有 `LoadBalancer` 和 `AvailabilityZone` 两个维度的 `RequestCount` 指标。

**WHERE**  
可选。使用一个或多个标签键的特定标签值，将结果筛选为仅与指定表达式匹配的指标。例如，**WHERE InstanceType = 'c3.4xlarge'** 将结果筛选为仅 `c3.4xlarge` 实例类型，**WHERE InstanceType \$1= 'c3.4xlarge'** 将结果筛选为除 `c3.4xlarge` 外的所有实例类型。  
在监控账户中运行查询时，可以利用 `WHERE AWS.AccountId` 将查询结果限制到指定账户。例如，`WHERE AWS.AccountId=444455556666` 仅查询账户 `444455556666` 的指标。要将查询限制为仅限监控账户本身中的指标，请使用 `WHERE AWS.AccountId=CURRENT_ACCOUNT_ID()`。  
标签值必须始终放在单引号中。  
**在 WHERE 子句中使用标签**  
可通过 `tag.keyName` 语法，按 AWS 资源标签筛选查询结果。标签筛选遵循与维度筛选相同的运算符规则。例如：  
+ WHERE `tag.env = 'prod'`：筛选出标签为 *env=prod* 的资源对应的指标
+ WHERE `tag.department != 'test'`：排除标签为 *department=test* 的资源对应的指标
标签筛选可与维度筛选组合使用：  
`WHERE tag.env = 'prod' AND InstanceType = 'm5.large'`  
**支持的运算符**  
**WHERE** 子句支持以下运算符：  
+ **=** 标签值必须与指定的字符串匹配。
+ **\$1=** 标签值不得与指定的字符串匹配。
+ **AND** 指定的两个条件都必须为真才能匹配。您可以使用多个 **AND** 关键字来指定两个或更多条件。

**GROUP BY**  
可选。将查询结果分组为多个时间序列，每个时间序列对应指定的一个或多个标签键的不同值。例如，使用 `GROUP BY InstanceId` 为每个 `InstanceId` 值返回不同的时间序列。使用 `GROUP BY ServiceName, Operation` 为 `ServiceName` 和 `Operation` 值的每个可能组合创建不同的时间序列。  
通过 **GROUP BY** 子句，默认情况下，将使用 **GROUP BY** 子句中指定的标签序列将结果按字母升序排列。要更改结果的顺序，请在查询中添加 **ORDER BY** 子句。  
在监控账户中运行查询时，您可以使用 `GROUP BY AWS.AccountId` 来按照结果的来源账户对结果进行分组。  
**在 GROUP BY 子句中使用标签**  
可通过 `tag.keyName` 语法，按 AWS 资源标签的值对查询结果进行分组。例如：  
+ *GROUP BY tag.environment*：按环境标签的不同取值生成独立的时间序列
+ *GROUP BY tag.team, InstanceType*：同时按标签和维度的取值进行分组
+ *GROUP BY tag.team, AWS.AccountId*：同时按标签和关联的源账户 ID 进行分组
如果某些匹配的指标不包含 **GROUP BY** 子句中指定的标签键，则会返回名为 `Other` 的空组。例如，如果指定 `GROUP BY ServiceName, Operation` 而且某些返回的指标不包括作为维度的 `ServiceName`，则这些指标将显示为将 `Other` 作为 `ServiceName` 的值。

**ORDER BY**  
可选。如果查询返回多个时间序列，则指定返回的时间序列的使用顺序。该顺序基于您在 **ORDER BY** 子句中指定的 **FUNCTION** 找到的值。**FUNCTION** 用于计算每个返回的时间序列中的单个标量值，该值用于确定顺序。  
还可以指定使用升序 **ASC** 或降序 **DESC**。如果您省略这一步，则默认为升序 **ASC**。  
例如，添加 `ORDER BY MAX() DESC` 子句将按时间范围内观察到的最大数据点以降序对结果进行排序：这意味着具有最高最大数据点的时间序列会首先返回。  
要在 **ORDER BY** 子句中使用的有效函数为 `AVG()`、`COUNT()`、`MAX()`、`MIN()` 和 `SUM()`。  
如果您将 **ORDER BY** 子句与 **LIMIT** 子句配合使用，则生成的查询为“前 N 个”查询。**ORDER BY** 对于可能返回大量指标的查询也很有用，因为每个查询返回的时间序列不超过 500 个。如果查询匹配超过 500 个时间序列，并且您使用 **ORDER BY** 子句并对时间序列进行排序，则排序中前 500 个时间序列是返回的时间序列。

**LIMIT**  
可选。将查询返回的时间序列数量限制为指定的值。您可以指定的最大值为 500，而不指定 **LIMIT** 的查询也可以返回不超过 500 个时间序列。  
将 **LIMITED** 子句与 **ORDER BY** 子句配合使用，将获得“前 N 个”查询。

## 什么内容需要引号或转义字符？
<a name="cloudwatch-metrics-insights-syntaxdetails"></a>

在查询中，标签值必须始终放在单引号中。例如，**SELECT MAX(CPUUtilization) FROM "AWS/EC2" WHERE AutoScalingGroupName = 'my-production-fleet'**。

包含字母、数字和下划线 (\$1) 以外的字符的指标命名空间、指标名称和标签键必须放在双引号中。例如，**SELECT MAX("My.Metric")**。

如果其中一个已包含双引号或单引号（如 `Bytes"Input"`），您必须用反斜杠转义每个引号，如 **SELECT AVG("Bytes\$1"Input\$1"")**。

如果指标命名空间、指标名称或标签键包含的词为 Metrics Insights 中的保留关键字，则这些词也必须放在双引号中。例如，如果您有名为 `LIMIT` 的指标，您可以使用 `SELECT AVG("LIMIT")`。将任何命名空间、指标名称或标签（即使不包含保留关键字）放在双引号中也有效。

有关保留关键字的完整列表，请参阅 [保留关键字](cloudwatch-metrics-insights-reserved-keywords.md)。

## 逐步构建丰富的查询
<a name="cloudwatch-metrics-insights-syntaxexample"></a>

本节说明了如何逐步构建一个使用所有可能子句的完整示例。

您可从以下查询开始，该查询聚合了使用 `LoadBalancer` 和 `AvailabilityZone` 两个维度收集的所有应用程序负载均衡器 `RequestCount` 指标。

```
SELECT SUM(RequestCount) 
FROM SCHEMA("AWS/ApplicationELB", LoadBalancer, AvailabilityZone)
```

如果只想查看来自特定负载均衡器的指标，您可以添加 **WHERE** 子句，将返回的指标限制为 `LoadBalancer` 维度的值为 `app/load-balancer-1` 的指标。

```
SELECT SUM(RequestCount) 
FROM SCHEMA("AWS/ApplicationELB", LoadBalancer, AvailabilityZone)
WHERE LoadBalancer = 'app/load-balancer-1'
```

前面的查询将此负载均衡器的所有可用区中的 `RequestCount` 指标聚合为一个时间序列。如果想看到每个可用区的不同时间序列，可以添加 **GROUP BY** 子句。

```
SELECT SUM(RequestCount) 
FROM SCHEMA("AWS/ApplicationELB", LoadBalancer, AvailabilityZone)
WHERE LoadBalancer = 'app/load-balancer-1'
GROUP BY AvailabilityZone
```

接下来可对查询结果进行排序，优先展示数值最大的结果。以下 **ORDER BY** 子句按查询时间范围内每个时间序列报告的最大值以降序对时间序列进行排序：

```
SELECT SUM(RequestCount) 
FROM SCHEMA("AWS/ApplicationELB", LoadBalancer, AvailabilityZone)
WHERE LoadBalancer = 'app/load-balancer-1'
GROUP BY AvailabilityZone
ORDER BY MAX() DESC
```

您也可通过标签对查询结果做进一步筛选。例如，若希望仅查看带有特定环境标签的负载均衡器对应的结果，可在 WHERE 子句中添加标签筛选条件：

```
SELECT SUM(RequestCount) FROM SCHEMA("AWS/ApplicationELB", LoadBalancer, AvailabilityZone) WHERE LoadBalancer = 'app/load-balancer-1' AND tag.Environment = 'prod' GROUP BY AvailabilityZone ORDER BY MAX() DESC
```

您也可依据标签值对查询结果进行分组，替代维度分组（或在维度分组基础上叠加标签值分组）。例如，按应用程序标签分组：

```
SELECT SUM(RequestCount) FROM SCHEMA("AWS/ApplicationELB", LoadBalancer, AvailabilityZone) WHERE tag.Environment = 'prod' GROUP BY tag.Application ORDER BY MAX() DESC
```

最后，如果我们主要对“前 N 个”类型的查询感兴趣，我们可以使用 **LIMIT** 子句。这最后一个例子将结果限制为仅带有五个最高 `MAX` 值的时间序列。

```
SELECT SUM(RequestCount) 
FROM SCHEMA("AWS/ApplicationELB", LoadBalancer, AvailabilityZone)
WHERE LoadBalancer = 'app/load-balancer-1'
GROUP BY AvailabilityZone
ORDER BY MAX() DESC
LIMIT 5
```

## 跨账户查询示例
<a name="cloudwatch-metrics-insights-crossaccount"></a>

这些示例在 CloudWatch 跨账户可观测性中设置为监控账户的账户中运行时有效。

以下示例搜索源账户 123456789012 中的所有 Amazon EC2 实例并返回平均值。

```
SELECT AVG(CpuUtilization) 
FROM "AWS/EC2" 
WHERE AWS.AccountId ='123456789012'
```

以下示例查询所有关联源账户中 `AWS/EC2` 的 `CPUUtilization` 指标，并按账户 ID 和实例类型对结果进行分组。

```
SELECT AVG(CpuUtilization) 
FROM "AWS/EC2" 
GROUP BY AWS.AccountId, InstanceType
```

以下示例查询监控账户本身中的 `CPUUtilization`。

```
SELECT AVG(CpuUtilization) 
FROM "AWS/EC2" 
WHERE AWS.AccountId = CURRENT_ACCOUNT_ID()
```

# 保留关键字
<a name="cloudwatch-metrics-insights-reserved-keywords"></a>

以下是 CloudWatch Metrics Insights 中的保留关键字。如果查询中的命名空间、指标名称或标签键中包含这些词中的任何一个，则必须将其放在双引号中。保留关键字不区分大小写。

```
"ABORT" "ABORTSESSION" "ABS" "ABSOLUTE" "ACCESS" "ACCESSIBLE" "ACCESS_LOCK" "ACCOUNT" "ACOS" "ACOSH" "ACTION" "ADD" "ADD_MONTHS"
"ADMIN" "AFTER" "AGGREGATE" "ALIAS" "ALL" "ALLOCATE" "ALLOW" "ALTER" "ALTERAND" "AMP" "ANALYSE" "ANALYZE" "AND" "ANSIDATE" "ANY" "ARE" "ARRAY",
"ARRAY_AGG" "ARRAY_EXISTS" "ARRAY_MAX_CARDINALITY" "AS" "ASC" "ASENSITIVE" "ASIN" "ASINH" "ASSERTION" "ASSOCIATE" "ASUTIME" "ASYMMETRIC" "AT",
"ATAN" "ATAN2" "ATANH" "ATOMIC" "AUDIT" "AUTHORIZATION" "AUX" "AUXILIARY" "AVE" "AVERAGE" "AVG" "BACKUP" "BEFORE" "BEGIN" "BEGIN_FRAME" "BEGIN_PARTITION",
"BETWEEN" "BIGINT" "BINARY" "BIT" "BLOB" "BOOLEAN" "BOTH" "BREADTH" "BREAK" "BROWSE" "BT" "BUFFERPOOL" "BULK" "BUT" "BY" "BYTE" "BYTEINT" "BYTES" "CALL",
"CALLED" "CAPTURE" "CARDINALITY" "CASCADE" "CASCADED" "CASE" "CASESPECIFIC" "CASE_N" "CAST" "CATALOG" "CCSID" "CD" "CEIL" "CEILING" "CHANGE" "CHAR",
"CHAR2HEXINT" "CHARACTER" "CHARACTERS" "CHARACTER_LENGTH" "CHARS" "CHAR_LENGTH" "CHECK" "CHECKPOINT" "CLASS" "CLASSIFIER" "CLOB" "CLONE" "CLOSE" "CLUSTER",
"CLUSTERED" "CM" "COALESCE" "COLLATE" "COLLATION" "COLLECT" "COLLECTION" "COLLID" "COLUMN" "COLUMN_VALUE" "COMMENT" "COMMIT" "COMPLETION" "COMPRESS" "COMPUTE",
"CONCAT" "CONCURRENTLY" "CONDITION" "CONNECT" "CONNECTION" "CONSTRAINT" "CONSTRAINTS" "CONSTRUCTOR" "CONTAINS" "CONTAINSTABLE" "CONTENT" "CONTINUE" "CONVERT",
"CONVERT_TABLE_HEADER" "COPY" "CORR" "CORRESPONDING" "COS" "COSH" "COUNT" "COVAR_POP" "COVAR_SAMP" "CREATE" "CROSS" "CS" "CSUM" "CT" "CUBE" "CUME_DIST",
"CURRENT" "CURRENT_CATALOG" "CURRENT_DATE" "CURRENT_DEFAULT_TRANSFORM_GROUP" "CURRENT_LC_CTYPE" "CURRENT_PATH" "CURRENT_ROLE" "CURRENT_ROW" "CURRENT_SCHEMA",
"CURRENT_SERVER" "CURRENT_TIME" "CURRENT_TIMESTAMP" "CURRENT_TIMEZONE" "CURRENT_TRANSFORM_GROUP_FOR_TYPE" "CURRENT_USER" "CURRVAL" "CURSOR" "CV" "CYCLE" "DATA",
"DATABASE" "DATABASES" "DATABLOCKSIZE" "DATE" "DATEFORM" "DAY" "DAYS" "DAY_HOUR" "DAY_MICROSECOND" "DAY_MINUTE" "DAY_SECOND" "DBCC" "DBINFO" "DEALLOCATE" "DEC",
"DECFLOAT" "DECIMAL" "DECLARE" "DEFAULT" "DEFERRABLE" "DEFERRED" "DEFINE" "DEGREES" "DEL" "DELAYED" "DELETE" "DENSE_RANK" "DENY" "DEPTH" "DEREF" "DESC" "DESCRIBE",
"DESCRIPTOR" "DESTROY" "DESTRUCTOR" "DETERMINISTIC" "DIAGNOSTIC" "DIAGNOSTICS" "DICTIONARY" "DISABLE" "DISABLED" "DISALLOW" "DISCONNECT" "DISK" "DISTINCT",
"DISTINCTROW" "DISTRIBUTED" "DIV" "DO" "DOCUMENT" "DOMAIN" "DOUBLE" "DROP" "DSSIZE" "DUAL" "DUMP" "DYNAMIC" "EACH" "ECHO" "EDITPROC" "ELEMENT" "ELSE" "ELSEIF",
"EMPTY" "ENABLED" "ENCLOSED" "ENCODING" "ENCRYPTION" "END" "END-EXEC" "ENDING" "END_FRAME" "END_PARTITION" "EQ" "EQUALS" "ERASE" "ERRLVL" "ERROR" "ERRORFILES",
"ERRORTABLES" "ESCAPE" "ESCAPED" "ET" "EVERY" "EXCEPT" "EXCEPTION" "EXCLUSIVE" "EXEC" "EXECUTE" "EXISTS" "EXIT" "EXP" "EXPLAIN" "EXTERNAL" "EXTRACT" "FALLBACK
"FALSE" "FASTEXPORT" "FENCED" "FETCH" "FIELDPROC" "FILE" "FILLFACTOR" "FILTER" "FINAL" "FIRST" "FIRST_VALUE" "FLOAT" "FLOAT4" "FLOAT8" "FLOOR" 
"FOR" "FORCE" "FOREIGN" "FORMAT" "FOUND" "FRAME_ROW" "FREE" "FREESPACE" "FREETEXT" "FREETEXTTABLE" "FREEZE" "FROM" "FULL" "FULLTEXT" "FUNCTION" 
"FUSION" "GE" "GENERAL" "GENERATED" "GET" "GIVE" "GLOBAL" "GO" "GOTO" "GRANT" "GRAPHIC" "GROUP" "GROUPING" "GROUPS" "GT" "HANDLER" "HASH" 
"HASHAMP" "HASHBAKAMP" "HASHBUCKET" "HASHROW" "HAVING" "HELP" "HIGH_PRIORITY" "HOLD" "HOLDLOCK" "HOUR" "HOURS" "HOUR_MICROSECOND" "HOUR_MINUTE" 
"HOUR_SECOND" "IDENTIFIED" "IDENTITY" "IDENTITYCOL" "IDENTITY_INSERT" "IF" "IGNORE" "ILIKE" "IMMEDIATE" "IN" "INCLUSIVE" "INCONSISTENT" "INCREMENT" 
"INDEX" "INDICATOR" "INFILE" "INHERIT" "INITIAL" "INITIALIZE" "INITIALLY" "INITIATE" "INNER" "INOUT" "INPUT" "INS" "INSENSITIVE" "INSERT" "INSTEAD" 
"INT" "INT1" "INT2" "INT3" "INT4" "INT8" "INTEGER" "INTEGERDATE" "INTERSECT" "INTERSECTION" "INTERVAL" "INTO" "IO_AFTER_GTIDS" "IO_BEFORE_GTIDS" 
"IS" "ISNULL" "ISOBID" "ISOLATION" "ITERATE" "JAR" "JOIN" "JOURNAL" "JSON_ARRAY" "JSON_ARRAYAGG" "JSON_EXISTS" "JSON_OBJECT" "JSON_OBJECTAGG" 
"JSON_QUERY" "JSON_TABLE" "JSON_TABLE_PRIMITIVE" "JSON_VALUE" "KEEP" "KEY" "KEYS" "KILL" "KURTOSIS" "LABEL" "LAG" "LANGUAGE" "LARGE" "LAST" 
"LAST_VALUE" "LATERAL" "LC_CTYPE" "LE" "LEAD" "LEADING" "LEAVE" "LEFT" "LESS" "LEVEL" "LIKE" "LIKE_REGEX" "LIMIT" "LINEAR" "LINENO" "LINES" 
"LISTAGG" "LN" "LOAD" "LOADING" "LOCAL" "LOCALE" "LOCALTIME" "LOCALTIMESTAMP" "LOCATOR" "LOCATORS" "LOCK" "LOCKING" "LOCKMAX" "LOCKSIZE" "LOG" 
"LOG10" "LOGGING" "LOGON" "LONG" "LONGBLOB" "LONGTEXT" "LOOP" "LOWER" "LOW_PRIORITY" "LT" "MACRO" "MAINTAINED" "MAP" "MASTER_BIND" 
"MASTER_SSL_VERIFY_SERVER_CERT" "MATCH" "MATCHES" "MATCH_NUMBER" "MATCH_RECOGNIZE" "MATERIALIZED" "MAVG" "MAX" "MAXEXTENTS" "MAXIMUM" "MAXVALUE" 
"MCHARACTERS" "MDIFF" "MEDIUMBLOB" "MEDIUMINT" "MEDIUMTEXT" "MEMBER" "MERGE" "METHOD" "MICROSECOND" "MICROSECONDS" "MIDDLEINT" "MIN" "MINDEX" 
"MINIMUM" "MINUS" "MINUTE" "MINUTES" "MINUTE_MICROSECOND" "MINUTE_SECOND" "MLINREG" "MLOAD" "MLSLABEL" "MOD" "MODE" "MODIFIES" "MODIFY" 
"MODULE" "MONITOR" "MONRESOURCE" "MONSESSION" "MONTH" "MONTHS" "MSUBSTR" "MSUM" "MULTISET" "NAMED" "NAMES" "NATIONAL" "NATURAL" "NCHAR" "NCLOB" 
"NE" "NESTED_TABLE_ID" "NEW" "NEW_TABLE" "NEXT" "NEXTVAL" "NO" "NOAUDIT" "NOCHECK" "NOCOMPRESS" "NONCLUSTERED" "NONE" "NORMALIZE" "NOT" "NOTNULL" 
"NOWAIT" "NO_WRITE_TO_BINLOG" "NTH_VALUE" "NTILE" "NULL" "NULLIF" "NULLIFZERO" "NULLS" "NUMBER" "NUMERIC" "NUMPARTS" "OBID" "OBJECT" "OBJECTS" 
"OCCURRENCES_REGEX" "OCTET_LENGTH" "OF" "OFF" "OFFLINE" "OFFSET" "OFFSETS" "OLD" "OLD_TABLE" "OMIT" "ON" "ONE" "ONLINE" "ONLY" "OPEN" "OPENDATASOURCE" 
"OPENQUERY" "OPENROWSET" "OPENXML" "OPERATION" "OPTIMIZATION" "OPTIMIZE" "OPTIMIZER_COSTS" "OPTION" "OPTIONALLY" "OR" "ORDER" "ORDINALITY" "ORGANIZATION" 
"OUT" "OUTER" "OUTFILE" "OUTPUT" "OVER" "OVERLAPS" "OVERLAY" "OVERRIDE" "PACKAGE" "PAD" "PADDED" "PARAMETER" "PARAMETERS" "PART" "PARTIAL" "PARTITION" 
"PARTITIONED" "PARTITIONING" "PASSWORD" "PATH" "PATTERN" "PCTFREE" "PER" "PERCENT" "PERCENTILE" "PERCENTILE_CONT" "PERCENTILE_DISC" "PERCENT_RANK" "PERIOD" "PERM" 
"PERMANENT" "PIECESIZE" "PIVOT" "PLACING" "PLAN" "PORTION" "POSITION" "POSITION_REGEX" "POSTFIX" "POWER" "PRECEDES" "PRECISION" "PREFIX" "PREORDER" 
"PREPARE" "PRESERVE" "PREVVAL" "PRIMARY" "PRINT" "PRIOR" "PRIQTY" "PRIVATE" "PRIVILEGES" "PROC" "PROCEDURE" "PROFILE" "PROGRAM" "PROPORTIONAL" 
"PROTECTION" "PSID" "PTF" "PUBLIC" "PURGE" "QUALIFIED" "QUALIFY" "QUANTILE" "QUERY" "QUERYNO" "RADIANS" "RAISERROR" "RANDOM" "RANGE" "RANGE_N" "RANK" 
"RAW" "READ" "READS" "READTEXT" "READ_WRITE" "REAL" "RECONFIGURE" "RECURSIVE" "REF" "REFERENCES" "REFERENCING" "REFRESH" "REGEXP" "REGR_AVGX" "REGR_AVGY" 
"REGR_COUNT" "REGR_INTERCEPT" "REGR_R2" "REGR_SLOPE" "REGR_SXX" "REGR_SXY" "REGR_SYY" "RELATIVE" "RELEASE" "RENAME" "REPEAT" "REPLACE" "REPLICATION" 
"REPOVERRIDE" "REQUEST" "REQUIRE" "RESIGNAL" "RESOURCE" "RESTART" "RESTORE" "RESTRICT" "RESULT" "RESULT_SET_LOCATOR" "RESUME" "RET" "RETRIEVE" "RETURN" 
"RETURNING" "RETURNS" "REVALIDATE" "REVERT" "REVOKE" "RIGHT" "RIGHTS" "RLIKE" "ROLE" "ROLLBACK" "ROLLFORWARD" "ROLLUP" "ROUND_CEILING" "ROUND_DOWN" 
"ROUND_FLOOR" "ROUND_HALF_DOWN" "ROUND_HALF_EVEN" "ROUND_HALF_UP" "ROUND_UP" "ROUTINE" "ROW" "ROWCOUNT" "ROWGUIDCOL" "ROWID" "ROWNUM" "ROWS" "ROWSET" 
"ROW_NUMBER" "RULE" "RUN" "RUNNING" "SAMPLE" "SAMPLEID" "SAVE" "SAVEPOINT" "SCHEMA" "SCHEMAS" "SCOPE" "SCRATCHPAD" "SCROLL" "SEARCH" "SECOND" "SECONDS" 
"SECOND_MICROSECOND" "SECQTY" "SECTION" "SECURITY" "SECURITYAUDIT" "SEEK" "SEL" "SELECT" "SEMANTICKEYPHRASETABLE" "SEMANTICSIMILARITYDETAILSTABLE" 
"SEMANTICSIMILARITYTABLE" "SENSITIVE" "SEPARATOR" "SEQUENCE" "SESSION" "SESSION_USER" "SET" "SETRESRATE" "SETS" "SETSESSRATE" "SETUSER" "SHARE" "SHOW" 
"SHUTDOWN" "SIGNAL" "SIMILAR" "SIMPLE" "SIN" "SINH" "SIZE" "SKEW" "SKIP" "SMALLINT" "SOME" "SOUNDEX" "SOURCE" "SPACE" "SPATIAL" "SPECIFIC" "SPECIFICTYPE" 
"SPOOL" "SQL" "SQLEXCEPTION" "SQLSTATE" "SQLTEXT" "SQLWARNING" "SQL_BIG_RESULT" "SQL_CALC_FOUND_ROWS" "SQL_SMALL_RESULT" "SQRT" "SS" "SSL" "STANDARD" 
"START" "STARTING" "STARTUP" "STAT" "STATE" "STATEMENT" "STATIC" "STATISTICS" "STAY" "STDDEV_POP" "STDDEV_SAMP" "STEPINFO" "STOGROUP" "STORED" "STORES" 
"STRAIGHT_JOIN" "STRING_CS" "STRUCTURE" "STYLE" "SUBMULTISET" "SUBSCRIBER" "SUBSET" "SUBSTR" "SUBSTRING" "SUBSTRING_REGEX" "SUCCEEDS" "SUCCESSFUL" 
"SUM" "SUMMARY" "SUSPEND" "SYMMETRIC" "SYNONYM" "SYSDATE" "SYSTEM" "SYSTEM_TIME" "SYSTEM_USER" "SYSTIMESTAMP" "TABLE" "TABLESAMPLE" "TABLESPACE" "TAN" 
"TANH" "TBL_CS" "TEMPORARY" "TERMINATE" "TERMINATED" "TEXTSIZE" "THAN" "THEN" "THRESHOLD" "TIME" "TIMESTAMP" "TIMEZONE_HOUR" "TIMEZONE_MINUTE" "TINYBLOB" 
"TINYINT" "TINYTEXT" "TITLE" "TO" "TOP" "TRACE" "TRAILING" "TRAN" "TRANSACTION" "TRANSLATE" "TRANSLATE_CHK" "TRANSLATE_REGEX" "TRANSLATION" "TREAT" 
"TRIGGER" "TRIM" "TRIM_ARRAY" "TRUE" "TRUNCATE" "TRY_CONVERT" "TSEQUAL" "TYPE" "UC" "UESCAPE" "UID" "UNDEFINED" "UNDER" "UNDO" "UNION" "UNIQUE" 
"UNKNOWN" "UNLOCK" "UNNEST" "UNPIVOT" "UNSIGNED" "UNTIL" "UPD" "UPDATE" "UPDATETEXT" "UPPER" "UPPERCASE" "USAGE" "USE" "USER" "USING" "UTC_DATE" 
"UTC_TIME" "UTC_TIMESTAMP" "VALIDATE" "VALIDPROC" "VALUE" "VALUES" "VALUE_OF" "VARBINARY" "VARBYTE" "VARCHAR" "VARCHAR2" "VARCHARACTER" "VARGRAPHIC" 
"VARIABLE" "VARIADIC" "VARIANT" "VARYING" "VAR_POP" "VAR_SAMP" "VCAT" "VERBOSE" "VERSIONING" "VIEW" "VIRTUAL" "VOLATILE" "VOLUMES" "WAIT" "WAITFOR" 
"WHEN" "WHENEVER" "WHERE" "WHILE" "WIDTH_BUCKET" "WINDOW" "WITH" "WITHIN" "WITHIN_GROUP" "WITHOUT" "WLM" "WORK" "WRITE" "WRITETEXT" "XMLCAST" "XMLEXISTS" 
"XMLNAMESPACES" "XOR" "YEAR" "YEARS" "YEAR_MONTH" "ZEROFILL" "ZEROIFNULL" "ZONE"
```

# CloudWatch 中的 CloudWatch Metrics Insights 查询警报
<a name="cloudwatch-metrics-insights-alarms"></a>

您可以为 Metrics Insights 查询创建告警。这有助于您获得跟踪多个资源的告警，而无需稍后更新。该查询可捕获新资源和发生变化的资源。例如，您可以创建一个告警来监视实例集的 CPU 利用率，该告警会自动评估您在创建告警后启动的新实例。

在为 CloudWatch 跨账户可观测性设置的监控账户中，Metris Insights 警报可以监控源账户中的资源和该监控账户本身中的资源。有关如何将警报查询限制在特定账户，以及如何按账户 ID 对结果进行分组的更多信息，请参阅 [CloudWatch Metrics Insights 中的查询组件和语法](cloudwatch-metrics-insights-querylanguage.md) 中的 `WHERE` 和 `GROUP BY` 部分。

**在警报查询中使用标签**

您可以在 Metrics Insights 查询上创建警报，这些查询使用 AWS 资源标签对指标进行筛选和分组。要将标签与警报结合使用，请在 [https://console.aws.amazon.com/connect/](https://console.aws.amazon.com/connect/) 上选择**设置**。在 **CloudWatch 设置**页面的**针对遥测启用资源标签**下，选择**启用**。上下文感知型警报可随资源变化，自动监控特定应用程序、环境或团队的相关指标。

例如，您可创建警报，对所有带有特定应用程序标签的 Amazon EC2 实例的 CPU 利用率进行监控。

```
SELECT MAX(CPUUtilization) FROM "AWS/EC2" WHERE tag.Application = 'Orders' AND tag.Environment = 'Prod'
```

基于标签的警报会随匹配标签的资源新增或移除自动适配，实现与运维架构相契合的动态监控。

**Contents**
+ [创建 Metrics Insights CloudWatch 警报](cloudwatch-metrics-insights-alarm-create.md)

# 创建 Metrics Insights CloudWatch 警报
<a name="cloudwatch-metrics-insights-alarm-create"></a>

**使用控制台为 Metrics Insights 查询创建告警**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. （可选）要运行预构建的示例查询，请选择 **Add query**（添加查询），然后选择要运行的查询。或者，您可以选择 **Editor**（编辑器）来编辑示例查询，然后选择 **Run**（运行）以运行修改后的查询。

1. 要创建您自己的查询，请选择**多来源查询**。您可以使用**构建器**视图、**编辑器**视图，也可以将二者结合起来使用。您可以随时在两个视图之间切换，并在两个视图中查看正在进行的工作。

   在 **Builder**（构建器）视图中，您可以浏览并选择指标命名空间、指标名称、筛选条件、分组和排序选项。对于其中每个选项，查询构建器都会为您提供您环境中的可选项列表，供您选择。

   在 **Editor**（编辑器）视图中，您可以开始编写查询。输入时，编辑器会根据您当前已输入的字符提供建议。

   例如，在为警报配置 Metrics Insights 查询语句时，您可通过标签对指标进行筛选和分组，实现更具针对性的监控。
   + 按标签筛选：通过 `WHERE tag.keyName = 'value'` 监控带有特定标签的资源

     ```
     SELECT MAX(CPUUtilization) FROM "AWS/EC2" WHERE tag.Environment = 'Prod'
     ```
   + 标签与维度结合：将标签筛选条件与现有指标维度结合使用

     ```
     SELECT AVG(Duration) FROM "AWS/Lambda" WHERE tag.Application = 'OrderService' AND FunctionName = 'process%'
     ```
**注意**  
使用标签时，仅当关联资源在警报评估时段内存在指定标签，该警报才会匹配对应指标。

1. 如果对查询感到满意，请选择 **Run**（运行）。

1. 选择**创建警报**。

1. 在**条件**下面，指定以下内容：

   1. 对于 **Whenever *metric* is（每当指标）**，指定指标是必须大于、小于还是等于阈值。在**于...** 下面，指定阈值。

   1. 选择**其他配置**。对于**触发警报的数据点数**，指定必须有多少个评估期（数据点）处于 `ALARM` 状态才能触发警报。如果此处的两个值匹配，则会创建一个告警；如果多个连续评估期违例，该告警将变为 `ALARM`（告警）状态。

      要创建“M（最大为 N）”告警，为第一个值指定的数字应小于为第二个值指定的数字。有关更多信息，请参阅 [告警评估](alarm-evaluation.md)。

   1. 对于**缺失数据处理**，选择在缺失某些数据点时的警报行为。有关更多信息，请参阅 [配置 CloudWatch 告警处理缺失数据的方式](alarms-and-missing-data.md)。

1. 选择**下一步**。

1. 在**通知**下面，选择一个在警报处于 `ALARM`、`OK` 或 `INSUFFICIENT_DATA` 状态时通知的 SNS 主题。

   要使告警为相同告警状态或不同告警状态发送多个通知，请选择**添加通知**。

   要让警报不发送通知，请选择**删除**。

1. 要让告警执行 Auto Scaling、EC2 或 Systems Manager 操作，请选择相应的按钮，然后选择告警状态和要执行的操作。告警只有在进入“ALARM（告警）”状态时才能执行 Systems Manager 操作。有关 Systems Manager 操作的更多信息，请参阅[将 CloudWatch 配置为通过告警创建 OpsItems ](https://docs.aws.amazon.com/systems-manager/latest/userguide/OpsCenter-create-OpsItems-from-CloudWatch-Alarms.html)和[事件创建](https://docs.aws.amazon.com/incident-manager/latest/userguide/incident-creation.html)。
**注意**  
要创建执行 SSM Incident Manager 操作的告警，您必须具有特定的权限。有关更多信息，请参阅 [AWS Systems Manager Incident Manager 的基于身份的策略示例](https://docs.aws.amazon.com/incident-manager/latest/userguide/security_iam_id-based-policy-examples.html)。

1. 在完成后，选择**下一步**。

1. 输入警报的名称和说明。名称只能包含 ASCII 字符。然后选择**下一步**。

1. 在 **Preview and create** 下面，确认具有所需的信息和条件，然后选择 **Create alarm**。

**通过 AWS CLI 基于 Metrics Insights 查询创建警报**

使用 `put-metric-alarm` 命令并在 `metrics` 参数中指定 Metrics Insights 查询。例如，以下命令将设置一个告警，如果任何实例的 CPU 利用率超过 50%，该告警将进入 ALARM 状态。

```
aws cloudwatch put-metric-alarm —alarm-name Prod-App-CPU-Alarm —evaluation-periods 1 —comparison-operator GreaterThanThreshold —metrics '[{"Id":"m1","Expression":"SELECT MAX(CPUUtilization) FROM \"AWS/EC2\" WHERE tag.Environment = '\''Prod'\'' AND tag.Application = '\''OrderService'\''", "Period":60}]' —threshold 80
```

# 将 Metrics Insights 查询与指标数学配合使用
<a name="cloudwatch-metrics-insights-math"></a>

您可以使用 Metrics Insights 查询作为指标数学函数的输入。有关指标数学的更多信息，请参阅 [将数学表达式与 CloudWatch 指标结合使用](using-metric-math.md)。

不包括 **GROUP BY** 子句的 Metrics Insights 查询将返回单个时间序列。因此，其返回的结果可以与以单个时间序列作为输入的任何指标数学函数一起使用。

包括 **GROUP BY** 子句的 Metrics Insights 查询将返回多个时间序列。因此，其返回的结果可以与以时间序列数组作为输入的任何指标数学函数一起使用。

例如，以下查询以时间序列数组的形式返回为区域中每个存储桶下载的总字节数：

```
SELECT SUM(BytesDownloaded) 
FROM SCHEMA("AWS/S3", BucketName, FilterId) 
WHERE FilterId = 'EntireBucket'
GROUP BY BucketName
```

在控制台或 [GetMetricData](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html) 操作中的图表上，此查询的结果为 `q1`。此查询返回以字节为单位的结果，因此如果您想查看 MB 单位的结果，可以使用以下数学函数：

```
q1/1024/1024
```

# 使用自然语言生成与更新 CloudWatch Metrics Insights 查询
<a name="cloudwatch-metrics-insights-query-assist"></a>

 CloudWatch 支持自然语言查询功能，以帮助您生成和更新 [CloudWatch Metrics Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/query_with_cloudwatch-metrics-insights.html) 和 [CloudWatch Logs Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html) 查询。

 通过此功能，您可以用通俗易懂的英语询问或描述要查找的 CloudWatch 数据。自然语言功能可根据您输入的提示生成查询，并逐行说明查询的工作原理。您也可以更新查询以进一步调查数据。

 您可以根据环境输入各种提示，例如“Which Amazon Elastic Compute Cloud instance has the highest network out?”（哪个 Amazon Elastic Compute Cloud 实例的网络输出量最高？） 以及“Show me the top 10 Amazon DynamoDB Tables by consumed reads”（展示读取使用量前 10 的 Amazon DynamoDB 表）等。

**注意**  
自然语言查询功能通常在 10 个区域可用。对于某些区域，该功能会向美国的区域发起跨区域调用以处理查询提示。下表列出了支持的区域，并显示了每个区域处理其提示的位置。  


| 支持的区域 | 处理提示的区域 | 
| --- | --- | 
|  美国东部（弗吉尼亚州北部）  |  美国东部（弗吉尼亚州北部）  | 
|  美国东部（俄亥俄州）  |  美国东部（弗吉尼亚州北部）  | 
|  美国西部（俄勒冈州）  |  美国西部（俄勒冈州）  | 
|  亚太地区（香港）  |  美国西部（俄勒冈州）  | 
|  亚太地区（新加坡）  |  美国西部（俄勒冈州）  | 
|  亚太地区（悉尼）  |  美国西部（俄勒冈）  | 
|  亚太地区（东京）  |  亚太地区（东京）  | 
|  欧洲地区（法兰克福）  |  欧洲地区（法兰克福）  | 
|  欧洲地区（爱尔兰）  |  美国东部（弗吉尼亚州北部）  | 
|  欧洲地区（斯德哥尔摩）  |  美国东部（弗吉尼亚州北部）  | 

 要生成具有此功能的 CloudWatch Metrics Insights 查询，请在*构建器*或*编辑器*视图中打开 CloudWatch Metrics Insights 查询编辑器，然后选择**生成查询**。

**重要**  
 要使用自然语言查询功能，您必须使用 [CloudWatchFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/CloudWatchFullAccess.html)、[CloudWatchReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/CloudWatchReadOnlyAccess.html)、[CloudWatchFullAccessV2](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/CloudWatchFullAccessV2.html)、[AdministratorAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AdministratorAccess.html) 或 [ReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/ReadOnlyAccess.html) 策略。  
 您也可以将 `cloudwatch:GenerateQuery` 操作包含在新的或现有的客户托管策略或内联策略中。

## 示例查询
<a name="cloudwatch-metrics-insights-query-assist-examples"></a>

 本节中的示例描述了如何使用自然语言功能生成和更新查询。

**注意**  
 有关 CloudWatch Metrics Insights 查询编辑器和语法的更多信息，请参阅 [CloudWatch Metrics Insights 查询组件和语法](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-metrics-insights-querylanguage.html)。

### 示例：生成自然语言查询
<a name="cloudwatch-metrics-insights-query-assist-example-1"></a>

 要使用自然语言来生成查询，请输入提示并选择**生成新查询**。此示例显示了一个执行基本搜索的查询。

**提示**  
 在以下示例中，该提示指示的功能可搜索占用最多读取容量的前 10 个 DynamoDB 表格。

```
Show top 10 DynamoDB Tables by consumed reads
```

**Query**  
 以下是自然语言功能根据提示生成的查询示例。请注意在查询之前的注释中，提示是如何显示的。查询完成后，您可以阅读有关查询工作原理的说明。

```
# Show top 10 DynamoDB Tables by consumed reads
SELECT SUM("ConsumedReadCapacityUnits")
FROM "AWS/DynamoDB"
GROUP BY TableName
ORDER BY SUM() DESC
LIMIT 10
# This query selects the sum of consumed read capacity units for each DynamoDB table, groups the results by table name, orders the results from highest to lowest read capacity consumption, and limits the results to the top 10 tables.
```

**注意**  
 要关闭提示和有关查询工作原理的说明显示，请使用编辑器中的齿轮图标。

### 示例：更新自然语言查询
<a name="cloudwatch-metrics-insights-query-assist-example-2"></a>

 您可以通过编辑初始提示，然后选择**更新查询**，来更新查询。

**更新版提示**  
 以下示例显示了先前提示的更新版本。现在，该提示不再搜索占用读取容量最多的前 10 个 DynamoDB 表格，而是按返回的字节数对结果进行排序。

```
Sort by bytes returned instead
```

**更新版查询**  
 以下是更新版查询的示例：请注意在更新版查询之前的注释中，更新版提示是如何显示的。查询完成后，您可以阅读有关原始查询是如何更新的说明。

```
# Sort by bytes returned instead
SELECT SUM("ReturnedBytes")
FROM "AWS/DynamoDB"
GROUP BY TableName
ORDER BY SUM() DESC
LIMIT 10
# This query modifies the original query to select the sum of returned bytes instead of consumed read capacity units, and orders the results from highest to lowest sum of returned bytes, limiting the results to the top 10 tables.
```

## 选择不使用您的数据来改进服务
<a name="cloudwatch-metrics-insights-query-assist-service-data"></a>

 您为训练 AI 模型和生成相关查询而提供的自然语言提示数据仅用于提供和维护您的服务。这些数据可用于提高 CloudWatch Metrics Insights 的质量。您的信任、隐私和内容的安全性是我们最重视的问题。有关更多信息，请参阅 [AWS Service Terms](https://aws.amazon.com/service-terms/) 和 [AWS responsible AI policy](https://aws.amazon.com/machine-learning/responsible-ai/policy/)。

 通过创建 AI 服务选择退出策略，您可以选择不将您的内容用于开发自然语言查询或提高自然语言查询的质量。要选择退出对所有 CloudWatch AI 功能（包括查询生成功能）进行的数据收集，您必须为 CloudWatch 创建一个选择退出策略。有关更多信息，请参阅《AWS Organizations 用户指南》**中的 [AI 服务选择退出策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_ai-opt-out.html)。

# SQL 推理
<a name="cloudwatch-metrics-insights-inference"></a>

CloudWatch Metrics Insights 使用多种机制来推断给定 SQL 查询的意图。

**Topics**
+ [时间分段](#cloudwatch-metrics-insights-inference-timebucketing)
+ [字段投影](#cloudwatch-metrics-insights-inference-fieldsprojection)
+ [ORDER BY 全局聚合](#cloudwatch-metrics-insights-inference-OrderBy)

## 时间分段
<a name="cloudwatch-metrics-insights-inference-timebucketing"></a>

根据请求的时段，查询生成的时间序列数据点将累计到时间段中。要在标准 SQL 中聚合值，必须定义一个明确的 GROUP BY 子句，以便一起收集给定时段的所有观测值。由于这是查询时间序列数据的标准方式，CloudWatch Metrics Insights 可推断时间分段，而无需明确表达 **GROUP BY** 子句。

例如，当执行时间为 1 分钟的查询时，属于该分钟的所有观测值，直到下一分钟（排除）为止，都将累计到该时间段的开始时间。这使得 Metrics Insights SQL 语句更加简洁明了。

```
SELECT AVG(CPUUtilization)
FROM SCHEMA("AWS/EC2", InstanceId)
```

上一个查询返回单个时间序列（时间戳值对），表示所有 Amazon EC2 实例的平均 CPU 使用率。假设请求的时段为 1 分钟，则返回的每个数据点代表在特定 1 分钟间隔（包括开始时间，不包括结束时间）内测量的所有观测值的平均值。与特定数据点相关的时间戳是时间段的开始时间

## 字段投影
<a name="cloudwatch-metrics-insights-inference-fieldsprojection"></a>

Metrcis Insights 查询始终返回时间戳投影。您不需要在 **SELECT** 子句中指定时间戳列来获取每个相应数据点值的时间戳。有关如何计算时间戳的详细信息，请参阅 [时间分段](#cloudwatch-metrics-insights-inference-timebucketing)。

使用 **GROUP BY** 时，还可以在结果中推断和投影每个组名称，以便您可以对返回的时间序列进行分组。

```
SELECT AVG(CPUUtilization)
FROM SCHEMA("AWS/EC2", InstanceId)
GROUP BY InstanceId
```

上一个查询将返回每个 Amazon EC2 实例的时间序列。每个时间序列都在实例 ID 的值之后进行标注。

## ORDER BY 全局聚合
<a name="cloudwatch-metrics-insights-inference-OrderBy"></a>

使用 **ORDER BY** 时、**FUNCTION()** 推断要按哪个聚合函数排序（查询指标的数据点值）。聚合操作在查询的时间窗口中对每个单独时间序列的所有匹配数据点执行。

```
SELECT AVG(CPUUtilization)
FROM SCHEMA("AWS/EC2", InstanceId)
GROUP BY InstanceId
ORDER BY MAX()
LIMIT 10
```

上一个查询返回每个 Amazon EC2 实例的 CPU 使用率，并将结果集限制为 10 个条目。结果根据请求的时间窗口内各个时间序列的最大值进行排序。**ORDER BY** 子句在 **LIMIT** 之前应用，以便根据 10 个以上的时间序列计算排序。

# Metrics Insights 配额
<a name="cloudwatch-metrics-insights-limits"></a>

CloudWatch Metrics Insights 目前有以下配额：
+ 查询长达两周的数据，以便在指标、小组件和告警图表中进行可视化展示。您可以查询最近三小时的数据，以进行告警条件评估。
+ 单个查询可处理的指标不超过 10,000 个。这意味着，如果 **SELECT**、**FROM** 和 **WHERE** 子句匹配 10,000 个以上的指标，查询只处理找到的前 10,000 个指标。
+ 单个查询可返回的时间序列不超过 500 个。这意味着，如果查询返回 500 个以上的指标，则查询结果中并非所有指标都将返回。如果您使用的是 **ORDER BY** 子句，则将对正在处理的所有指标进行排序，并根据您的 **ORDER BY** 子句，具有前 500 个最高值或最低值的指标将返回。

  如果您不包括 **ORDER BY** 子句，则无法控制哪 500 个匹配的指标将返回。
+ 每个区域最多可以有 200 个 Metrics Insights 警报。
+ Metrics Insights 不支持高分辨率数据，即以小于一分钟的粒度报告的指标数据。如果您请求高分辨率数据，该请求不会失败，但输出会以一分钟的粒度聚合。
+ 每个 [GetMetricData](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html) 操作只能有一个查询，但是您可以在控制面板中有多个小组件，每个小组件都包含一个查询。
+ 如果一个使用标签且包含 **GROUP BY** 或 **WHERE** 子句的查询匹配到标签更新次数超过 10 次的指标，则查询结果中将仅包含该指标最新的 10 个带标签版本。

# Metrics Insights 示例查询
<a name="cloudwatch-metrics-insights-queryexamples"></a>

本节包含有用的 CloudWatch Metrics Insights 查询的示例，您可以直接复制和使用，或在查询编辑器中复制并修改。控制台中已经提供一些示例，您可以通过选择 **Metrics**（指标）视图中的 **Add query**（添加查询）来访问它们。

## Application Load Balancer 示例
<a name="cloudwatch-metrics-insights-queryexamples-applicationloadbalancer"></a>

**所有负载均衡器的请求总数**

```
SELECT SUM(RequestCount) 
FROM SCHEMA("AWS/ApplicationELB", LoadBalancer)
```

**前 10 大最活跃的负载均衡器**

```
SELECT MAX(ActiveConnectionCount) 
FROM SCHEMA("AWS/ApplicationELB", LoadBalancer) 
GROUP BY LoadBalancer 
ORDER BY SUM() DESC 
LIMIT 10
```

## AWS API 使用示例
<a name="cloudwatch-metrics-insights-queryexamples-APIusage"></a>

**按账户中的调用次数划分，排名前 20 的 AWS API**

```
SELECT COUNT(CallCount) 
FROM SCHEMA("AWS/Usage", Class, Resource, Service, Type) 
WHERE Type = 'API' 
GROUP BY Service, Resource 
ORDER BY COUNT() DESC 
LIMIT 20
```

**按调用排序的 CloudWatch API**

```
SELECT COUNT(CallCount) 
FROM SCHEMA("AWS/Usage", Class, Resource, Service, Type) 
WHERE Type = 'API' AND Service = 'CloudWatch' 
GROUP BY Resource 
ORDER BY COUNT() DESC
```

## DynamoDB 示例
<a name="cloudwatch-metrics-insights-queryexamples-DynamoDB"></a>

**按消耗的读取数排序的前 10 个表**

```
SELECT SUM(ProvisionedWriteCapacityUnits)
FROM SCHEMA("AWS/DynamoDB", TableName) 
GROUP BY TableName
ORDER BY MAX() DESC LIMIT 10
```

**按返回的字节数排序的前 10 个表**

```
SELECT SUM(ReturnedBytes)
FROM SCHEMA("AWS/DynamoDB", TableName) 
GROUP BY TableName
ORDER BY MAX() DESC LIMIT 10
```

**按用户错误排序的前 10 个表**

```
SELECT SUM(UserErrors)
FROM SCHEMA("AWS/DynamoDB", TableName) 
GROUP BY TableName
ORDER BY MAX() DESC LIMIT 10
```

## Amazon Elastic Block Store 示例
<a name="cloudwatch-metrics-insights-queryexamples-EBS"></a>

**按写入字节数排序的前 10 个 Amazon EBS 卷**

```
SELECT SUM(VolumeWriteBytes) 
FROM SCHEMA("AWS/EBS", VolumeId) 
GROUP BY VolumeId 
ORDER BY SUM() DESC 
LIMIT 10
```

**Amazon EBS 卷的平均写入时间**

```
SELECT AVG(VolumeTotalWriteTime) 
FROM SCHEMA("AWS/EBS", VolumeId)
```

## Amazon EC2 示例
<a name="cloudwatch-metrics-insights-queryexamples-EC2"></a>

**按最高排序的 EC2 实例 CPU 使用率**

```
SELECT AVG(CPUUtilization) 
  FROM SCHEMA("AWS/EC2", InstanceId) 
  GROUP BY InstanceId 
  ORDER BY AVG() DESC
```

**整个机群的平均 CPU 使用率**

```
SELECT AVG(CPUUtilization) 
FROM SCHEMA("AWS/EC2", InstanceId)
```

**按最高 CPU 使用率排序的前 10 个实例**

```
SELECT MAX(CPUUtilization) 
FROM SCHEMA("AWS/EC2", InstanceId) 
GROUP BY InstanceId 
ORDER BY MAX() DESC 
LIMIT 10
```

**在这种情况下，CloudWatch 代理正在根据应用程序收集 `CPUUtilization` 指标。此查询筛选特定应用程序名称的此指标的平均值。**

```
SELECT AVG(CPUUtilization)
FROM "AWS/CWAgent"
WHERE ApplicationName = 'eCommerce'
```

## Amazon Elastic Container Service 示例
<a name="cloudwatch-metrics-insights-queryexamples-ECS"></a>

**所有 ECS 集群的平均 CPU 使用率**

```
SELECT AVG(CPUUtilization) 
FROM SCHEMA("AWS/ECS", ClusterName)
```

**按内存利用率排序的前 10 个集群**

```
SELECT AVG(MemoryUtilization) 
FROM SCHEMA("AWS/ECS", ClusterName) 
GROUP BY ClusterName 
ORDER BY AVG() DESC
LIMIT 10
```

**按 CPU 使用率排序的前 10 项服务**

```
SELECT AVG(CPUUtilization) 
FROM SCHEMA("AWS/ECS", ClusterName, ServiceName) 
GROUP BY ClusterName, ServiceName 
ORDER BY AVG() DESC 
LIMIT 10
```

**按运行任务排序的前 10 项服务 (Container Insights)**

```
SELECT AVG(RunningTaskCount) 
FROM SCHEMA("ECS/ContainerInsights", ClusterName, ServiceName) 
GROUP BY ClusterName, ServiceName 
ORDER BY AVG() DESC 
LIMIT 10
```

## Amazon Elastic Kubernetes Service Container Insights 示例
<a name="cloudwatch-metrics-insights-queryexamples-EKSCI"></a>

**所有 EKS 集群的平均 CPU 使用率**

```
SELECT AVG(pod_cpu_utilization) 
FROM SCHEMA("ContainerInsights", ClusterName)
```

**按节点 CPU 使用率排序的前 10 个集群**

```
SELECT AVG(node_cpu_utilization) 
FROM SCHEMA("ContainerInsights", ClusterName) 
GROUP BY ClusterName
ORDER BY AVG() DESC LIMIT 10
```

**按 pod 内存利用率排序的前 10 个集群**

```
SELECT AVG(pop_memory_utilization) 
FROM SCHEMA("ContainerInsights", ClusterName) 
GROUP BY ClusterName
ORDER BY AVG() DESC LIMIT 10
```

**按 CPU 使用率排序的前 10 个节点**

```
SELECT AVG(node_cpu_utilization) 
FROM SCHEMA("ContainerInsights", ClusterName, NodeName) 
GROUP BY ClusterName, NodeName 
ORDER BY AVG() DESC LIMIT 10
```

**按内存利用率排序的前 10 个 pod**

```
SELECT AVG(pod_memory_utilization) 
FROM SCHEMA("ContainerInsights", ClusterName, PodName) 
GROUP BY ClusterName, PodName 
ORDER BY AVG() DESC LIMIT 10
```

## EventBridge 示例
<a name="cloudwatch-metrics-insights-queryexamples-EventBridge"></a>

**按调用排序的前 10 条规则**

```
SELECT SUM(Invocations)
FROM SCHEMA("AWS/Events", RuleName) 
GROUP BY RuleName
ORDER BY MAX() DESC LIMIT 10
```

**按失败调用排序的前 10 条规则**

```
SELECT SUM(FailedInvocations)
FROM SCHEMA("AWS/Events", RuleName) 
GROUP BY RuleName
ORDER BY MAX() DESC LIMIT 10
```

**按匹配规则排序的前 10 条规则**

```
SELECT SUM(MatchedEvents)
FROM SCHEMA("AWS/Events", RuleName) 
GROUP BY RuleName
ORDER BY MAX() DESC LIMIT 10
```

## Kinesis 示例
<a name="cloudwatch-metrics-insights-queryexamples-Kinesis"></a>

**按写入字节数排序的前 10 个流**

```
SELECT SUM("PutRecords.Bytes") 
FROM SCHEMA("AWS/Kinesis", StreamName) 
GROUP BY StreamName
ORDER BY SUM() DESC LIMIT 10
```

**按流中最早的项目排序的前 10 个流**

```
SELECT MAX("GetRecords.IteratorAgeMilliseconds") 
FROM SCHEMA("AWS/Kinesis", StreamName) 
GROUP BY StreamName
ORDER BY MAX() DESC LIMIT 10
```

## Lambda 示例
<a name="cloudwatch-metrics-insights-queryexamples-Lambda"></a>

**按调用次数排序的 Lambda 函数**

```
SELECT SUM(Invocations) 
FROM SCHEMA("AWS/Lambda", FunctionName) 
GROUP BY FunctionName 
ORDER BY SUM() DESC
```

**按最长运行时排序的前 10 个 Lambda 函数**

```
SELECT AVG(Duration) 
FROM SCHEMA("AWS/Lambda", FunctionName) 
GROUP BY FunctionName 
ORDER BY MAX() DESC 
LIMIT 10
```

**按错误计数排序的前 10 个 Lambda 函数**

```
SELECT SUM(Errors) 
FROM SCHEMA("AWS/Lambda", FunctionName) 
GROUP BY FunctionName 
ORDER BY SUM() DESC 
LIMIT 10
```

## CloudWatch Logs 示例
<a name="cloudwatch-metrics-insights-queryexamples-CloudWatchLogs"></a>

**按传入事件排序的前 10 个日志组**

```
SELECT SUM(IncomingLogEvents)
FROM SCHEMA("AWS/Logs", LogGroupName) 
GROUP BY LogGroupName
ORDER BY SUM() DESC LIMIT 10
```

**按写入字节数排序的前 10 个日志组**

```
SELECT SUM(IncomingBytes)
FROM SCHEMA("AWS/Logs", LogGroupName) 
GROUP BY LogGroupName
ORDER BY SUM() DESC LIMIT 10
```

## Amazon RDS 示例
<a name="cloudwatch-metrics-insights-queryexamples-RDS"></a>

**按最高 CPU 使用率排序的前 10 个 Amazon RDS 实例**

```
SELECT MAX(CPUUtilization)
FROM SCHEMA("AWS/RDS", DBInstanceIdentifier) 
GROUP BY DBInstanceIdentifier
ORDER BY MAX() DESC 
LIMIT 10
```

**按写入数排序的前 10 个 Amazon RDS 集群**

```
SELECT SUM(WriteIOPS)
FROM SCHEMA("AWS/RDS", DBClusterIdentifier) 
GROUP BY DBClusterIdentifier
ORDER BY MAX() DESC 
LIMIT 10
```

## Amazon Simple Storage Service 示例
<a name="cloudwatch-metrics-insights-queryexamples-S3"></a>

**按存储桶排序的平均延迟**

```
SELECT AVG(TotalRequestLatency) 
FROM SCHEMA("AWS/S3", BucketName, FilterId) 
WHERE FilterId = 'EntireBucket' 
GROUP BY BucketName 
ORDER BY AVG() DESC
```

**按已下载字节数排序的前 10 个存储桶**

```
SELECT SUM(BytesDownloaded) 
FROM SCHEMA("AWS/S3", BucketName, FilterId) 
WHERE FilterId = 'EntireBucket'
GROUP BY BucketName 
ORDER BY SUM() DESC 
LIMIT 10
```

## Amazon Simple Notification Service 示例
<a name="cloudwatch-metrics-insights-queryexamples-SNS"></a>

**SNS 主题发布的消息总数**

```
SELECT SUM(NumberOfMessagesPublished) 
FROM SCHEMA("AWS/SNS", TopicName)
```

**按发布消息排序的前 10 个主题**

```
SELECT SUM(NumberOfMessagesPublished) 
FROM SCHEMA("AWS/SNS", TopicName) 
GROUP BY TopicName 
ORDER BY SUM() DESC 
LIMIT 10
```

**按消息传送失败排序的前 10 个主题**

```
SELECT SUM(NumberOfNotificationsFailed) 
FROM SCHEMA("AWS/SNS", TopicName)
GROUP BY TopicName 
ORDER BY SUM() DESC 
LIMIT 10
```

## Amazon SQS 示例
<a name="cloudwatch-metrics-insights-queryexamples-SQS"></a>

**按可见消息数量排序的前 10 个队列**

```
SELECT AVG(ApproximateNumberOfMessagesVisible)
FROM SCHEMA("AWS/SQS", QueueName) 
GROUP BY QueueName
ORDER BY AVG() DESC 
LIMIT 10
```

**前 10 个最活跃的队列**

```
SELECT SUM(NumberOfMessagesSent)
FROM SCHEMA("AWS/SQS", QueueName) 
GROUP BY QueueName
ORDER BY SUM() DESC 
LIMIT 10
```

**按最早消息的时间排序的前 10 个队列**

```
SELECT AVG(ApproximateAgeOfOldestMessage)
FROM SCHEMA("AWS/SQS", QueueName) 
GROUP BY QueueName
ORDER BY AVG() DESC 
LIMIT 10
```

# Metrics Insights 术语表
<a name="cloudwatch-metrics-insights-glossary"></a>

**标签**  
在 Metrics Insights 中，标签是一个键值对，用于确定查询范围以返回特定数据集，或者定义将查询结果分为单独时间序列的标准。标签键与 SQL 中的列名称类似。标签必须是 CloudWatch 指标维度。

**观测值**  
观测值是指在给定时间为给定指标记录的值。

# Metrics Insights 问题排查
<a name="cloudwatch-metrics-insights-troubleshooting"></a>

## 结果包括“其他”，但未将其作为维度
<a name="cloudwatch-metrics-insights-troubleshooting-other"></a>

这意味着查询包含 **GROUP BY** 子句，该子句指定查询返回的某些指标中未使用的标签键。在这种情况下，会返回名为 `Other` 的空组。不包含该标签键的指标可能是聚合指标，这些指标返回该标签键的所有值之间聚合的值。

 例如，假设我们有以下查询：

```
SELECT AVG(Faults) 
FROM MyCustomNamespace 
GROUP BY Operation, ServiceName
```

如果某些返回的指标不作为维度包括 `ServiceName`，则这些指标将显示为将 `Other` 作为 `ServiceName` 的值。

要防止在结果中看到“其他”，请在您的 **FROM** 子句中使用 **SCHEMA**，如以下示例所示：

```
SELECT AVG(Faults) 
FROM SCHEMA(MyCustomNamespace, Operation)
GROUP BY Operation, ServiceName
```

这将返回的结果限制为同时具有 `Operation` 和 `ServiceName` 维度的指标。

## 我的图表中最早的时间戳的指标值比其他时间戳的指标值低
<a name="cloudwatch-metrics-insights-troubleshooting-oldest"></a>

CloudWatch Metrics Insights 支持长达两周的历史数据。当您使用大于 1 分钟的时间段绘制图表时，可能会出现最早的数据点与预期值不同的情况。这是因为 CloudWatch Metrics Insights 查询仅返回两周保留期内的数据。在这种情况下，查询中最早的数据点仅会返回两周界限内测得的观察值，而不会返回该数据点时间段内的所有观察值。

## 使用基于标签的查询时，不同时间段的指标值不一致
<a name="cloudwatch-metrics-insights-troubleshooting-tag-mutations"></a>

在 CloudWatch Metrics Insights 查询中使用带有标签的 `WHERE` 或 `GROUP BY` 子句时，根据所选的时间段，可能会看到不同的指标值。例如，6 小时的时段可能显示峰值 20，而 1 小时的时段在同一时间窗口内仅显示峰值 2。

出现这种情况是因为标签时间戳以二级分辨率存储，而指标数据点则与时段边界（例如，每分钟或每小时的开始）对齐。为了确定哪些数据点与标签时间范围匹配，CloudWatch 通过减去一个时段来调整该范围的起始点。对于较长的时段，此调整会在标签时间戳和最早包含的数据点之间造成更大的间隔，这可能会导致范围起始点附近的数据点被排除在外。

以下示例说明了这会如何影响查询结果。一个指标有两个标签值：`env=beta`（从 00:00 至 01:30）和 `env=gamma`（从 01:30 至 03:00）。每个标签覆盖 90 分钟的数据，总和为 270。

![\[两张 CloudWatch 指标图表，将基于标签的查询结果与 1 分钟和 3 小时的时段进行了比较。\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metrics-insights-tag-alignment.png)



| **env=beta，时段为 1 分钟** | Statistic | 预期 | 返回值 | 区别 | 
| --- | --- | --- | --- | --- | 
| SUM | 270 | 271 | \$11 | 
| AVG | 3.0 | 3.0 | 0 | 
| MIN | 1 | 1 | 0 | 
| MAX | 5 | 5 | 0 | 
| SAMPLE\$1COUNT | 90 | 91 | \$11 | 


| **env=gamma，时段为 1 分钟** | Statistic | 预期 | 返回值 | 区别 | 
| --- | --- | --- | --- | --- | 
| SUM | 270 | 275 | 5\$1 | 
| AVG | 3.0 | 3.0 | 0 | 
| MIN | 1 | 1 | 0 | 
| MAX | 5 | 5 | 0 | 
| SAMPLE\$1COUNT | 90 | 91 | \$11 | 

对于 1 分钟的时段，对齐调整很小（1 分钟），因此每个标签只包含 1 个额外的数据点。对于 3 小时的时段，调整跨越了整个查询范围：


| **env=beta，时段为 3 小时** | Statistic | 预期 | 返回值 | 区别 | 
| --- | --- | --- | --- | --- | 
| SUM | 270 | 540 | \$1270 | 
| AVG | 3.0 | 3.0 | 0 | 
| MIN | 1 | 1 | 0 | 
| MAX | 5 | 5 | 0 | 
| SAMPLE\$1COUNT | 90 | 180 | \$190 | 


| **env=gamma，时段为 3 小时** | Statistic | 预期 | 返回值 | 区别 | 
| --- | --- | --- | --- | --- | 
| SUM | 270 | 540 | \$1270 | 
| AVG | 3.0 | 3.0 | 0 | 
| MIN | 1 | 1 | 0 | 
| MAX | 5 | 5 | 0 | 
| SAMPLE\$1COUNT | 90 | 180 | \$190 | 

对于 3 小时的时段，两个标签都会返回整个数据集（SUM=540，SAMPLE\$1COUNT=180），因为单个聚合数据点的时间戳在两个调整后的范围内。标签边界已被有效擦除。

要减少此行为的影响，请尝试以下方法：
+ **使用较短的聚合时段。**较短的时段（例如 1 分钟或 5 分钟）更贴近地匹配标签时间戳的二级分辨率，这样可以最大限度地减少对齐间隔，并且更有可能包含所有相关数据点。
+ **使用基于维度的筛选而不是标签。**如果使用案例允许，请按维度而不是标签进行筛选。基于维度的查询不受此行为的影响。例如，使用 `WHERE InstanceId = 'i-1234567890abcdef0'` 而不是 `WHERE tag."my-tag" = 'my-value'`。
+ **以一致的粒度进行查询。**比较不同时间窗口的指标数据时，请使用相同的时段，以避免因对齐调整导致的意外差异。

# 使用 PromQL 查询指标
<a name="CloudWatch-PromQL"></a>

**Topics**
+ [什么是 Prometheus 查询语言（PromQL）？](#CloudWatch-PromQL-WhatIs)
+ [PromQL 限额和限制](#CloudWatch-PromQL-Limits)
+ [支持的 AWS 区域](#CloudWatch-PromQL-Regions)
+ [PromQL的 IAM 权限](#CloudWatch-PromQL-IAM)
+ [PromQL 查询](CloudWatch-PromQL-Querying.md)
+ [在 Query Studio 中运行 PromQL 查询（预览版）](CloudWatch-PromQL-QueryStudio.md)
+ [在警报中使用 PromQL](CloudWatch-PromQL-Alarms.md)

**注意**  
OTLP 指标摄取、PromQL 查询、已出售 AWS 指标的 OTel 补充以及 Query Studio 均为公开预览版，免费提供，并可能会发生变更。

## 什么是 Prometheus 查询语言（PromQL）？
<a name="CloudWatch-PromQL-WhatIs"></a>

Prometheus 查询语言（PromQL）是一种功能性查询语言，可让您实时选择、聚合与转换时间序列数据。PromQL 最初是为 Prometheus 设计，现已成为一种流行的指标查询语言。

Amazon CloudWatch 支持使用 PromQL 来查询指标，包括通过 OpenTelemetry Line Protocol（OTLP）摄取的指标和 [AWS 补充的已出售指标](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html)。您摄取 OTLP 指标时，CloudWatch 会保留遥测数据的完整语义结构，包括资源属性、埋点范围、数据点属性和特定于 AWS 的元数据，并将它们显示为可查询的 PromQL 标签。

借助 PromQL，您可以执行以下操作：
+ 按指标名称和标签匹配器选择时间序列。
+ 跨时间序列应用数学函数和运算符。
+ 跨服务、区域或账户等维度聚合指标。
+ 计算费率、直方图、分位数和移动平均值。

您可以在 [在 Query Studio 中运行 PromQL 查询（预览版）](CloudWatch-PromQL-QueryStudio.md) 中以交互方式使用 PromQL 查询，也可以创建 CloudWatch 警报。有关更多信息，请参阅[PromQL 查询](CloudWatch-PromQL-Querying.md)和[在警报中使用 PromQL](CloudWatch-PromQL-Alarms.md)。

**注意**  
CloudWatch 根据 Prometheus 3.0 规范使用 PromQL。这包括对 UTF-8 指标名称和标签名称的支持。

以下概念是在 CloudWatch 中使用 PromQL 的基础。


| 概念 | 说明 | 
| --- | --- | 
| **时间序列** | 由指标名称和一组称为*标签*的键值对标识的带有时间戳的一系列值。指标名称和标签的每个唯一组合构成一个不同的时间序列。 | 
| **即时向量** | 一组时间序列，包含每个序列的单个样本，所有序列共享相同的时间戳。由诸如 `{"http.server.active_requests", "@resource.service.name"="myservice"}` 之类的查询返回。 | 
| **范围向量** | 一组时间序列，包含每个序列随时间变化的一系列数据点。通过在方括号中附加持续时间选择器来创建，例如 `avg_over_time({"http.server.active_requests", "@resource.service.name"="myservice"}[5m])`。 | 
| **标签** | 附加到时间序列的键值对。在 OTLP 摄取的指标中，标签源自资源属性、埋点范围、数据点属性和特定于 AWS 的元数据。 | 
| **标签匹配器** | 花括号中的表达式，用于按标签值筛选时间序列。支持精确匹配 (`=`)、不等于 (`!=`)、正则表达式匹配 (`=~`) 和负正则表达式匹配 (`!~`)。 | 
| **聚合操作符** | 一种将多个时间序列组合成更少序列的函数。常见的操作符包括 `sum`、`avg`、`min`、`max`、`count` 和 `topk`。 | 

## PromQL 限额和限制
<a name="CloudWatch-PromQL-Limits"></a>

下表列出了 PromQL 的限额和限制：


| 限制 | 值 | 附加信息 | 错误代码 | 
| --- | --- | --- | --- | 
| 每个账户查询请求的最大 TPS | 300 | 每个账户允许的每秒查询请求（/query、/query\$1range）的最大数量。 | 422 | 
| 每个账户的发现请求的最大 TPS | 10 | 每个账户允许的每秒发现请求（/series、/label、/label\$1values）的最大数量。 | 422 | 
| 每个账户的最大并发查询请求数量 | 30 | 一个账户可以同时主动执行的查询（/query、/query\$1range）的最大数量。 | 429 | 
| 每个账户的最大并发发现请求数量 | 30 | 一个账户可以同时主动执行的发现请求（/series、/label\$1values）的最大数量。 | 429 | 
| 每个查询请求返回的最大序列数量 | 500 | 查询请求（/query、/query\$1range）可返回的唯一时间序列的最大数量。 | 200 – 已截断响应 | 
| 每个发现请求返回的最大标签数量 | 10000 | 发现请求（/series、/labels、/label\$1values）可返回的唯一标签的最大数量。 | 200 – 已截断响应 | 
| 每个请求的最大范围 | 7 days | 查询可跨越的最大时间范围，包括范围参数和回顾期。 | 422 | 
| 每 24 小时时段扫描的最大序列数量 | 100000 | 每 24 小时时段查询执行可扫描的唯一时间序列的最大数量。 | 422 | 
| 每 24 小时时段扫描的最大样本数量 | 3 亿 | 每 24 小时时段查询执行可扫描的最大样本数量。 | 422 | 
| 每 24 小时时段处理的最大样本数量 | 30 亿 | 每 24 小时时段查询执行可处理的最大样本数量。 | 422 | 
| Execution timeout (执行超时) | 20 秒 | 引擎可花费在评估查询上的最长时间，不包括排队和从存储中提取数据所花费的时间。 | 422 | 

## 支持的 AWS 区域
<a name="CloudWatch-PromQL-Regions"></a>

下表列出了提供 OTLP 指标摄取、PromQL 查询和 Query Studio 的 AWS 区域。


|  区域名称 | 区域代码 | IVS 指标摄取 | PromQL 查询 | Query Studio | 
| --- | --- | --- | --- | --- | 
| 美国东部（弗吉尼亚州北部） | us-east-1 | ✓ | ✓ | ✓ | 
| 美国西部（俄勒冈州） | us-west-2 | ✓ | ✓ | ✓ | 
| 欧洲地区（爱尔兰） | eu-west-1 | ✓ | ✓ | ✓ | 
| 亚太地区（新加坡） | ap-southeast-1 | ✓ | ✓ | ✓ | 
| 亚太地区（悉尼） | ap-southeast-2 | ✓ | ✓ | ✓ | 

## PromQL的 IAM 权限
<a name="CloudWatch-PromQL-IAM"></a>

要执行 PromQL 查询，您需要同时具有 `cloudwatch:ListMetrics` 和 `cloudwatch:GetMetricData` 权限。下表列出了新的 PromQL API 操作及其所需 IAM 操作：


| API 操作 | 所需的操作 | 
| --- | --- | 
| ExecuteMetricQueryPost | `cloudwatch:GetMetricData`, `cloudwatch:ListMetrics` | 
| ExecuteMetricQueryGet | `cloudwatch:GetMetricData`, `cloudwatch:ListMetrics` | 
| ExecuteMetricRangeQuery | `cloudwatch:GetMetricData`, `cloudwatch:ListMetrics` | 
| ExecuteMetricRangeQueryGet | `cloudwatch:GetMetricData`, `cloudwatch:ListMetrics` | 
| ExecuteMetricSeriesPost | `cloudwatch:ListMetrics` | 
| ExecuteMetricSeriesGet | `cloudwatch:ListMetrics` | 
| ExecuteMetricLabelsPost | `cloudwatch:ListMetrics` | 
| ExecuteMetricLabelsGet | `cloudwatch:ListMetrics` | 
| ExecuteMetricLabelValuesGet | `cloudwatch:ListMetrics` | 

# PromQL 查询
<a name="CloudWatch-PromQL-Querying"></a>

您通过 OpenTelemetry Protocol（OTLP）将 OpenTelemetry 指标摄取到 CloudWatch 时，分层 OTLP 数据模型会扁平化为兼容 PromQL 的标签。本节介绍标签结构、用于查询这些标签的 PromQL 语法以及 PromQL 中对 UTF-8 的支持。

**注意**  
Prometheus 3 中的 PromQL 支持在指标名称和标签名称中使用完整的 UTF-8 字符。这对于 OTLP 指标尤其重要，因为 OpenTelemetry 语义惯例在属性名称中使用点号，例如 `service.name`。以前，这些点号在翻译过程中被下划线所取代，这会导致 OTel 惯例中定义的内容与 Prometheus 中可查询的内容之间存在差异。

在 CloudWatch 中使用 PromQL 时，`@` 前缀惯例会将 OTLP 范围的标签与标准 Prometheus 标签区分开来。每个作用域内的字段使用双 `@` 前缀（例如 `@resource.@schema_url`），而属性使用单 `@` 作用域前缀，例如 `@resource.service.name`。数据点属性还支持裸露（无前缀）访问，以向后兼容标准 PromQL 查询，例如 `{"http.server.active_requests"}` 和 `{"@datapoint.@name"="http.server.active_requests"}` 等效。

PromQL 表达式用花括号括起来，用于指定指标名称和一组可选的标签匹配器。以下示例选择了 `http.server.active_requests` 指标的所有时间序列：

```
{"http.server.active_requests"}
```

以下示例选择了 `http.server.active_requests` 指标的所有时间序列，其中 OpenTelemetry 资源属性 `service.name` 等于 `myservice`：

```
{"http.server.active_requests", "@resource.service.name"="myservice"}
```

您可以在单个查询中组合多个标签匹配器。以下示例选择了 `http.server.active_requests` 指标的所有时间序列，其中在所有美国区域，OpenTelemetry 资源属性 `service.name` 等于 `myservice`：

```
{"http.server.active_requests",
 "@resource.service.name"="myservice",
 "@aws.region"=~"us-.*"}
```

以下示例显示了范围查询。该示例计算每个时间序列在指定时间范围内所有数据点的平均值：

```
avg_over_time(
  {"http.server.active_requests",
   "@resource.service.name"="myservice"}[5m]
)
```

下表总结了每个 OTLP 范围的前缀惯例：


| OTLP 范围 | 字段前缀 | 属性前缀 | 示例 | 
| --- | --- | --- | --- | 
| 资源 | `@resource.@` | `@resource.` | `@resource.service.name="myservice"` | 
| 埋点作用域 | `@instrumentation.@` | `@instrumentation.` | `@instrumentation.@name="otel-go/metrics"` | 
| 数据点 | `@datapoint.@` | `@datapoint.` 或裸露 | `cpu="cpu0"` 或 `@datapoint.cpu="cpu0"` | 
| AWS 保留 | 不适用 | `@aws.` | `@aws.account_id="123456789"` | 

## 使用 PromQL 查询 AWS 已出售指标
<a name="CloudWatch-PromQL-Querying-Vended"></a>

为了能够在 PromQL 中查询 AWS 已出售指标，您首先需要启用已出售指标的 OTel 补充功能。请参阅：[在 PromQL 中启用已出售指标](CloudWatch-OTelEnrichment.md)。

启用 OTel 补充功能后，可通过 PromQL 使用其他标签查询 AWS 已出售指标。指标名称与原始 CloudWatch 指标名称相同，原始 CloudWatch 维度可作为数据点属性提供。以下标签可用（以下示例适用于 EC2 实例）：


| PromQL 标签 | 说明 | 示例 | 
| --- | --- | --- | 
| `InstanceId` | 原始 CloudWatch 维度，作为数据点属性 | `i-0123456789abcdef0` | 
| `"@resource.cloud.resource_id"` | 资源的完整 ARN | `arn:aws:ec2:us-east-1:123456789012:instance/i-0123456789abcdef0` | 
| `"@resource.cloud.provider"` | 云提供商 | `aws` | 
| `"@resource.cloud.region"` | 此指标起源的 AWS 区域 | `us-east-1` | 
| `"@resource.cloud.account.id"` | 此指标起源的 AWS 账户 ID | `123456789012` | 
| `"@instrumentation.@name"` | 标识源服务的埋点作用域名称 | `cloudwatch.aws/ec2` | 
| `"@instrumentation.cloudwatch.source"` | 源服务标识符 | `aws.ec2` | 
| `"@instrumentation.cloudwatch.solution"` | 补充解决方案标识符 | `CloudWatchOTelEnrichment` | 
| `"@aws.tag.Environment"` | AWS 资源标签 | `production` | 
| `"@aws.account"` | 摄取此指标的 AWS 账户（系统标签） | `123456789012` | 
| `"@aws.region"` | 摄取此指标的 AWS 区域（系统标签） | `us-east-1` | 

以下示例为特定的 Lambda 函数选择了 `Invocations`：

```
histogram_sum({Invocations, FunctionName="my-api-handler"})
```

以下示例为具有特定团队标签的所有函数选择了 `Errors` Lambda：

```
histogram_sum(
  {Errors, "@instrumentation.@name"="cloudwatch.aws/lambda", "@aws.tag.Team"="backend"}
)
```

以下示例计算按团队分组的 `Invocations` Lambda 总数：

```
sum by ("@aws.tag.Team")(
    {Invocations, "@instrumentation.@name"="cloudwatch.aws/lambda"}
)
```

以下示例选择了 EC2 `CPUUtilization` 指标的所有时间序列。`"@instrumentation.@name"="cloudwatch.aws/ec2"` 的用法是为了专门匹配来自 EC2 的 CPUUtilization，而不是来自其他 AWS 服务（例如 Amazon Relational Database Service）的 CPUUtilization：

```
histogram_avg({CPUUtilization, "@instrumentation.@name"="cloudwatch.aws/ec2"})
```

# 在 Query Studio 中运行 PromQL 查询（预览版）
<a name="CloudWatch-PromQL-QueryStudio"></a>

**注意**  
Query Studio 目前以预览版功能的形式提供，不收取额外费用。有关支持的区域，请参阅[支持的 AWS 区域](CloudWatch-PromQL.md#CloudWatch-PromQL-Regions)。

Query Studio 是 CloudWatch 控制台中的一个交互式查询环境，您可以在其中根据 CloudWatch 指标编写、运行和可视化 PromQL 查询。您可以使用 Query Studio 浏览通过 OTLP 摄取的指标和 AWS 已出售指标、创建可视化效果、设置警报以及将小组件添加到 CloudWatch 控制面板中。

您可以使用 CloudWatch API 以编程方式运行 PromQL 查询，也可以在 Query Studio 中以交互方式运行。

## 在 Query Studio 中运行 PromQL 查询
<a name="CloudWatch-PromQL-QueryStudio-RunQuery"></a>

**在 Query Studio 中运行 PromQL 查询**

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

1. 在导航窗格中，请选择 **Query Studio（预览版）**。

1. 在查询编辑器工具中，从下拉菜单中选择 **PromQL**。

1. 使用**生成器**模式浏览和选择指标名称、标签与聚合函数。

1. 或者，通过**编辑器**模式输入 PromQL 查询，例如 `{"http.server.active_requests"}`。

1. （可选）使用页面顶部的时间间隔选择器调整时间范围。

1. 选择**运行**以执行查询并查看结果。

Query Studio 将以时间序列图表的方式显示结果。您可以在图表视图和表格视图之间切换以分析数据。

## 通过 Query Studio 创建警报
<a name="CloudWatch-PromQL-QueryStudio-Alarms"></a>

运行返回单个时间序列的 PromQL 查询后，可以直接通过 Query Studio 创建 CloudWatch 警报。从操作菜单中选择**创建警报**，根据查询结果配置警报阈值、评估期和通知操作。有关更多信息，请参阅 [在警报中使用 PromQL](CloudWatch-PromQL-Alarms.md)。

## 将可视化效果添加到控制面板中
<a name="CloudWatch-PromQL-QueryStudio-Dashboards"></a>

您可以将任何 Query Studio 可视化效果添加到 CloudWatch 控制面板中。运行查询并查看结果后，选择**添加到控制面板**以将可视化效果保存为控制面板小组件。该小组件继续以控制面板的刷新间隔运行 PromQL 查询，使控制面板保持最新状态。

# 在警报中使用 PromQL
<a name="CloudWatch-PromQL-Alarms"></a>

您可以使用 PromQL 查询来创建 CloudWatch 警报，以监控指标。PromQL 警报会评估 PromQL 表达式，并根据查询结果触发警报状态更改。

有关警报概念的信息，请参阅[概念](alarm-concepts.md)。

有关警报数据查询的信息，请参阅[告警数据查询](alarm-data-queries.md)。

有关警报操作的信息，请参阅[告警操作](alarm-actions.md)。

有关警报限制的信息，请参阅[限制](alarm-limits.md)。

## 创建 PromQL 警报
<a name="CloudWatch-PromQL-Alarms-Create"></a>

您可以通过 CloudWatch 控制台、AWS CLI 或 CloudWatch API 创建 PromQL 警报。

**通过控制台创建 PromQL 警报**

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

1. 在导航窗格中，依次选择 **Alarms**（警报）和 **All alarms**（所有警报）。

1. 选择**Create alarm（创建警报）**。

1. 选择**选择指标**，然后选择 **PromQL** 选项卡。

1. 输入 PromQL 查询。查询必须返回警报的单个时间序列以进行评估。

1. 配置警报条件，包括阈值、评估期和要发出警报的数据点。

1. 配置警报操作，例如 Amazon SNS 通知。

1. 输入警报的名称和描述，然后选择**创建警报**。

您也可以在运行返回单个时间序列的查询后，直接通过 [在 Query Studio 中运行 PromQL 查询（预览版）](CloudWatch-PromQL-QueryStudio.md) 创建 PromQL 警报。

## 使用 PromQL 创建 CloudWatch 警报以进行异常检测
<a name="promql_alarm_anomaly_detection"></a>

您可以创建一个 PromQL 警报，当指标违反统计界限定义的预期范围时会触发该警报。警报查询将上限和下限组合成一个表达式，该表达式仅返回异常数据点。查询返回的任何时间序列均被视为违规。

以下示例表达式会检测检测广告请求指标在 60 分钟窗口内偏离中位数超过 3 个标准差的情况：

```
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 警报](alarm-promql.md)。

您可以调整乘数和时间窗口，以匹配指标的行为。乘数越高，界限越宽，误报越少。较长的时间窗口会平滑掉短期峰值波动。对于不能为负值的指标，`clamp_min` 函数可防止下限变为负值。

有关使用 PromQL 构建异常检测范围的更多信息，请参阅[使用 PromQL 检测异常](CloudWatch_Anomaly_Detection.md#anomaly_detection_promql)。

# 使用 Metrics Explorer 按标签和属性监控资源
<a name="CloudWatch-Metrics-Explorer"></a>

Metrics Explorer 是一个基于标签的工具，您可以使用它按标签和资源属性筛选、聚合和可视化指标，从而增强对服务的监控。这样，您可以灵活、动态地排查问题，从而能够一次创建多个图表并使用它们构建应用程序运行状况控制面板。

Metrics Explorer 可视化会动态变化，如果在创建 Metrics Explorer 小组件并将其添加到 CloudWatch 控制面板之后创建了匹配的资源，则新资源将自动显示在 Metrics Explorer 小组件中。

例如，如果您的所有 EC2 生产实例都具有 **production** 标签，则您可以使用 Metrics Explorer 筛选和聚合所有这些实例的指标，以了解其运行状况和性能。如果稍后创建了具有匹配标签的新实例，则该实例会自动添加到 Metrics Explorer 小组件中。

**注意**  
Metrics Explorer 提供时间点体验。已终止的资源或不再以您指定的属性或标签存在的资源不会显示在可视化中。但是，您仍然可以在 CloudWatch 指标视图中找到这些资源的指标。

使用 Metrics Explorer，您可以选择如何聚合资源中与条件匹配的指标，以及是在单个图表中显示这些指标，还是在一个 Metrics Explorer 小组件中的不同图表上显示它们。

Metrics Explorer 包括您可以一键查看有用的可视化图表的模板，您还可以扩展这些模板以创建完全自定义的 Metrics Explorer 小组件。

如果您使用[跨账户跨区域的 CloudWatch 控制台](Cross-Account-Cross-Region.md)，则可以跨账户使用 Metrics Explorer。但是，不支持从[CloudWatch 跨账户可观测性](CloudWatch-Unified-Cross-Account.md)中的监控账户跨账户使用 Metrics Explorer。

Metrics Explorer 支持 AWS 发布的指标和由 CloudWatch 代理发布的 EC2 指标，包括内存、磁盘和 CPU 指标。若要使用 Metrics Explorer 查看由 CloudWatch 代理发布的指标，您可能需要更新您的 CloudWatch 代理配置文件。有关更多信息，请参阅 [适合 Metrics Explorer 的 CloudWatch 代理配置](#CloudWatch-Metrics-Explorer-agent)

若要使用 Metrics Explorer 创建可视化图表并选择性地将其添加到控制面板，请按照下列步骤操作。

**使用 Metrics Explorer 创建可视化图表**

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

1. 在导航窗格上，选择 **Explorer**。

1. 请执行以下操作之一：
   + 若要使用模板，请在当前显示 **Empty Explorer（空 Explorer）**的框中将其选中。

     根据不同模板，Explorer 可能会立即显示指标图表。如果未显示，请在 **From（从）**框中选择一个或多个标签或属性，随后应会显示数据。如果未显示数据，请使用页面顶部的选项将图表中显示的时间范围扩大。
   + 若要创建自定义可视化，请在 **Metrics（指标）**下，选择服务的单个指标或所有可用指标。

     选择指标之后，您可以选择性地重复此步骤添加更多指标。

1. 对于选定的每个指标，CloudWatch 会在指标名称后面显示其将随即使用的统计数据。若要更改此统计数据，请选择统计数据名称，然后选择您想要的统计数据。

1. 在 **From（从）**下，选择标签或资源属性来筛选结果。

   执行此操作后，您可以选择性地重复此步骤以选择更多标签或资源属性。

   如果您选择同一属性的多个值（如两个 EC2 实例类型），则 Explorer 将显示与任一选定属性匹配的所有资源。Explorer 将此选择视为 OR 操作。

   如果您选择了不同的属性或标签，例如 **Production** 标签和 M5 实例类型，则仅显示与所有这些选择匹配的资源。Explorer 将此选择视为 AND 操作。

1. （可选）对于 **Aggregate by（聚合依据）**，选择要用于聚合指标的统计数据。然后，在 **for（聚合方式）**旁边，选择如何聚合列表中的指标。您可以将当前显示的所有资源聚合在一起，也可以按单个标签或资源属性聚合。

   根据您选择的聚合方式，结果可能是单个时间序列或多个时间序列。

1. 在 **Split by（拆分方式）**下，您可以选择将具有多个时间序列的单个图表拆分为多个图表。可以按您在 **Split by（拆分方式）**下选择的多种标准进行拆分。

1. 在 **Graph options（绘制选项图形）**下，您可以通过更改周期、图表类型、图例放置和布局来优化图表。

1. 若要将此可视化作为小组件添加到 CloudWatch 控制面板，请选择 **Add to dashboard（添加到控制面板）**。

## 适合 Metrics Explorer 的 CloudWatch 代理配置
<a name="CloudWatch-Metrics-Explorer-agent"></a>

要使 Metrics Explorer 能够发现 CloudWatch 代理发布的 EC2 指标，请确保 CloudWatch 代理配置文件包含以下值：
+ 在 `metrics` 部分，请确保 `aggregation_dimensions` 参数包含 `["InstanceId"]`。其还可以包含其他维度。
+ 在 `metrics` 部分，请确保 `append_dimensions` 参数包含 `{"InstanceId":"${aws:InstanceId}"}` 行。其还可以包含其他行。
+ 在 `metrics` 部分（`metrics_collected` 部分中），检查您希望 Metrics Explorer 发现的每种资源类型所对应的部分，例如 `cpu`、`disk` 和 `memory` 部分。确保所有这些部分均包含 `"resources": [ "*"] line.`。
+ 在 `cpu` 部分（`metrics_collected` 部分中），请确保具有 `"totalcpu": true` 行。
+ 您必须为 CloudWatch 代理收集的指标使用原定设置的 `CWAgent` 命名空间，而不是自定义命名空间。

根据上一个列表中的设置，CloudWatch 代理会发布磁盘、CPU 和其它资源的聚合指标，这些指标可在 Metrics Explorer 中为使用它的所有实例标绘出来。

这些设置会重新发布您之前设置为以多个维度发布的指标，从而增加您的指标成本。

有关编辑 CloudWatch 代理配置文件的更多信息，请参阅 [手动创建或编辑 CloudWatch 代理配置文件](CloudWatch-Agent-Configuration-File-Details.md)。

# 使用指标流
<a name="CloudWatch-Metric-Streams"></a>

您可以使用*指标流*持续地将 CloudWatch 指标流式传输到您所选的目标位置，实现近实时传送和低延迟。支持的目标位置包括 AWS 目标位置（例如 Amazon Simple Storage Service）和多个第三方服务提供商目标位置。

CloudWatch 指标流有 3 种主要使用场景：
+ **使用 Firehose 进行自定义设置** – 创建指标流并将其导向 Amazon Data Firehose 传输流，该流会将您的 CloudWatch 指标传送到所需位置。您可以将它们流式传输到诸如 Amazon S3 之类的数据湖，或传输到 Firehose 支持的任何目标或端点，包括第三方提供商。原生支持 JSON、OpenTelemetry 1.0.0 和 OpenTelemetry 0.7.0 格式，或者您可以在 Firehose 传输流中配置转换，将数据转换为其他格式，例如 Parquet。借助指标流，您可以持续更新监控数据，或者将此 CloudWatch 指标数据与账单和性能数据相结合，以创建丰富的数据集。然后，您可以使用 Amazon Athena 等工具深入了解成本优化、资源性能和资源利用率。
+ **S3 快速设置** – 通过快速设置过程流式传输到 Amazon Simple Storage Service。默认情况下，CloudWatch 会创建流所需的资源。支持的格式为 JSON、OpenTelemetry 1.0.0 和 OpenTelemetry 0.7.0。
+ **AWS 合作伙伴快速设置** – CloudWatch 会为某些第三方合作伙伴提供快速设置功能体验。您可以通过第三方服务提供商，使用 CloudWatch 流式数据监控和分析您的应用程序并排查应用程序问题。当您使用合作伙伴快速设置工作流时，您只需要提供目标 URL 和目标的 API 密钥，CloudWatch 将负责其余的设置。合作伙伴快速设置适用于以下第三方提供商：

  
  + Datadog
  + Dynatrace
  + 弹性
  + New Relic
  + Splunk Observability Cloud
  + SumoLogic

您可以流式传输所有 CloudWatch 指标，也可以使用筛选条件仅流式传输指定指标。每个指标流最多可包含 1000 个包括或排除指标命名空间或特定指标的筛选条件。单个指标流只能包括或排除筛选条件，不能同时既包括又排除。

创建指标流后，如果创建了与现有筛选条件匹配的新指标，则新指标将自动包含在指标流中。

每个账户或每个区域的指标流数量没有限制，正在流式传输的指标的更新数量也没有限制。

每个指标流可以使用 JSON、OpenTelemetry 1.0.0 或 OpenTelemetry 0.7.0 格式。您可以随时编辑指标流的输出格式，例如从 OpenTelemetry 0.7.0 升级到 OpenTelemetry 1.0.0。有关输出格式的更多信息，请参阅 [JSON 格式的 CloudWatch 指标流](CloudWatch-metric-streams-formats-json.md)、[OpenTelemetry 1.0.0 格式的 CloudWatch 指标流输出](CloudWatch-metric-streams-formats-opentelemetry-100.md)和 [OpenTelemetry 0.7.0 格式的 CloudWatch 指标流输出](CloudWatch-metric-streams-formats-opentelemetry.md)。

对于监控账户中的指标流，您可以选择是否包含与该监控账户关联的源账户的指标。有关更多信息，请参阅 [CloudWatch 跨账户可观测性](CloudWatch-Unified-Cross-Account.md)。

指标流始终包括 `Minimum`、`Maximum`、`SampleCount` 和 `Sum` 统计数据。您也可以选择包括其他统计数据，另外收费。有关更多信息，请参阅 [可以流式传输的统计数据](CloudWatch-metric-streams-statistics.md)。

指标流定价基于指标更新的数量。对于用于指标流的传输流的 Firehose，也会产生费用。有关更多信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

**Topics**
+ [设置指标流](CloudWatch-metric-streams-setup.md)
+ [可以流式传输的统计数据](CloudWatch-metric-streams-statistics.md)
+ [指标流操作和维护](CloudWatch-metric-streams-operation.md)
+ [使用 CloudWatch 指标监控您的指标流](CloudWatch-metric-streams-monitoring.md)
+ [CloudWatch 和 Firehose 之间的信任关系](CloudWatch-metric-streams-trustpolicy.md)
+ [JSON 格式的 CloudWatch 指标流](CloudWatch-metric-streams-formats-json.md)
+ [OpenTelemetry 1.0.0 格式的 CloudWatch 指标流输出](CloudWatch-metric-streams-formats-opentelemetry-100.md)
+ [OpenTelemetry 0.7.0 格式的 CloudWatch 指标流输出](CloudWatch-metric-streams-formats-opentelemetry.md)
+ [对 CloudWatch 中的指标流进行故障排除](CloudWatch-metric-streams-troubleshoot.md)

# 设置指标流
<a name="CloudWatch-metric-streams-setup"></a>

按照以下部分中的步骤设置 CloudWatch 指标流。

创建指标流后，指标数据显示在目标位置所需的时间取决于对 Firehose 传输流配置的缓冲设置。缓冲以最大负载大小或最长等待时间表示，以先达到者为准。如果缓冲设置为最小值（60 秒、1MB），则如果所选 CloudWatch 命名空间具有活动指标更新，则预期延迟将在 3 分钟内。

在 CloudWatch 指标流中，每分钟发送一次数据。数据可能无序到达最终目标位置。指定命名空间中的所有指定的指标都在指标流中发送，但时间戳超过两天的指标除外。

对于您流式传输的指标名称和命名空间的每个组合，该指标名称和命名空间的所有维度组合都将被流式传输。

对于监控账户中的指标流，您可以选择是否包含与该监控账户关联的源账户的指标。有关更多信息，请参阅 [CloudWatch 跨账户可观测性](CloudWatch-Unified-Cross-Account.md)。

要创建及管理指标流，您必须登录具有 **CloudWatchFullAccess** 策略和 `iam:PassRole` 权限的账户，或具有以下所列权限的账户：
+ `iam:PassRole`
+ `cloudwatch:PutMetricStream`
+ `cloudwatch:DeleteMetricStream`
+ `cloudwatch:GetMetricStream`
+ `cloudwatch:ListMetricStreams`
+ `cloudwatch:StartMetricStreams`
+ `cloudwatch:StopMetricStreams`

如果您要让 CloudWatch 设置指标流所需的 IAM 角色，您还必须具有 `iam:CreateRole` 和 `iam:PutRolePolicy` 权限。

**重要**  
具有 `cloudwatch:PutMetricStream` 的用户即使不具有 `cloudwatch:GetMetricData` 权限也可以访问正在流式传输的 CloudWatch 指标数据。

**Topics**
+ [使用 Firehose 自定义设置](CloudWatch-metric-streams-setup-datalake.md)
+ [使用 Amazon S3 快速设置](CloudWatch-metric-streams-setup-Quick-S3.md)
+ [合作伙伴快速设置](CloudWatch-metric-streams-QuickPartner.md)

# 使用 Firehose 自定义设置
<a name="CloudWatch-metric-streams-setup-datalake"></a>

使用此方法创建指标流并将其导向 Amazon Data Firehose 传输流，该流会将您的 CloudWatch 指标传送到所需位置。您可以将它们流式传输到诸如 Amazon S3 之类的数据湖，或传输到 Firehose 支持的任何目标或端点，包括第三方提供商。

原生支持 JSON、OpenTelemetry 1.0.0 和 OpenTelemetry 0.7.0 格式，或者您可以在 Firehose 传输流中配置转换，将数据转换为其他格式，例如 Parquet。借助指标流，您可以持续更新监控数据，或者将此 CloudWatch 指标数据与账单和性能数据相结合，以创建丰富的数据集。然后，您可以使用 Amazon Athena 等工具深入了解成本优化、资源性能和资源利用率。

您可以使用 CloudWatch 控制台、AWS CLI、AWS CloudFormation 或 AWS Cloud Development Kit (AWS CDK) 设置指标流。

您用于指标流的 Firehose 传输流必须位于指标流设置所在的同一账户和区域中。要实现跨区域功能，您可以将 Firehose 传输流配置为流式传输到位于不同账户或不同区域中的最终目标位置。

## CloudWatch 控制台
<a name="CloudWatch-metric-streams-setup-datalake-console"></a>

本部分介绍如何通过 CloudWatch 控制台使用 Firehose 设置指标流。

**要使用 Firehose 设置自定义指标流**

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

1. 在导航窗格中，选择 **Metrics**（指标）、**Streams**（流）。然后选择 **Create metric stream**（创建指标流）。

1. （可选）如果您登录的账户在 CloudWatch 跨账户可观测性中设置为监控账户，您可以选择是否包含来自此指标流中关联源账户的指标。要包含来自源账户的指标，请选择 **Include source account metrics**（包含源账户指标）。

1. 选择**使用 Firehose 自定义设置**。

1. 对于**选择 Kinesis Data Firehose 流**，请选择要使用的 Firehose 传输流。必须位于同一账户中。此选项的默认格式为 OpenTelemetry 0.7.0，但您可以在此过程的后续步骤中更改格式。

   然后在**选择您的 Firehose 传输流**下选择要使用的 Firehose 传输流。

1. （可选）您可以选择**选择现有服务角色**来使用现有 IAM 角色，而不必让 CloudWatch 为您创建新角色。

1. （可选）要更改方案的默认输出格式，请选择 **Change output format（更改输出格式）**。支持的格式为 JSON、OpenTelemetry 1.0.0 和 OpenTelemetry 0.7.0。

1. 对于**要进行流式传输的指标**，请选择**所有指标**或**选择指标**。

   如果您选择**所有指标**，则该账户的所有指标都将包含在流中。

   请仔细考虑是否要流式传输所有指标，因为流式传输的指标越多，您的指标流费用就越高。

   如果选择的是**选择指标**，请执行以下操作中的一项：
   + 要流式传输大多数指标命名空间，请选择**排除**，然后选择要排除的命名空间或指标。在**排除**中指定命名空间时，可以选择该命名空间中要排除的一些特定指标。如果选择排除某个命名空间，但随后没有选择该命名空间中的指标，则该命名空间中的所有指标都将被排除。
   + 要在指标流中仅包含少数指标命名空间或指标，请选择**包含**，然后选择要包含的命名空间或指标。如果选择包含某个命名空间，但随后没有选择该命名空间中的指标，则该命名空间中的所有指标都将包含在内。

1. （可选）要流式传输其中除 Minimum、Maximum、SampleCount 和 Sum 外的一些指标的其他统计数据，请选择**添加其他统计数据**。要么选择 **Add recommended metrics**（添加推荐的指标）添加一些常用的统计数据，要么手动选择要针对其流式传输额外统计数据的命名空间和指标名称。接下来，选择要流式传输的额外统计数据。

   然后，要选择另一组指标，以流式传输另一组额外统计数据，请选择 **Add additional statistics**（添加额外统计数据）。每个指标可以包含多达 20 个额外统计数据，一个指标流中有多达 100 个指标可以包含额外统计数据。

   流式传输额外统计数据会产生更多费用。有关更多信息，请参阅 [可以流式传输的统计数据](CloudWatch-metric-streams-statistics.md)。

   有关额外统计数据的定义，请参阅 [CloudWatch 统计数据定义](Statistics-definitions.md)。

1. （可选）可以在 **Metric stream name（指标流名称）**下自定义新指标流的名称。

1. 选择 **Create metric filter（创建指标流）**。

## AWS CLI 或 AWS API
<a name="CloudWatch-metric-streams-setup-datalake-CLI"></a>

使用以下步骤创建 CloudWatch 指标流。

**使用 AWS CLI 或 AWS API 创建指标流**

1. 如果您要流式传输到 Amazon S3，请先创建存储桶。有关更多信息，请参阅[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。

1. 创建 Firehose 传输流。有关更多信息，请参阅[创建 Firehose 流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。

1. 创建使 CloudWatch 能够向 Firehose 传输流写入的 IAM 角色。有关该角色内容的更多信息，请参阅 [CloudWatch 和 Firehose 之间的信任关系](CloudWatch-metric-streams-trustpolicy.md)。

1. 使用 `aws cloudwatch put-metric-stream` CLI 命令或 `PutMetricStream` API 来创建 CloudWatch 指标流。

## AWS CloudFormation
<a name="CloudWatch-metric-streams-setup-datalake-CFN"></a>

您可以使用 CloudFormation 设置指标流。有关更多信息，请参阅 [AWS::CloudWatch::MetricStream](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html)。

**使用 CloudFormation 创建指标流**

1. 如果您要流式传输到 Amazon S3，请先创建存储桶。有关更多信息，请参阅[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。

1. 创建 Firehose 传输流。有关更多信息，请参阅[创建 Firehose 流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。

1. 创建使 CloudWatch 能够向 Firehose 传输流写入的 IAM 角色。有关该角色内容的更多信息，请参阅 [CloudWatch 和 Firehose 之间的信任关系](CloudWatch-metric-streams-trustpolicy.md)。

1. 在 CloudFormation 中创建指标流。有关更多信息，请参阅 [AWS::CloudWatch::MetricStream](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html)。

## AWS Cloud Development Kit (AWS CDK)
<a name="CloudWatch-metric-streams-setup-datalake-CDK"></a>

您可以使用 AWS Cloud Development Kit (AWS CDK) 设置指标流。

**使用 AWS CDK 创建指标流**

1. 如果您要流式传输到 Amazon S3，请先创建存储桶。有关更多信息，请参阅[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。

1. 创建 Firehose 传输流。有关更多信息，请参阅[创建 Amazon Data Firehose 传输流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。

1. 创建使 CloudWatch 能够向 Firehose 传输流写入的 IAM 角色。有关该角色内容的更多信息，请参阅 [CloudWatch 和 Firehose 之间的信任关系](CloudWatch-metric-streams-trustpolicy.md)。

1. 创建指标流。指标流资源在 AWS CDK 中作为名为 `CfnMetricStream` 的 Level 1 (L1) Construct 提供。有关更多信息，请参阅[使用 L1 Construct](https://docs.aws.amazon.com/cdk/latest/guide/constructs.html#constructs_l1_using.html)。

# 使用 Amazon S3 快速设置
<a name="CloudWatch-metric-streams-setup-Quick-S3"></a>

如果您想快速设置传输到 Amazon S3 的流，并且除了支持的 JSON、OpenTelemetry 1.0.0 和 OpenTelemetry 0.7.0 格式之外，您不需要任何格式转换，**S3 快速设置**方法非常适合。CloudWatch 将创建所有必要的资源，包括 Firehose 传输流和必要的 IAM 角色。此选项的默认格式为 JSON，但您可以在设置流时更改格式。

或者，如果您希望最终格式为 Parquet 格式或优化的行列式（ORC），则应改为按照 [使用 Firehose 自定义设置](CloudWatch-metric-streams-setup-datalake.md) 中的步骤进行操作。

## CloudWatch 控制台
<a name="CloudWatch-metric-streams-setup-quick-S3-console"></a>

本部分介绍如何通过 CloudWatch 控制台使用“S3 快速设置”设置指标流 Amazon S3。

**使用“S3 快速设置”设置指标流**

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

1. 在导航窗格中，选择 **Metrics**（指标）、**Streams**（流）。然后选择 **Create metric stream**（创建指标流）。

1. （可选）如果您登录的账户在 CloudWatch 跨账户可观测性中设置为监控账户，您可以选择是否包含来自此指标流中关联源账户的指标。要包含来自源账户的指标，请选择 **Include source account metrics**（包含源账户指标）。

1. 选择**S3 快速设置**。CloudWatch 将创建所有必要的资源，包括 Firehose 传输流和必要的 IAM 角色。此选项的默认格式为 JSON，但您可以在此程序的稍后步骤中更改格式。

1. （可选）选择**选择现有资源**以使用现有 S3 存储桶或现有 IAM 角色，而不是让 CloudWatch 为您创建新的存储桶或 IAM 角色。

1. （可选）要更改方案的默认输出格式，请选择 **Change output format（更改输出格式）**。支持的格式为 JSON、OpenTelemetry 1.0.0 和 OpenTelemetry 0.7.0。

1. 对于**要进行流式传输的指标**，请选择**所有指标**或**选择指标**。

   如果您选择**所有指标**，则该账户的所有指标都将包含在流中。

   请仔细考虑是否要流式传输所有指标，因为流式传输的指标越多，您的指标流费用就越高。

   如果选择的是**选择指标**，请执行以下操作中的一项：
   + 要流式传输大多数指标命名空间，请选择**排除**，然后选择要排除的命名空间或指标。在**排除**中指定命名空间时，可以选择该命名空间中要排除的一些特定指标。如果选择排除某个命名空间，但随后没有选择该命名空间中的指标，则该命名空间中的所有指标都将被排除。
   + 要在指标流中仅包含少数指标命名空间或指标，请选择**包含**，然后选择要包含的命名空间或指标。如果选择包含某个命名空间，但随后没有选择该命名空间中的指标，则该命名空间中的所有指标都将包含在内。

1. （可选）要流式传输其中除 Minimum、Maximum、SampleCount 和 Sum 外的一些指标的其他统计数据，请选择**添加其他统计数据**。要么选择 **Add recommended metrics**（添加推荐的指标）添加一些常用的统计数据，要么手动选择要针对其流式传输额外统计数据的命名空间和指标名称。接下来，选择要流式传输的额外统计数据。

   然后，要选择另一组指标，以流式传输另一组额外统计数据，请选择 **Add additional statistics**（添加额外统计数据）。每个指标可以包含多达 20 个额外统计数据，一个指标流中有多达 100 个指标可以包含额外统计数据。

   流式传输额外统计数据会产生更多费用。有关更多信息，请参阅 [可以流式传输的统计数据](CloudWatch-metric-streams-statistics.md)。

   有关额外统计数据的定义，请参阅 [CloudWatch 统计数据定义](Statistics-definitions.md)。

1. （可选）可以在 **Metric stream name（指标流名称）**下自定义新指标流的名称。

1. 选择 **Create metric filter（创建指标流）**。

# 合作伙伴快速设置
<a name="CloudWatch-metric-streams-QuickPartner"></a>

CloudWatch 为以下第三方合作伙伴提供快速设置功能体验。要使用此工作流，您只需提供目标 URL 和目标的 API 密钥。CloudWatch 将负责其余的设置，包括创建 Firehose 传输流和所需的 IAM 角色。

**重要**  
在使用合作伙伴快速设置创建指标流之前，我们强烈建议您阅读以下列表中链接的该合作伙伴的文档。
+ [Datadog](https://docs.datadoghq.com/integrations/guide/aws-cloudwatch-metric-streams-with-kinesis-data-firehose/)
+ [Dynatrace](https://www.dynatrace.com/support/help/dynatrace-api/basics/dynatrace-api-authentication)
+ [弹性](https://www.elastic.co/docs/current/integrations/awsfirehose)
+ [New Relic](https://docs.newrelic.com/install/aws-cloudwatch/)
+ [Splunk Observability Cloud](https://docs.splunk.com/observability/en/gdi/get-data-in/connect/aws/aws-console-ms.html)
+ [SumoLogic](https://www.sumologic.com)

当您设置要传输到其中一个合作伙伴的指标流时，将使用一些默认设置创建该流，如以下各部分所列。

**Topics**
+ [使用“合作伙伴快速设置”设置指标流](#CloudWatch-metric-streams-QuickPartner-setup)
+ [Datadog 流默认设置](#CloudWatch-metric-streams-QuickPartner-Datadog)
+ [Dynatrace 流默认设置](#CloudWatch-metric-streams-QuickPartner-Dynatrace)
+ [Elastic 流默认设置](#CloudWatch-metric-streams-QuickPartner-Elastic)
+ [New Relic 流默认设置](#CloudWatch-metric-streams-QuickPartner-NewRelic)
+ [Splunk Observability Cloud 流默认设置](#CloudWatch-metric-streams-QuickPartner-Splunk)
+ [Sumo Logic 流默认设置](#CloudWatch-metric-streams-QuickPartner-Sumologic)

## 使用“合作伙伴快速设置”设置指标流
<a name="CloudWatch-metric-streams-QuickPartner-setup"></a>

CloudWatch 为某些第三方合作伙伴提供了快速设置功能选项。在开始执行本部分中的步骤之前，您必须先了解合作伙伴的某些信息。这些信息可能包括目标 URL 和/或合作伙伴目标的 API 密钥。您还应该阅读上一部分中链接的合作伙伴网站上的文档，以及以下各部分中列出的针对相应合作伙伴的默认设置。

要流式传输到快速设置功能不支持的第三方目标，您可以按照 [使用 Firehose 自定义设置](CloudWatch-metric-streams-setup-datalake.md) 中的说明，使用 Firehose 设置流，然后将这些指标从 Firehose 发送到最终目标。

**使用“合作伙伴快速设置”创建传输到第三方提供商的指标流**

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

1. 在导航窗格中，选择 **Metrics**（指标）、**Streams**（流）。然后选择 **Create metric stream**（创建指标流）。

1. （可选）如果您登录的账户在 CloudWatch 跨账户可观测性中设置为监控账户，您可以选择是否包含来自此指标流中关联源账户的指标。要包含来自源账户的指标，请选择 **Include source account metrics**（包含源账户指标）。

1. 选择**快速设置 Amazon Web Services 合作伙伴**

1. 选择要将指标流式传输到的合作伙伴的名称。

1. 对于**端点 URL**，输入目标 URL。

1. 对于**访问密钥**或 **API 密钥**，输入相应合作伙伴的访问密钥。并非所有合作伙伴都需要访问密钥。

1. 对于**要进行流式传输的指标**，请选择**所有指标**或**选择指标**。

   如果您选择**所有指标**，则该账户的所有指标都将包含在流中。

   请仔细考虑是否要流式传输所有指标，因为流式传输的指标越多，您的指标流费用就越高。

   如果选择的是**选择指标**，请执行以下操作中的一项：
   + 要流式传输大多数指标命名空间，请选择**排除**，然后选择要排除的命名空间或指标。在**排除**中指定命名空间时，可以选择该命名空间中要排除的一些特定指标。如果选择排除某个命名空间，但随后没有选择该命名空间中的指标，则该命名空间中的所有指标都将被排除。
   + 要在指标流中仅包含少数指标命名空间或指标，请选择**包含**，然后选择要包含的命名空间或指标。如果选择包含某个命名空间，但随后没有选择该命名空间中的指标，则该命名空间中的所有指标都将包含在内。

1. （可选）要流式传输其中除 Minimum、Maximum、SampleCount 和 Sum 外的一些指标的其他统计数据，请选择**添加其他统计数据**。要么选择 **Add recommended metrics**（添加推荐的指标）添加一些常用的统计数据，要么手动选择要针对其流式传输额外统计数据的命名空间和指标名称。接下来，选择要流式传输的额外统计数据。

   然后，要选择另一组指标，以流式传输另一组额外统计数据，请选择 **Add additional statistics**（添加额外统计数据）。每个指标可以包含多达 20 个额外统计数据，一个指标流中有多达 100 个指标可以包含额外统计数据。

   流式传输额外统计数据会产生更多费用。有关更多信息，请参阅 [可以流式传输的统计数据](CloudWatch-metric-streams-statistics.md)。

   有关额外统计数据的定义，请参阅 [CloudWatch 统计数据定义](Statistics-definitions.md)。

1. （可选）可以在 **Metric stream name（指标流名称）**下自定义新指标流的名称。

1. 选择 **Create metric filter（创建指标流）**。

## Datadog 流默认设置
<a name="CloudWatch-metric-streams-QuickPartner-Datadog"></a>

传输到 Datadog 的合作伙伴快速设置流使用以下默认设置：
+ **输出格式：**OpenTelemetry 0.7.0
+ **Firehose 流内容编码** GZIP
+ **Firehose 流缓冲选项** 间隔为 60 秒，大小为 4MB
+ **Firehose 流重试选项** 持续时间为 60 秒

当您使用“合作伙伴快速设置”创建传输到 Datadog 的指标流并流式传输某些指标时，默认情况下，这些指标会包含一些其他统计数据。流式传输其他统计数据可能会产生额外费用。有关这些统计数据及其费用的更多信息，请参阅 [可以流式传输的统计数据](CloudWatch-metric-streams-statistics.md)。

如果您选择流式传输默认会流式传输其他统计数据的指标，以下列表将显示这些指标。在启动流式传输之前，您可以选择取消选择这些其他统计数据。
+ **`AWS/Lambda` 中的 `Duration`：**p50、p80、p95、p99、p99.9
+ **`AWS/Lambda` 中的 `PostRuntimeExtensionDuration`：**p50、p99
+ **`AWS/S3` 中的 `FirstByteLatency` 和 `TotalRequestLatency`：**p50、p90、p95、p99、p99.9
+ **AWS/ApplicationELB 中 `AWS/Polly` 和 `TargetResponseTime` 中的 `ResponseLatency`：**p50、p90、p95、p99
+ **`AWS/ApiGateway` 中的 `Latency` 和 `IntegrationLatency`：**p90、p95、p99
+ **`AWS/ELB` 中的 `Latency` 和 `TargetResponseTime`：**p95、p99
+ **`AWS/AppRunner` 中的 `RequestLatency`：**p50、p95、p99
+ **`AWS/States` 中的 `ActivityTime`、`ExecutionTime`、`LambdaFunctionRunTime`、`LambdaFunctionScheduleTime`、`LambdaFunctionTime`、`ActivityRunTime` 和 `ActivityScheduleTime`：**p95、p99
+ **`AWS/MediaLive` 中的 `EncoderBitRate`、`ConfiguredBitRate` 和 `ConfiguredBitRateAvailable`：**p90
+ **`AWS/AppSync` 中的 `Latency`：**p90

## Dynatrace 流默认设置
<a name="CloudWatch-metric-streams-QuickPartner-Dynatrace"></a>

传输到 Dynatrace 的合作伙伴快速设置流使用以下默认设置：
+ **输出格式：**OpenTelemetry 0.7.0
+ **Firehose 流内容编码** GZIP
+ **Firehose 流缓冲选项** 间隔为 60 秒，大小为 5MB
+ **Firehose 流重试选项** 持续时间为 600 秒

## Elastic 流默认设置
<a name="CloudWatch-metric-streams-QuickPartner-Elastic"></a>

传输到 Elastic 的合作伙伴快速设置流使用以下默认设置：
+ **输出格式：**OpenTelemetry 1.0.0
+ **Firehose 流内容编码** GZIP
+ **Firehose 流缓冲选项** 间隔为 60 秒，大小为 1MB
+ **Firehose 流重试选项** 持续时间为 60 秒

## New Relic 流默认设置
<a name="CloudWatch-metric-streams-QuickPartner-NewRelic"></a>

传输到 New Relic 的合作伙伴快速设置流使用以下默认设置：
+ **输出格式：**OpenTelemetry 0.7.0
+ **Firehose 流内容编码** GZIP
+ **Firehose 流缓冲选项** 间隔为 60 秒，大小为 1MB
+ **Firehose 流重试选项** 持续时间为 60 秒

## Splunk Observability Cloud 流默认设置
<a name="CloudWatch-metric-streams-QuickPartner-Splunk"></a>

传输到 Splunk Observability Cloud 的合作伙伴快速设置流使用以下默认设置：
+ **输出格式：**OpenTelemetry 1.0.0
+ **Firehose 流内容编码** GZIP
+ **Firehose 流缓冲选项** 间隔为 60 秒，大小为 1MB
+ **Firehose 流重试选项** 持续时间为 300 秒

## Sumo Logic 流默认设置
<a name="CloudWatch-metric-streams-QuickPartner-Sumologic"></a>

传输到 Sumo Logic 的合作伙伴快速设置流使用以下默认设置：
+ **输出格式：**OpenTelemetry 0.7.0
+ **Firehose 流内容编码** GZIP
+ **Firehose 流缓冲选项** 间隔为 60 秒，大小为 1MB
+ **Firehose 流重试选项** 持续时间为 60 秒

# 可以流式传输的统计数据
<a name="CloudWatch-metric-streams-statistics"></a>

指标流始终包括以下统计数据：`Minimum`、`Maximum`、`SampleCount` 和 `Sum`。您还可以选择在指标流中包括以下其他统计数据。此选择基于每个指标。有关这些统计数据的更多信息，请参阅 [CloudWatch 统计数据定义](Statistics-definitions.md)。
+ 百分位数值，例如 p95 或 p99（适用于 JSON 或 OpenTelemetry 格式的流） 
+ 切尾均值（仅适用于 JSON 格式的流）
+ 缩尾均值（仅适用于 JSON 格式的流）
+ 切尾计数（仅适用于 JSON 格式的流）
+ 切尾总和（仅适用于 JSON 格式的流）
+ 百分位数排名（仅适用于 JSON 格式的流）
+ 四分位数均值（仅适用于 JSON 格式的流）

流式传输额外统计数据会产生额外费用。流式传输某一特定指标的其中 1 个到 5 个额外统计数据，将作为一次额外指标更新来计费。此后，每增加一组（最多包含其中 5 个统计数据），将作为另一次指标更新来计费。

 例如，假设对于某一指标，您正在流式传输以下 6 个额外统计数据：p95、p99、p99.9、切尾均值、缩尾均值和切尾总和。此指标的每次更新均作为三次指标更新计费：一个用于包含默认统计数据的指标更新，一个用于前 5 个额外统计数据，还有一个用于第 6 个额外统计数据。再添加最多 4 个额外统计数据，共 10 个，不会增加计费，但是第 11 个额外统计数据就会增加计费。

当您指定指标名称和命名空间组合，以流式传输额外统计数据时，该指标名称和命名空间的所有维度组合都将与这些额外统计数据一起流式传输。

CloudWatch 指标流发布了一个新指标，`TotalMetricUpdate`，它反映了指标更新加上由流式传输额外统计数据产生的额外指标更新的基本数量。有关更多信息，请参阅 [使用 CloudWatch 指标监控您的指标流](CloudWatch-metric-streams-monitoring.md)。

有关更多信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

**注意**  
有些指标不支持百分位数。这些指标的百分位数统计数据将从流式传输中排除，因而不会产生指标流费用。这些不支持百分位数的统计数据的一个示例是 `AWS/ECS` 命名空间的一些指标。

仅当您配置的额外统计数据与流的筛选条件相匹配时，才会流式传输这些统计数据。例如，如果您创建的流仅将 `EC2` 和 `RDS` 包含在包含筛选条件中，然后您的统计数据配置列出 `EC2` 和 `Lambda`，则该流将包含 `EC2` 指标（其中包含额外统计数据）、`RDS` 指标（仅包含默认统计数据），但根本不包含 `Lambda` 统计数据。

# 指标流操作和维护
<a name="CloudWatch-metric-streams-operation"></a>

指标流始终处于两种状态之一，即**正在运行**或**已停止**状态。
+ **正在运行** – 指标流正在正确运行。由于指标流的筛选条件，可能没有任何已流式传输到目标位置的指标数据。
+ **已停止** – 指标流已被某人明确停止，且不是因错误而停止。停止指标流以暂时暂停流式传输数据而不删除指标流可能会很有帮助。

如果停止并重新启动指标流，则在指标流停止期间发布到 CloudWatch 的指标数据不会回填到该指标流。

如果更改指标流的输出格式，在某些情况下，您可能会看到少量指标数据以新旧两种格式写入到目标位置。为了避免这种情况，您可以使用与当前传输流相同的配置创建新的 Firehose 传输流，然后更改为新的 Firehose 传输流并同时更改输出格式。这样，具有不同输出格式的 Kinesis 记录将存储在 Amazon S3 中的单独对象中。您稍后可以将流量导向回原始 Firehose 传输流，并删除另一个传输流。

**查看、编辑、停止和启动指标流**

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

1. 在导航窗格中，选择 **Metrics**（指标）、**Streams**（流）。

   此时将显示流列表，并且 **Status（状态）**列显示每个流是处于正在运行还是已停止状态。

1. 要停止或启动指标流，请选择该流，然后选择 **Stop（停止）**或 **Start（启动）**。

1. 要查看有关指标流的详细信息，请选择该流，然后选择 **View details（查看详细信息）**。

1. 若要更改流的输出格式、筛选条件、目标 Firehose 流或角色，请选择**编辑**并执行所需的更改。

   如果您更改筛选条件，则在过渡期间指标数据中可能存在一些差异。

# 使用 CloudWatch 指标监控您的指标流
<a name="CloudWatch-metric-streams-monitoring"></a>

指标流会在 `AWS/CloudWatch/MetricStreams` 命名空间中发出关于自身运行状况和操作的 CloudWatch 指标。将发出以下指标。发出的这些指标都会存在具有 `MetricStreamName` 维度和没有维度两种情况。您可以使用没有维度的指标来查看所有指标流的已聚合指标。您可以使用具有 `MetricStreamName` 维度的指标以查看仅与该指标流有关的指标。

对于所有这些指标，均仅针对处于 **Running**（正在运行）状态的指标流发出数值。


| 指标 | 说明 | 
| --- | --- | 
|  `MetricUpdate`  |  发送到指标流的指标更新次数。如果在某个时间段内没有流式传输指标更新，则在该时间段内不会发布此指标。 如果停止指标流，则将停止发出该指标，直到该指标流再次启动。 有效统计数据：`Sum` 单位：无 | 
|  `TotalMetricUpdate`  |  计算方法为 **MetricUpdate \$1 一个基于正在流式传输的额外统计数据的数字**。 对于每个唯一的命名空间和指标名称组合，流式传输 1-5 个额外统计数据将向 `TotalMetricUpdate` 加 1，流式传输 6-10 个额外统计数据将向 `TotalMetricUpdate` 加 2，以此类推。 有效统计数据：`Sum` 单位：无 | 
|  `PublishErrorRate`  |  在将数据放入 Firehose 传输流时发生的不可恢复的错误数。如果在某个时间段内没有发生错误，则在该时间段内不会发布此指标。 如果停止指标流，则将停止发出该指标，直到该指标流再次启动。 有效统计数据：`Average`，用于查看无法写入的指标更新速率。此值必须介于 0.0 到 1.0 之间。 单位：无  | 

# CloudWatch 和 Firehose 之间的信任关系
<a name="CloudWatch-metric-streams-trustpolicy"></a>

Firehose 传输流必须通过对 Firehose 具有写入权限的 IAM 角色来信任 CloudWatch。这些权限可仅限为 CloudWatch 指标流使用的单个 Firehose 传输流。IAM 角色必须信任 `streams.metrics.cloudwatch.amazonaws.com` 服务主体。

如果您使用 CloudWatch 控制台创建指标流，则可以让 CloudWatch 创建具有正确权限的角色。如果您使用其他方法创建指标流，或者希望创建 IAM 角色本身，则该角色必须包含以下权限策略和信任策略。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "firehose:PutRecord",
                "firehose:PutRecordBatch"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:firehose:us-east-1:123456789012:deliverystream/*"
        }
    ]
}
```

------

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "streams.metrics.cloudwatch.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

指标数据由 CloudWatch 代表拥有该指标流资源的源将其流式传输到目标 Firehose 传输流。

# JSON 格式的 CloudWatch 指标流
<a name="CloudWatch-metric-streams-formats-json"></a>

在使用 JSON 格式的 CloudWatch 指标流中，每条 Firehose 记录都包含多个由换行符（\$1n）分隔的 JSON 对象。每个对象包含单个指标的单一数据点。

所使用的 JSON 格式与 AWS Glue 和 Amazon Athena 完全兼容。如果您的 Firehose 传输流和 AWS Glue 表格的格式均正确，则格式可以自动转换为 Parquet 格式或优化的行列式（ORC）格式，然后再存储在 S3 中。有关转换格式的更多信息，请参阅[在 Firehose 中转换输入记录格式](https://docs.aws.amazon.com/firehose/latest/dev/record-format-conversion.html)。有关 AWS Glue 的正确格式的更多信息，请参阅 [我应该对 JSON 输出格式使用哪个 AWS Glue 架构？](#CloudWatch-metric-streams-format-glue)。

在 JSON 格式中，`unit` 的有效值与 `MetricDatum` API 结构中 `unit` 的值相同。有关更多信息，请参阅 [MetricDatum](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html)。`timestamp` 字段的值以纪元毫秒为单位，例如 `1616004674229`。

以下为格式示例。在本示例中，JSON 所用格式的目的是便于查看，但实际上，整个格式应位于一行上。

```
{
    "metric_stream_name": "MyMetricStream",
    "account_id": "1234567890",
    "region": "us-east-1",
    "namespace": "AWS/EC2",
    "metric_name": "DiskWriteOps",
    "dimensions": {
        "InstanceId": "i-123456789012"
    },
    "timestamp": 1611929698000,
    "value": {
        "count": 3.0,
        "sum": 20.0,
        "max": 18.0,
        "min": 0.0,
        "p99": 17.56,
        "p99.9": 17.8764,
        "TM(25%:75%)": 16.43
    },
    "unit": "Seconds"
}
```

## 我应该对 JSON 输出格式使用哪个 AWS Glue 架构？
<a name="CloudWatch-metric-streams-format-glue"></a>

以下是 AWS Glue 表的 `StorageDescriptor` 的 JSON 表示（之后由 Firehose 使用）示例。有关 `StorageDescriptor` 的更多信息，请参阅 [StorageDescriptor](https://docs.aws.amazon.com/glue/latest/webapi/API_StorageDescriptor.html)。

```
{
  "Columns": [
    {
      "Name": "metric_stream_name",
      "Type": "string"
    },
    {
      "Name": "account_id",
      "Type": "string"
    },
    {
      "Name": "region",
      "Type": "string"
    },
    {
      "Name": "namespace",
      "Type": "string"
    },
    {
      "Name": "metric_name",
      "Type": "string"
    },
    {
      "Name": "timestamp",
      "Type": "timestamp"
    },
    {
      "Name": "dimensions",
      "Type": "map<string,string>"
    },
    {
      "Name": "value",
      "Type": "struct<min:double,max:double,count:double,sum:double,p99:double,p99.9:double>"
    },
    {
      "Name": "unit",
      "Type": "string"
    }
  ],
  "Location": "s3://amzn-s3-demo-bucket/",
  "InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
  "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
  "SerdeInfo": {
    "SerializationLibrary": "org.apache.hive.hcatalog.data.JsonSerDe"
  },
  "Parameters": {
    "classification": "json"
  }
}
```

上面的示例适用于以 JSON 格式在 Amazon S3 上写入的数据。将以下字段中的值替换为指定的值，以便以 Parquet 格式或 Optimized Row Columnar (ORC) 格式存储数据。
+ **Parquet：**
  + inputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
  + outputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat
  + SerDeInfo.serializationLib: org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
  + parameters.classification: parquet
+ **ORC：**
  + inputFormat: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
  + outputFormat: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
  + SerDeInfo.serializationLib: org.apache.hadoop.hive.ql.io.orc.OrcSerde
  + parameters.classification: orc

# OpenTelemetry 1.0.0 格式的 CloudWatch 指标流输出
<a name="CloudWatch-metric-streams-formats-opentelemetry-100"></a>

**注意**  
如果选择 OpenTelemetry 1.0.0 格式，指标属性会被编码为一个 `KeyValue` 对象列表，而不是 0.7.0 格式中使用的 `StringKeyValue` 类型。作为消费端，这是 0.7.0 和 1.0.0 格式之间的唯一重大变化。从 0.7.0 原型文件生成的解析器无法解析以 1.0.0 格式编码的指标属性。反之亦然，从 1.0.0 原型文件生成的解析器无法解析以 0.7.0 格式编码的指标属性。

OpenTelemetry 是工具、API 和软件开发工具包的集合。您可以使用它来测量、生成、收集及导出遥测数据（指标、日志和跟踪）以进行分析。OpenTelemetry 属于云原生计算基金会。有关更多信息，请参阅 [OpenTelemetry](https://opentelemetry.io/)。

有关完整 OpenTelemetry 1.0.0 规范的信息，请参阅 [Release version 1.0.0](https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v1.0.0)。

一条 Kinesis 记录可以包含一个或多个 `ExportMetricsServiceRequest` OpenTelemetry 数据结构。每个数据结构都以一个带有指示记录长度（字节）的 `UnsignedVarInt32` 的标头开头。每个 `ExportMetricsServiceRequest` 可同时包含来自多个指标的数据。

以下是 `ExportMetricsServiceRequest` OpenTelemetry 数据结构形式的消息的字符串表示。OpenTelemetry 会序列化 Google Protocol Buffers 二进制协议，此协议人类不可读。

```
resource_metrics {
  resource {
    attributes {
      key: "cloud.provider"
      value {
        string_value: "aws"
      }
    }
    attributes {
      key: "cloud.account.id"
      value {
        string_value: "123456789012"
      }
    }
    attributes {
      key: "cloud.region"
      value {
        string_value: "us-east-1"
      }
    }
    attributes {
      key: "aws.exporter.arn"
      value {
        string_value: "arn:aws:cloudwatch:us-east-1:123456789012:metric-stream/MyMetricStream"
      }
    }
  }
  scope_metrics {
    metrics {
      name: "amazonaws.com/AWS/DynamoDB/ConsumedReadCapacityUnits"
      unit: "NoneTranslated"
      summary {
        data_points {
          start_time_unix_nano: 60000000000
          time_unix_nano: 120000000000
          count: 1
          sum: 1.0
          quantile_values {
            value: 1.0
          }
          quantile_values {
            quantile: 0.95
            value: 1.0
          }
          quantile_values {
            quantile: 0.99
            value: 1.0
          }
          quantile_values {
            quantile: 1.0
            value: 1.0
          }
          attributes {
            key: "Namespace"
            value {
              string_value: "AWS/DynamoDB"
            }
          }
          attributes {
            key: "MetricName"
            value {
              string_value: "ConsumedReadCapacityUnits"
            }
          }
          attributes {
            key: "Dimensions"
            value {
              kvlist_value {
                values {
                  key: "TableName"
                  value {
                    string_value: "MyTable"
                  }
                }
              }
            }
          }
        }
        data_points {
          start_time_unix_nano: 70000000000
          time_unix_nano: 130000000000
          count: 2
          sum: 5.0
          quantile_values {
            value: 2.0
          }
          quantile_values {
            quantile: 1.0
            value: 3.0
          }
          attributes {
            key: "Namespace"
            value {
              string_value: "AWS/DynamoDB"
            }
          }
          attributes {
            key: "MetricName"
            value {
              string_value: "ConsumedReadCapacityUnits"
            }
          }
          attributes {
            key: "Dimensions"
            value {
              kvlist_value {
                values {
                  key: "TableName"
                  value {
                    string_value: "MyTable"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
```

**用于序列化 OpenTelemetry 指标数据的顶级对象**

`ExportMetricsServiceRequest` 是用于序列化 OpenTelemetry 导出器负载的顶级包装器。它包含一个或多个 `ResourceMetrics`。

```
message ExportMetricsServiceRequest {
  // An array of ResourceMetrics.
  // For data coming from a single resource this array will typically contain one
  // element. Intermediary nodes (such as OpenTelemetry Collector) that receive
  // data from multiple origins typically batch the data before forwarding further and
  // in that case this array will contain multiple elements.
  repeated opentelemetry.proto.metrics.v1.ResourceMetrics resource_metrics = 1;
}
```

`ResourceMetrics` 是表示 MetricData 对象的顶级对象。

```
// A collection of ScopeMetrics from a Resource.
message ResourceMetrics {
  reserved 1000;

  // The resource for the metrics in this message.
  // If this field is not set then no resource info is known.
  opentelemetry.proto.resource.v1.Resource resource = 1;

  // A list of metrics that originate from a resource.
  repeated ScopeMetrics scope_metrics = 2;

  // This schema_url applies to the data in the "resource" field. It does not apply
  // to the data in the "scope_metrics" field which have their own schema_url field.
  string schema_url = 3;
}
```

**资源对象**

`Resource` 对象是一个值对对象，其中包含有关生成指标的资源的一些信息。对于由 AWS 创建的指标，数据结构包含与指标相关的资源的 Amazon Resource Name (ARN)，例如 EC2 实例或 S3 存储桶。

`Resource` 对象包含名为 `attributes` 的属性，其会存储键值对列表。
+ `cloud.account.id` 包含账户 ID
+ `cloud.region` 包含区域
+ `aws.exporter.arn` 包含指标流 ARN
+ `cloud.provider` 始终为 `aws`。

```
// Resource information.
message Resource {
  // Set of attributes that describe the resource.
  // Attribute keys MUST be unique (it is not allowed to have more than one
  // attribute with the same key).
  repeated opentelemetry.proto.common.v1.KeyValue attributes = 1;

  // dropped_attributes_count is the number of dropped attributes. If the value is 0, then
  // no attributes were dropped.
  uint32 dropped_attributes_count = 2;
}
```

**ScopeMetrics 对象**

`scope` 字段将不会填充。我们仅填充正在导出的指标字段。

```
// A collection of Metrics produced by an Scope.
message ScopeMetrics {
  // The instrumentation scope information for the metrics in this message.
  // Semantically when InstrumentationScope isn't set, it is equivalent with
  // an empty instrumentation scope name (unknown).
  opentelemetry.proto.common.v1.InstrumentationScope scope = 1;

  // A list of metrics that originate from an instrumentation library.
  repeated Metric metrics = 2;

  // This schema_url applies to all metrics in the "metrics" field.
  string schema_url = 3;
}
```

**指标对象**

指标对象包含一些元数据和一个 `Summary` 数据字段，该字段包含一个 `SummaryDataPoint` 列表。

对于指标流，元数据如下所示：
+ `name` 将为 `amazonaws.com/metric_namespace/metric_name`
+ `description` 将为空
+ `unit` 将通过将指标基准单位映射为计量单位统一代码的变体（区分大小写）来填充。有关更多信息，请参阅 [在 CloudWatch 中转换为 OpenTelemetry 1.0.0 格式](CloudWatch-metric-streams-formats-opentelemetry-translation-100.md) 和[计量单位统一代码](https://ucum.org/ucum.html)。
+ `type` 将为 `SUMMARY`

```
message Metric {
  reserved 4, 6, 8;

  // name of the metric, including its DNS name prefix. It must be unique.
  string name = 1;

  // description of the metric, which can be used in documentation.
  string description = 2;

  // unit in which the metric value is reported. Follows the format
  // described by http://unitsofmeasure.org/ucum.html.
  string unit = 3;

  // Data determines the aggregation type (if any) of the metric, what is the
  // reported value type for the data points, as well as the relatationship to
  // the time interval over which they are reported.
  oneof data {
    Gauge gauge = 5;
    Sum sum = 7;
    Histogram histogram = 9;
    ExponentialHistogram exponential_histogram = 10;
    Summary summary = 11;
  }
}

message Summary {
  repeated SummaryDataPoint data_points = 1;
}
```

**SummaryDataPoint 对象**

SummaryDataPoint 对象包含 DoubleSummary 指标时间序列中单个数据点的值。

```
// SummaryDataPoint is a single data point in a timeseries that describes the
// time-varying values of a Summary metric.
message SummaryDataPoint {
  reserved 1;

  // The set of key/value pairs that uniquely identify the timeseries from
  // where this point belongs. The list may be empty (may contain 0 elements).
  // Attribute keys MUST be unique (it is not allowed to have more than one
  // attribute with the same key).
  repeated opentelemetry.proto.common.v1.KeyValue attributes = 7;

  // StartTimeUnixNano is optional but strongly encouraged, see the
  // the detailed comments above Metric.
  //
  // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January
  // 1970.
  fixed64 start_time_unix_nano = 2;

  // TimeUnixNano is required, see the detailed comments above Metric.
  //
  // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January
  // 1970.
  fixed64 time_unix_nano = 3;

  // count is the number of values in the population. Must be non-negative.
  fixed64 count = 4;

  // sum of the values in the population. If count is zero then this field
  // must be zero.
  //
  // Note: Sum should only be filled out when measuring non-negative discrete
  // events, and is assumed to be monotonic over the values of these events.
  // Negative events *can* be recorded, but sum should not be filled out when
  // doing so.  This is specifically to enforce compatibility w/ OpenMetrics,
  // see: https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#summary
  double sum = 5;

  // Represents the value at a given quantile of a distribution.
  //
  // To record Min and Max values following conventions are used:
  // - The 1.0 quantile is equivalent to the maximum value observed.
  // - The 0.0 quantile is equivalent to the minimum value observed.
  //
  // See the following issue for more context:
  // https://github.com/open-telemetry/opentelemetry-proto/issues/125
  message ValueAtQuantile {
    // The quantile of a distribution. Must be in the interval
    // [0.0, 1.0].
    double quantile = 1;

    // The value at the given quantile of a distribution.
    //
    // Quantile values must NOT be negative.
    double value = 2;
  }

  // (Optional) list of values at different quantiles of the distribution calculated
  // from the current snapshot. The quantiles must be strictly increasing.
  repeated ValueAtQuantile quantile_values = 6;

  // Flags that apply to this specific data point.  See DataPointFlags
  // for the available flags and their meaning.
  uint32 flags = 8;
}
```

有关更多信息，请参阅 [在 CloudWatch 中转换为 OpenTelemetry 1.0.0 格式](CloudWatch-metric-streams-formats-opentelemetry-translation-100.md)。

# 在 CloudWatch 中转换为 OpenTelemetry 1.0.0 格式
<a name="CloudWatch-metric-streams-formats-opentelemetry-translation-100"></a>

CloudWatch 会执行一些转换，将 CloudWatch 数据转换为 OpenTelemetry 格式。

**转换命名空间、指标名称和维度**

这些属性是在映射中编码的键值对。
+ 一个属性的键是 `Namespace`，其值是指标的命名空间
+ 一个属性的键是 `MetricName`，其值是指标的名称
+ 一个键值对的键是 `Dimensions`，其值是一个键值对嵌套列表。此列表中的每个键值对都映射到一个 CloudWatch 指标维度，其中键值对的键是维度的名称，其值是维度的值。

**转换平均值、总和、样本计数、最小值和最大值**

摘要数据点使 CloudWatch 能够使用一个数据点导出所有这些统计数据。
+ `startTimeUnixNano` 包含 CloudWatch `startTime`
+ `timeUnixNano` 包含 CloudWatch `endTime`
+ `sum` 包含总和统计数据。
+ `count` 包含样本数统计数据。
+ `quantile_values` 包含两个 `valueAtQuantile.value` 对象：
  + `valueAtQuantile.quantile = 0.0` 与 `valueAtQuantile.value = Min value`
  + `valueAtQuantile.quantile = 0.99` 与 `valueAtQuantile.value = p99 value`
  + `valueAtQuantile.quantile = 0.999` 与 `valueAtQuantile.value = p99.9 value`
  + `valueAtQuantile.quantile = 1.0` 与 `valueAtQuantile.value = Max value`

使用该指标流的资源可以按**总和/样本数**来计算平均值统计数据。

**转换单位**

CloudWatch 单位映射到计量单位统一代码区分大小写的变体，如下表所示。有关更多信息，请参阅[计量单位统一代码](https://ucum.org/ucum.html)。


| CloudWatch | OpenTelemetry | 
| --- | --- | 
|  秒 |  s | 
|  秒 |  s | 
|  微秒 |  us | 
|  毫秒 |  ms | 
|  字节 |  By | 
|  千字节 |  kBy | 
|  兆字节 |  MBy | 
|  千兆字节 |  GBy | 
|  千吉字节 |  TBy | 
|  Bits |  bit | 
|  千位 |  kbit | 
|  兆位 |  MBit | 
|  千兆位 |  GBit | 
|  太位 |  Tbit | 
|  百分比 |  % | 
|  计数 |  \$1Count\$1 | 
|  无 |  1 | 

由斜线组合而成的单位通过同时对斜线前后两个单位应用 OpenTelemetry 转换来进行映射。例如，字节/秒映射为 By/s。

# 如何解析 OpenTelemetry 1.0.0 消息
<a name="CloudWatch-metric-streams-formats-opentelemetry-parse-100"></a>

本节提供了有助于您开始解析 OpenTelemetry 1.0.0 的信息。

首先，您应获得特定于语言的绑定，这样您才能够以首选语言解析 OpenTelemetry 1.0.0 消息。

**获取特定于语言的绑定**
+ 根据您的首选语言选择以下步骤。
  + 若要使用 Java，请将以下 Maven 依赖项添加到您的 Java 项目中：[OpenTelemetry Java >> 0.14.1](https://mvnrepository.com/artifact/io.opentelemetry/opentelemetry-proto/0.14.1)。
  + 若要使用任何其他语言，请按照下列步骤操作：

    1. 检查[生成类](https://developers.google.com/protocol-buffers/docs/proto3#generating)中的列表，确保您的语言受支持。

    1. 按照[下载协议缓冲区](https://developers.google.com/protocol-buffers/docs/downloads)中的步骤安装 Protobuf 编译器。

    1. 在 [Release version 1.0.0](https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v1.0.0) 中下载 OpenTelemetry 1.0.0 ProtoBuf 定义。

    1. 确认您位于下载的 OpenTelemetry 1.0.0 ProtoBuf 定义的根文件夹中。创建一个 `src` 文件夹，然后运行命令以生成特定于语言的绑定。有关更多信息，请参阅[生成类](https://developers.google.com/protocol-buffers/docs/proto3#generating)。

       以下示例展示了如何生成 Javascript 绑定。

       ```
       protoc --proto_path=./ --js_out=import_style=commonjs,binary:src \
       opentelemetry/proto/common/v1/common.proto \
       opentelemetry/proto/resource/v1/resource.proto \
       opentelemetry/proto/metrics/v1/metrics.proto \
       opentelemetry/proto/collector/metrics/v1/metrics_service.proto
       ```

以下部分包括使用特定于语言的绑定的示例，您可以使用前面的说明来构建这些绑定。

**Java**

```
package com.example;

import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MyOpenTelemetryParser {

    public List<ExportMetricsServiceRequest> parse(InputStream inputStream) throws IOException {
        List<ExportMetricsServiceRequest> result = new ArrayList<>();

        ExportMetricsServiceRequest request;
        /* A Kinesis record can contain multiple `ExportMetricsServiceRequest`
           records, each of them starting with a header with an
           UnsignedVarInt32 indicating the record length in bytes:
            ------ --------------------------- ------ -----------------------
           |UINT32|ExportMetricsServiceRequest|UINT32|ExportMetricsService...
            ------ --------------------------- ------ -----------------------
         */
        while ((request = ExportMetricsServiceRequest.parseDelimitedFrom(inputStream)) != null) {
            // Do whatever we want with the parsed message
            result.add(request);
        }

        return result;
    }
}
```

**Javascript**

本示例假定具有所生成的绑定的根文件夹为 `./`

函数 `parseRecord` 的数据参数可以是以下类型之一：
+ `Uint8Array`，此类型最佳
+ `Buffer`，在节点下最佳
+ `Array.number`，8 位整数

```
const pb = require('google-protobuf')
const pbMetrics =
    require('./opentelemetry/proto/collector/metrics/v1/metrics_service_pb')

function parseRecord(data) {
    const result = []

    // Loop until we've read all the data from the buffer
    while (data.length) {
        /* A Kinesis record can contain multiple `ExportMetricsServiceRequest`
           records, each of them starting with a header with an
           UnsignedVarInt32 indicating the record length in bytes:
            ------ --------------------------- ------ -----------------------
           |UINT32|ExportMetricsServiceRequest|UINT32|ExportMetricsService...
            ------ --------------------------- ------ -----------------------
         */
        const reader = new pb.BinaryReader(data)
        const messageLength = reader.decoder_.readUnsignedVarint32()
        const messageFrom = reader.decoder_.cursor_
        const messageTo = messageFrom + messageLength

        // Extract the current `ExportMetricsServiceRequest` message to parse
        const message = data.subarray(messageFrom, messageTo)

        // Parse the current message using the ProtoBuf library
        const parsed =
            pbMetrics.ExportMetricsServiceRequest.deserializeBinary(message)

        // Do whatever we want with the parsed message
        result.push(parsed.toObject())

        // Shrink the remaining buffer, removing the already parsed data
        data = data.subarray(messageTo)
    }

    return result
}
```

**Python**

您必须自行读取 `var-int` 分隔符或使用内部方法 `_VarintBytes(size)` 和 `_DecodeVarint32(buffer, position)`。它们会返回刚好位于缓冲区中大小字节之后的位置。读取端构建一个新的缓冲区，该缓冲区仅限于读取消息的字节。

```
size = my_metric.ByteSize()
f.write(_VarintBytes(size))
f.write(my_metric.SerializeToString())
msg_len, new_pos = _DecodeVarint32(buf, 0)
msg_buf = buf[new_pos:new_pos+msg_len]
request = metrics_service_pb.ExportMetricsServiceRequest()
request.ParseFromString(msg_buf)
```

**Go**

使用 `Buffer.DecodeMessage()`。

**C\$1**

使用 `CodedInputStream`。此类可以读取分隔了大小的消息。

**C\$1\$1**

`google/protobuf/util/delimited_message_util.h` 中描述的函数可以读取分隔了大小的消息。

**其他语言**

有关使用其他语言，请参阅[下载协议缓冲区](https://developers.google.com/protocol-buffers/docs/downloads)。

在实现解析器时，请注意，一条 Kinesis 记录可以包含多个 `ExportMetricsServiceRequest` 协议缓冲区消息，每个消息都以具有指示记录长度（字节）的 `UnsignedVarInt32` 的标头开头。

# OpenTelemetry 0.7.0 格式的 CloudWatch 指标流输出
<a name="CloudWatch-metric-streams-formats-opentelemetry"></a>

OpenTelemetry 是工具、API 和软件开发工具包的集合。您可以使用它来测量、生成、收集及导出遥测数据（指标、日志和跟踪）以进行分析。OpenTelemetry 属于云原生计算基金会。有关更多信息，请参阅 [OpenTelemetry](https://opentelemetry.io/)。

有关完整 OpenTelemetry 0.7.0 规范的信息，请参阅 [v0.7.0 版本](https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v0.7.0)。

一条 Kinesis 记录可以包含一个或多个 `ExportMetricsServiceRequest` OpenTelemetry 数据结构。每个数据结构都以一个带有指示记录长度（字节）的 `UnsignedVarInt32` 的标头开头。每个 `ExportMetricsServiceRequest` 可同时包含来自多个指标的数据。

以下是 `ExportMetricsServiceRequest` OpenTelemetry 数据结构形式的消息的字符串表示。OpenTelemetry 会序列化 Google Protocol Buffers 二进制协议，此协议人类不可读。

```
resource_metrics {
  resource {
    attributes {
      key: "cloud.provider"
      value {
        string_value: "aws"
      }
    }
    attributes {
      key: "cloud.account.id"
      value {
        string_value: "2345678901"
      }
    }
    attributes {
      key: "cloud.region"
      value {
        string_value: "us-east-1"
      }
    }
    attributes {
      key: "aws.exporter.arn"
      value {
        string_value: "arn:aws:cloudwatch:us-east-1:123456789012:metric-stream/MyMetricStream"
      }
    }
  }
  instrumentation_library_metrics {
    metrics {
      name: "amazonaws.com/AWS/DynamoDB/ConsumedReadCapacityUnits"
      unit: "1"
      double_summary {
        data_points {
          labels {
            key: "Namespace"
            value: "AWS/DynamoDB"
          }
          labels {
            key: "MetricName"
            value: "ConsumedReadCapacityUnits"
          }
          labels {
            key: "TableName"
            value: "MyTable"
          }
          start_time_unix_nano: 1604948400000000000
          time_unix_nano: 1604948460000000000
          count: 1
          sum: 1.0
          quantile_values {
            quantile: 0.0
            value: 1.0
          }
          quantile_values {
            quantile: 0.95
            value: 1.0
          }          
          quantile_values {
            quantile: 0.99
            value: 1.0
          }
          quantile_values {
            quantile: 1.0
            value: 1.0
          }
        }
        data_points {
          labels {
            key: "Namespace"
            value: "AWS/DynamoDB"
          }
          labels {
            key: "MetricName"
            value: "ConsumedReadCapacityUnits"
          }
          labels {
            key: "TableName"
            value: "MyTable"
          }
          start_time_unix_nano: 1604948460000000000
          time_unix_nano: 1604948520000000000
          count: 2
          sum: 5.0
          quantile_values {
            quantile: 0.0
            value: 2.0
          }
          quantile_values {
            quantile: 1.0
            value: 3.0
          }
        }
      }
    }
  }
}
```

**用于序列化 OpenTelemetry 指标数据的顶级对象**

`ExportMetricsServiceRequest` 是用于序列化 OpenTelemetry 导出器负载的顶级包装器。它包含一个或多个 `ResourceMetrics`。

```
message ExportMetricsServiceRequest {
  // An array of ResourceMetrics.
  // For data coming from a single resource this array will typically contain one
  // element. Intermediary nodes (such as OpenTelemetry Collector) that receive
  // data from multiple origins typically batch the data before forwarding further and
  // in that case this array will contain multiple elements.
  repeated opentelemetry.proto.metrics.v1.ResourceMetrics resource_metrics = 1;
}
```

`ResourceMetrics` 是表示 MetricData 对象的顶级对象。

```
// A collection of InstrumentationLibraryMetrics from a Resource.
message ResourceMetrics {
  // The resource for the metrics in this message.
  // If this field is not set then no resource info is known.
  opentelemetry.proto.resource.v1.Resource resource = 1;
  
  // A list of metrics that originate from a resource.
  repeated InstrumentationLibraryMetrics instrumentation_library_metrics = 2;
}
```

**资源对象**

`Resource` 对象是一个值对对象，其中包含有关生成指标的资源的一些信息。对于由 AWS 创建的指标，数据结构包含与指标相关的资源的 Amazon Resource Name (ARN)，例如 EC2 实例或 S3 存储桶。

`Resource` 对象包含名为 `attributes` 的属性，其会存储键值对列表。
+ `cloud.account.id` 包含账户 ID
+ `cloud.region` 包含区域
+ `aws.exporter.arn` 包含指标流 ARN
+ `cloud.provider` 始终为 `aws`。

```
// Resource information.
message Resource {
  // Set of labels that describe the resource.
  repeated opentelemetry.proto.common.v1.KeyValue attributes = 1;
  
  // dropped_attributes_count is the number of dropped attributes. If the value is 0,
  // no attributes were dropped.
  uint32 dropped_attributes_count = 2;
}
```

**InstrumentationLibraryMetrics 对象**

将不会填写 instrumentation\$1library 字段。我们将仅填写正在导出的指标字段。

```
// A collection of Metrics produced by an InstrumentationLibrary.
message InstrumentationLibraryMetrics {
  // The instrumentation library information for the metrics in this message.
  // If this field is not set then no library info is known.
  opentelemetry.proto.common.v1.InstrumentationLibrary instrumentation_library = 1;
  // A list of metrics that originate from an instrumentation library.
  repeated Metric metrics = 2;
}
```

**指标对象**

指标对象包含一个 `DoubleSummary` 数据字段，该字段包含一个 `DoubleSummaryDataPoint` 列表。

```
message Metric {
  // name of the metric, including its DNS name prefix. It must be unique.
  string name = 1;

  // description of the metric, which can be used in documentation.
  string description = 2;

  // unit in which the metric value is reported. Follows the format
  // described by http://unitsofmeasure.org/ucum.html.
  string unit = 3;

  oneof data {
    IntGauge int_gauge = 4;
    DoubleGauge double_gauge = 5;
    IntSum int_sum = 6;
    DoubleSum double_sum = 7;
    IntHistogram int_histogram = 8;
    DoubleHistogram double_histogram = 9;
    DoubleSummary double_summary = 11;
  }
}

message DoubleSummary {
  repeated DoubleSummaryDataPoint data_points = 1;
}
```

**MetricDescriptor 对象**

MetricDescriptor 对象包含元数据。有关更多信息，请参阅 GitHub 上的 [metrics.proto](https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/metrics/v1/metrics.proto#L110)。

对于指标流，MetricDescriptor 包含以下内容：
+ `name` 将为 `amazonaws.com/metric_namespace/metric_name`
+ `description` 将为空。
+ `unit` 将通过将指标基准单位映射为计量单位统一代码的变体（区分大小写）来填充。有关更多信息，请参阅 [在 CloudWatch 中转换为 OpenTelemetry 0.7.0 格式](CloudWatch-metric-streams-formats-opentelemetry-translation.md) 和[计量单位统一代码](https://ucum.org/ucum.html)。
+ `type` 将为 `SUMMARY`。

**DoubleSummaryDataPoint 对象**

DoubleSummaryDataPoint 对象包含 DoubleSummary 指标时间序列中单个数据点的值。

```
// DoubleSummaryDataPoint is a single data point in a timeseries that describes the
// time-varying values of a Summary metric.
message DoubleSummaryDataPoint {
  // The set of labels that uniquely identify this timeseries.
  repeated opentelemetry.proto.common.v1.StringKeyValue labels = 1;

  // start_time_unix_nano is the last time when the aggregation value was reset
  // to "zero". For some metric types this is ignored, see data types for more
  // details.
  //
  // The aggregation value is over the time interval (start_time_unix_nano,
  // time_unix_nano].
  //
  // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January
  // 1970.
  //
  // Value of 0 indicates that the timestamp is unspecified. In that case the
  // timestamp may be decided by the backend.
  fixed64 start_time_unix_nano = 2;

  // time_unix_nano is the moment when this aggregation value was reported.
  //
  // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January
  // 1970.
  fixed64 time_unix_nano = 3;

  // count is the number of values in the population. Must be non-negative.
  fixed64 count = 4;

  // sum of the values in the population. If count is zero then this field
  // must be zero.
  double sum = 5;

  // Represents the value at a given quantile of a distribution.
  //
  // To record Min and Max values following conventions are used:
  // - The 1.0 quantile is equivalent to the maximum value observed.
  // - The 0.0 quantile is equivalent to the minimum value observed.
  message ValueAtQuantile {
    // The quantile of a distribution. Must be in the interval
    // [0.0, 1.0].
    double quantile = 1;

    // The value at the given quantile of a distribution.
    double value = 2;
  }

  // (Optional) list of values at different quantiles of the distribution calculated
  // from the current snapshot. The quantiles must be strictly increasing.
  repeated ValueAtQuantile quantile_values = 6;
}
```

有关更多信息，请参阅 [在 CloudWatch 中转换为 OpenTelemetry 0.7.0 格式](CloudWatch-metric-streams-formats-opentelemetry-translation.md)。

# 在 CloudWatch 中转换为 OpenTelemetry 0.7.0 格式
<a name="CloudWatch-metric-streams-formats-opentelemetry-translation"></a>

CloudWatch 会执行一些转换，将 CloudWatch 数据转换为 OpenTelemetry 格式。

**转换命名空间、指标名称和维度**

这些属性是在映射中编码的键值对。
+ 其中一对包含指标的命名空间
+ 另一对包含指标的名称
+ 对于每个维度，CloudWatch 都存储以下键值对：`metricDatum.Dimensions[i].Name, metricDatum.Dimensions[i].Value`

**转换平均值、总和、样本计数、最小值和最大值**

摘要数据点使 CloudWatch 能够使用一个数据点导出所有这些统计数据。
+ `startTimeUnixNano` 包含 CloudWatch `startTime`
+ `timeUnixNano` 包含 CloudWatch `endTime`
+ `sum` 包含总和统计数据。
+ `count` 包含样本数统计数据。
+ `quantile_values` 包含两个 `valueAtQuantile.value` 对象：
  + `valueAtQuantile.quantile = 0.0` 与 `valueAtQuantile.value = Min value`
  + `valueAtQuantile.quantile = 0.99` 与 `valueAtQuantile.value = p99 value`
  + `valueAtQuantile.quantile = 0.999` 与 `valueAtQuantile.value = p99.9 value`
  + `valueAtQuantile.quantile = 1.0` 与 `valueAtQuantile.value = Max value`

使用该指标流的资源可以按**总和/样本数**来计算平均值统计数据。

**转换单位**

CloudWatch 单位映射到计量单位统一代码区分大小写的变体，如下表所示。有关更多信息，请参阅[计量单位统一代码](https://ucum.org/ucum.html)。


| CloudWatch | OpenTelemetry | 
| --- | --- | 
|  秒 |  s | 
|  秒 |  s | 
|  Microsecond |  us | 
|  毫秒 |  ms | 
|  字节 |  By | 
|  千字节 |  kBy | 
|  兆字节 |  MBy | 
|  千兆字节 |  GBy | 
|  千吉字节 |  TBy | 
|  Bits |  bit | 
|  千位 |  kbit | 
|  兆位 |  MBit | 
|  千兆位 |  GBit | 
|  太位 |  Tbit | 
|  百分比 |  % | 
|  计数 |  \$1Count\$1 | 
|  无 |  1 | 

由斜线组合而成的单位通过同时对斜线前后两个单位应用 OpenTelemetry 转换来进行映射。例如，字节/秒映射为 By/s。

# 如何解析 OpenTelemetry 0.7.0 消息
<a name="CloudWatch-metric-streams-formats-opentelemetry-parse"></a>

本部分提供了有助于您开始解析 OpenTelemetry 0.7.0 的信息。

首先，您应获得特定于语言的绑定，这样您能够以您的首选语言解析 OpenTelemetry 0.7.0 消息。

**获取特定于语言的绑定**
+ 根据您的首选语言选择以下步骤。
  + 若要使用 Java，请将以下 Maven 依赖项添加到您的 Java 项目中：[OpenTelemetry Java >> 0.14.1](https://mvnrepository.com/artifact/io.opentelemetry/opentelemetry-proto/0.14.1)。
  + 若要使用任何其他语言，请按照下列步骤操作：

    1. 检查[生成类](https://developers.google.com/protocol-buffers/docs/proto3#generating)中的列表，确保您的语言受支持。

    1. 按照[下载协议缓冲区](https://developers.google.com/protocol-buffers/docs/downloads)中的步骤安装 Protobuf 编译器。

    1. 在 [v0.7.0 版本](https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v0.7.0)中下载 OpenTelemetry 0.7.0 ProtoBuf 定义。

    1. 确认您位于下载的 OpenTelemetry 0.7.0 ProtoBuf 定义的根文件夹中。创建一个 `src` 文件夹，然后运行命令以生成特定于语言的绑定。有关更多信息，请参阅[生成类](https://developers.google.com/protocol-buffers/docs/proto3#generating)。

       以下示例展示了如何生成 Javascript 绑定。

       ```
       protoc --proto_path=./ --js_out=import_style=commonjs,binary:src \
       opentelemetry/proto/common/v1/common.proto \
       opentelemetry/proto/resource/v1/resource.proto \
       opentelemetry/proto/metrics/v1/metrics.proto \
       opentelemetry/proto/collector/metrics/v1/metrics_service.proto
       ```

以下部分包括使用特定于语言的绑定的示例，您可以使用前面的说明来构建这些绑定。

**Java**

```
package com.example;

import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MyOpenTelemetryParser {

    public List<ExportMetricsServiceRequest> parse(InputStream inputStream) throws IOException {
        List<ExportMetricsServiceRequest> result = new ArrayList<>();

        ExportMetricsServiceRequest request;
        /* A Kinesis record can contain multiple `ExportMetricsServiceRequest`
           records, each of them starting with a header with an
           UnsignedVarInt32 indicating the record length in bytes:
            ------ --------------------------- ------ -----------------------
           |UINT32|ExportMetricsServiceRequest|UINT32|pExportMetricsService...
            ------ --------------------------- ------ -----------------------
         */
        while ((request = ExportMetricsServiceRequest.parseDelimitedFrom(inputStream)) != null) {
            // Do whatever we want with the parsed message
            result.add(request);
        }

        return result;
    }
}
```

**Javascript**

本示例假定具有所生成的绑定的根文件夹为 `./`

函数 `parseRecord` 的数据参数可以是以下类型之一：
+ `Uint8Array`，此类型最佳
+ `Buffer`，在节点下最佳
+ `Array.number`，8 位整数

```
const pb = require('google-protobuf')
const pbMetrics =
    require('./opentelemetry/proto/collector/metrics/v1/metrics_service_pb')

function parseRecord(data) {
    const result = []

    // Loop until we've read all the data from the buffer
    while (data.length) {
        /* A Kinesis record can contain multiple `ExportMetricsServiceRequest`
           records, each of them starting with a header with an
           UnsignedVarInt32 indicating the record length in bytes:
            ------ --------------------------- ------ -----------------------
           |UINT32|ExportMetricsServiceRequest|UINT32|ExportMetricsService...
            ------ --------------------------- ------ -----------------------
         */
        const reader = new pb.BinaryReader(data)
        const messageLength = reader.decoder_.readUnsignedVarint32()
        const messageFrom = reader.decoder_.cursor_
        const messageTo = messageFrom + messageLength

        // Extract the current `ExportMetricsServiceRequest` message to parse
        const message = data.subarray(messageFrom, messageTo)

        // Parse the current message using the ProtoBuf library
        const parsed =
            pbMetrics.ExportMetricsServiceRequest.deserializeBinary(message)

        // Do whatever we want with the parsed message
        result.push(parsed.toObject())

        // Shrink the remaining buffer, removing the already parsed data
        data = data.subarray(messageTo)
    }

    return result
}
```

**Python**

您必须自行读取 `var-int` 分隔符或使用内部方法 `_VarintBytes(size)` 和 `_DecodeVarint32(buffer, position)`。它们会返回刚好位于缓冲区中大小字节之后的位置。读取端构建一个新的缓冲区，该缓冲区仅限于读取消息的字节。

```
size = my_metric.ByteSize()
f.write(_VarintBytes(size))
f.write(my_metric.SerializeToString())
msg_len, new_pos = _DecodeVarint32(buf, 0)
msg_buf = buf[new_pos:new_pos+msg_len]
request = metrics_service_pb.ExportMetricsServiceRequest()
request.ParseFromString(msg_buf)
```

**Go**

使用 `Buffer.DecodeMessage()`。

**C\$1**

使用 `CodedInputStream`。此类可以读取分隔了大小的消息。

**C\$1\$1**

`google/protobuf/util/delimited_message_util.h` 中描述的函数可以读取分隔了大小的消息。

**其他语言**

有关使用其他语言，请参阅[下载协议缓冲区](https://developers.google.com/protocol-buffers/docs/downloads)。

在实现解析器时，请注意，一条 Kinesis 记录可以包含多个 `ExportMetricsServiceRequest` 协议缓冲区消息，每个消息都以具有指示记录长度（字节）的 `UnsignedVarInt32` 的标头开头。

# 对 CloudWatch 中的指标流进行故障排除
<a name="CloudWatch-metric-streams-troubleshoot"></a>

如果您在最终目标位置看不到指标数据，请检查以下各项：
+ 检查指标流是否处于正在运行状态。有关如何使用 CloudWatch 控制台执行此操作的步骤，请参阅 [指标流操作和维护](CloudWatch-metric-streams-operation.md)。
+ 无法流式传输发布时间超过两天的指标。要确定是否流式传输特定指标，请在 CloudWatch 控制台中绘制指标图表，然后检查最后一个可见数据点的存在时间。如果发布时间超过两天，那么指标流将不会获取此指标。
+ 检查指标流发出的指标。在 CloudWatch 控制台中，在 **Metrics**（指标）下，查看 **MetricUpdate**、**TotalMetricUpdate** 和 **PublishErrorRate** 指标的 **AWS/CloudWatch/MetricStreams** 命名空间。
+ 如果 **PublishErrorRate** 指标较高，请确认 Firehose 传输流使用的目标存在，并且指标流配置中指定的 IAM 角色授予了 `CloudWatch` 服务主要权限以写入其中。有关更多信息，请参阅 [CloudWatch 和 Firehose 之间的信任关系](CloudWatch-metric-streams-trustpolicy.md)。
+ 检查 Firehose 传输流是否有权限写入最终目标位置。
+ 在 Firehose 控制台中，查看用于指标流的 Firehose 传输流，并检查**监控**选项卡以查看 Firehose 传输流是否在接收数据。
+ 确认您已为 Firehose 传输流配置了正确的详细信息。
+ 检查 Firehose 传输流写入的最终目标位置的任何可用日志或指标。
+ 若要获取更多详细信息，请在 Firehose 传输流上启用 CloudWatch Logs 错误日志记录。有关更多信息，请参阅[使用 CloudWatch Logs 监控 Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/monitoring-with-cloudwatch-logs.html)。

**注意**  
在发送特定指标和时间戳的数据点后，即使其值稍后更改，也不会再次发送该数据点。

# 查看可用的指标
<a name="viewing_metrics_with_cloudwatch"></a>

指标首先按命名空间进行分组，然后按各命名空间内的各种维度组合进行分组。例如，您可以查看所有 EC2 指标、按实例分组的 EC2 指标或按 Auto Scaling 组分组的 EC2 指标。

只有您使用的 AWS 服务会将指标发送到 Amazon CloudWatch。

有关向 CloudWatch 发送指标的 AWS 服务列表，请参阅 [发布 CloudWatch 指标的 AWS 服务](aws-services-cloudwatch-metrics.md)。在此页面中，您还可以查看这些服务中的每个服务所发布的指标和维度。

**注意**  
控制台中不会显示在过去两周内没有任何新数据点的指标。当您在控制台的 **All metrics**（全部指标）选项卡的搜索框中键入指标名称或维度名称时，它们也不会显示，并且 [list-metrics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/list-metrics.html) 命令的结果中不会返回它们。检索这些指标的最佳方法是使用 AWS CLI 中的 [get-metric-data](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-data.html) 或者 [get-metric-statistics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html) 命令。  
如果要查看的旧指标有一个具有相似维度的当前指标，则可以查看该当前相似指标，然后选择 **Source**（源）选项卡，并将指标名称和维度字段更改为所需的指标，此外将时间范围更改为报告指标的时间。

以下步骤可帮助您浏览指标命名空间以查找和查看指标。您还可以使用目标搜索词搜索指标。有关更多信息，请参阅 [搜索可用指标](finding_metrics_with_cloudwatch.md)。

如果您浏览在 CloudWatch 跨账户可观测性中设置为监控账户的账户，则可以从与该监控账户关联的源账户查看指标。当显示来自源账户的指标时，还会显示其所属账户的 ID 或标签。有关更多信息，请参阅 [CloudWatch 跨账户可观测性](CloudWatch-Unified-Cross-Account.md)。

**注意**  
在源账户停止与*监控*账户共享指标后，监控账户将无法访问*源*账户指标数据。源指标名称最长在 14 天内对监控账户可见。

**使用控制台按命名空间和维度查看可用指标**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. 选择指标命名空间（例如 **EC2** 或 **Lambda**）。

1. 选择指标维度（例如 **Per-Instance Metrics**（每个实例的指标）或 **By Function Name**（按函数名称））。

1. **Browse**（浏览）选项卡显示命名空间中该维度的所有指标。每个指标名称旁边都有一个信息按钮，您可以选择查看包含指标定义的弹出窗口。

   如果这是 CloudWatch 跨账户可观测性中的监控账户，您还可以看到与该监控账户关联的源账户中的指标。表中的 **Account label**（账户标签）和 **Account id**（账户 ID）列显示每个指标来自哪个账户。

   您可执行以下操作：

   1. 要对表进行排序，请使用列标题。

   1. 要为指标绘制图表，请选中该指标旁的复选框。要选择所有指标，请选中表的标题行中的复选框。

   1. 要按账户筛选，请选择账户标签或账户 ID，然后选择 **Add to search**（添加到搜索）。

   1. 要按资源进行筛选，请选择资源 ID，然后选择 **Add to search**。

   1. 要按指标进行筛选，请选择指标名称，然后选择 **Add to search**。

1. （可选）要将此图表添加到 CloudWatch 控制面板，请选择 **Actions（操作）**，然后选择 **Add to dashboard（添加到控制面板）**。

**使用 AWS CLI 按账户命名空间、维度或指标查看可用指标**

使用 [list-metrics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/list-metrics.html) 命令列出 CloudWatch 指标。有关发布指标的所有服务的命名空间、指标和维度的列表，请参阅 [发布 CloudWatch 指标的 AWS 服务](aws-services-cloudwatch-metrics.md)。

以下示例命令将列出 Amazon EC2 的所有指标。

```
aws cloudwatch list-metrics --namespace AWS/EC2
```

下面是示例输出。

```
{
  "Metrics" : [
    ...
    {
        "Namespace": "AWS/EC2",
        "Dimensions": [
            {
                "Name": "InstanceId",
                "Value": "i-1234567890abcdef0"
            }
        ],
        "MetricName": "NetworkOut"
    },
    {
        "Namespace": "AWS/EC2",
        "Dimensions": [
            {
                "Name": "InstanceId",
                "Value": "i-1234567890abcdef0"
            }
        ],
        "MetricName": "CPUUtilization"
    },
    {
        "Namespace": "AWS/EC2",
        "Dimensions": [
            {
                "Name": "InstanceId",
                "Value": "i-1234567890abcdef0"
            }
        ],
        "MetricName": "NetworkIn"
    },
    ...
  ]
}
```

**列出指定资源的所有可用指标**  
以下示例指定 `AWS/EC2` 命名空间和 `InstanceId` 维度以仅查看指定实例的结果。

```
aws cloudwatch list-metrics --namespace AWS/EC2 --dimensions Name=InstanceId,Value=i-1234567890abcdef0
```

**列出所有资源的指标**  
以下示例指定 `AWS/EC2` 命名空间和指标名称以仅查看指定指标的结果。

```
aws cloudwatch list-metrics --namespace AWS/EC2 --metric-name CPUUtilization
```

**在 CloudWatch 跨账户可观测性中从关联的源账户检索指标**  
以下示例在监控账户中运行，以便从监控账户和所有关联的源账户检索指标。如果您不添加 `--include-linked-accounts`，则该命令仅返回监控账户的指标。

```
aws cloudwatch list-metrics --include-linked-accounts
```

**在 CloudWatch 跨账户可观测性中从源账户检索指标**  
以下示例在监控账户中运行，以便从 ID 为 111122223333 的源账户检索指标。

```
aws cloudwatch list-metrics --include-linked-accounts --owning-account "111122223333"
```

# 搜索可用指标
<a name="finding_metrics_with_cloudwatch"></a>

您可以使用目标搜索词，对您账户中的所有指标进行搜索。之后会返回在命名空间、指标名称或维度内具有匹配结果的指标。

如果这是 CloudWatch 跨账户可观测性中的监控账户，您还可以从与该监控账户关联的源账户中搜索指标。

**注意**  
控制台中不会显示在过去两周内没有任何新数据点的指标。当您在控制台的 **All metrics**（全部指标）选项卡的搜索框中键入指标名称或维度名称时，它们也不会显示，并且 [list-metrics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/list-metrics.html) 命令的结果中不会返回它们。检索这些指标的最佳方法是使用 AWS CLI 中的 [get-metric-data](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-data.html) 或者 [get-metric-statistics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html) 命令。

**在 CloudWatch 中搜索可用指标**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. 在搜索字段中，输入搜索词（例如，指标名称、命名空间、账户 ID、账户标签、维度名称/值或资源名称）。这将为您显示带有匹配此搜索词的指标的所有命名空间。

   例如，如果搜索 **volume**，则将显示其名称中包含该搜索词的指标的命名空间。

   有关搜索的更多信息，请参阅[在图表中使用搜索表达式](using-search-expressions.md)。

1. 要绘制所有搜索结果的图表，请选择 **Graph search**（图表搜索）

   或者

   选择命名空间以查看该命名空间中的指标。然后，您可执行以下操作：

   1. 要为一个或多个指标绘制图表，请选中每个指标旁边的复选框。要选择所有指标，请选中表的标题行中的复选框。

   1. 要细化您的搜索，请将鼠标指针悬停在某个指标名称上，然后选择 **Add to search**（添加到搜索）或 **Search for this only**（仅为此搜索）。

   1. 要在控制台中查看某个资源，请选择资源 ID，然后选择 **Jump to resource**（跳转到资源）。

   1. 要查看指标的帮助，请选择指标名称，然后选择 **What is this?**。

   所选指标会显示在图表上。  
![\[查看搜索词的结果指标\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metrics_search_results.png)

1. （可选）选择搜索栏中的一个按钮以编辑搜索词的该部分。

# 绘制指标的图表
<a name="graph_metrics"></a>

使用 CloudWatch 控制台绘制其他 AWS 服务生成的指标数据的图表。这样可以更高效地查看服务上的指标活动。以下程序介绍了如何在 CloudWatch 中绘制指标图表。

**Topics**
+ [绘制指标图表](graph_a_metric.md)
+ [将两个图表合并为一个](merge_graphs.md)
+ [使用动态标签](graph-dynamic-labels.md)
+ [修改图表的时间范围或时区格式](modify_graph_date_time.md)
+ [放大折线图或堆叠面积图](zoom-graph.md)
+ [修改图表的 Y 轴](switch_graph_axes.md)
+ [从图表上的指标创建告警](create_alarm_metric_graph.md)

# 绘制指标图表
<a name="graph_a_metric"></a>

您可以使用 CloudWatch 控制台选择指标并创建指标数据图表。

CloudWatch 支持指标的以下统计数据：`Average`、`Minimum`、`Maximum`、`Sum` 和 `SampleCount`。有关更多信息，请参阅 [统计信息](cloudwatch_concepts.md#Statistic)。

您可以在不同的详细程度下查看您的数据。例如，您可以选择一分钟视图，这在您排查问题时会非常有用。或者，选择不太详细的一小时视图。这在您查看更大的时间范围（例如 3 天）来了解一段时间内的趋势时会很有用。有关更多信息，请参阅 [时间段](cloudwatch_concepts.md#CloudWatchPeriods)。

如果您使用的账户在 CloudWatch 跨账户可观测性中设置为监控账户，则可以用图表表示与该监控账户关联的源账户中的指标。有关更多信息，请参阅 [CloudWatch 跨账户可观测性](CloudWatch-Unified-Cross-Account.md)。

## 创建图表
<a name="create-metric-graph"></a>

**绘制指标图表**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. 在**浏览**选项卡上的搜索字段中，输入搜索词（例如，指标名称、账户 ID 或资源名称）。

   例如，如果您搜索 `CPUUtilization` 指标，则将显示具有该指标的命名空间和维度。

1. 选择某个搜索结果以查看指标。

1. 要为一个或多个指标绘制图表，请选中每个指标旁边的复选框。要选择所有指标，请选中表的标题行中的复选框。

1. （可选）要更改图表类型，请选择**选项**选项卡。然后，您可以从折线图、堆叠面积图、数字显示、量规图、条形图或饼形图中选择。

1. 选择**绘成图表的指标**选项卡。

1. （可选）若要更改图表中使用的统计数据，请选择指标名称旁边 **Statistic（统计数据）**列中的新统计数据。

   有关 CloudWatch 统计数据的更多信息，请参阅 [CloudWatch 统计数据定义](Statistics-definitions.md)。有关 **p*xx* 百分位数统计数据的更多信息，请参阅 [百分位数](cloudwatch_concepts.md#Percentiles)。**

1. （可选）要添加显示指标的预期值的异常检测范围，请选择指标旁边的**操作**下的异常检测图标。有关异常检测的更多信息，请参阅[使用 CloudWatch 异常检测](CloudWatch_Anomaly_Detection.md)。  
![\[指标控制台，包含带圆圈的异常检测图标。\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/Anomaly_Detection_Icon.PNG)

   CloudWatch 使用指标最多两周的最新历史数据来计算预期值的模型。然后将此预期值范围以条带形式显示在图表上。CloudWatch 会在指标下新增一行，以显示异常检测范围数学表达式，并标记为 **ANOMALY\$1DETECTION\$1BAND**。最近的历史数据存在时，您可以立即看到一个预览异常检测范围，该范围是模型生成的异常检测范围的近似值。实际异常检测范围可能需要长达 15 分钟才能显示出来。

   预设情况下，CloudWatch 使用范围阈值的默认值 2 创建预期值范围的上限和下限。要更改此数字，请更改范围的 **Details (详细信息)** 下的公式末尾的值。

   1. （可选）选择 **Edit model (编辑模型)** 来更改计算异常检测模型的方式。您可以排除过去和未来的时间段，不在模型计算训练中使用。从训练数据中排除系统中断、部署和假日等异常事件至关重要。您还可以指定要用于夏令时更改模型的时区。

     有关更多信息，请参阅 [编辑异常检测模型](Create_Anomaly_Detection_Alarm.md#Modify_Anomaly_Detection_Model)。

   有关异常检测的更多信息，请参阅[使用 CloudWatch 异常检测](CloudWatch_Anomaly_Detection.md)。

   要在图表中隐藏模型，请在 ` ANOMALY_DETECTION_BAND` 函数所在行中取消选中选中标记或者选择 `X` 图标。要完全删除模型，请选择 **Edit model (编辑模型)**，然后选择 **Delete model (删除模型)**。

1. （可选）在选择要绘制图表的指标时，为每个指标指定一个在图表图例上显示的动态标签。动态标签显示有关指标的统计数据，并在刷新控制面板或图表时自动进行更新。要添加动态标签，请选择**已绘制图表指标**，然后选择**添加动态标签**。

   默认情况下，添加到标签的动态值显示在标签开头。然后，您可以选择指标的**标签**值以编辑标签。有关更多信息，请参阅 [使用动态标签](graph-dynamic-labels.md)。

1. 要查看有关要为其绘制图表的指标的更多信息，请将鼠标指针暂停在图例上。

1. 横向注释可帮助图表用户更高效地查看指标的峰值何时达到特定级别以及指标是否在预定义的范围内。要添加横向注释，请选择**选项**选项卡，然后选择**添加横向注释**：

   1. 对于 **Label (标签)**，输入注释的标签。

   1. 对于 **Value (值)**，输入显示横向注释的指标值。

   1. 对于 **Fill**，指定是否将填充阴影用于此注释。例如，为要填充的相应区域选择 `Above` 或 `Below`。如果您指定 `Between`，则另一个 `Value` 字段将出现，并且将填充两个值之间的图表区域。

   1. 对于 **Axis**，指定 `Value` 中的数字是否在图表包含多个指标的情况下表示与左侧 Y 轴或右侧 Y 轴关联的指标。

      您可以通过在注释的左列中选择颜色方块来更改注释的填充色。

   重复这些步骤可向同一个图表添加多个横向注释。

   要隐藏注释，请清除该注释的左列中的复选框。

   要删除注释，请在 **Actions** 列中选择 **x**。

1. 要获取图表的 URL，请依次选择 **Actions** 和 **Share**。复制要保存或共享的 URL。

1. 要将图表添加到控制面板，请依次选择 **Actions** 和 **Add to dashboard**。

## 创建源自另一个数据来源的指标图表
<a name="create-metric-graph-multidatasource"></a>

您可以创建一个图表来显示源自非 CloudWatch 数据来源的资源。有关创建与这些其他数据来源的连接的更多信息，请参阅[查询源自其他数据来源的指标](MultiDataSourceQuerying.md)。

**绘制源自另一个数据来源的指标图表**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. 选择**多来源查询**选项卡。

1. 对于**数据来源**，选择要使用的数据来源。

   如果您尚未创建与所需数据来源的连接，请选择**创建和管理数据来源**，然后选择**创建和管理数据来源**。有关此数据来源创建过程其余部分的信息，请参阅 [通过向导连接到预构建数据来源](CloudWatch_MultiDataSources-Connect.md)。

1. 向导或查询编辑器将提示您输入查询所需的信息。每个数据来源的工作流程都不同，并且这些工作流程都是针对数据来源量身定制的。例如，对于 Amazon Managed Service for Prometheus 和 Prometheus 数据来源，系统会显示带有查询助手的 PromQL 查询编辑器框。

1. 完成查询构造后，选择**图表查询**。

   图表会填充查询中的指标。

1. （可选）横向注释可帮助图表用户更高效地查看指标的峰值何时达到特定级别，以及指标是否在预定义的范围内。要添加横向注释，请选择**选项**选项卡，然后选择**添加横向注释**：

   1. 对于 **Label (标签)**，输入注释的标签。

   1. 对于 **Value (值)**，输入显示横向注释的指标值。

   1. 对于 **Fill**，指定是否将填充阴影用于此注释。例如，为要填充的相应区域选择 `Above` 或 `Below`。如果您指定 `Between`，则另一个 `Value` 字段将出现，并且将填充两个值之间的图表区域。

   1. 对于 **Axis**，指定 `Value` 中的数字是否在图表包含多个指标的情况下表示与左侧 Y 轴或右侧 Y 轴关联的指标。

      您可以通过在注释的左列中选择颜色方块来更改注释的填充色。

   重复这些步骤可向同一个图表添加多个横向注释。

   要隐藏注释，请清除该注释的左列中的复选框。

   要删除注释，请在 **Actions** 列中选择 **x**。

1. （可选）要将此图表添加到控制面板，请选择**操作**，然后选择**添加到控制面板**。

## 更新图表
<a name="update-metric-graph"></a>

**更新图表**

1. 要更改图表的名称，请选择铅笔图标。

1. 要更改时间范围，请选择某个预定义的值或选择 **custom**。有关更多信息，请参阅 [修改图表的时间范围或时区格式](modify_graph_date_time.md)。

1. 要更改统计数据，请选择 **Graphed metrics**（已绘制图表指标）选项卡。选择列标题或单个值，然后选择某个统计数据或预定义百分位数，或指定自定义百分位数（例如 **p95.45**）。

1. 要更改时间段，请选择 **Graphed metrics**（已绘制图表指标）选项卡。选择列标题或单个值，然后选择其他值。

1. 要添加横向注释，请选择 **Graph options (图表选项)**，然后选择 **Add horizontal annotation (添加横向注释)**：

   1. 对于 **Label (标签)**，输入注释的标签。

   1. 对于 **Value (值)**，输入显示横向注释的指标值。

   1. 对于 **Fill**，指定是否将填充阴影用于此注释。例如，为要填充的相应区域选择 `Above` 或 `Below`。如果您指定 `Between`，则另一个 `Value` 字段将出现，并且将填充两个值之间的图表区域。

   1. 对于 **Axis**，指定 `Value` 中的数字是否在图表包含多个指标的情况下表示与左侧 Y 轴或右侧 Y 轴关联的指标。

      您可以通过在注释的左列中选择颜色方块来更改注释的填充色。

   重复这些步骤可向同一个图表添加多个横向注释。

   要隐藏注释，请清除该注释的左列中的复选框。

   要删除注释，请在 **Actions** 列中选择 **x**。

1. 要更改刷新间隔，请选择 **Refresh options (刷新选项)**，然后选择 **Auto refresh (自动刷新)** 或者选择 **1 Minute (1 分钟)**、**2 Minutes (2 分钟)**、**5 Minutes (5 分钟)** 或 **15 Minutes (15 分钟)**。

## 复制指标
<a name="duplicate-metric-graph"></a>

**复制指标**

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

1. 对于 **Actions**，选择 **Duplicate** 图标。  
![\[复制指标\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metric_graph_duplicate.png)

1. 根据需要更新重复指标。

# 将两个图表合并为一个
<a name="merge_graphs"></a>

您可以将两个不同的图表合并为一个，然后生成的图表将显示这两个指标。如果您已经在不同的图表中显示了不同的指标并希望将它们合并，或者您想轻松地使用来自不同地区的指标创建单个图表，这会很有用。

要将一个图表合并到其他图表中，您可以使用要合并的图表的 URL 或 JSON 源。

**要将两个图表合并为一个**

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

1. 打开要合并到其他图表中的图表。为此，您可以选择**指标**、**所有指标**，然后选择要生成图表的指标。或者，您可以打开控制面板，然后通过选择图表，并从图表右上角的菜单中选择**在指标中打开**来打开控制面板上的其中一个图表。

1. 在打开图表之后，请执行以下操作之一：
   + 从浏览器栏复制 URL。
   + 选择**资源**选项卡，然后选择**复制**。

1. 打开要合并到上一个图表中的图表。

1. 当您在**指标**视图中打开第二个图表时，依次选择**操作**、**合并图表**。

1. 输入您之前复制的 URL 或 JSON，然后选择**合并**。

1. 此时将显示合并的图表。左侧的 Y 轴用于原始图表，右侧的 y 轴用于您合并到其中的图表。
**注意**  
如果您合并的图表使用 **METRICS()** 函数，则合并后的图表中的指标不包括在合并的图表的 **METRICS()** 计算中。

1. 要将合并的图表保存到控制面板，请依次选择**操作**和**添加到控制面板**。

# 使用动态标签
<a name="graph-dynamic-labels"></a>

您可以在图表中使用动态标签。动态标签在选定指标的标签中添加动态更新的值。您可以向标签添加多种值，如下表所示。

在标签中显示的动态值来自于当前在图表上显示的时间范围。在刷新控制面板或图表时，将自动更新标签的动态部分。

如果将动态标签与搜索表达式一起使用，则动态标签适用于搜索返回的每个指标。

您可以使用 CloudWatch 控制台向标签添加动态值、编辑标签、更改动态值在标签列中的位置以及自定义其他内容。

## 动态标签
<a name="dynamic-label-syntax"></a>

在动态标签中，您可以使用与指标属性相关的以下值：


| 动态标签实时值 | 说明 | 
| --- | --- | 
|  \$1\$1AVG\$1 |  当前在图表中显示的时间范围内的值的平均值。  | 
|  \$1\$1DATAPOINT\$1COUNT\$1 |  图表中当前所示时间范围内的数据点的数量。  | 
|  \$1\$1FIRST\$1 |  图表中当前所示时间范围内的最早指标值。  | 
|  \$1\$1FIRST\$1LAST\$1RANGE\$1 |  图表中当前所示最早数据点和最新数据点的指标值之间的差值。  | 
|  \$1\$1FIRST\$1LAST\$1TIME\$1RANGE\$1 |  图表中当前所示最早数据点和最新数据点之间的绝对时间范围。  | 
|  \$1\$1FIRST\$1TIME\$1 |  图表中当前所示时间范围内的最早数据点的时间戳。  | 
|  \$1\$1FIRST\$1TIME\$1RELATIVE\$1 |  此刻与图表中当前所示时间范围内的最早数据点的时间戳之间的绝对时间差。  | 
|  \$1\$1LABEL\$1 |  指标的默认标签的表示形式。  | 
|  \$1\$1LAST\$1 |  图表中当前所示时间范围内的指标值的最新值。  | 
|  \$1\$1LAST\$1TIME\$1 |  图表中当前所示时间范围内的最新数据点的时间戳。  | 
|  \$1\$1LAST\$1TIME\$1RELATIVE\$1 |  此刻与图表中当前所示时间范围内的最新数据点的时间戳之间的绝对时间差。  | 
|  \$1\$1MAX\$1 |  当前在图表中显示的时间范围内的值的最大值。  | 
|  \$1\$1MAX\$1TIME\$1 |  图表中当前所示数据点中具有最高指标值的数据点的时间戳。  | 
|  \$1\$1MAX\$1TIME\$1RELATIVE\$1 |  此刻与图表中当前所示数据点中具有最高值的数据点的时间戳之间的绝对时间差。  | 
|  \$1\$1MIN\$1 |  当前在图表中显示的时间范围内的值的最小值。  | 
|  \$1\$1MIN\$1MAX\$1RANGE\$1 |  图表中当前所示数据点中具有最高指标值和最低指标值的数据点之间的指标值之差。  | 
|  \$1\$1MIN\$1MAX\$1TIME\$1RANGE\$1 |  图表中当前所示数据点中具有最高指标值和最低指标值的数据点之间的绝对时间范围。  | 
|  \$1\$1MIN\$1TIME\$1 |  图表中当前所示数据点中具有最低指标值的数据点的时间戳。  | 
|  \$1\$1MIN\$1TIME\$1RELATIVE\$1 |  此刻与图表中当前所示数据点中具有最低值的数据点的时间戳之间的绝对时间差。  | 
|  \$1\$1PROP('AccountId')\$1 |  指标的 AWS 账户 ID。  | 
|  \$1\$1PROP('AccountLabel')\$1 |  在 CloudWatch 跨账户可观测性中,为拥有该指标的源账户指定的标签。  | 
|  \$1\$1PROP('Dim.*dimension\$1name*')\$1 |  指定维度的值。将 *dimension\$1name* 替换为您的维度名称（区分大小写。  | 
|  \$1\$1PROP('MetricName')\$1 |  指标的名称。  | 
|  \$1\$1PROP('Namespace')\$1 |  指标的命名空间。  | 
|  \$1\$1PROP('Period')\$1 |  指标的时间段（以秒为单位）。  | 
|  \$1\$1PROP('Region')\$1 |  发布指标的 AWS 区域。  | 
|  \$1\$1PROP('Stat')\$1 |  正在用于绘制图表的指标统计数据。  | 
|  \$1\$1SUM\$1 |  当前在图表中显示的时间范围内的值的总和。  | 

例如，假设您使用 **SEARCH(' \$1AWS/Lambda, FunctionName\$1 Errors ', 'Sum')** 搜索表达式，它查找每个 Lambda 函数的 `Errors`。如果将标签设置为 `[max: ${MAX} Errors for Function Name ${LABEL}]`，则每个指标的标签为 **[max: *number* Errors for Function Name *Name*]**。

您最多可以在标签中添加 6 个动态值。您只能在每个标签中使用一次 `${LABEL}` 占位符。

# 修改图表的时间范围或时区格式
<a name="modify_graph_date_time"></a>

 本节介绍了如何在 CloudWatch 指标图表上修改日期、时间和时区格式。它还介绍了如何放大图表以应用特定的时间范围。有关创建图表的信息，请参阅 [绘制指标图表](graph_a_metric.md)。

**注意**  
如果控制面板的时间范围短于其上用于图表的时间段，则会发生以下情况：  
 图表会被修改以显示该小组件的一个完整时间段对应的数据量，即使该时间段长于控制面板时间范围，也是如此。这样可以确保图表上至少有一个数据点。
 该数据点时间段的开始时间会被向后调整，以确保至少可以显示一个数据点。

## 设置相对时间范围
<a name="set-relative-time-range"></a>

------
#### [  New interface  ]

**指定图表的相对时间范围**

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

1.  在导航窗格中，选择 **Metrics**（指标），然后选择 **All metrics**（所有指标）。在屏幕右上角，您可以选择从 1 小时到 1 周的某个预定义的时间范围（**1h**（1 小时）、**3h**（3 小时）、**12h**（12 小时）、**1d**（1 天）、**3d**（3 天）或者 **1w**（1 周））。或者，您也可以选择 **Custom**（自定义）来设置自己的时间范围。

1.  选择 **Custom**（自定义），然后选择框的左上角的 **Relative**（相对）选项卡。您可以以 **Minutes**（分钟）、**Hours**（小时）、**Days**（天）、**Weeks**（周）、**Months**（月）为单位指定时间范围。

1.  在指定时间范围后，选择 **Apply**（应用）。

------
#### [  Original interface  ]

**指定图表的相对时间范围**

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

1.  在导航窗格中，选择 **Metrics**（指标），然后选择 **All metrics**（所有指标）。在屏幕右上角，您可以选择从 1 小时到 1 周的某个预定义的时间范围（**1h**（1 小时）、**3h**（3 小时）、**12h**（12 小时）、**1d**（1 天）、**3d**（3 天）或者 **1w**（1 周））。或者，您也可以选择 **custom**（自定义）来设置自己的时间范围。

1.  选择 **custom**（自定义），然后选择框的左上角的 **Relative**（相对）。您可以以 **Minutes**（分钟）、**Hours**（小时）、**Days**（天）、**Weeks**（周）或 **Months**（月）为单位指定时间范围。

------

## 设置绝对时间范围
<a name="set-absolute-time-range"></a>

------
#### [  New interface  ]

**指定图表的绝对时间范围**

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

1.  在导航窗格中，选择 **Metrics**（指标），然后选择 **All metrics**（所有指标）。在屏幕右上角，您可以选择从 1 小时到 1 周的某个预定义的时间范围（**1h**（1 小时）、**3h**（3 小时）、**12h**（12 小时）、**1d**（1 天）、**3d**（3 天）或者 **1w**（1 周））。或者，您也可以选择 **Custom**（自定义）来设置自己的时间范围。

1.  选择 **Custom**（自定义），然后选择框的左上角的 **Absolute**（绝对）选项卡。使用日历选取器或文本字段框指定时间范围。

1.  在指定时间范围后，选择 **Apply**（应用）。

------
#### [  Original interface  ]

**指定图表的绝对时间范围**

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

1.  在导航窗格中，选择 **Metrics**（指标），然后选择 **All metrics**（所有指标）。在屏幕右上角，您可以选择从 1 小时到 1 周的某个预定义的时间范围（**1h**（1 小时）、**3h**（3 小时）、**12h**（12 小时）、**1d**（1 天）、**3d**（3 天）或者 **1w**（1 周））。或者，您也可以选择 **custom**（自定义）来设置自己的时间范围。

1.  选择 **custom**（自定义），然后选择框的左上角的 **Absolute**（绝对）。使用日历选取器或文本字段框指定时间范围。

1.  在指定时间范围后，选择 **Apply**（应用）。

------

## 设置时区格式
<a name="set-time-zone-Cloudwatch-graph"></a>

------
#### [  New interface  ]

**指定图表的时区**

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

1.  在导航窗格中，选择 **Metrics**（指标），然后选择 **All metrics**（所有指标）。在屏幕右上角，您可以选择从 1 小时到 1 周的某个预定义的时间范围（**1h**（1 小时）、**3h**（3 小时）、**12h**（12 小时）、**1d**（1 天）、**3d**（3 天）或者 **1w**（1 周））。或者，您也可以选择 **Custom**（自定义）来设置自己的时间范围。

1.  选择 **Custom**（自定义），然后选择框右上角的下拉菜单。您可以将时区更改为 **UTC**（协调世界时）或 **Local time zone**（本地时区）。

1.  在更改之后，选择 **Apply**（应用）。

------
#### [  Original interface  ]

**指定图表的时区**

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

1.  在导航窗格中，选择 **Metrics**（指标），然后选择 **All metrics**（所有指标）。在屏幕右上角，您可以选择从 1 小时到 1 周的某个预定义的时间范围（**1h**（1 小时）、**3h**（3 小时）、**12h**（12 小时）、**1d**（1 天）、**3d**（3 天）或者 **1w**（1 周））。或者，您也可以选择 **custom**（自定义）来设置自己的时间范围。

1.  选择 **custom**（自定义），然后选择框右上角的下拉菜单。您可以将时区更改为 **UTC**（协调世界时）或 **Local timezone**（本地时区）。

------

# 放大折线图或堆叠面积图
<a name="zoom-graph"></a>

 在 CloudWatch 控制台中，您可以使用缩微贴图缩放功能来重点查看折线图和堆叠面积图的各个部分，而无需在放大和缩小视图之间进行切换。例如，您可以使用缩微贴图缩放功能来重点查看折线图中的峰值，以便将该峰值与同一时间线的控制面板中的其他指标进行比较。本节内容中的程序描述如何使用缩放功能。

![\[显示对比的缩放功能屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/widget_zoom.png)


 在上图中，缩放功能突出了与输入字节处理速率相关的折线图的峰值，它同时还在控制面板中显示其他折线图，突出同一时间线的各个部分。

------
#### [  New interface  ]

**放大图表**

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

1.  在导航窗格中，选择 **Metrics**（指标），然后选择 **All metrics**（所有指标）。

1.  选择 **Browse**（浏览），然后选择要生成图表的一个或多个指标。

1.  选择 **Options**（选项），然后选择 ***Widget type***（小组件类型）下方的 **Line**（折线图）。

1.  选择并拖动要突出的图表区域，然后释放拖动对象。

1.  要重置缩放，选择 **Reset zoom**（重置缩放）图标，该图标看起来像放大镜里面包含减号 (-) 符号。

------
#### [  Original interface  ]

**放大图表**

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

1.  在导航窗格中，选择 **Metrics**（指标），然后选择 **All metrics**（所有指标）。

1.  选择 **All metrics**（所有指标），然后选择要生成图表的指标。

1.  选择 **Graph options**（图表选项）。在 ***Widget type***（小组件类型）下方，选择 **Line**（折线图）。

1.  选择并拖动要突出的图表区域，然后释放拖动对象。

1.  要重置缩放，选择 **Reset zoom**（重置缩放）图标，该图标看起来像放大镜里面包含减号 (-) 符号。

------

**提示**  
 如果您已创建包含折线图或堆叠面积图的控制面板，可以转至控制面板并开始使用缩放功能。

# 修改图表的 Y 轴
<a name="switch_graph_axes"></a>

您可以在图表上设置 Y 轴的自定义范围，帮助您更好地查看数据。例如，您可以将 `CPUUtilization` 图表上的范围更改为 100%，这样，您就能轻松看到 CPU 使用率是低（绘制的线条靠近图表底部）还是高（绘制的线条靠近图表顶部）。

您可以在图表的两个不同的 Y 轴之间切换。这在图表包含单位不同或者值范围差异很大的指标时非常有用。

**修改图表上的 Y 轴**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. 选择一个指标命名空间（例如 **EC2**），然后选择一个指标维度（例如 **Per-Instance Metrics (每个实例的指标)**）。

1. **All metrics** 选项卡显示此命名空间中该维度的所有指标。要为指标绘制图表，请选中该指标旁的复选框。

1. 在 **Graph options（绘制图表选项）**选项卡上，指定 **Left Y Axis（左侧 Y 轴）**的 **Min（最小值）**和 **Max（最大值）**。**Min (最小值)** 的值不能大于 **Max (最大值)** 的值。  
![\[设置 Y 轴的自定义范围\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metric_graph_custom_bounds.png)

1. 要创建第二个 Y 轴，请指定 **Right Y Axis（右侧 Y 轴）**的 **Min（最小值）**和 **Max（最大值）**。

1. 要在两个 Y 轴之间切换，请选择 **Graphed metrics**（已绘制图表指标）选项卡。对于 **Y Axis**，请选择 **Left Y Axis** 或 **Right Y Axis**。  
![\[在图表的 Y 轴之间切换\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metric_graph_switch_axis.png)

# 从图表上的指标创建告警
<a name="create_alarm_metric_graph"></a>

您可以绘制指标的图表，然后从图表上的指标创建警报，这样做的优点是可为您填充很多警报字段。

**从图表上的指标创建警报**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. 选择一个指标命名空间（例如 **EC2**），然后选择一个指标维度（例如 **Per-Instance Metrics (每个实例的指标)**）。

1. **All metrics** 选项卡显示此命名空间中该维度的所有指标。要为指标绘制图表，请选中该指标旁的复选框。

1. 要为指标创建警报，请选择 **Graphed metrics**（已绘制图表指标）选项卡。对于 **Actions**，选择警报图标。  
![\[从指标的图表创建警报\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metric_graph_alarm.png)

1. 在**条件**下，选择**静态**或**异常检测**，以指定对警报使用静态阈值还是异常检测模型。

   根据您的选择，输入警报条件的其余数据。

1. 选择**其他配置**。对于**触发警报的数据点数**，指定必须有多少个评估期（数据点）处于 `ALARM` 状态才能触发警报。如果此处的两个值匹配，则会创建一个告警；如果多个连续评估期违例，该告警将变为 `ALARM`（告警）状态。

   要创建“M（最大为 N）”告警，为第一个值指定的数字应小于为第二个值指定的数字。有关更多信息，请参阅 [告警评估](alarm-evaluation.md)。

1. 对于**缺失数据处理**，选择在缺失某些数据点时的警报行为。有关更多信息，请参阅 [配置 CloudWatch 告警处理缺失数据的方式](alarms-and-missing-data.md)。

1. 选择**下一步**。

1. 在**通知**下面，选择一个在警报处于 `ALARM`、`OK` 或 `INSUFFICIENT_DATA` 状态时通知的 SNS 主题。

   要使告警为相同告警状态或不同告警状态发送多个通知，请选择**添加通知**。

   要让警报不发送通知，请选择**删除**。

1. 要让警报执行 Auto Scaling 或 EC2 操作，请选择相应的按钮，然后选择警报状态和要执行的操作。

1. 在完成后，选择**下一步**。

1. 输入警报的名称和说明。名称只能包含 ASCII 字符。然后选择**下一步**。

1. 在 **Preview and create** 下面，确认具有所需的信息和条件，然后选择 **Create alarm**。

# 使用 CloudWatch 异常检测
<a name="CloudWatch_Anomaly_Detection"></a>

为指标启用*异常检测*时，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 异常检测的工作原理
<a name="CloudWatch_Anomaly_Detection_Algorithm"></a>

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

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

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

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

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

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

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

## 指标数学异常检测
<a name="anomaly_detection_on_metric_math"></a>

指标数学异常检测是一项您可以用于针对指标数学表达式的输出创建异常检测告警的功能。您可以使用这些表达式来创建能可视化异常检测范围的图表。该功能支持基本的算术函数、比较和逻辑运算符以及大多数其他函数。有关不支持的函数的信息，请参阅 [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 检测异常
<a name="anomaly_detection_promql"></a>

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

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

### 定义上限和下限
<a name="anomaly_detection_promql_bounds"></a>

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

以下示例使用 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)。

### 检测违规
<a name="anomaly_detection_promql_breach"></a>

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

```
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)。

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

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

您也可以使用 `GetMetricData` API 操作以编程方式执行指标数学。有关更多信息，请参阅 [GetMetricData](https://docs.aws.amazon.com/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.aws.amazon.com/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.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/using-metric-math.html) **DB\$1PERF\$1INSIGHTS** 函数仅支持以下周期长度： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/using-metric-math.html) 有关 Amazon RDS 性能详情计数器指标的更多信息，请参阅[性能详情计数器指标](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights_Counters.html)。 有关 Amazon DocumentDB 性能详情计数器指标的更多信息，请参阅[性能详情计数器指标](https://docs.aws.amazon.com/documentdb/latest/developerguide/performance-insights-counter-metrics.html)。  **DB\$1PERF\$1INSIGHTS** 检索的精度为亚分钟的高分辨率指标仅适用于 **DBLoad** 指标，或者如果您启用了更高分辨率的增强监控，则适用于操作系统指标。有关 Amazon RDS 增强监控的更多信息，请参阅[使用增强监控监控操作系统指标](https://docs.aws.amazon.com/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.aws.amazon.com/zh_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.aws.amazon.com/zh_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  | 返回给定使用指标的服务配额。您可以使用此选项来可视化当前用量与配额的比较情况，并设置在接近配额时向您发送警告的警报。有关更多信息，请参阅 [AWS 使用情况指标](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.aws.amazon.com/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.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Anomaly_Detection.html#anomaly_detection_on_metric_math)。

# 在图表中使用搜索表达式
<a name="using-search-expressions"></a>

搜索表达式是一种类型的数学表达式，您可以将其添加到 CloudWatch 图表中。搜索表达式可让您快速向图表添加多个相关指标。它们还使您能够创建动态图表，从而自动将相应的指标添加到其显示中，即使您在第一次创建图表时不存在这些指标也是如此。

例如，您可以创建一个搜索表达式来显示区域中所有实例的 `AWS/EC2 CPUUtilization` 指标。如果您稍后启动新实例，则新实例的 `CPUUtilization` 会自动添加到图表中。

在图表中使用搜索表达式时，搜索会在指标名称、命名空间、维度名称和维度值中查找搜索表达式。您可以使用布尔运算符进行更复杂、更强大的搜索。搜索表达式只能找到在过去两周内报告了数据的指标。

您无法根据 **SEARCH** 表达式创建告警。这是因为搜索表达式可返回多个时间序列，而基于数学表达式的告警只能监视一个时间序列。

如果您使用的是 CloudWatch 跨账户可观测性中的监控账户，则您的搜索表达式可以在与该监控账户关联的源账户中查找指标。

**Topics**
+ [CloudWatch 搜索表达式语法](search-expression-syntax.md)
+ [CloudWatch 搜索表达式示例](search-expression-examples.md)
+ [使用搜索表达式创建 CloudWatch 图表](create-search-expression.md)

# CloudWatch 搜索表达式语法
<a name="search-expression-syntax"></a>

有效的搜索表达式具有以下格式。

```
SEARCH(' {Namespace, DimensionName1, DimensionName2, ...} SearchTerm', 'Statistic')
```

例如：

```
SEARCH('{AWS/EC2,InstanceId} MetricName="CPUUtilization"', 'Average')
```
+ 查询中单词 `SEARCH` 之后的第一部分（用大括号括起来）是要搜索的*指标架构*。指标架构包含指标命名空间以及一个或多个维度名称。在搜索查询中包含指标架构是可选的。如果指定，则指标架构必须包含命名空间，并且可以（可选）包含在该命名空间中有效的一个或多个维度名称。

  除非命名空间或维度名称包含空格或非字母数字字符，否则不需要在指标架构中使用引号。在这种情况下，您必须用双引号将包含这些字符的名称引起来。
+ `SearchTerm` 也是可选的，但有效的搜索必须包含指标架构和/或 `SearchTerm`。`SearchTerm` 通常包含一个或多个账户 ID、指标名称或维度值。`SearchTerm` 可以通过部分匹配和精确匹配来包含要搜索的多个词语。它还可以包含布尔运算符。

  在 `SearchTerm` 中使用账户 ID 仅适用于设置为 CloudWatch 跨账户可观测性监控账户的账户。`SearchTerm` 中账户 ID 的语法是 `:aws.AccountId = 444455556666`。您也可以使用 `'LOCAL'` 来指定监控账户本身：`:aws.AccountId = 'LOCAL'`

  有关更多信息，请参阅 [CloudWatch 跨账户可观测性](CloudWatch-Unified-Cross-Account.md)。

  `SearchTerm` 可以包含一个或多个指示符，例如 `MetricName=`（如本例中所示），但不需要使用指示符。

  指标架构和 `SearchTerm` 必须一起包含在一对单引号中。
+ `Statistic` 是任何有效 CloudWatch 统计数据的名称。它必须用单引号引起来。有关更多信息，请参阅 [统计信息](cloudwatch_concepts.md#Statistic)。

上述示例在 `AWS/EC2` 命名空间中搜索任何具有 `InstanceId` 作为维度名称的指标。它会返回找到的所有 `CPUUtilization` 指标，图表显示 `Average` 统计数据。

搜索表达式只能找到在过去两周内报告了数据的指标。

**搜索表达式限制**

最大搜索表达式查询大小为 1024 个字符。一个图表上最多可以包含 100 个搜索表达式。一个图表可以显示多达 500 个时间序列。

## CloudWatch 搜索表达式：令牌化
<a name="search-expression-syntax-tokenization"></a>

当您指定 `SearchTerm` 时，搜索函数会搜索*令牌*，即 CloudWatch 自动根据完整的指标名称、维度名称、维度值和命名空间生成的子字符串。CloudWatch 生成的令牌在原始字符串中以驼峰式大小写区分。数字字符也可用作新令牌的开头，非字母数字字符用作分隔符，从而在非字母数字字符之前和之后创建令牌。

相同类型的令牌分隔符字符的连续字符串会生成一个令牌。

所有生成的令牌都是小写的。下表显示了一些生成的令牌示例。


| 原始字符串 | 生成的令牌 | 
| --- | --- | 
|  CustomCount1  |  `customcount1`, `custom`, `count`, `1`    | 
|  SDBFailure  |  `sdbfailure`, `sdb`, `failure`  | 
|  Project2-trial333  |  `project2trial333`, `project`, `2`, `trial`, `333`  | 

## CloudWatch 搜索表达式：部分匹配项
<a name="search-expression-partial-match"></a>

当您指定 `SearchTerm` 时，搜索词也会被令牌化。CloudWatch 根据部分匹配项查找指标，部分匹配项是根据搜索词生成的单个令牌与根据指标名称、命名空间、维度名称或维度值生成的单个令牌的匹配项。

与单个令牌匹配的部分匹配搜索是不区分大小写的。例如，使用以下任一搜索词可能会返回 `CustomCount1` 指标：
+ `count`
+ `Count`
+ `COUNT`

但是，使用 `couNT` 作为搜索词不会找到 `couNT`，因为搜索词 `CustomCount1` 中的大写会被令牌化为 `cou` 和 `NT`。

搜索还可以匹配复合令牌，复合令牌是在原始名称中连续出现的多个令牌。为与复合令牌匹配，搜索是区分大小写的。例如，如果原始词是 `CustomCount1`，则 `CustomCount` 或 `Count1` 的搜索成功，但 `customcount` 或 `count1` 的搜索不成功。

## CloudWatch 搜索表达式：精确匹配项
<a name="search-expression-exact-match"></a>

您可以定义搜索，以便通过使用双引号将搜索词中需要精确匹配的部分引起来，仅查找搜索词的精确匹配项。这些双引号被括在将整个搜索词引起来的单引号中。例如，**SEARCH(' \$1MyNamespace\$1, "CustomCount1" ', 'Maximum')** 找到确切的字符串 `CustomCount1`（如果它在名为 `MyNamespace` 的命名空间中作为指标名称、维度名称或维度值存在）。但是，搜索 **SEARCH(' \$1MyNamespace\$1, "customcount1" ', 'Maximum')** 或 **SEARCH(' \$1MyNamespace\$1, "Custom" ', 'Maximum')** 找不到该字符串。

您可以在单个搜索表达式中组合部分匹配词和精确匹配词。例如，**SEARCH(' \$1AWS/NetworkELB, LoadBalancer\$1 "ConsumedLCUs" OR flow ', 'Maximum')** 会返回名为 `ConsumedLCUs` 的 Elastic Load Balancing 指标和包含令牌 `flow` 的所有 Elastic Load Balancing 指标或维度。

使用精确匹配也是查找具有特殊字符（例如非字母数字字符或空格）的名称的好方法，如下例所示。

```
SEARCH(' {"My Namespace", "Dimension@Name"}, "Custom:Name[Special_Characters" ', 'Maximum')
```

## CloudWatch 搜索表达式：排除指标架构
<a name="search-expression-no-schema"></a>

到目前为止显示的所有示例都包括指标架构（在大括号中）。省略指标架构的搜索也是有效的。

例如，**SEARCH(' "CPUUtilization" ', 'Average')** 返回所有与字符串 `CPUUtilization` 精确匹配的指标名称、维度名称、维度值和命名空间。在 AWS 指标命名空间中，这可以包括多个服务（包括 Amazon EC2、Amazon ECS、SageMaker AI 等）中的指标。

要将此搜索范围缩小到只有一个 AWS 服务，最佳做法是在指标架构中指定命名空间以及任何必要的维度，如以下示例所示。虽然这会缩小对 `AWS/EC2` 命名空间的搜索范围，但如果您已将 `CPUUtilization` 定义为其他指标的维度值，它仍会返回这些指标的结果。

```
SEARCH(' {AWS/EC2, InstanceType} "CPUUtilization" ', 'Average')
```

或者，您可以在 `SearchTerm` 中添加命名空间，如以下示例所示。但是在本示例中，搜索将与任何 `AWS/EC2` 字符串匹配，即使它是自定义维度名称或值。

```
SEARCH(' "AWS/EC2" MetricName="CPUUtilization" ', 'Average')
```

## CloudWatch 搜索表达式：在搜索中指定属性名称
<a name="search-expression-type-of-search-term"></a>

以下搜索 `"CustomCount1"` 的精确匹配将返回具有该名称的所有指标。

```
SEARCH(' "CustomCount1" ', 'Maximum')
```

但它也返回维度名称、维度值或命名空间为 `CustomCount1` 的指标。要进一步构建搜索，您可以指定要在搜索中查找的对象类型的属性名称。以下示例搜索所有命名空间并返回名为 `CustomCount1` 的指标。

```
SEARCH(' MetricName="CustomCount1" ', 'Maximum')
```

您还可以使用命名空间和维度名称/值对作为属性名称，如以下示例所示。这些示例中的第一个还演示了您也可以将属性名称与部分匹配搜索一起使用。

```
SEARCH(' InstanceType=micro ', 'Average')
```

```
SEARCH(' InstanceType="t2.micro" Namespace="AWS/EC2" ', 'Average')
```

## CloudWatch 搜索表达式：非字母数字字符
<a name="search-expression-syntax-characters"></a>

非字母数字字符用作分隔符，并标记要将指标名称、维度名称、命名空间名称和搜索词分隔成令牌的位置。当词语被令牌化时，非字母数字字符会被剥离掉，不会出现在令牌中。例如，`Network-Errors_2` 生成令牌 `network`、`errors` 和 `2`。

您的搜索词可以包含任何非字母数字字符。如果这些字符出现在搜索词中，则可以在部分匹配中指定复合令牌。例如，以下所有搜索都将查找名为 `Network-Errors-2` 或 `NetworkErrors2` 的指标。

```
network/errors
network+errors
network-errors
Network_Errors
```

当您进行精确值搜索时，精确搜索中使用的任何非字母数字字符都必须是出现在要搜索的字符串中的正确字符。例如，如果您要查找 `Network-Errors-2`，则 `"Network-Errors-2"` 的搜索成功，但 `"Network_Errors_2"` 搜索不成功。

执行精确匹配搜索时，必须使用反斜杠转义以下字符。

```
" \ ( )
```

例如，要按精确匹配查找指标名称 `Europe\France Traffic(Network)`，请使用搜索词 **"Europe\$1\$1France Traffic\$1(Network\$1)"**

## CloudWatch 搜索表达式：布尔运算符
<a name="search-expression-boolean-operators"></a>

搜索支持在 `SearchTerm` 中使用布尔运算符 `AND`、`OR` 和 `NOT`。布尔运算符被括在用于将整个搜索词引起来的单引号中。布尔运算符区分大小写，因此 `and`、`or` 和 `not` 作为布尔运算符无效。

您可以在搜索中显式使用 `AND`，例如 **SEARCH('\$1AWS/EC2,InstanceId\$1 network AND packets', 'Average')**。在搜索词之间不使用任何布尔运算符会隐式地搜索它们，就好像存在 `AND` 运算符，因此 **SEARCH(' \$1AWS/EC2,InstanceId\$1 network packets ', 'Average')** 产生相同的搜索结果。

使用 `NOT` 从结果中排除数据子集。例如，**SEARCH(' \$1AWS/EC2,InstanceId\$1 MetricName="CPUUtilization" NOT i-1234567890123456 ', 'Average')** 返回您的所有实例（`i-1234567890123456` 实例除外）的 `CPUUtilization`。您还可以使用 `NOT` 子句作为唯一的搜索词。例如，**SEARCH( 'NOT Namespace=AWS ', 'Maximum')** 产生所有自定义指标（具有不包括 `AWS` 的命名空间的指标）。

您可以在一个查询中使用多个 `NOT` 短语。例如，**SEARCH(' \$1AWS/EC2,InstanceId\$1 MetricName="CPUUtilization" NOT "ProjectA" NOT "ProjectB" ', 'Average')** 返回区域中的所有实例（但维度值为 `ProjectA` 或 `ProjectB` 的实例除外）的 `CPUUtilization`。

您可以组合布尔运算符以进行更强大、更详细的搜索，如以下示例所示。使用括号对运算符进行分组。

接下来的两个示例都返回包含 EC2 和 EBS 命名空间中的 `ReadOps` 的所有指标名称。

```
SEARCH(' (EC2 OR EBS) AND MetricName=ReadOps ', 'Maximum')
```

```
SEARCH(' (EC2 OR EBS) MetricName=ReadOps ', 'Maximum')
```

以下示例将以前的搜索范围缩小为仅包含 `ProjectA` 的结果，这可能是维度的值。

```
SEARCH(' (EC2 OR EBS) AND ReadOps AND ProjectA ', 'Maximum')
```

以下示例使用嵌套分组。它返回所有函数的 `Errors` 的 Lambda 指标，以及名称中包含字符串 `ProjectA` 或 `ProjectB` 的函数的 `Invocations`。

```
SEARCH(' {AWS/Lambda,FunctionName} MetricName="Errors" OR (MetricName="Invocations" AND (ProjectA OR ProjectB)) ', 'Average')
```

## CloudWatch 搜索表达式：使用数学表达式
<a name="search-expression-math-expressions"></a>

您可以在图表中的数学表达式内使用搜索表达式。

例如，**SUM(SEARCH(' \$1AWS/Lambda, FunctionName\$1 MetricName="Errors" ', 'Sum'))** 返回您的所有 Lambda 函数的 `Errors` 指标的总和。

对搜索表达式和数学表达式使用单独的行可能会产生更有用的结果。例如，假设您在图表中使用以下两个表达式。第一行显示您的各个 Lambda 函数的单独 `Errors` 行。该表达式的 ID 为 `e1`。第二行添加另一行，以显示所有函数的错误总和。

```
SEARCH(' {AWS/Lambda, FunctionName}, MetricName="Errors" ', 'Sum')
SUM(e1)
```

# CloudWatch 搜索表达式示例
<a name="search-expression-examples"></a>

以下示例演示了更多搜索表达式用法和语法。让我们首先在区域内的所有实例中搜索 `CPUUtilization`，然后查看变体。

此示例为区域中的每个实例显示一行，从而显示 `AWS/EC2` 命名空间中的 `CPUUtilization` 指标。

```
SEARCH(' {AWS/EC2,InstanceId} MetricName="CPUUtilization" ', 'Average')
```

将 `InstanceId` 更改为 `InstanceType` 会更改图表，以便为区域中使用的每个实例类型显示一行。来自每个类型的所有实例的数据针对该实例类型聚合为一行。

```
SEARCH(' {AWS/EC2,InstanceType} MetricName="CPUUtilization" ', 'Average')
```

以下示例按实例类型聚合 `CPUUtilization`，并为包含字符串 `micro` 的每个实例类型显示一行。

```
SEARCH('{AWS/EC2,InstanceType} InstanceType=micro MetricName="CPUUtilization" ', 'Average')
```

此示例缩小了上一个示例，将 `InstanceType` 更改为 t2.micro 实例的精确搜索。

```
SEARCH('{AWS/EC2,InstanceType} InstanceType="t2.micro" MetricName="CPUUtilization" ', 'Average')
```

以下搜索删除了查询的 `{metric schema}` 部分，因此所有命名空间中的 `CPUUtilization` 指标都显示在图表中。这可以返回不少结果，因为该图表为来自每个 AWS 服务的 `CPUUtilization` 指标包含多个行（沿不同维度聚合）。

```
SEARCH('MetricName="CPUUtilization" ', 'Average')
```

要稍微缩小这些结果范围，可以指定两个特定的指标名称空间。

```
SEARCH('MetricName="CPUUtilization" AND ("AWS/ECS" OR "AWS/ES") ', 'Average')
```

前面的示例是使用一个搜索查询来搜索特定的多个名称空间的唯一方法，因为您在每个查询中只能指定一个指标架构。但是，要添加更多结构，可以在图表中使用两个查询，如以下示例所示。在此示例中，还通过指定用于聚合 Amazon ECS 数据的维度来添加更多结构。

```
SEARCH('{AWS/ECS ClusterName}, MetricName="CPUUtilization" ', 'Average')
SEARCH(' {AWS/EBS} MetricName="CPUUtilization" ', 'Average')
```

以下示例返回名为 `ConsumedLCUs` 的 Elastic Load Balancing 指标和包含令牌 `flow` 的所有 Elastic Load Balancing 指标或维度。

```
SEARCH('{AWS/NetworkELB, LoadBalancer} "ConsumedLCUs" OR flow ', 'Maximum')
```

以下示例使用嵌套分组。它返回所有函数的 `Errors` 的 Lambda 指标，以及名称中包含字符串 `ProjectA` 或 `ProjectB` 的函数的 `Invocations`。

```
SEARCH('{AWS/Lambda,FunctionName} MetricName="Errors" OR (MetricName="Invocations" AND (ProjectA OR ProjectB)) ', 'Average')
```

以下示例显示了所有自定义指标，不包括 AWS 服务生成的指标。

```
SEARCH('NOT Namespace=AWS ', 'Average')
```

以下示例显示具有包含字符串 `Errors` 作为其名称一部分的指标名称、命名空间、维度名称和维度值的指标。

```
SEARCH('Errors', 'Average')
```

以下示例将搜索缩小到精确匹配。例如，此搜索会查找指标名称 `Errors`，但不会查找名为 `ConnectionErrors` 或 `errors` 的指标。

```
SEARCH(' "Errors" ', 'Average')
```

以下示例说明如何在搜索词的指标架构部分中指定包含空格或特殊字符的名称。

```
SEARCH('{"Custom-Namespace", "Dimension Name With Spaces"}, ErrorCount ', 'Maximum')
```

## CloudWatch 跨账户可观测性搜索表达式示例
<a name="search-expression-examples"></a>

**CloudWatch 跨账户可观测性示例**

如果您登录的账户在 CloudWatch 跨账户可观测性中设置为监控账户，则可以使用 **SEARCH**（搜索）函数从指定的源账户返回指标。有关更多信息，请参阅 [CloudWatch 跨账户可观测性](CloudWatch-Unified-Cross-Account.md)。

以下示例从账户 ID 为 111122223333 的账户中检索所有 Lambda 指标。

```
SEARCH(' AWS/Lambda :aws.AccountId = 111122223333 ', 'Average')
```

以下示例从两个账户中检索所有 `AWS/EC2` 指标：111122223333 和 777788889999。

```
SEARCH(' AWS/EC2 :aws.AccountId = (111122223333 OR 777788889999) ', 'Average')
```

以下示例从源账户 111122223333 和监控账户本身检索所有 `AWS/EC2` 指标。

```
SEARCH(' AWS/EC2 :aws.AccountId = (111122223333 OR 'LOCAL') ', 'Average')
```

以下示例将检索账户 `444455556666` 中指标 `MetaDataToken` 的 `SUM`，维度为 `InstanceId`。

```
SEARCH('{AWS/EC2,InstanceId} :aws.AccountId=444455556666 MetricName=\"MetadataNoToken\"','Sum')
```

# 使用搜索表达式创建 CloudWatch 图表
<a name="create-search-expression"></a>

在 CloudWatch 控制台上，在将图表添加到控制面板时或通过使用 **Metrics（指标）**视图，可以访问搜索功能。

您无法根据 **SEARCH** 表达式创建告警。原因在于搜索表达式会返回多个时间序列，而基于数学表达式的告警只能监视一个时间序列。

**将具有搜索表达式的图表添加到现有控制面板**

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

1. 在导航窗格中，选择 **Dashboards**，然后选择一个控制面板。

1. 选择 **Add widget**。

1. 选择**折线**或**堆积面积**，然后选择**配置**。

1. 在 **Graphed metrics**（已绘制图表指标）选项卡上，选择 **Add a math expression (添加数学表达式)**。

1.  对于 **Details (详细信息)**，输入所需的搜索表达式。例如，**SEARCH('\$1AWS/EC2,InstanceId\$1 MetricName="CPUUtilization"', 'Average')**

1. （可选）要向图表中添加其他搜索表达式或数学表达式，请选择 **Add a math expression (添加数学表达式)**

1. （可选）在添加搜索表达式后，您可以为每个指标指定在图表图例上显示的动态标签。动态标签显示有关指标的统计数据，并在刷新控制面板或图表时自动进行更新。要添加动态标签，请选择**Graphed metrics**（绘制的指标），然后选择**动态标签**。

   默认情况下，添加到标签的动态值显示在标签开头。然后，您可以单击指标的**标签**值以编辑标签。有关更多信息，请参阅 [使用动态标签](graph-dynamic-labels.md)。

1. （可选）要向图表中添加单个指标，请选择 **All metrics (所有指标)** 选项卡并向下钻取到所需的指标。

1. (可选) 要更改图表上显示的时间范围，请选择图表顶部的 **custom (自定义)**，或 **custom (自定义)** 左侧的一个时间段。

1. <a name="horizontal-annotations"></a> （可选）横向注释帮助控制面板用户快速查看指标的峰值何时达到特定级别，或者指标是否在预定义的范围内。要添加横向注释，请选择 **Graph options (图表选项)**，然后选择 **Add horizontal annotation (添加横向注释)**：

   1. 对于 **Label (标签)**，输入注释的标签。

   1. 对于 **Value (值)**，输入显示横向注释的指标值。

   1. 对于 **Fill**，指定是否将填充阴影用于此注释。例如，为要填充的相应区域选择 `Above` 或 `Below`。如果您指定 `Between`，则另一个 `Value` 字段将出现，并且将填充两个值之间的图表区域。

   1. 对于 **Axis**，指定 `Value` 中的数字是否在图表包含多个指标的情况下表示与左侧 Y 轴或右侧 Y 轴关联的指标。

      您可以通过在注释的左列中选择颜色方块来更改注释的填充色。

   重复这些步骤可向同一个图表添加多个横向注释。

   要隐藏注释，请清除该注释的左列中的复选框。

   要删除注释，请在 **Actions** 列中选择 **x**。

1. <a name="vertical-annotations"></a> （可选）垂直注释可帮助您标记图表中的里程碑，例如操作事件或部署的开始和结束。要添加垂直注释，请选择 **Graph options (图表选项)**，然后选择 **Add vertical annotation (添加垂直注释)**：

   1. 对于 **Label (标签)**，输入注释的标签。要仅在注释中显示日期和时间，请将 **Label (标签)** 字段留空。

   1. 对于 **Date (日期)**，指定垂直注释出现的日期和时间。

   1. 对于 **Fill (填充)**，指定是否在垂直注释前面或后面使用填充阴影或者在两个垂直注释之间使用填充阴影。例如，为要填充的相应区域选择 `Before` 或 `After`。如果您指定 `Between`，则另一个 `Date` 字段将出现，并且将填充两个值之间的图表区域。

   重复这些步骤可向同一个图表添加多个垂直注释。

   要隐藏注释，请清除该注释的左列中的复选框。

   要删除注释，请在 **Actions** 列中选择 **x**。

1. 选择 **Create widget**。

1. 选择 **Save dashboard**。

**使用“Metrics”(指标) 视图绘制所搜索指标的图表**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. 在搜索字段中，输入要搜索的令牌：例如，**cpuutilization t2.small**。

   将会显示与您的搜索匹配的结果。

1. 要绘制与搜索匹配的所有指标的图表，请选择 **Graph search (图表搜索)**。

   或者

   要细化您的搜索，请选择搜索结果中显示的一个命名空间。

1. 如果您选择了命名空间来缩小结果范围，则可以执行以下操作：

   1. 要为一个或多个指标绘制图表，请选中每个指标旁边的复选框。要选择所有指标，请选中表的标题行中的复选框。

   1. 要细化您的搜索，请将鼠标指针悬停在某个指标名称上，然后选择 **Add to search**（添加到搜索）或 **Search for this only**（仅为此搜索）。

   1. 要查看指标的帮助，请选择指标名称，然后选择 **What is this?**。

   所选指标会显示在图表上。

1. （可选）选择搜索栏中的一个按钮以编辑搜索词的该部分。

1. （可选）要将图表添加到控制面板，请选择 **Actions (操作)**，然后选择 **Add to dashboard (添加到控制面板)**。

# 获取指标的统计数据
<a name="getting-metric-statistics"></a>

# CloudWatch 统计数据定义
<a name="Statistics-definitions"></a>

统计数据是指定时间段内的指标数据汇总。当您绘制某个指标的图表或检索其统计数据时，您可以指定时间*段*（例如 5 分钟），用于计算每个统计值。例如，如果**时间段**为 5 分钟，则**总数**是在此五分钟内所收集的所有样本值的总数，而**最小值**是此五分钟内收集的最低值。

CloudWatch 支持指标的以下统计数据。
+ **样本数**是在该时间段内的数据点数。
+ **总数**是在该时间段内收集的所有数据点值的总数。
+ **平均值**是指定时间段内 `Sum/SampleCount` 的值。
+ **最小值**是指定时间段内的最小观察值。
+ **最大值**是指定时间段内的最大观察值。
+ **百分位数 (p)** 表示某个值在数据集中的相对位置。例如，**p95** 指第 95 个百分位数，表示该时间段内 95% 的数据低于此值，5% 的数据高于此值。百分位数可帮助您更好地了解指标数据的分布情况。
+ **切尾均值 (TM)** 是两个指定边界之间的所有值的均值。计算此均值时，两个边界以外的值均被忽略。您可以将边界定义为 0 到 100 之间的一个或两个数字，最多 10 位小数。这些数字可以是绝对值或百分比。例如，**tm90** 计算的是去掉 10% 具有最高值的数据点后的平均值。**TM(2%:98%)** 计算的是去掉 2% 最小数据点和 2% 最大数据点后的平均值。**TM(150:1000)** 计算的是去掉所有小于或等于 150 或大于 1000 的数据点后的平均值。
+ **四分位均值 (IQM)** 是*四分位间距*的切尾均值，或中间 50% 的值。它等同于 **TM(25%:75%)**。
+ **缩尾均值 (WM)** 类似于切尾均值。但是，计算缩尾均值时，不会忽略边界以外的值，而是将它们视为等于相应边界边缘的值。经过此规范化处理之后再计算平均值。您可以将边界定义为 0 到 100 之间的一个或两个数字，最多 10 位小数。例如，**wm98** 将计算平均值，同时将 2% 的最高值视为等于第 98 个百分位数的值。**WM(10%:90%)** 将计算平均值，同时将 10% 的最大数据点视为 90% 的边界值，并将 10% 的最小数据点视为 10% 的边界值。
+ **百分等级 (PR)** 是满足某一固定阈值的值的百分比。例如，**PR(:300)** 返回的是值等于或小于 300 的数据点的百分比。**PR(100:2000)** 返回的是值介于 100 到 2000 之间的数据点的百分比。

  百分位数排名的下限不含本数，上限包含本数。
+ **切尾计数 (TC)** 指所选切尾均值统计数据范围内的数据点数。例如，**tc90** 返回的是不包括处于 10% 最高值区间内的任何数据点的数据点数。**TC(0.005:0.030)** 返回的是值介于 0.005（不含）和 0.030（含）之间的数据点数。

  切尾计数可以返回十进制值而非整数。这是因为它是一个插值近似值，可以得出分数结果。
+ **切尾总数 (TS)** 指所选切尾均值统计数据范围内数据点的值的总数。它等同于（切尾均值）\$1（切尾计数）。例如，**ts90** 返回的是不包括处于 10% 最高值区间内的任何数据点的数据点总数。**TS(80%:)** 返回的是不包括值处于 80% 最低值区间内的任何数据点的值的总数。

**注意**  
对于“切尾均值”、“切尾计数”、“切尾总数”和“缩尾均值”，如果将两个边界定义为固定值而不是百分比，则计算时将包括等于较高边界的值，但不包括等于较低边界的值。

## 语法
<a name="Statistics-syntax"></a>

对于“切尾均值”、“切尾计数”、“切尾总数”和“缩尾均值”，以下语法规则适用：
+ 使用括号和带有百分号的一个或两个数字来定义边界，以用作数据集中位于指定的两个百分位数之间的值。例如，**TM(10%:90%)** 将仅使用位于第 10 和第 90 个百分位数之间的值。**TM(:95%)** 将使用处于数据集最低值区间到第 95 个百分位数之间的值，忽略 5% 具有最高值的数据点。
+ 使用括号和无百分号的一个或两个数字来定义边界，以用作数据集中位于指定的确切值之间的值。例如，**TC(80:500)** 将仅使用介于 80（不含）和 500（含）之间的值。**TC(:0.5)** 将仅使用等于或小于 0.5 的值。
+ 使用一个数字（无括号）以百分比形式来计算，计算过程忽略高于指定百分位数的数据点。例如，**tm99** 将计算均值，同时忽略 1% 具有最高值的数据点。其与 **TM(:99%)** 的计算结果相同。
+ 在指定范围时，切尾均值、切尾计数、切尾总数和缩尾均值均可以使用大写字母缩写表示，例如 **TM(5%:95%)**、**TM(100:200)** 或 **TM(:95%)**。仅指定一个数字时，只能使用小写字母缩写，例如 **tm99**。

## 统计数据使用案例
<a name="Statistics-usecases"></a>
+ **切尾均值**对于样本规模较大的指标（例如网页延迟）最实用。例如，**tm99** 会忽略可能由网络问题或人为错误导致的极高异常值，以便为典型请求的平均延迟提供更准确的数据。同样，**TM(10%:)** 会忽略 10% 的最低延迟值，例如由缓存命中导致的延迟值。此外，**TM(10%:99%)** 将排除这两种类型的异常值。我们建议您使用切尾均值来监测延迟。
+ 每当您使用切尾均值时，最好随时关注切尾计数，以确保在切尾均值计算中使用的值的数量足以具有统计意义。
+ 百分等级使您能够将值归入范围的“条柱”中，而且您可以使用它来手动创建直方图。为此，请将值归入各种不同的条柱，例如 **PR(:1)**、**PR(1:5)**、**PR(5:10)** 和 **PR(10:)**。以条形图的方式可视化呈现其中每个条柱，这样就得到一个直方图。

  百分位数排名的下限不含本数，上限包含本数。

## 百分位数与切尾均值
<a name="Percentile-versus-Trimmed-Mean"></a>

百分位数（如 **p99**）和切尾均值（如 **tm99**）衡量的是相似但并不完全相同的值。**p99** 和 **tm99** 二者都会忽略 1% 具有最高值的数据点，这些数据点被视为异常值。在此之后，**p99** 为剩余 99% 值的**最大值，而 **tm99** 为剩余 99% 的值的*平均值*。如果您正在研究 Web 请求的延迟，**p99** 告诉您的是最糟糕的客户体验，而 **tm99** 告诉您的是平均客户体验，二者都会忽略异常值。

如果您正寻求优化客户体验，那么切尾均值是适用于监测的理想延迟统计数据。

## 对使用百分位数、切尾均值和其他一些统计数据的要求
<a name="Percentiles-trimmedmean-requirements"></a>

CloudWatch 需要原始数据点来计算以下统计数据：
+ 百分位数
+ 切尾均值
+ 四分位均值
+ 缩尾均值
+ 切尾总数
+ 切尾计数
+ 百分等级

如果您不使用原始数据而是改用统计数据集发布数据，只有满足以下条件之一，才能检索此数据的这些类型统计数据：
+ 统计数据集的 SampleCount 值为 1，且最小值、最大值和总和均相等。
+ 最小值和最大值相等，总和等于最小值乘以 SampleCount。

以下 AWS 服务包含支持这些类型统计数据的指标。
+ API Gateway
+ Application Load Balancer
+ Amazon EC2
+ Elastic Load Balancing
+ Kinesis
+ Amazon RDS

此外，当任何指标值为负数时，指标的这些类型统计数据将不可用。

## 示例
<a name="statistics-examples-intro"></a>

以下示例说明如何获取资源（例如 EC2 实例）的 CloudWatch 指标的统计数据。

**Topics**

# 获取特定资源的统计数据
<a name="US_SingleMetricPerInstance"></a>

以下示例说明如何确定特定 EC2 实例的最大 CPU 使用率。

**要求**
+ 您必须拥有实例的 ID。可使用 Amazon EC2 控制台或 [describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) 命令获取实例 ID。
+ 默认情况下，基本监控已启用，但您可以启用详细监控。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[对实例启用或禁用详细监控](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch-new.html)。

**使用控制台显示特定实例的平均 CPU 使用率**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. 选择 **EC2** 指标命名空间。  
![\[选择 EC2 指标命名空间\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metric_view_categories.png)

1. 选择 **Per-Instance Metrics**（每个实例的指标）维度。  
![\[查看 Amazon EC2 的指标维度\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metric_view_metric_category.png)

1. 在搜索框中，输入 **CPUUtilization** 并按 Enter。选择特定实例的行，这将显示该实例的 `CPUUtilization` 指标的图表。要更改图表的名称，请选择铅笔图标。要更改时间范围，请选择某个预定义的值或选择 **custom**。  
![\[绘制单个指标的图表\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metric_statistics_ec2_instance.png)

1. 要更改统计数据，请选择 **Graphed metrics**（已绘制图表指标）选项卡。选择列标题或单个值，然后选择某个统计数据或预定义百分位数，或指定自定义百分位数（例如 **p99.999**）。  
![\[更改指标的统计数据\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metric_statistics_ec2_instance_statistic_period.png)

1. 要更改时间段，请选择 **Graphed metrics**（已绘制图表指标）选项卡。选择列标题或单个值，然后选择其他值。

**使用 AWS CLI 获取每个 EC2 实例的 CPU 使用率**  
使用 [get-metric-statistics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html) 命令（如下所示）可获取指定实例的 `CPUUtilization` 指标：

```
aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-1234567890abcdef0 --statistics Maximum \
--start-time 2016-10-18T23:18:00 --end-time 2016-10-19T23:18:00 --period 360
```

返回的统计数据是以请求的 24 小时时间为间隔的 6 分钟数值。每个值表示特定的六分钟时间段内的指定实例的最大 CPU 使用率百分比。数据点不是按时间顺序返回的。下面显示了示例输出的开头（完整输出包括 24 小时内每 6 分钟时间段的数据点）：

```
{
    "Datapoints": [
        {
            "Timestamp": "2016-10-19T00:18:00Z", 
            "Maximum": 0.33000000000000002, 
            "Unit": "Percent"
        }, 
        {
            "Timestamp": "2016-10-19T03:18:00Z", 
            "Maximum": 99.670000000000002, 
            "Unit": "Percent"
        }, 
        {
            "Timestamp": "2016-10-19T07:18:00Z", 
            "Maximum": 0.34000000000000002, 
            "Unit": "Percent"
        }, 
        ...
    ], 
    "Label": "CPUUtilization"
}
```

# 跨资源聚合统计数据
<a name="GetSingleMetricAllDimensions"></a>

您可以跨多个资源聚合 AWS 资源的指标。指标在区域之间完全独立，但您可以使用指标数学来跨区域聚合和转换类似指标。有关更多信息，请参阅 [将数学表达式与 CloudWatch 指标结合使用](using-metric-math.md)。

例如，您可以聚合已启用详细监控的 EC2 实例的统计数据。不包含使用基本监控的实例。因此，您必须启用详细监控 (另外收费)，这将提供以 1 分钟为间隔的数据。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[对实例启用或禁用详细监控](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch-new.html)。

此示例说明如何获取 EC2 实例的平均 CPU 使用率。因为未指定任何维度，所以 CloudWatch 会返回 `AWS/EC2` 命名空间中所有维度的统计数据。要获取其他指标的统计信息，请参阅 [发布 CloudWatch 指标的 AWS 服务](aws-services-cloudwatch-metrics.md)。

**重要**  
此方法可以在 AWS 命名空间中检索所有维度，但不适用于发布到 CloudWatch 的自定义命名空间。对于自定义命名空间，必须指定与任意给定数据关联的完整的维度组，以检索包含数据点的统计数据。

**显示 EC2 实例的平均 CPU 使用率**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. 选择 **EC2** 命名空间，然后选择 **Across All Instances**。

1. 选择包含 `CPUUtilization` 的行，这将显示所有 EC2 实例的指标的图表。要更改图表的名称，请选择铅笔图标。要更改时间范围，请选择某个预定义的值或选择 **custom**。  
![\[跨您的 EC2 实例聚合的指标\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metric_aggregated_instances.png)

1. 要更改统计数据，请选择 **Graphed metrics**（已绘制图表指标）选项卡。选择列标题或单个值，然后选择某个统计数据或预定义百分位数，或指定自定义百分位数（例如 **p95.45**）。

1. 要更改时间段，请选择 **Graphed metrics**（已绘制图表指标）选项卡。选择列标题或单个值，然后选择其他值。

**使用 AWS CLI 获取 EC2 实例的平均 CPU 使用率**  
按以下所示使用 [get-metric-statistics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-staticstics.html) 命令：

```
aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization --statistics "Average" "SampleCount" \
--start-time 2016-10-11T23:18:00 --end-time 2016-10-12T23:18:00 --period 3600
```

下面是示例输出：

```
{
    "Datapoints": [
        {
            "SampleCount": 238.0, 
            "Timestamp": "2016-10-12T07:18:00Z", 
            "Average": 0.038235294117647062, 
            "Unit": "Percent"
        }, 
        {
            "SampleCount": 240.0, 
            "Timestamp": "2016-10-12T09:18:00Z", 
            "Average": 0.16670833333333332, 
            "Unit": "Percent"
        }, 
        {
            "SampleCount": 238.0, 
            "Timestamp": "2016-10-11T23:18:00Z", 
            "Average": 0.041596638655462197, 
            "Unit": "Percent"
        }, 
        ...
    ], 
    "Label": "CPUUtilization"
}
```

# 按 Auto Scaling 组聚合统计数据
<a name="GetMetricAutoScalingGroup"></a>

您可以聚合 Auto Scaling 组中 EC2 实例的统计数据。指标在区域之间完全独立，但您可以使用 CloudWatch 指标数学来聚合和转换来自多个区域的指标。您还可以使用跨账户控制面板对来自不同账户的指标执行指标数学。

此示例说明如何获取为一个 Auto Scaling 组写入磁盘的字节总数。总数以 1 分钟为周期、24 小时为间隔针对指定 Auto Scaling 组中的所有 EC2 实例计算得出。

**使用控制台显示 Auto Scaling 组中实例的 DiskWriteBytes**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. 选择 **EC2** 命名空间，然后选择 **By Auto Scaling Group**。

1. 选择 **DiskWriteBytes** 指标和特定 Auto Scaling 组所在的行，随后将显示该 Auto Scaling 组中实例的指标的图表。要更改图表的名称，请选择铅笔图标。要更改时间范围，请选择某个预定义的值或选择 **custom**。  
![\[在 Auto Scaling 组中聚合的指标\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metric_aggregated_auto_scaling.png)

1. 要更改统计数据，请选择 **Graphed metrics**（已绘制图表指标）选项卡。选择列标题或单个值，然后选择某个统计数据或预定义百分位数，或指定自定义百分位数（例如 **p95.45**）。

1. 要更改时间段，请选择 **Graphed metrics**（已绘制图表指标）选项卡。选择列标题或单个值，然后选择其他值。

**使用 AWS CLI 获取 Auto Scaling 组中实例的 DiskWriteBytes**  
使用 [get-metric-statistics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html) 命令，如下所示。

```
aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name DiskWriteBytes  
--dimensions Name=AutoScalingGroupName,Value=my-asg --statistics "Sum" "SampleCount" \
--start-time 2016-10-16T23:18:00 --end-time 2016-10-18T23:18:00 --period 360
```

下面是示例输出。

```
{
    "Datapoints": [
        {
            "SampleCount": 18.0, 
            "Timestamp": "2016-10-19T21:36:00Z", 
            "Sum": 0.0, 
            "Unit": "Bytes"
        }, 
        {
            "SampleCount": 5.0, 
            "Timestamp": "2016-10-19T21:42:00Z", 
            "Sum": 0.0, 
            "Unit": "Bytes"
        }
    ], 
    "Label": "DiskWriteBytes"
}
```

# 按亚马逊机器映像（AMI）聚合统计数据
<a name="US_SingleMetricPerAMI"></a>

您可以聚合已启用详细监控的 EC2 实例的统计数据。不包含使用基本监控的实例。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[对实例启用或禁用详细监控](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch-new.html)。

此示例说明如何确定使用指定 AMI 的所有实例的平均 CPU 使用率。平均值以 60 秒为时间间隔 1 天为周期。

**使用控制台按 AMI 显示平均 CPU 使用率**

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

1. 在导航窗格中，依次选择 **Metrics**（指标）、**All metrics**（所有指标）。

1. 选择 **EC2** 命名空间，然后选择 **By Image (AMI) Id**。

1. 选择 `CPUUtilization` 指标和特定 AMI 的行，这将显示指定 AMI 的指标的图表。要更改图表的名称，请选择铅笔图标。要更改时间范围，请选择某个预定义的值或选择 **custom**。  
![\[AMI 聚合的指标\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/metric_aggregated_ami.png)

1. 要更改统计数据，请选择 **Graphed metrics**（已绘制图表指标）选项卡。选择列标题或单个值，然后选择某个统计数据或预定义百分位数，或指定自定义百分位数（例如 **p95.45**）。

1. 要更改时间段，请选择 **Graphed metrics**（已绘制图表指标）选项卡。选择列标题或单个值，然后选择其他值。

**使用 AWS CLI 获取按 AMI 聚合的平均 CPU 使用率**  
使用 [get-metric-statistics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html) 命令，如下所示。

```
aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization \
--dimensions Name=ImageId,Value=ami-3c47a355 --statistics Average \
--start-time 2016-10-10T00:00:00 --end-time 2016-10-11T00:00:00 --period 3600
```

操作返回的统计信息是以 1 天时间为间隔的 1 分钟数值。每个数值代表运行指定 AMI 的 EC2 实例的平均 CPU 使用率百分比。下面是示例输出。

```
{
    "Datapoints": [
        {
            "Timestamp": "2016-10-10T07:00:00Z", 
            "Average": 0.041000000000000009, 
            "Unit": "Percent"
        }, 
        {
            "Timestamp": "2016-10-10T14:00:00Z", 
            "Average": 0.079579831932773085, 
            "Unit": "Percent"
        }, 
        {
            "Timestamp": "2016-10-10T06:00:00Z", 
            "Average": 0.036000000000000011, 
            "Unit": "Percent"
        }, 
        ...
    ], 
    "Label": "CPUUtilization"
}
```

# 发布自定义指标
<a name="publishingMetrics"></a>

可以使用 OpenTelemetry Protocol（OTLP）或 CloudWatch API，将自己的指标发送到 CloudWatch。

## 使用 OpenTelemetry 发布指标（推荐）
<a name="publishMetricsOTLP"></a>

对于新的实现，建议使用 OpenTelemetry 将自定义指标发布到 CloudWatch。OpenTelemetry 为与供应商无关的埋点提供了更丰富的描述性标签，并支持包括仪表、总和、直方图和指数直方图在内的指标类型。

要使用 OpenTelemetry 发布指标，请将 OpenTelemetry Collector 或 SDK 配置为向 CloudWatch OTLP 端点发送指标。通过 OTLP 发送的指标可以在 CloudWatch Query Studio 中使用 Prometheus 查询语言（PromQL）进行查询。您还可以在这些指标上设置基于 PromQL 的 CloudWatch 警报。

与 CloudWatch API 方法的主要区别：


| 功能 | OpenTelemetry（OTLP） | CloudWatch API（PutMetricData） | 
| --- | --- | --- | 
| 每个指标的标签数量 | 最多 150 | 最多 30 个维度 | 
| 指标类型 | 仪表、总和、直方图、指数直方图 | 单个值，统计数据集 | 
| 粒度 | 以发送的分辨率摄取 | 1 秒（高分辨率）或 1 分钟（标准） | 
| 查询语言 | PromQL | GetMetricStatistics、Metrics Insights | 
| 警报 | 基于 PromQL 的 CloudWatch 警报 | 标准 CloudWatch 警报 | 
| Instrumentation | 与供应商无关的 OpenTelemetry SDK 和收集器 | AWS SDK 或 CLI | 

要开始使用，请参阅[使用 OpenTelemetry 发送指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-OpenTelemetry-Sections.html)。

## 使用 CloudWatch API 发布指标
<a name="publishMetricsCWAPI"></a>

您也可以使用 PutMetricData API 或 AWS CLI 发布自定义指标。此方法使用 CloudWatch 命名空间、指标名称和维度。

**Topics**
+ [使用 OpenTelemetry 发布指标（推荐）](#publishMetricsOTLP)
+ [使用 CloudWatch API 发布指标](#publishMetricsCWAPI)
+ [高精度指标](#high-resolution-metrics)
+ [使用维度](#usingDimensions)
+ [发布单一数据点](#publishingDataPoints)
+ [发布统计数据集](#publishingDataPoints1)
+ [发布零值](#publishingZero)
+ [停止发布指标](#CloudWatch-Stop-Publishing-Metrics)

## 高精度指标
<a name="high-resolution-metrics"></a>

每个指标均为以下类型之一：
+ 标准精度，数据粒度为一分钟
+ 高精度，数据粒度为一秒

AWS 服务生成的指标在默认情况下为标准精度。在发布自定义指标时，您可以将其定义为标准精度或高精度。发布高精度指标时，CloudWatch 使用 1 秒的精度来存储指标，您可以按照 1 秒、5 秒、10 秒、30 秒或 60 秒的任意倍数的时间段读取和检索。

高精度指标让您对应用程序的亚分钟级活动有着更详细的直观认识。请记住，每次对自定义指标的 `PutMetricData` 调用都会收取费用，因此对高精度指标频繁调用 `PutMetricData` 会导致较高的费用。有关 CloudWatch 定价的信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

如果对高精度指标设置告警，您可以指定 10 秒或 30 秒时间段的高精度告警，也可以设置 60 秒的任意倍数时间段的定期告警。10 秒或 30 秒时间段的高精度警报会产生较高的费用。

## 使用维度
<a name="usingDimensions"></a>

在自定义指标中，`--dimensions` 参数很常见。维度进一步阐明了指标是什么以及指标存储什么数据。您可以将最多 30 个维度分配给一个指标，每个维度通过一个名称和值对进行定义。

当使用不同的命令时，指定维度的方式也不同。使用 [put-metric-data](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-data.html) 时，将每个维度指定为 *MyName*=*MyValue* 格式，使用 [get-metric-statistics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html) 或 [put-metric-alarm](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-alarm.html) 时，将使用格式 `Name=`*MyName*、`Value=`*MyValue*。例如，以下命令将发布一个包含两个维度（分别名为 `InstanceId` 和 `InstanceType`）的 `Buffers` 指标。

```
aws cloudwatch put-metric-data --metric-name Buffers --namespace MyNameSpace --unit Bytes --value 231434333 --dimensions InstanceId=1-23456789,InstanceType=m1.small
```

此命令检索同一指标的统计数据。使用逗号分隔单一维度的名称部分和值部分，但如果有多个维度，应在不同维度之间使用空格分隔。

```
aws cloudwatch get-metric-statistics --metric-name Buffers --namespace MyNameSpace --dimensions Name=InstanceId,Value=1-23456789 Name=InstanceType,Value=m1.small --start-time 2016-10-15T04:00:00Z --end-time 2016-10-19T07:00:00Z --statistics Average --period 60
```

如果单个指标包含多个维度，则在使用 [get-metric-statistics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html) 时必须为每个已定义的维度指定一个值。例如，Amazon S3 指标 `BucketSizeBytes` 包含维度 `BucketName` 和 `StorageType`，因此必须使用 [get-metric-statistics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html) 指定这两个维度。

```
aws cloudwatch get-metric-statistics --metric-name BucketSizeBytes --start-time 2017-01-23T14:23:00Z --end-time 2017-01-26T19:30:00Z --period 3600 --namespace AWS/S3 --statistics Maximum --dimensions Name=BucketName,Value=amzn-s3-demo-bucket Name=StorageType,Value=StandardStorage --output table
```

要查看为指标定义的维度，请使用 [list-metrics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/list-metrics.html) 命令。

## 发布单一数据点
<a name="publishingDataPoints"></a>

要发布新指标或现有指标的单一数据点，请使用带有一个值和时间戳的 [put-metric-data](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-data.html) 命令。例如，下列每项操作会发布一个数据点。

```
aws cloudwatch put-metric-data --metric-name PageViewCount --namespace MyService --value 2 --timestamp 2016-10-20T12:00:00.000Z
aws cloudwatch put-metric-data --metric-name PageViewCount --namespace MyService --value 4 --timestamp 2016-10-20T12:00:01.000Z
aws cloudwatch put-metric-data --metric-name PageViewCount --namespace MyService --value 5 --timestamp 2016-10-20T12:00:02.000Z
```

如果使用新的指标名称调用此命令，CloudWatch 会为您创建一个指标。否则，CloudWatch 会将您的数据与您指定的现有指标进行关联。

**注意**  
当您创建指标时，可能需要 2 分钟时间，然后才能使用 [get-metric-statistics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html) 命令检索新指标的统计数据。但是，这可能需要最多 15 分钟时间，然后新指标才会出现在使用 [list-metrics](https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/list-metrics.html) 命令检索的指标列表中。

尽管可以以千分之一秒粒度的时间戳发布数据点，但是 CloudWatch 会将数据聚合到一秒钟的最低粒度。CloudWatch 记录每个时间段内收到的值的平均值（所有项之和除以项数）以及同一个时间段内的样本数、最大值和最小值。例如，之前示例中的 `PageViewCount` 指标包含三个以若干秒为分隔的时间戳的数据点。如果将时间段设置为 1 分钟，则 CloudWatch 会聚合三个数据点，因为它们都具有 1 分钟时间段内的时间戳。

您可以使用 **get-metric-statistics** 命令，基于您发布的数据点来检索统计数据。

```
aws cloudwatch get-metric-statistics --namespace MyService --metric-name PageViewCount \
--statistics "Sum" "Maximum" "Minimum" "Average" "SampleCount" \
--start-time 2016-10-20T12:00:00.000Z --end-time 2016-10-20T12:05:00.000Z --period 60
```

下面是示例输出。

```
{
    "Datapoints": [
        {
            "SampleCount": 3.0, 
            "Timestamp": "2016-10-20T12:00:00Z", 
            "Average": 3.6666666666666665, 
            "Maximum": 5.0, 
            "Minimum": 2.0, 
            "Sum": 11.0, 
            "Unit": "None"
        }
    ], 
    "Label": "PageViewCount"
}
```

## 发布统计数据集
<a name="publishingDataPoints1"></a>

您可在将数据发布到 CloudWatch 之前对数据进行聚合。如果您每分钟拥有多个数据点，则数据聚合会将调用 **put-metric-data** 的数目减到最少。例如，与其将彼此相隔 3 秒之内的三个数据点调用 **put-metric-data** 多次，不如使用 `--statistic-values` 参数将数据聚合到以一次调用发布的统计信息集中：

```
aws cloudwatch put-metric-data --metric-name PageViewCount --namespace MyService --statistic-values Sum=11,Minimum=2,Maximum=5,SampleCount=3 --timestamp 2016-10-14T12:00:00.000Z
```

CloudWatch 需要原始数据点来计算百分位数。如果您改用统计数据集发布数据，则无法检索此数据的百分位数统计数据，除非满足以下条件之一：
+ 统计数据集的 `SampleCount` 为 1。
+ 统计数据集的 `Minimum` 和 `Maximum` 相等

## 发布零值
<a name="publishingZero"></a>

 如果数据比较分散并有一些包含无关联数据的时间段，则可以选择为该时间段发布值零 (`0`) 或者无任何值。如果您通过定期调用 `PutMetricData` 来监控应用程序的运行状况，则可能需要发布零值来代替无值。例如，可以设置一个当应用程序发布指标失败时每隔五分钟向您发送通知的 CloudWatch 告警。您想让这样的应用程序为不含任何关联数据的时间段发布零值。

 如果想要追踪数据点的总数或需要最小和平均等统计数据包含 0 值数据点，也可以发布零值。

## 停止发布指标
<a name="CloudWatch-Stop-Publishing-Metrics"></a>

要停止向 CloudWatch 发布自定义指标，请更改应用程序或服务的代码以停止使用 **PutMetricData**。CloudWatch 不会从应用程序中提取指标，它只会接收推送的内容，因此要停止发布指标，您必须在源头停止这些指标。