使用 Prometheus CloudWatch 导出器收集 AWS CloudWatch 指标

本文档介绍了如何使用开源 Prometheus CloudWatch 导出器和在 Compute Engine 实例上运行的 Ops Agent 来收集 AWS CloudWatch 指标并将其存储在 Google Cloud 项目中。本文档面向以下受众:

  • 需要收集 AWS CloudWatch 指标的开发者和系统管理员。本文档介绍了如何设置 Prometheus CloudWatch 导出器以收集 AWS CloudWatch 指标。
  • 将 AWS CloudWatch 指标与 AWS Connector 项目迁移到 Prometheus CloudWatch 导出器的用户。本文档还包含如何迁移以收集 Connector 项目中的旧版 AWS CloudWatch 指标。

借助 Cloud Monitoring,您可以在与 Google Cloud 指标相同的上下文中查看 AWS 指标。例如,您可以创建一个信息中心,其中包含显示 Amazon EC2 实例和 Compute Engine 实例的 CPU 利用率的图表。您还可以创建提醒政策来监控您的 AWS 指标。如需了解详情,请参阅以下部分:

准备工作

如需使用 Prometheus CloudWatch 导出器收集 AWS CloudWatch 指标,您需要符合以下条件:

  • 一个有权执行以下操作的 Google Cloud 项目:
    • 创建虚拟机
    • 将日志写入 Cloud Logging
    • 将指标写入 Cloud Monitoring
  • 具有 AWS 凭据的 AWS 帐号,Prometheus 导出器可以使用该凭据来获取指标。如需了解详情,请参阅运行 Prometheus 导出器

创建 Compute Engine 虚拟机

我们建议您创建一个专门用于运行 Ops Agent 和 Prometheus CloudWatch 导出器的 Linux Compute Engine 虚拟机。此虚拟机充当所有 AWS 指标的收集点。

  1. 如需在您指定的可用区中创建名为 aws-exporter-test 的 Debian Linux 虚拟机,请运行以下命令:

    gcloud compute instances create \
      --image-project debian-cloud \
      --image-family debian-11 \
      --zone ZONE \
      aws-exporter-test
    

    按如下方式配置命令:

    • ZONE 替换为新虚拟机所在的可用区
    • 可选。将 aws-exporter-test 替换为您的虚拟机名称。

    如需详细了解此命令,请查看 gcloud compute instances create 参考

  2. 如需访问您的虚拟机以便安装 Prometheus CloudWatch 导出器和 Ops Agent,您可以使用以下命令:

    gcloud compute ssh --zone ZONE  --project PROJECT_ID  aws-exporter-test
    

    按如下方式配置命令:

    • ZONE 替换为您在其中创建虚拟机的可用区
    • PROJECT_ID 替换为您的 Google Cloud 项目的 ID
    • 如果您用其他名称创建了虚拟机,请替换 aws-exporter-test

    如需详细了解此命令,请查看 gcloud compute ssh 参考

设置 Prometheus CloudWatch 导出器

以下各部分介绍了在 Compute Engine 虚拟机上下载、安装和配置 Prometheus CloudWatch 导出器的过程。

下载 Prometheus 导出器和 JRE

如需运行 Prometheus CloudWatch 导出器,您需要下载该导出器和 Java 运行时环境 (JRE)(版本 11 或更高版本)。

  1. 如需下载包含 Prometheus CloudWatch 导出器的 JAR 文件,请在 Compute Engine 实例上运行以下命令:

    curl -sSO https://github.com/prometheus/cloudwatch_exporter/releases/download/v0.15.1/cloudwatch_exporter-0.15.1-jar-with-dependencies.jar
    
  2. 如需安装 JRE,您可以使用如下命令:

    sudo apt install default-jre
    

配置 Prometheus 导出器

如需配置 Prometheus CloudWatch 导出器,您需要为要从中收集指标的 AWS 服务创建配置文件。如需了解一般信息,请参阅 Prometheus CloudWatch 导出器配置文档

  • 迁移用户:如果要将现有 AWS CloudWatch 指标迁移到 Prometheus CloudWatch 导出器,则可以使用用于迁移的 Prometheus CloudWatch 导出器配置中的配置文件。这些配置文件旨在尽可能接近地复制现有指标,但不会收集使用适用于 AWS 服务的 Prometheus CloudWatch 导出器的所有可用指标。

  • 新用户:如果您不迁移现有指标,我们建议您不要使用迁移配置。如需了解如何为其他服务定义导出器配置,请参阅 AWS CloudWatch 服务文档。您还可以在 Prometheus CloudWatch 导出器 GitHub 代码库中找到其他示例。

您可以将多项 AWS 服务的配置合并到一个配置文件中。本文档中的示例假定您的配置文件名为 config.yml

运行 Prometheus 导出器

您必须先为导出器提供凭据和授权,然后才能运行 Prometheus CloudWatch 导出器。Prometheus CloudWatch 导出器使用 AWS Java SDK,该 SDK 提供了使用以下环境变量提供凭据的方法:

  • AWS_ACCESS_KEY
  • AWS_SECRET_ACCESS_KEY
  • AWS_SESSION_TOKEN(如果您使用的是临时凭据

如需详细了解如何向 SDK 提供凭据,请参阅 Java 版 AWS SDK 2.x

您还必须有权使用 CloudWatch API 检索指标,并且需要以下 AWS IAM CloudWatch 权限

  • cloudwatch:ListMetrics
  • cloudwatch:GetMetricStatistics
  • cloudwatch:GetMetricData

使用 aws_tag_select 功能还需要 tag:GetResources AWS IAM 权限。

如需详细了解如何授权访问 AWS 服务,请参阅 AWS Identity and Access Management

如需运行 Prometheus CloudWatch 导出器,请执行以下操作:

  1. 如需为导出器提供凭据,请设置访问密钥环境变量:

    export AWS_ACCESS_KEY=YOUR_ACCESS_KEY
    export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY
    export AWS_SESSION_TOKEN=YOUR_SESSION_TOKEN
    

    YOUR_KEY 变量替换为您的访问密钥。 仅当您使用临时凭据时,才需要设置 AWS_SESSION_TOKEN 环境变量。

  2. 如需测试配置,请启动导出器并加载配置文件,请运行以下命令:

    java -jar cloudwatch_exporter-0.15.1-jar-with-dependencies.jar 9106 config.yml
    

    根据需要更改端口 (9106) 和配置文件 (config.yml) 值。

    如果您在导出器运行时修改了 config.yml 文件,则可以通过运行以下命令重新加载导出器:

    curl -X POST localhost:9106/-/reload
    

    为了在生产环境中使用,您可以将导出器配置为在虚拟机重启时重启。例如,在 Debian 系统上,您可以使用系统和服务管理器 systemd

设置 Ops Agent

以下部分介绍了如何安装和启动 Ops Agent。这些部分提供了与 Prometheus CloudWatch 导出器搭配使用的 Ops Agent 的最低设置信息。如需详细了解这些主题,请参阅 Ops Agent 概览

安装 Ops Agent

如需安装 Ops Agent,请使用以下命令下载并运行代理的安装脚本:

curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
sudo bash add-google-cloud-ops-agent-repo.sh --also-install

配置 Ops Agent

如需配置 Ops Agent,请将配置元素添加到代理的用户配置文件中。在 Linux 上,用户配置文件为 /etc/google-cloud-ops-agent/config.yaml

将 Ops Agent 配置为从 Prometheus CloudWatch 导出器收集 AWS 指标时,您需要使用该代理的 Prometheus 接收器。本文档介绍了 Ops Agent 的两种基本配置。选择其中一个配置并将其添加到用户配置文件中:

sudo vim /etc/google-cloud-ops-agent/config.yaml

Ops Agent 的基本配置

以下配置为 Ops Agent 提供最低配置。此配置会执行以下操作:

  • 创建名为 aws 且类型为 prometheus 的接收器。接收器配置为从 aws_exporter 作业抓取指标。指定的端口必须与 Prometheus CloudWatch 导出器导出指标的端口相匹配;请参阅运行 Prometheus 导出器

  • 创建一个名为 aws_pipeline 的流水线,该流水线使用 aws 指标接收器。

metrics:
  receivers:
    aws:
      type: prometheus
      config:
        scrape_configs:
          - job_name: 'aws_exporter'
            scrape_interval: 10s
            static_configs:
              - targets: ['localhost:9106']
  service:
    pipelines:
      aws_pipeline:
        receivers:
          - aws

丢弃 JVM 指标的配置

以下配置会执行基本配置的所有操作,但它还添加了一个重新添加标签配置,该配置会删除导出器生成的 JVM 指标。删除这些指标会减少提取的指标数据,但可能会使导出器的问题更难以调试,因为您无法获取导出器自己的指标:

metrics:
  receivers:
    aws:
      type: prometheus
      config:
        scrape_configs:
          - job_name: 'aws_exporter'
            scrape_interval: 10s
            static_configs:
              - targets: ['localhost:9106']
            # Drop the exporter's own JVM metrics to reduce noise.
            metric_relabel_configs:
              - source_labels: [ __name__ ]
                regex: 'jvm_.*'
                action: drop
  service:
    pipelines:
      aws_pipeline:
        receivers:
          - aws

您可以为 Ops Agent 创建更复杂的配置。

重启 Ops Agent

如需将配置更改应用于 Ops Agent,您必须重启代理。

  1. 要重启代理,请在您的实例上运行以下命令:
    sudo service google-cloud-ops-agent restart
    
  2. 如需确认代理已重启,请运行以下命令并验证“Metrics Agent”和“Logging Agent”组件是否已启动:
    sudo systemctl status google-cloud-ops-agent"*"
    

在 Cloud Monitoring 中查看指标

在 Cloud Monitoring 中,您可以查询 AWS CloudWatch 指标,并创建图表,就像为任何其他指标创建图表一样。在 Metrics Explorer 界面中,您可以使用 PromQL、Monitoring Query Language (MQL) 或查询构建器界面。如需了解详情,请参阅使用 Metrics Explorer 创建图表

如果您已创建想要保留的图表,则可以将其保存到自定义信息中心。如需了解详情,请参阅信息中心概览

下图显示了针对 AWS 虚拟机的 aws_ec2_cpuutilization_sum 指标的 PromQL 查询:

该图表显示了使用 PromQL 提取 AWS 虚拟机的 aws_ec2_cpuutilization_sum 统计信息的结果。

您可以使用 PromQL 查询 Cloud Monitoring 中的任何指标。如需了解详情,请参阅将 Cloud Monitoring 指标映射到 PromQL

您可以使用 PromQL 或使用 Monitoring Query Language (MQL) 等 Cloud Monitoring 工具查询 Prometheus 指标。将 Prometheus 指标注入 Cloud Monitoring 后,每个指标都会使用标准的 OpenTelemetry 到 Prometheus 转换进行转换,并映射到 Cloud Monitoring prometheus_target 监控资源类型。该转换包含以下更改:

  • 指标名称的前缀为字符串 prometheus.googleapis.com/
  • 指标名称中的所有非字母数字字符(例如英文句点 (.))都会被替换为下划线 (_)。
  • 指标名称的后面部分会附加一个表示指标种类的字符串,例如 /gauge/counter

如需使用 MQL 查询 Prometheus aws_ec2_cpuutilization_sum 指标,请将指标指定为 prometheus.googleapis.com/aws_ec2_cpuutilization_sum/gauge,并指定 prometheus_target 受监控的资源类型:

fetch prometheus_target :: 'prometheus.googleapis.com/aws_ec2_cpuutilization_sum/gauge'

以下图表显示了针对 Prometheus aws_ec2_cpuutilization_sum 指标的 MQL 查询结果:

该图表显示了使用 MQL 提取 AWS 虚拟机的 aws_ec2_cpuutilization_sum 统计信息的结果。

针对指标行为发出提醒

在 Cloud Monitoring 中,您可以创建 [提醒政策][alert-intro] 来监控您的 AWS CloudWatch 指标并通知您指标值的高峰、低谷或趋势。

监控多个区域

Prometheus CloudWatch 导出器的配置仅支持每个配置文件使用一个区域。如果您需要监控多个区域,我们建议您运行多个 Prometheus 导出器实例,为要监控的每个区域配置一个实例。您可以在单个虚拟机上运行多个导出器,也可以分布在多个虚拟机上。在这种情况下,Prometheus 导出器 Docker 映像可能会很有用。

您可以将在 Compute Engine 虚拟机上运行的 Ops Agent 配置为爬取多个 Prometheus 端点。我们建议您在配置 Prometheus 导出器的多个实例时为每个实例使用不同的 job 名称抓取配置,以便在需要对导出器实例进行问题排查时可以区分它们。

如需了解如何配置 Ops Agent 和 Prometheus 接收器,请参阅配置 Ops Agent

费用

Amazon 按每个 CloudWatch API 请求或您请求的每个 CloudWatch 指标收费;如需了解当前价格,请参阅 Amazon CloudWatch 价格。Prometheus CloudWatch 导出器具有以下查询特征,这可能会影响您的 Amazon 费用:

  • 使用 GetMetricStatistics 方法(默认)时,每个指标都需要一个 API 请求。每个请求可包含多个统计信息。
  • 使用 aws_dimensions 时,导出器必须执行 API 请求以确定要请求的指标。与指标请求的数量相比,维度请求的数量通常可以忽略不计。

Cloud Monitoring 按提取的样本数量对来自 Prometheus 导出器的 AWS CloudWatch 指标收费。如需了解当前价格,请参阅 Monitoring 价格摘要

迁移指南

对于从使用 AWS 连接器项目的旧版 AWS CloudWatch 指标迁移到 Prometheus CloudWatch 导出器解决方案的客户,本部分提供了更多信息。

如果您不从旧版解决方案迁移到 Prometheus CloudWatch 导出器,则可以跳过本部分。

将旧版 AWS CloudWatch 指标映射到 Prometheus CloudWatch 导出器指标

本部分以 AWS CloudWatch 指标 CPUUtilization 为例,介绍如何将旧版 AWS CloudWatch 指标映射到 Prometheus CloudWatch 导出器收集的指标。

CPUUtilization 指标衡量 Amazon EC2 用于运行实例的物理 CPU 时间的百分比,包括运行用户代码和 Amazon EC2 代码的时间。一般来说,指标值是客户机 CPU 利用率和 Hypervisor CPU 利用率的总和。

旧版解决方案使用以下指标向 Cloud Monitoring 报告此数据:

“平均值”和“最大值”等值的指标表示对该指标有意义的 CloudWatch 统计信息;每个指标都会报告不同的 AWS CPUUtilization 指标汇总。这些指标是针对 aws_ec2_instance 受监控的资源类型写入的,而 instance_id 资源标签的值是编写指标的 Amazon EC2 实例的标识符。

当您使用 Prometheus CloudWatch 导出器和 Ops Agent 时,系统会按如下方式报告指标:

  • aws_ec2_cpuutilization_average
  • aws_ec2_cpuutilization_maximum
  • aws_ec2_cpuutilization_minimum
  • aws_ec2_cpuutilization_samplecount
  • aws_ec2_cpuutilization_sum

这些指标对应于旧版解决方案收集的 aws.googleapis.com/EC2/CPUUtilization/Statistic 指标。这些指标是针对 prometheus-target 受监控的资源类型写入的。

prometheus-target 资源上的标签值反映了运行 Prometheus CloudWatch 导出器的 Compute Engine 虚拟机,而不是 Amazon EC2 实例的标签值。指标上的标签值由 Prometheus 导出器设置。aws_ec2_cpuutilization_statistic 指标在 instance_id 指标标签中保留了 Amazon EC2 实例的实例 ID。以下屏幕截图展示了为 aws_ec2_cpuutilization_sum 指标绘制图表的 PromQL 查询;该表显示了所选标签的值:

此表格会显示 EC2 指标的“intance_id”标签值。

如果您使用的是我们提供的 Prometheus CloudWatch 导出器配置之一进行迁移,但想要收集指标的其他维度或统计信息,则可以修改该配置。如需了解详情,请参阅 Prometheus CloudWatch 导出器配置文档

重新构建信息中心和提醒政策

使用旧版 AWS CloudWatch 指标的现有信息中心和提醒政策不适用于使用 Prometheus CloudWatch 导出器注入的指标。这是一项重大变更。

为使 AWS 系统实现同样的可观测性,您必须重新构建信息中心和提醒政策,以使用 Prometheus 导出器收集的指标。

元数据丢失

除了收集 AWS CloudWatch 指标之外,旧版解决方案还从旧版 Monitoring 代理和在 Amazon Elastic Compute Cloud (Amazon EC2) 实例上运行的旧版 Logging 代理中收集元数据。该资源元数据与 Cloud Monitoring 中的指标相联接,显示为系统或用户元数据标签,例如实例名称、可用区、机器类型等。

Prometheus CloudWatch 导出器可能不会收集相同的元数据。如果您在 Amazon EC2 虚拟机实例上使用任一旧版代理,以下部分介绍了如何使用 Prometheus 导出器收集缺失的元数据并将其与 Prometheus 导出器收集的指标联接:

2024 年 8 月 21 日之后,旧版 AWS CloudWatch 解决方案的弃用结束后,这些元数据标签将不再可用。指标和 aws_ec2_instance 资源标签不受影响。

对于 Amazon EC2 实例上使用旧版 Monitoring 代理的用户

如果您在图表和查询中使用 AWS 元数据,并希望维护这些元数据,则可以使用 Prometheus CloudWatch 导出器收集该元数据。创建一个 Compute Engine 虚拟机,然后按照本文档中的说明设置 Prometheus CloudWatch 导出器Ops Agent。在配置 Prometheus CloudWatch 导出器时使用 ec2.yml 配置文件,

ec2.yml 配置文件使用 aws_tag_select 功能。在配置中使用 aws_tag_select 功能时,Prometheus CloudWatch 导出器会导出名为 aws_resource_info 的指标。aws_resource_info 指标会报告时序,并在指标标签中包含 AWS 资源的元数据。此元数据包含 tag_Name 标签中的所有 Amazon EC2 实例标记,包括实例名称。

如果要收集其他元数据,您可以在 Amazon EC2 实例上使用实例标记来添加该元数据;请参阅添加或移除 EC2 实例标记。Prometheus 导出器报告的 aws_resource_info 指标包含额外的元数据。

然后,您可以使用适用于 PromQL 的 MQL 将 aws_resource_info 指标的元数据标签与旧版 Monitoring 代理的自身指标或任何 Amazon EC2 指标联接起来。

MQL 联接

例如,以下 MQL 查询将针对 aws_ec2_instance 资源类型编写的代理自身指标 agent.googleapis.com/agent/uptime 与针对 prometheus-target 资源类型写入的 Prometheus CloudWatch 导出器 aws_resource_info 指标相联接:

{
    aws_ec2_instance :: 'agent.googleapis.com/agent/uptime'
    | align next_older()
    | group_by [instance_id: resource.instance_id, resource.project_id, resource.region, resource.aws_account, metric.version]
    ;
    prometheus_target :: 'prometheus.googleapis.com/aws_resource_info/gauge'
    | align next_older()
    | group_by [instance_id: metric.instance_id, resource.project_id, aws_account: re_extract(metric.arn, "arn:aws:ec2:[^:]+:([^:]+):instance/.*"), region: concatenate("aws:", re_extract(metric.arn, "arn:aws:ec2:([^:]+):[^:]+:instance/.*")), name: metric.tag_Name]
}
| join
| val(0)

这两个指标通过 instance_id 标签联接,因此虚拟机的名称(aws_resource_info 指标中 metric.tag_Name 标签的值)可以添加到联接的结果中。代理 uptime 自我指标包含资源标签 region;与 region 标签的联接有效,因为 AWS 不指定实例 ID 在区域范围内必须是唯一的还是全局唯一的。

如需详细了解 MQL,请参阅监控查询语言概览

PromQL 联接

以下示例展示了一个 PromQL 查询,该查询将 Prometheus CloudWatch 导出器中的 aws_ec2_cpuutilization_average 指标联接起来。以下示例展示了一个 PromQL 查询,该查询将 Prometheus CloudWatch 导出器中的 aws_ec2_cpuutilization_average 指标与 aws_resource_info 元数据指标相联接。指标通过 instance_id 标签联接起来,以添加虚拟机名称(从元数据指标的 tag_Name 标签添加到查询结果)。

  aws_ec2_cpuutilization_average
* on(instance_id) group_left(tag_Name)
  aws_resource_info

对于 Amazon EC2 实例上使用旧版 Logging 代理的用户

旧版 Logging 代理 google-fluentd 会直接将其元数据报告给 Cloud Logging,因此使用旧版 Monitoring 代理弃用 AWS CloudWatch 指标解决方案对 Logging 代理收集的日志没有影响。

不过,旧版 Logging 代理会报告关于自身的一些指标。如果要向这些自行指标添加元数据,您可以创建 Compute Engine 虚拟机,并按照本文档中的说明设置 Prometheus CloudWatch 导出器Ops Agent。在配置 Prometheus CloudWatch 导出器时使用 ec2.yml 配置文件,

您可能还需要修改旧版 Logging 代理的配置。旧版 Logging 代理的输出插件支持 AWS 的 use_aws_availability_zone 选项。此选项必须设置为 false,以便代理写入 region 标签,而不是 availability_zone 标签。如需了解插件配置文件的位置,请参阅 Google Cloud fluentd 输出插件配置

ec2.yml 配置文件使用 aws_tag_select 功能。在配置中使用 aws_tag_select 功能时,Prometheus CloudWatch 导出器会导出名为 aws_resource_info 的指标。aws_resource_info 指标会报告时序,并在指标标签中包含 AWS 资源的元数据。此元数据包含 tag_Name 标签中的所有 Amazon EC2 实例标记,包括实例名称。

如果要收集其他元数据,您可以在 Amazon EC2 实例上使用实例标记来添加该元数据;请参阅添加或移除 EC2 实例标记。Prometheus 导出器报告的 aws_resource_info 指标包含额外的元数据。

然后,您可以使用 MQL 将 aws_resource_info 指标的元数据标签与旧版 Logging 代理中的自身指标联接起来。例如,以下 MQL 查询将针对 aws_ec2_instance 资源类型编写的代理自身指标 agent.googleapis.com/agent/uptime 与针对 prometheus-target 资源类型写入的 Prometheus CloudWatch 导出器 aws_resource_info 指标相联接:

{
    aws_ec2_instance :: 'agent.googleapis.com/agent/uptime'
    | align next_older()
    | group_by [instance_id: resource.instance_id, resource.project_id, resource.region, resource.aws_account, metric.version]
    ;
    prometheus_target :: 'prometheus.googleapis.com/aws_resource_info/gauge'
    | align next_older()
    | group_by [instance_id: metric.instance_id, resource.project_id, aws_account: re_extract(metric.arn, "arn:aws:ec2:[^:]+:([^:]+):instance/.*"), region: concatenate("aws:", re_extract(metric.arn, "arn:aws:ec2:([^:]+):[^:]+:instance/.*")), name: metric.tag_Name]
}
| join
| val(0)

这两个指标通过 instance_id 标签联接,因此虚拟机的名称(aws_resource_info 指标中 metric.tag_Name 标签的值)可以添加到联接的结果中。代理 uptime 自我指标包含资源标签 region;与 region 标签的联接有效,因为 AWS 不指定实例 ID 在区域范围内必须是唯一的还是全局唯一的。

如需详细了解 MQL,请参阅监控查询语言概览

在 AWS 账号中停用旧版指标

在 Google Cloud 项目中创建 AWS 连接器项目时,您会创建一个 AWS IAM 角色,该角色会向 Google Cloud 授予对您的 AWS 帐号的只读权限。如需在 AWS 控制台中停用旧版 AWS CloudWatch 指标,请移除此角色。如需了解详情,请参阅删除 IAM 角色(控制台)

用于迁移的 Prometheus CloudWatch 导出器配置

本部分提供的配置尽可能接近 AWS 指标列表中记录的 AWS 服务指标。这些配置文件旨在供要从旧版解决方案迁移到 Prometheus CloudWatch 导出器的客户使用。如果您将 Prometheus CloudWatch 导出器设置为新用户(而不是迁移用户),并使用这些配置,则并不会收集 Prometheus CloudWatch 导出器提供的所有 AWS 指标。

如需查看 AWS CloudWatch 指标的示例配置文件,请展开即可下任一部分。