在 Amazon EC2 实例上设置和配置 Prometheus 指标集合
以下部分介绍如何在 EC2 实例上安装具有 Prometheus 监控功能的 CloudWatch 代理,以及如何配置代理以抓取其他目标。它还提供了设置示例工作负载以使用 Prometheus 监控进行测试的教程。
同时支持 Linux 和 Windows 实例。
有关 CloudWatch 代理支持的操作系统的信息,请参阅 使用 CloudWatch 代理收集指标、日志和跟踪信息
VPC 安全组要求
如果您使用的是 VPC,则以下要求适用。
Prometheus 工作负载的安全组的入口规则必须向 CloudWatch 代理打开 Prometheus 端口,以便通过私有 IP 抓取 Prometheus 指标。
CloudWatch 代理的安全组的出口规则必须允许 CloudWatch 代理通过私有 IP 连接到 Prometheus 工作负载的端口。
步骤 1:安装 CloudWatch 代理
第一步是在 EC2 实例上安装 CloudWatch 代理。有关说明,请参阅 安装 CloudWatch 代理。
步骤 2:抓取 Prometheus 源并导入指标
具有 Prometheus 监控功能的 CloudWatch 代理需要两种配置来抓取 Prometheus 指标。一种是 Prometheus 文档的 <scrape_config>
Prometheus 抓取配置
CloudWatch 代理支持标准的 Prometheus 抓取配置,如 Prometheus 文档中的 <scrape_config>
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_sd_config
从 EC2 实例列表中抓取 Prometheus 指标。这些实例的 Prometheus 端口必须向运行 CloudWatch 代理的服务器打开。运行 CloudWatch 代理的 EC2 实例的 IAM 角色必须包含 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 实例 ID 进行筛选。有关可以筛选的更多条件,请参阅 DescribeInstances。
Prometheus 的 CloudWatch 代理配置
CloudWatch 代理配置文件包含 logs
和 metrics_collected
下的 prometheus
部分。它包括以下参数。
cluster_name – 指定要在日志事件中添加为标签的集群名称。该字段是可选的。
log_group_name – 指定已抓取 Prometheus 指标的日志组名称。
prometheus_config_path – 指定 Prometheus 抓取配置文件路径。
emf_processor – 指定嵌入式指标格式处理器配置。有关嵌入式指标格式的更多信息,请参阅在日志中嵌入指标。
emf_processor
部分可能包括以下参数:metric_declaration_dedup – 设置为 true,则启用嵌入式指标格式指标的重复数据消除功能。
metric_namespace – 指定发射的 CloudWatch 指标的指标命名空间。
metric_unit – 指定指标名称:指标单位映射。有关受支持指标单位的信息,请参阅 MetricDatum。
metric_declaration – 是指定要生成的采用嵌入式指标格式的日志数组的部分。默认情况下,CloudWatch 代理从中进行导入的每个 Prometheus 源都有
metric_declaration
部分。这些部分各包括以下字段: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_current
和jvm_gc_collection_seconds_sum
同时包含job
和key2
标签。
发送的日志事件包括以下突出显示的部分。
{ "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 Exporter 的 Java 虚拟机 (JVM)、Hjava 和 Tomcat (Catalina) 中收集预定义的 Prometheus 指标。
步骤 1:安装 CloudWatch 代理
第一步是在 EC2 实例上安装 CloudWatch 代理。有关说明,请参阅 安装 CloudWatch 代理。
步骤 2:启动 Java/JMX 工作负载
下一步是启动 Java/JMX 工作负载。
首先,从以下位置下载最新的 JMX Exporter jar 文件:prometheus/jmx_exporter
为您的示例应用程序使用 jar
以下各部分中的示例命令使用 SampleJavaApplication-1.0-SNAPSHOT.jar
作为 jar 文件。将命令的这些部分替换为应用程序的 jar。
准备 JMX Exporter 配置
config.yaml
文件是 JMX Exporter 配置文件。有关更多信息,请参阅 JMX Exporter 文档中的配置
以下是 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。请务必将入口点 com.gubupt.sample.app.App
替换为您示例 java 应用程序的正确信息。
在 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 抓取配置
设置
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" ]
设置抓取目标配置。
在 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
通过
ec2_sc_config
设置 Prometheus 抓取配置。用正确的 EC2 实例 ID 替代your-ec2-instance-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
设置 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 } }通过输入以下命令之一,重新启动 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 示例工作负载的指标
通过 https://console.aws.amazon.com/cloudwatch/
打开 CloudWatch 控制台。 在运行集群的区域中,选择左侧导航窗格中的 Metrics(指标)。查找 PrometheusTest 命名空间以查看指标。
要查看 CloudWatch Logs 事件,请在导航窗格中选择 Log groups(日志组)。这些事件位于日志组 prometheus-test 中。