

# 查询源自其他数据来源的指标
<a name="MultiDataSourceQuerying"></a>

您可以使用 CloudWatch 对源自其他数据来源的指标进行查询、可视化并为其创建警报。为此，您需要将 CloudWatch 连接到其他数据来源。这样，您便可在 CloudWatch 控制台中进行集中统一监控。无论数据存储在何处，您都可以统一查看基础设施和应用程序指标，从而帮助您更快地发现和解决问题。

使用 CloudWatch 向导连接到数据来源后，CloudWatch 会创建一个用于部署和配置 AWS Lambda 函数的 AWS CloudFormation 堆栈。每次查询数据来源时，此 Lambda 函数都会按需运行。CloudWatch 查询构建器会实时显示可查询元素的列表，例如指标、表、字段或标签。在您做出选择后，查询构建器会以选定来源的原生语言预先填充一个查询。

您可以使用 CloudWatch 提供的引导式向导连接到以下数据来源。对于这些数据来源，您需要提供一些基本信息来识别数据来源和凭证。您还可以通过创建自己的 Lambda 函数来手动创建连接其他数据来源的连接器。
+ Amazon OpenSearch Service：从您的 OpenSearch Service 日志和跟踪中派生指标。
+ Amazon Managed Service for Prometheus：使用 PromQL 查询这些指标。
+ Amazon RDS for MySQL：使用 SQL 将存储在 Amazon RDS 表中的数据转换为指标。
+ Amazon RDS for PostgreSQL：使用 SQL 将存储在 Amazon RDS 表中的数据转换为指标。
+ Amazon S3 CSV 文件：显示存储在 Amazon S3 存储桶中的 CSV 文件内的指标数据。
+ Microsoft Azure Monitor：查询 Microsoft Azure Monitor 账户中的指标。
+ Prometheus：使用 PromQL 查询这些指标。

创建连接到数据来源的连接器后，请参阅 [创建源自另一个数据来源的指标图表](graph_a_metric.md#create-metric-graph-multidatasource) 查看有关绘制来自某个数据来源的指标的图表的信息。有关为数据来源中的指标设置警报的信息，请参阅 [基于连接的数据来源创建警报](Create_MultiSource_Alarm.md)。

**Topics**
+ [管理对数据来源的访问](CloudWatch_MultiDataSources_Permissions.md)
+ [通过向导连接到预构建数据来源](CloudWatch_MultiDataSources-Connect.md)
+ [创建自定义数据来源连接器。](CloudWatch_MultiDataSources-Connect-Custom.md)
+ [使用您的自定义数据来源](CloudWatch_MultiDataSources-Custom-Use.md)
+ [删除数据来源连接器](CloudWatch_MultiDataSources-Delete.md)

# 管理对数据来源的访问
<a name="CloudWatch_MultiDataSources_Permissions"></a>

 CloudWatch 通过 CloudFormation 在您的账户中创建所需资源。在向 IAM 用户授予 `CreateStack` 权限时，我们建议您使用 `cloudformation:TemplateUrl` 条件来控制对 CloudFormation 模板的访问权限。

**警告**  
您对其授予数据来源调用权限的任何用户都可以查询该数据来源中的指标，即使此用户没有该数据来源的直接 IAM 访问权限。例如，如果您向用户授予 Amazon Managed Service for Prometheus 数据来源 Lambda 函数的 `lambda:InvokeFunction` 权限，则即使您没有向用户授予该工作区的直接 IAM 访问权限，该用户也将能够查询相应 Amazon Managed Service for Prometheus 工作区的指标。

您可以在 CloudWatch 设置控制台的**创建堆栈**页面上找到数据来源的模板 URL。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCloudFormationCreateStack",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "cloudformation:TemplateUrl": [
                        "https://s3.us-east-1.amazonaws.com/amzn-s3-demo-bucket/template.json"
                    ]
                }
            }
        }
    ]
}
```

------

有关控制 CloudFormation 访问的更多信息，请参阅[使用 AWS Identity and Access Management 控制访问](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html)。

# 通过向导连接到预构建数据来源
<a name="CloudWatch_MultiDataSources-Connect"></a>

 本主题提供相关说明，帮助您了解如何通过向导将 CloudWatch 连接到以下数据来源。
+ Amazon OpenSearch Service
+ Amazon Managed Service for Prometheus
+ Amazon RDS for MySQL
+ Amazon RDS for PostgreSQL
+ Amazon S3 CSV 文件
+ Microsoft Azure Monitor
+ Prometheus

 本主题中的若干小节包含有关管理这些数据来源和使用其进行查询的说明。

**创建数据来源连接器。**

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

1. 在导航窗格中，选择**设置**。

1. 选择**指标数据来源**选项卡。

1. 选择**创建数据来源**。

1. 选择所需的来源，然后选择**下一步**。

1. 输入数据来源的名称。

1. 根据所选择的数据来源，输入其他必填信息。这些信息可能包括用于访问数据来源的凭证和数据来源标识信息，例如 Prometheus 工作区名称、数据库名称或 Amazon S3 存储桶名称。关于 AWS 服务，向导会发现资源并将其填充到选择下拉列表中。

   有关您正在使用的数据来源的更多说明，请参阅此过程之后的小节。

1. 要将 CloudWatch 连接到 VPC 中的数据来源，请选择**使用 VPC**，然后选择要使用的 VPC。然后选择子网和安全组。

1. 选择**我确认 CloudFormation 会创建 IAM 资源**。此资源是 Lambda 函数执行角色。

1. 选择**创建数据来源**。

   CloudFormation 堆栈完成创建新来源之后，您刚刚添加的新来源才会出现。要查看进度，可以选择**查看我的 CloudFormation 堆栈的状态**。您也可以使用刷新图标来更新此列表。

   新数据来源出现在此列表中时即可使用。您可以选择**从 CloudWatch 指标中查询**，以开始使用新数据来源进行查询。有关更多信息，请参阅 [创建源自另一个数据来源的指标图表](graph_a_metric.md#create-metric-graph-multidatasource)。

## Amazon Managed Service for Prometheus
<a name="MultiDataSources-Amazon_Managed_Prometheus"></a>

**更新数据来源配置**
+ 您可以通过以下步骤手动更新数据来源：
  + 要更新 Amazon Managed Service for Prometheus 工作区 ID，请更新数据来源连接器 Lambda 函数的 `AMAZON_PROMETHEUS_WORKSPACE_ID` 环境变量。
  + 要更新 VPC 配置，请参阅[配置 VPC 访问（控制台）](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-configuring)了解更多信息。

**查询数据来源**
+ 查询 Amazon Managed Service for Prometheus 时，在**多来源查询**选项卡中选择数据来源并选择一个 Amazon Managed Service for Prometheus 连接器后，您可以通过**查询助手**来发现指标和标签并提供简单的 PromQL 查询。您也可以使用 PromQL 查询编辑器来构建 PromQL 查询。
+ CloudWatch 数据来源连接器不支持多行查询。执行查询，或者使用查询创建警报或控制面板小组件时，每个换行符都会替换为空格。在某些情况下，这可能会导致查询无效。例如，如果您的查询包含单行注释，则该查询无效。如果您尝试利用命令行或基础设施即代码中的多行查询来创建控制面板或警报，API 将拒绝该操作，并显示解析错误。

## Amazon OpenSearch Service
<a name="MultiDataSources-Amazon_OpenSearch"></a>

**创建数据来源**

如果为 FGAC 启用 OpenSearch 域，您必须将连接器 Lambda 函数的执行角色映射到 OpenSearch Service 中的用户。有关更多信息，请参阅 OpenSearch Service 文档[管理权限](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-access-control)中的**将角色映射到用户**部分。

如果您的 OpenSearch 域只能在虚拟私有云（VPC）中访问，则需要在 Lambda 函数中手动包含一个名为 `AMAZON_OPENSEARCH_ENDPOINT` 的新环境变量。此变量的值应为 OpenSearch 端点的根域。您可以通过从 OpenSearch 服务控制台列出的域端点中移除 `https://` 和 `<region>.es.amazonaws.com` 来获取此根域。例如，如果您的域端点是 `https://sample-domain.us-east-1.es.amazonaws.com`，则根域为 `sample-domain`。

**更新数据来源**
+ 您可以通过以下步骤手动更新数据来源：
  + 要更新 OpenSearch Service 域，请更新数据来源连接器 Lambda 函数的 `AMAZON_OPENSEARCH_DOMAIN_NAME` 环境变量。
  + 要更新 VPC 配置，请参阅[配置 VPC 访问（控制台）](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-configuring)了解更多信息。

**查询数据来源**
+ 查询 OpenSearch Service 时，在**多来源查询**选项卡中选择数据来源后，请执行以下操作：
  + 选择要查询的索引。
  + 选择指标名称（文档中的任何数值字段）和统计数据。
  + 选择时间轴（文档中的任何日期字段）。
  + 选择要应用的筛选条件（文档中的任意字符串字段）。
  + 选择**图表查询**。

## Amazon RDS for PostgreSQL 和 Amazon RDS for MySQL
<a name="MultiDataSources-Amazon_RDS_PostGre_SQL"></a>

**创建数据来源**
+ 如果数据来源只能在 VPC 中访问，则连接器必须包含 VPC 配置，如 [通过向导连接到预构建数据来源](#CloudWatch_MultiDataSources-Connect) 中所述。如果数据来源要连接到 VPC 以获取凭证，则必须在 VPC 中配置端点。有关更多信息，请参阅[使用 AWS Secrets Manager VPC 端点](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)。

  此外，您必须为 Amazon RDS 服务创建 VPC 端点。有关更多信息，请参阅 [Amazon RDS API 和接口 VPC 端点（AWS PrivateLink）](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/vpc-interface-endpoints.html)。

**更新数据来源**
+ 您可以通过以下步骤手动更新数据来源：
  + 要更新数据库实例，请更新数据来源连接器 Lambda 函数的 `RDS_INSTANCE` 环境变量。
  + 要更新用于连接 Amazon RDS 的用户名和密码，请使用 AWS Secrets Manager。您可以在数据来源 Lambda 函数的 `RDS_SECRET` 环境变量中找到用于数据来源的密钥的 ARN。有关更新 AWS Secrets Manager 中的密钥的更多信息，请参阅[修改 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_update-secret.html)。
  + 要更新 VPC 配置，请参阅[配置 VPC 访问（控制台）](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-configuring)了解更多信息。

**查询数据来源**
+ 查询 Amazon RDS 时，在**多来源查询**选项卡中选择数据来源并选择 Amazon RDS 连接器后，即可使用数据库发现器查看可用的数据库、表和列。您还可以使用 SQL 编辑器创建 SQL 查询。

  您可以在查询中使用以下变量：
  + `$start.iso`：ISO 日期格式的开始时间
  + `$end.iso`：ISO 日期格式的结束时间
  + `$period`：选定时段（以秒为单位）

  例如，您可以查询 `SELECT value, timestamp FROM table WHERE timestamp BETWEEN $start.iso and $end.iso`
+ CloudWatch 数据来源连接器不支持多行查询。执行查询，或者使用查询创建警报或控制面板小组件时，每个换行符都会替换为空格。在某些情况下，这可能会导致查询无效。例如，如果您的查询包含单行注释，则该查询无效。如果您尝试利用命令行或基础设施即代码中的多行查询来创建控制面板或警报，API 将拒绝该操作，并显示解析错误。

**注意**  
如果在结果中找不到日期字段，则将每个数值字段的值相加为单个值，并绘制在所提供的时间范围内。如果时间戳与 CloudWatch 中的选定时段不一致，则系统会使用 `SUM` 自动聚合数据，并且数据将与 CloudWatch 中的时段保持一致。

## Amazon S3 CSV 文件
<a name="MultiDataSources-Amazon_S3_CSV"></a>

**查询数据来源**
+ 查询 Amazon S3 CSV 文件时，在**多来源查询**选项卡中选择数据来源并选择 Amazon S3 连接器后，即可选择 Amazon S3 存储桶和键。

  CSV 文件必须通过以下方式格式化：
  + 时间戳必须位于第一列。
  + 该表必须有标题行。标题用于命名您的指标。时间戳列的标题将被忽略，仅使用指标列的标题。
  + 时间戳必须采用 ISO 日期格式。
  + 指标必须是数值字段。

  ```
  Timestamp, Metric-1, Metric-2, ...
  ```

  以下是示例：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/CloudWatch_MultiDataSources-Connect.html)

**注意**  
如果未提供时间戳，系统会将每个指标的值相加为单个值，并在所提供的时间范围内绘制。如果时间戳与 CloudWatch 中的选定时段不一致，则系统会使用 `SUM` 自动聚合数据，并且数据将与 CloudWatch 中的时段保持一致。

## Microsoft Azure Monitor
<a name="MultiDataSources-Azure_Monitor"></a>

**创建数据来源**
+ 您必须提供租户 ID、客户端 ID 和客户端密钥才能连接到 Microsoft Azure Monitor。凭证将存储于 AWS Secrets Manager 内。有关更多信息，请参阅 Microsoft 文档中的 [Create a Microsoft Entra application and service principal that can access resources](https://learn.microsoft.com/en-us/entra/identity-platform/howto-create-service-principal-portal)。

**更新数据来源**
+ 您可以通过以下步骤手动更新数据来源：
  + 要更新用于连接到 Azure Monitor 的租户 ID、客户端 ID 和客户端密钥，可以在数据来源 Lambda 函数上找到用于数据来源且作为 `AZURE_CLIENT_SECRET` 环境变量的密钥 ARN。有关更新 AWS Secrets Manager 中的密钥的更多信息，请参阅[修改 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_update-secret.html)。

**查询数据来源**
+ 查询 Azure Monitor 时，在**多来源查询**选项卡中选择数据来源并选择 Azure Monitor 连接器后，即可指定 Azure 订阅以及资源组和资源。然后，您可以选择指标命名空间、指标和聚合，并按维度进行筛选。

## Prometheus
<a name="MultiDataSources-Prometheus"></a>

**创建数据来源**
+ 您必须提供 Prometheus 端点以及查询 Prometheus 所需的用户名和密码。凭证将存储于 AWS Secrets Manager 内。
+ 如果数据来源只能在 VPC 中访问，则连接器必须包含 VPC 配置，如 [通过向导连接到预构建数据来源](#CloudWatch_MultiDataSources-Connect) 中所述。如果数据来源要连接到 VPC 以获取凭证，则必须在 VPC 中配置端点。有关更多信息，请参阅[使用 AWS Secrets Manager VPC 端点](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)。

**更新数据来源配置**
+ 您可以通过以下步骤手动更新数据来源：
  + 要更新 Prometheus 端点，请将新的端点指定为数据来源 Lambda 函数上的 `PROMETHEUS_API_ENDPOINT` 环境变量。
  + 要更新用于连接到 Prometheus 的用户名和密码，可以在数据来源 Lambda 函数上找到作为 `PROMETHEUS_API_SECRET` 环境变量用于数据来源的密钥的 ARN。有关更新 AWS Secrets Manager 中的密钥的更多信息，请参阅[修改 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_update-secret.html)。
  + 要更新 VPC 配置，请参阅[配置 VPC 访问（控制台）](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-configuring)了解更多信息。

**查询数据来源**

**重要**  
Prometheus 指标类型与 CloudWatch 指标不同，Prometheus 提供的许多指标都是特意累积的。当您查询 Prometheus 指标时，CloudWatch 不会对数据进行任何其他转换：如果您仅指定指标名称或标签，则将显示累积的值。有关更多信息，请参阅 Prometheus 文档中的[指标类型](https://prometheus.io/docs/concepts/metric_types/)。  
要将 Prometheus 指标（例如 CloudWatch 指标）数据视为离散值，则需要在运行查询之前对其进行编辑。例如，您可能需要向 Prometheus 指标名称添加对比率函数的调用。有关比率函数和其他 Prometheus 函数的文档，请参阅 Prometheus 文档中的 [rate()](https://prometheus.io/docs/prometheus/latest/querying/functions/#rate)。

CloudWatch 数据来源连接器不支持多行查询。执行查询，或者使用查询创建警报或控制面板小组件时，每个换行符都会替换为空格。在某些情况下，这可能会导致查询无效。例如，如果您的查询包含单行注释，则该查询无效。如果您尝试利用命令行或基础设施即代码中的多行查询来创建控制面板或警报，API 将拒绝该操作，并显示解析错误。

## 可用更新的通知
<a name="CloudWatch_MultiDataSources-Future-Updates"></a>

Amazon 可能会不时通知您，推荐您将连接器更新为较新的可用版本，并为您提供操作说明。

# 创建自定义数据来源连接器。
<a name="CloudWatch_MultiDataSources-Connect-Custom"></a>

 本主题介绍如何将自定义数据来源连接到 CloudWatch。您可以通过两种方式将自定义数据来源连接到 CloudWatch：
+  使用 CloudWatch 提供的示例模板。使用该模板时，您可以使用 JavaScript 或 Python。这些模板包含示例 Lambda 代码，这些代码将有助于您创建 Lambda 函数。然后，您可以修改模板中的 Lambda 函数，以便连接到自定义数据来源。
+  从头开始创建 AWS Lambda 函数，用于实现数据来源连接器、数据查询以及准备供 CloudWatch 使用的时间序列。此函数必须预聚合或合并数据点（如果需要），还必须调整周期和时间戳以与 CloudWatch 兼容。

**Contents**
+ [使用模板](#CloudWatch_MultiDataSources-Connect-Custom-template)
+ [从头开始创建自定义数据来源](#CloudWatch_MultiDataSources-Connect-Custom-Lambda)
  + [步骤 1：创建函数](#MultiDataSources-Connect-Custom-Lambda-Function)
    + [GetMetricData 事件](#MultiDataSources-GetMetricData)
    + [DescribeGetMetricData 事件](#MultiDataSources-DescribeGetMetricData)
    + [CloudWatch 警报的重要注意事项](#MultiDataSources-Connect-Custom-Lambda-Alarms)
    + [（可选）使用 AWS Secrets Manager 存储凭证](#MultiDataSources-Connect-Custom-Lambda-Secrets)
    + [（可选）连接到 VPC 中的数据来源](#MultiDataSources-Connect-Custom-Lambda-VPC)
  + [步骤 2：创建 Lambda 权限策略](#MultiDataSources-Connect-Custom-Lambda-Permissions)
  + [步骤 3：将资源标签附加到 Lambda 函数](#MultiDataSources-Connect-Custom-Lambda-tags)

## 使用模板
<a name="CloudWatch_MultiDataSources-Connect-Custom-template"></a>

使用模板可以创建示例 Lambda 函数，并帮助您更快地构建自定义连接器。这些示例函数提供了示例代码，可用于涉及构建自定义连接器的许多常见场景。在使用模板创建连接器后，您可以检查 Lambda 代码，然后对其进行修改以用于连接数据来源。

此外，如果使用该模板，CloudWatch 会负责创建 Lambda 权限策略并将资源标签附加到 Lambda 函数。

**使用模板创建连接到自定义数据来源的连接器**

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

1. 在导航窗格中，选择**设置**。

1. 选择**指标数据来源**选项卡。

1. 选择**创建数据来源**。

1. 选择**自定义 - 入门模板**单选按钮，然后选择**下一步**。

1. 输入数据来源的名称。

1. 从列出的模板中选择一个。

1. 选择 Node.js 或 Python。

1. 选择**创建数据来源**。

   CloudFormation 堆栈完成创建自定义来源之后，您刚刚添加的新自定义来源才会出现。要查看进度，可以选择**查看我的 CloudFormation 堆栈的状态**。您也可以使用刷新图标来更新此列表。

   新数据来源出现在此列表中时，您就可以在控制台中对其进行测试和修改。

1. （可选）要在控制台中查询来自该来源的测试数据，请按照 [创建源自另一个数据来源的指标图表](graph_a_metric.md#create-metric-graph-multidatasource) 中的说明进行操作。

1. 按需修改 Lambda 函数。

   1. 在导航窗格中，选择**设置**。

   1. 选择**指标数据来源**选项卡。

   1. 针对要修改的来源，选择**在 Lambda 控制台中查看**。

   您现在可以修改函数以访问数据来源。有关更多信息，请参阅 [步骤 1：创建函数](#MultiDataSources-Connect-Custom-Lambda-Function)。
**注意**  
通过使用该模板，您在编写 Lambda 函数时，无需按照 [步骤 2：创建 Lambda 权限策略](#MultiDataSources-Connect-Custom-Lambda-Permissions) 或 [步骤 3：将资源标签附加到 Lambda 函数](#MultiDataSources-Connect-Custom-Lambda-tags) 中的说明进行操作。CloudWatch 会执行这些步骤，因为您使用了该模板。

## 从头开始创建自定义数据来源
<a name="CloudWatch_MultiDataSources-Connect-Custom-Lambda"></a>

按照本节中的步骤创建 Lambda 函数，该函数会将 CloudWatch 连接到数据来源。

### 步骤 1：创建函数
<a name="MultiDataSources-Connect-Custom-Lambda-Function"></a>

自定义数据来源连接器必须支持来自 CloudWatch 的 `GetMetricData` 事件。您也可以实施 `DescribeGetMetricData` 活动，以便在 CloudWatch 控制台中向用户提供有关如何使用连接器的文档。`DescribeGetMetricData` 响应还可用于设置 CloudWatch 自定义查询构建器中使用的默认值。

CloudWatch 提供了代码段示例，以帮助您开始使用。有关更多信息，请参阅 [https://github.com/aws-samples/cloudwatch-data-source-samples](https://github.com/aws-samples/cloudwatch-data-source-samples) 上的示例存储库。

**约束**
+ 来自 Lambda 的响应必须小于 6 Mb。如果响应超过 6 Mb，则 `GetMetricData` 响应会将 Lambda 函数标记为 `InternalError`，并且不会返回任何数据。
+ 如果是用于可视化和控制面板管理，则 Lambda 函数必须在 10 秒内完成执行；如果是用于警报，则 Lambda 函数必须在 4.5 秒内完成执行。如果执行超时，则 `GetMetricData` 响应会将 Lambda 函数标记为 `InternalError`，并且不会返回任何数据。
+ Lambda 函数必须使用以秒为单位的纪元时间戳发送其输出。
+ 如果 Lambda 函数不对数据进行重采样，而是返回与 CloudWatch 用户请求的开始时间和时段长度不一致的数据，则 CloudWatch 将忽略该数据。任何可视化或警报中都将丢弃多余的数据。未介于开始时间和结束时间之间的任何数据也将被丢弃。

  例如，如果用户要求提供 10:00 到 11:00 之间的数据，周期为 5 分钟，则“10:00:00 至 10:04:59”和“10:05:00 至 10:09:59”为返回数据的有效时间范围。必须返回包含 `10:00 value1`、`10:05 value2` 等的时间序列。例如，如果函数返回 `10:03 valueX`，则会被丢弃，因为 10:03 与请求的开始时间和周期不对应。
+ CloudWatch 数据来源连接器不支持多行查询。执行查询，或者使用查询创建警报或控制面板小组件时，每个换行符都会替换为空格。在某些情况下，这可能会导致查询无效。

#### GetMetricData 事件
<a name="MultiDataSources-GetMetricData"></a>

**请求负载**

以下是作为输入发送到 Lambda 函数的 `GetMetricData` 请求负载示例。

```
{
  "EventType": "GetMetricData",
  "GetMetricDataRequest": {
    "StartTime": 1697060700,
    "EndTime": 1697061600,
    "Period": 300,
    "Arguments": ["serviceregistry_external_http_requests{host_cluster!=\"prod\"}"] 
  }
}
```
+ **StartTime**：指定最早返回的数据的时间戳。**类型**为时间戳纪元秒。
+ **EndTime**：指定最新返回的数据的时间戳。**类型**为时间戳纪元秒。
+ **Period**：每个指标数据聚合所代表的秒数。最短时间为 60 秒。**类型**为秒。
+ **Arguments**：要传递给 Lambda 指标数学表达式的参数数组。有关传递参数的更多信息，请参阅 [如何将参数传递给您的 Lambda 函数](CloudWatch_MultiDataSources-Custom-Use.md#MultiDataSources-Connect-Custom-Lambda-arguments)。

**响应负载**

以下是 Lambda 函数返回的 `GetMetricData` 响应负载的示例。

```
{
   "MetricDataResults": [
      {
         "StatusCode": "Complete",
         "Label": "CPUUtilization",
         "Timestamps": [ 1697060700, 1697061000, 1697061300 ],
         "Values": [ 15000, 14000, 16000 ]
      }
   ]
}
```

该响应负载将包含 `MetricDataResults` 字段或 `Error` 字段，但无法同时包含二者。

`MetricDataResults` 字段是 `MetricDataResult` 类型的时间序列字段列表。每个时间序列字段可包括以下字段。
+ **StatusCode**：（可选）`Complete` 表示已返回请求时间范围内的所有数据点。`PartialData` 表示返回的数据点不完整。如果省略，则使用默认值 `Complete`。

  有效值: `Complete` \$1 `InternalError` \$1 `PartialData` \$1 `Forbidden`
+ **Messages**：可选的消息列表，其中包含所返回的数据的其他相关信息。

  类型：包含 `Code` 和 `Value` 字符串的 [MessageData](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MessageData.html) 对象数组。
+ **Label**：与数据关联的人类可读标签。

  类型：字符串
+ **Timestamps**：数据点的时间戳，格式为纪元时间。时间戳的数量始终与值的数量相匹配，`Timestamps[x]` 的值为 `Values[x`]。

  类型：时间戳数组
+ **Values**：与 `Timestamps` 对应的指标数据点值。值的数量始终与时间戳的数量相匹配，`Timestamps[x]` 的值为 `Values[x`]。

  类型：双倍数组

有关 `Error` 对象的更多信息，请参阅以下部分。

**错误响应格式**

您可以选择使用错误响应来提供有关错误的更多信息。当发生验证错误时（例如缺少参数或参数类型错误），我们建议您使用代码验证返回错误。

以下是 Lambda 函数要引发 `GetMetricData` 验证异常时的响应示例。

```
{
   "Error": {
      "Code": "Validation",
      "Value": "Invalid Prometheus cluster"
   }
}
```

以下是 Lambda 函数表示由于访问问题而无法返回数据时的响应示例。响应被转换为单个时间序列，其状态代码为 `Forbidden`。

```
{
   "Error": {
      "Code": "Forbidden",
      "Value": "Unable to access ..."
   }
}
```

以下是 Lambda 函数引发整体 `InternalError` 异常的示例，该异常被转换为单个时间序列，其状态代码为 `InternalError` 并具有一条消息。只要错误代码的值不是 `Validation` 或 `Forbidden`，CloudWatch 都会认为这属于常规内部错误。

```
{
   "Error": {
      "Code": "PrometheusClusterUnreachable",
      "Value": "Unable to communicate with the cluster"
   }
}
```

#### DescribeGetMetricData 事件
<a name="MultiDataSources-DescribeGetMetricData"></a>

**请求负载**

以下是 `DescribeGetMetricData` 请求负载的示例。

```
{
  "EventType": "DescribeGetMetricData"
}
```

**响应负载**

以下是 `DescribeGetMetricData` 响应负载的示例。

```
{
    "Description": "Data source connector",
    "ArgumentDefaults": [{
        Value: "default value"
     }]
}
```
+ **Description**：关于如何使用数据来源连接器的描述。此描述将显示在 CloudWatch 控制台中。支持 Markdown。

  类型：字符串
+ **ArgumentDefaults**：预填充自定义数据来源构建器时使用的参数默认值的可选数组。

  如果返回 `[{ Value: "default value 1"}, { Value: 10}]`，则 CloudWatch 控制台中的查询构建器会显示两个输入，第一个是“default value 1”，第二个是“10”。

  如果未提供 `ArgumentDefaults`，则显示默认类型为 `String` 的一个输入。

  类型：包含值和类型的对象数组。
+ **Error**：（可选）错误字段可包含在任何响应中。您可以在 [GetMetricData 事件](#MultiDataSources-GetMetricData) 中查看示例。

#### CloudWatch 警报的重要注意事项
<a name="MultiDataSources-Connect-Custom-Lambda-Alarms"></a>

 如果要使用数据来源来设置 CloudWatch 警报，则应将其设置为每分钟向 CloudWatch 报告带有时间戳的数据。有关为源自已连接的数据来源的指标创建警报的更多信息和其他注意事项，请参阅 [基于连接的数据来源创建警报](Create_MultiSource_Alarm.md)。

#### （可选）使用 AWS Secrets Manager 存储凭证
<a name="MultiDataSources-Connect-Custom-Lambda-Secrets"></a>

如果您的 Lambda 函数需要使用凭证来访问数据来源，我们建议使用 AWS Secrets Manager 来存储这些凭证，而不是将其硬编码到您的 Lambda 函数中。有关结合使用 AWS Secrets Manager 和 Lambda 函数的更多信息，请参阅[在 AWS Lambda 函数中使用 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_lambda.html)。

#### （可选）连接到 VPC 中的数据来源
<a name="MultiDataSources-Connect-Custom-Lambda-VPC"></a>

如果数据来源位于由 Amazon Virtual Private Cloud 管理的 VPC 中，则必须配置您的 Lambda 函数才能对其进行访问。有关更多信息，请参阅[将出站联网连接到 VPC 中的资源](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html)。

您可能还需要配置 VPC 服务端点才能访问 AWS Secrets Manager 等服务。有关更多信息，请参阅[使用接口 VPC 端点访问 AWS 服务](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#access-service-though-endpoint)。

### 步骤 2：创建 Lambda 权限策略
<a name="MultiDataSources-Connect-Custom-Lambda-Permissions"></a>

您必须创建策略语句，授予 CloudWatch 使用您创建的 Lambda 函数的权限。您可以使用 AWS CLI 或 Lambda 控制台创建该策略语句。

**使用 AWS CLI 创建策略语句**
+ 输入如下命令。将 *123456789012* 替换为您的账户 ID，将 *my-data-source-function* 替换为您的 Lambda 函数的名称，然后将 *MyDataSource-DataSourcePermission1234* 替换为任意唯一值。

  ```
  aws lambda add-permission --function-name my-data-source-function --statement-id MyDataSource-DataSourcePermission1234 --action lambda:InvokeFunction --principal lambda.datasource.cloudwatch.amazonaws.com --source-account 123456789012
  ```

### 步骤 3：将资源标签附加到 Lambda 函数
<a name="MultiDataSources-Connect-Custom-Lambda-tags"></a>

CloudWatch 控制台通过使用标签来确定哪些 Lambda 函数是数据来源连接器。使用其中一个向导创建数据来源时，配置该标签的 CloudFormation 堆栈会自动应用该标签。当您自己创建数据来源时，可以将以下标签用于您的 Lambda 函数。这样一来，当您查询指标时，您的连接器就会显示在 CloudWatch 控制台的**数据来源**下拉列表中。
+ 具有键 `cloudwatch:datasource` 和值 `custom` 的标签。

# 使用您的自定义数据来源
<a name="CloudWatch_MultiDataSources-Custom-Use"></a>

 创建数据来源后，您可以使用它查询和可视化来自该来源的数据，以及设置警报。如果您使用模板创建了自定义数据来源连接器，或者添加了 [步骤 3：将资源标签附加到 Lambda 函数](CloudWatch_MultiDataSources-Connect-Custom.md#MultiDataSources-Connect-Custom-Lambda-tags) 中列出的标签，则可以按照 [创建源自另一个数据来源的指标图表](graph_a_metric.md#create-metric-graph-multidatasource) 中的步骤进行查询。您也可以使用指标数学函数 `LAMBDA` 对其进行查询，如下节所述。有关对数据来源的指标创建警报的更多信息，请参阅 [基于连接的数据来源创建警报](Create_MultiSource_Alarm.md)。本主题介绍如何将 Lambda 函数的参数传递给自定义数据来源。

## 如何将参数传递给您的 Lambda 函数
<a name="MultiDataSources-Connect-Custom-Lambda-arguments"></a>

要向自定义数据来源传递参数，建议您在查询数据来源时使用 CloudWatch 控制台中的查询构建器。

您还可以通过使用 CloudWatch 指标数学中的新 `LAMBDA` 表达式，来使用 Lambda 函数检索数据来源中的数据。

```
LAMBDA("LambdaFunctionName" [, optional-arg]*)
```

`optional-arg` 最多有 20 个字符串、数字或布尔值。例如，`param`、`3.14` 或 `true`。

**注意**  
CloudWatch 数据来源连接器不支持多行字符串。执行查询，或者使用查询创建警报或控制面板小组件时，每个换行符都会替换为空格。在某些情况下，这可能会导致查询无效。

使用 `LAMBDA` 指标数学函数时，可以提供函数名称 (`"MyFunction"`)。在资源策略允许的情况下，您还可以使用特定版本的函数 (`"MyFunction:22"`) 或使用 Lambda 函数别名 (`"MyFunction:MyAlias"`)。您无法使用 `*`

以下是调用 `LAMBDA` 函数的一些示例。

```
LAMBDA("AmazonOpenSearchDataSource", "MyDomain", "some-query")
```

```
LAMBDA("MyCustomDataSource", true, "fuzzy", 99.9)
```

`LAMBDA` 指标数学函数会返回一个时间序列列表，该列表可以返回到请求者或与其他指标数学函数结合使用。以下是 `LAMBDA` 与其他指标数学函数结合使用的示例。

```
FILL(LAMBDA("AmazonOpenSearchDataSource", "MyDomain", "some-query"), 0)
```

# 删除数据来源连接器
<a name="CloudWatch_MultiDataSources-Delete"></a>

 本节中的说明介绍了如何删除数据来源的连接器。

**删除数据来源连接器**

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

1. 在导航窗格中，选择**设置**。

1. 选择**指标数据来源**选项卡。

1. 在要删除的数据来源的行中，选择**在 CloudFormation 中管理**。

   您会进入 CloudFormation 控制台。

1. 在带有数据来源名称的部分中，选择**删除**。

1. 在确认弹出窗口中，选择**删除**。