在 Amazon EC2 实例上设置和配置 Prometheus 指标收集 - Amazon CloudWatch
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

在 Amazon EC2 实例上设置和配置 Prometheus 指标收集

以下部分介绍如何在 EC2 实例上安装具有 Prometheus 监控功能的 CloudWatch 代理,以及如何配置 代理以抓取其他目标。它还提供了有关设置示例工作负载以将测试与 Prometheus 监控结合使用的教程。

有关 CloudWatch 代理支持的操作系统的信息,请参阅 使用 Amazon EC2 代理从 CloudWatch 实例和本地服务器收集指标和日志

VPC 安全组要求

如果您使用的是 VPC,则存在以下要求。

  • Prometheus 工作负载的安全组的传入规则必须打开 Prometheus 端口到 CloudWatch 代理,以便按私有 IP 抓取 Prometheus 指标。

  • CloudWatch 代理的安全组的出口规则必须允许CloudWatch代理通过私有 IP 连接到 Prometheus 工作负载的端口。

步骤 1:安装 CloudWatch 代理

第一步是在 EC2 实例上安装 CloudWatch 代理。有关说明,请参阅 安装 CloudWatch 代理.

步骤 2:抓取 Prometheus 源并导入指标

具有 Prometheus 监控的 CloudWatch 代理需要两个配置才能抓取 Prometheus 指标。其中一个用于 Prometheus 文档的 <scrape_config>中记录的标准 Prometheus 配置。另一个用于 CloudWatch 代理配置。

Prometheus 抓取配置

CloudWatch 代理支持 Prometheus 文档的 <scrape_config> 中所述的标准 Prometheus 抓取程序组合。您可以编辑此部分以更新该文件中已有的配置,并添加其他 Prometheus 抓取目标。示例配置文件包含以下全局配置行:

PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus.yaml global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: MY_JOB sample_limit: 10000 file_sd_configs: - files: ["C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus_sd_1.yaml", "C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus_sd_2.yaml"]

global 部分指定在所有配置上下文中都有效的参数。它们还充当其他配置部分的默认值。它包含以下参数:

  • scrape_interval— 定义抓取目标的频率。

  • scrape_timeout— 定义在抓取请求超时之前等待的时长。

scrape_configs 部分指定一组定义如何抓取它们的目标和参数。它包含以下参数:

  • job_name— 默认情况下分配给已抓取指标的作业名称。

  • sample_limit— 将要接受的已抓取样本数量的每数组限制。

  • file_sd_configs— 文件服务发现配置的列表。它读取一组文件,其中包含零个或多个静态配置的列表。file_sd_configs 部分包含一个files参数,该参数定义从中提取目标组的文件模式。

CloudWatch 代理支持以下服务发现配置类型。

static_config 允许为它们指定目标列表和常见标签集。这是在抓取配置中指定静态目标的规范方式。

以下是从本地主机抓取 Prometheus 指标的示例静态配置。如果 Prometheus 端口对运行代理的服务器开放,则也可以从其他服务器抓取指标。

PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus_sd_1.yaml - targets: - 127.0.0.1:9404 labels: key1: value1 key2: value2

此示例包含以下参数:

  • targets— 静态配置抓取的目标。

  • labels— 分配给从目标抓取的所有指标的标签。

ec2_sd_config 允许从 Amazon EC2 实例检索抓取目标。以下是从 EC2 实例列表中ec2_sd_config抓取 Prometheus 指标的示例。这些实例的 Prometheus 端口必须对运行 CloudWatch 代理的服务器开放。代理在其中IAM运行的 EC2 实例的 CloudWatch 角色必须包含 ec2:DescribeInstance 权限。例如,您可以将 托管策略AmazonEC2ReadOnlyAccess附加到运行 CloudWatch 代理的 实例。

PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus.yaml global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: MY_JOB sample_limit: 10000 ec2_sd_configs: - region: us-east-1 port: 9404 filters: - name: instance-id values: - i-98765432109876543 - i-12345678901234567

此示例包含以下参数:

  • region— 目标 EC2 实例所在的AWS区域。如果将此项留空,则使用实例元数据中的区域。

  • port— 要从中抓取指标的端口。

  • filters— 用于筛选实例列表的可选筛选条件。此示例基于 EC2 实例 进行筛选IDs。 有关可以筛选的更多条件,DescribeInstances请参阅

CloudWatch Prometheus 的 代理配置

CloudWatch 代理配置文件包含 prometheus 和 下的logs部分metrics_collected。 它包括以下参数。

  • cluster_name— 指定要在日志事件中作为标签添加的集群名称。此字段为可选项。

  • log_group_name— 指定已抓取的 Prometheus 指标的日志组名称。

  • prometheus_config_path— 指定 Prometheus 抓取配置文件路径。

  • emf_processor— 指定嵌入式指标格式处理器配置。有关嵌入式指标格式的更多信息,请参阅采用 CloudWatch 嵌入式指标格式提取高基数日志并生成指标.

    emf_processor 部分可以包含以下参数:

    • metric_declaration_dedup— 设置为 true,启用嵌入式指标格式指标的重复数据删除函数。

    • metric_namespace— 指定所发出指标的CloudWatch指标命名空间。

    • metric_unit— 指定指标名称:指标单位映射。有关支持的指标单位的信息,MetricDatum请参阅

    • metric_declaration— 是指定要生成的采用嵌入式指标格式的日志数组的部分。默认情况下,metric_declaration 代理从中进行导入的每个 Prometheus 源都有 CloudWatch 部分。这些部分各包括以下字段:

      • source_labels 指定由 label_matcher 行检查的标签的值。

      • label_matcher 是一个正则表达式,用于检查 中列出的标签的值source_labels。 会将匹配的指标启用为包含在发送到 的嵌入式指标格式中CloudWatch。

      • metric_selectors 是一个正则表达式,用于指定要收集并发送到 的指标CloudWatch。

      • dimensions 是要用作每个选定指标的 CloudWatch 维度的标签列表。

下面是 Prometheus 的 CloudWatch 代理配置示例。

{ "logs":{ "metrics_collected":{ "prometheus":{ "cluster_name":"prometheus-cluster", "log_group_name":"Prometheus", "prometheus_config_path":"C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus.yaml", "emf_processor":{ "metric_declaration_dedup":true, "metric_namespace":"CWAgent-Prometheus", "metric_unit":{ "jvm_threads_current": "Count", "jvm_gc_collection_seconds_sum": "Milliseconds" }, "metric_declaration":[ { "source_labels":[ "job", "key2" ], "label_matcher":"^MY_JOB$;^value2$", "dimensions":[ [ "key1", "key2" ], [ "key2" ] ], "metric_selectors":[ "^jvm_threads_current$", "^jvm_gc_collection_seconds_sum$" ] } ] } } } } }

如果满足以下条件,上一个程序集会将嵌入式指标格式部分配置为作为日志事件发送:

  • 标签的值为 job MY_JOB

  • 标签的值为 key2 value2

  • Prometheus 指标 jvm_threads_currentjvm_gc_collection_seconds_sum 包含 jobkey2 标签。

发送的日志事件包括以下突出显示的部分。

{ "CloudWatchMetrics": [ { "Metrics": [ { "Unit": "Count", "Name": "jvm_threads_current" }, { "Unit": "Milliseconds", "Name": "jvm_gc_collection_seconds_sum" } ], "Dimensions": [ [ "key1", "key2" ], [ "key2" ] ], "Namespace": "CWAgent-Prometheus" } ], "ClusterName": "prometheus-cluster", "InstanceId": "i-0e45bd06f196096c8", "Timestamp": "1607966368109", "Version": "0", "host": "EC2AMAZ-PDDOIUM", "instance": "127.0.0.1:9404", "jvm_threads_current": 2, "jvm_gc_collection_seconds_sum": 0.006000000000000002, "prom_metric_type": "gauge", ... }

示例:为 Prometheus 指标测试设置 Java/JMX 示例工作负载

JMX Exporter 是正式的 Prometheus 导出程序,可以抓取 JMX mBeans 作为 Prometheus 指标公开。有关详细信息,请参阅 prometheus/jmx_exporter.

CloudWatch 代理可以从 EC2 实例上的 JMX 导出程序中收集 Java 虚拟机 (JVM)、Hjava 和 Tomcat (Catalina) 的预定义 Prometheus 指标。

步骤 1:安装 CloudWatch 代理

第一步是在 EC2 实例上安装 CloudWatch 代理。有关说明,请参阅 安装 CloudWatch 代理.

步骤 2:启动 Java/JMX 工作负载

下一步是启动 Java/JMX 工作负载。

首先,从以下位置下载最新的 JMX 导出程序 jar 文件:prometheus/jmx_exporter

对示例应用程序使用 jar

以下部分中的示例命令使用 SampleJavaApplication-1.0-SNAPSHOT.jar 作为 jar 文件。将命令的这些部分替换为您的应用程序的 jar。

准备 JMX 导出器配置

config.yaml 文件是 JMX 导出程序配置文件。有关更多信息,请参阅 JMX 导出程序文档中的配置

以下是 Java 和 Tomcat 的示例配置。

--- lowercaseOutputName: true lowercaseOutputLabelNames: true rules: - pattern: 'java.lang<type=OperatingSystem><>(FreePhysicalMemorySize|TotalPhysicalMemorySize|FreeSwapSpaceSize|TotalSwapSpaceSize|SystemCpuLoad|ProcessCpuLoad|OpenFileDescriptorCount|AvailableProcessors)' name: java_lang_OperatingSystem_$1 type: GAUGE - pattern: 'java.lang<type=Threading><>(TotalStartedThreadCount|ThreadCount)' name: java_lang_threading_$1 type: GAUGE - pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+)' name: catalina_globalrequestprocessor_$3_total labels: port: "$2" protocol: "$1" help: Catalina global $3 type: COUNTER - pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount)' name: catalina_servlet_$3_total labels: module: "$1" servlet: "$2" help: Catalina servlet $3 total type: COUNTER - pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount)' name: catalina_threadpool_$3 labels: port: "$2" protocol: "$1" help: Catalina threadpool $3 type: GAUGE - pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions)' name: catalina_session_$3_total labels: context: "$2" host: "$1" help: Catalina session $3 total type: COUNTER - pattern: ".*"

使用 Prometheus 导出程序启动 Java 应用程序

启动示例应用程序。这会将 Prometheus 指标发送到端口 9404。请务必将入口点替换为示例 java 应用程序com.gubupt.sample.app.App的正确源。

在 Linux 上,输入以下命令。

$ nohup java -javaagent:./jmx_prometheus_javaagent-0.14.0.jar=9404:./config.yaml -cp ./SampleJavaApplication-1.0-SNAPSHOT.jar com.gubupt.sample.app.App &

在 Windows 上,输入以下命令。

PS C:\> java -javaagent:.\jmx_prometheus_javaagent-0.14.0.jar=9404:.\config.yaml -cp .\SampleJavaApplication-1.0-SNAPSHOT.jar com.gubupt.sample.app.App

验证 Prometheus 指标的发射

验证是否正在发出 Prometheus 指标。

在 Linux 上,输入以下命令。

$ curl localhost:9404

在 Windows 上,输入以下命令。

PS C:\> curl http://localhost:9404

Linux 上的示例输出:

StatusCode : 200 StatusDescription : OK Content : # HELP jvm_classes_loaded The number of classes that are currently loaded in the JVM # TYPE jvm_classes_loaded gauge jvm_classes_loaded 2526.0 # HELP jvm_classes_loaded_total The total number of class... RawContent : HTTP/1.1 200 OK Content-Length: 71908 Content-Type: text/plain; version=0.0.4; charset=utf-8 Date: Fri, 18 Dec 2020 16:38:10 GMT # HELP jvm_classes_loaded The number of classes that are currentl... Forms : {} Headers : {[Content-Length, 71908], [Content-Type, text/plain; version=0.0.4; charset=utf-8], [Date, Fri, 18 Dec 2020 16:38:10 GMT]} Images : {} InputFields : {} Links : {} ParsedHtml : System.__ComObject RawContentLength : 71908

步骤 3:配置 CloudWatch 代理以抓取 Prometheus 指标

接下来,在 CloudWatch 代理配置文件中设置 Prometheus 抓取配置。

为 Java/JMX 示例设置 Prometheus 抓取配置

  1. file_sd_config 和 设置 配置static_config

    在 Linux 上,输入以下命令。

    $ cat /opt/aws/amazon-cloudwatch-agent/var/prometheus.yaml global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: jmx sample_limit: 10000 file_sd_configs: - files: [ "/opt/aws/amazon-cloudwatch-agent/var/prometheus_file_sd.yaml" ]

    在 Windows 上,输入以下命令。

    PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus.yaml global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: jmx sample_limit: 10000 file_sd_configs: - files: [ "C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus_file_sd.yaml" ]
  2. 设置抓取目标配置。

    在 Linux 上,输入以下命令。

    $ cat /opt/aws/amazon-cloudwatch-agent/var/prometheus_file_sd.yaml - targets: - 127.0.0.1:9404 labels: application: sample_java_app os: linux

    在 Windows 上,输入以下命令。

    PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus_file_sd.yaml - targets: - 127.0.0.1:9404 labels: application: sample_java_app os: windows
  3. 通过 设置 Prometheus 抓取配置ec2_sc_config。 替换 your-ec2-instance-id 替换为正确的 EC2 实例 ID。

    在 Linux 上,输入以下命令。

    $ cat .\prometheus.yaml global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: jmx sample_limit: 10000 ec2_sd_configs: - region: us-east-1 port: 9404 filters: - name: instance-id values: - your-ec2-instance-id

    在 Windows 上,输入以下命令。

    PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus_file_sd.yaml - targets: - 127.0.0.1:9404 labels: application: sample_java_app os: windows
  4. 设置 CloudWatch 代理配置。首先,直接导航到正确的 。在 Linux 上,它是 /opt/aws/amazon-cloudwatch-agent/var/cwagent-config.json。 在 Windows 上,它是 C:\ProgramData\Amazon\AmazonCloudWatchAgent\cwagent-config.json

    以下是定义了 Java/JHX Prometheus 指标的示例配置。请务必替换 path-to-Prometheus-Scrape-Configuration-file 使用正确的路径。

    { "agent": { "region": "us-east-1" }, "logs": { "metrics_collected": { "prometheus": { "cluster_name": "my-cluster", "log_group_name": "prometheus-test", "prometheus_config_path": "path-to-Prometheus-Scrape-Configuration-file", "emf_processor": { "metric_declaration_dedup": true, "metric_namespace": "PrometheusTest", "metric_unit":{ "jvm_threads_current": "Count", "jvm_classes_loaded": "Count", "java_lang_operatingsystem_freephysicalmemorysize": "Bytes", "catalina_manager_activesessions": "Count", "jvm_gc_collection_seconds_sum": "Seconds", "catalina_globalrequestprocessor_bytesreceived": "Bytes", "jvm_memory_bytes_used": "Bytes", "jvm_memory_pool_bytes_used": "Bytes" }, "metric_declaration": [ { "source_labels": ["job"], "label_matcher": "^jmx$", "dimensions": [["instance"]], "metric_selectors": [ "^jvm_threads_current$", "^jvm_classes_loaded$", "^java_lang_operatingsystem_freephysicalmemorysize$", "^catalina_manager_activesessions$", "^jvm_gc_collection_seconds_sum$", "^catalina_globalrequestprocessor_bytesreceived$" ] }, { "source_labels": ["job"], "label_matcher": "^jmx$", "dimensions": [["area"]], "metric_selectors": [ "^jvm_memory_bytes_used$" ] }, { "source_labels": ["job"], "label_matcher": "^jmx$", "dimensions": [["pool"]], "metric_selectors": [ "^jvm_memory_pool_bytes_used$" ] } ] } } }, "force_flush_interval": 5 } }
  5. 通过输入以下命令之一重新启动CloudWatch代理。

    在 Linux 上,输入以下命令。

    sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/var/cwagent-config.json

    在 Windows 上,输入以下命令。

    & "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -s -c file:C:\ProgramData\Amazon\AmazonCloudWatchAgent\cwagent-config.json

查看 Prometheus 指标和日志

现在,您可以查看正在收集的 Java/JMX 指标。

查看示例 Java/JMX 工作负载的指标

  1. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  2. 在运行集群的区域中,选择左侧导航窗格中的 Metrics (指标)。找到 PrometheusTest 命名空间以查看 指标。

  3. 要查看CloudWatch Logs事件,请在导航窗格中选择 Log groups (日志组)。事件位于日志组 prometheus-test 中。