简言

想要监控Java应用,JMX永远是第一选择。在prometheus监控体系中,jmx_exporter是使用范围十分广的工具。本文对jmx的配置进行一个讲解,主要是对社区文档进行翻译并解释说明。

JMX Exporter是什么

Prometheus 社区开发了 JMX Exporter 来导出 JVM 的监控指标,以便使用 Prometheus 来采集监控数据。它是 Prometheus 官方组件,作为一个JAVA Agent 来提供本地 JVM 的 metrics,并通过 http 暴露出来。这也是官方推荐的一种方式,可以获取进程的信息,比如CPU和内存使用情况。

JMX Exporter 利用 Java 的 JMX 机制来读取 JVM 运行时的一些监控数据,以代理的形式收集目标应用的 JMX 指标,这样做的好处在于无需对目标应用做任何的改动。然后将其转换为 Prometheus 所认知的 metrics 格式,以便让 Prometheus 对其进行监控采集。

那么,JMX 又是什么呢?它的全称是:Java Management Extensions。 顾名思义,是管理 Java 的一种扩展框架,JMX Exporter 正是基于此框架来读取 JVM 的运行时状态的。

jmx_exporter是一个可以配置抓取和暴露JMX目标的mBeans的收集器。

启动方式

自启动(独立启动)

1
java -javaagent:./jmx_prometheus_javaagent-0.13.0.jar=8080:config.yaml -jar yourJar.jar

随组件启动

随组件启动时启动,在组件运行命令中添加以下代码:

1
-javaagent:./jmx_prometheus_javaagent-0.13.0.jar=8080:config.yaml

举例我们要监控zookeeper,可以在zookeeper的组件中配置内容然后随组件启动而启动

步骤1

ZooKeeper conf目录下新建文件 java.env

1
2
cd zookeeper/conf
vim java.env
步骤2

添加java agent启动信息

1
2
export JMX_DIR="/opt/bigdata/"
export SERVER_JVMFLAGS="$SERVER_JVMFLAGS -javaagent:$JMX_DIR/jmx_prometheus_javaagent-0.13.0.jar=30001:$JMX_DIR/zookeeper/zookeeper.yaml"
步骤3

重启zk

1
bin/zkServer.sh

可访问:30001/metrics访问prometheus格式的指标数据

1、启动独立进程。JVM 启动时指定参数,暴露 JMX 的 RMI 接口,JMX Exporter 调用 RMI 获取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。
2、VM 进程内启动(in-process)。JVM 启动时指定参数,通过 JAVA Agent 的形式运行 JMX Exporter 的 jar 包,进程内读取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。
官方不推荐使用第一种方式,一方面配置复杂,另一方面因为它需要一个单独的进程,而这个进程本身的监控又成了新的问题。

使用JMX_Exporter

下载JMX_Exporter

1
github地址:https://github.com/prometheus/jmx_exporter
1
2
3
4
5
6
# 新建目录
mkdir -p /data/prometheus/jmx_exporter
# 进入目标目录
cd /data/prometheus/jmx_exporter
# 下载最新jmx_exporter:
wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.16.0/jmx_prometheus_javaagent-0.16.0.jar

创建一个config.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
---
startDelaySeconds: 0
#hostPort: 127.0.0.1:50051
username:
password:
#jmxUrl: service:jmx:rmi:///jndi/rmi://127.0.0.1:50051/jmxrmi
ssl: false
lowercaseOutputName: false
lowercaseOutputLabelNames: false
whitelistObjectNames: ["org.apache.cassandra.metrics:*"]
blacklistObjectNames: ["org.apache.cassandra.metrics:type=ColumnFamily,*"]
rules:
- pattern: 'org.apache.cassandra.metrics<type=(\w+), name=(\w+)><>Value: (\d+)'
name: cassandra_$1_$2
value: $3
valueFactor: 0.001
labels: {}
help: "Cassandra metric $1 $2"
type: GAUGE
attrNameSnakeCase: false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# jmx_exporter启动的延迟时间;启动前不会返回任何数据
startDelaySeconds: 0
# 这个是被监控组件的jmx的ip和端口号,如果不配置,默认设置是本地jvm
# 注:如果是随组件一起启动,此处建议不配置(除非自己变更过jmx端口)
hostPort: 127.0.0.1:1234
# jmx远程连接认证的用户名和密码
username: someuser
password: somepwd
# 完整的jmx的url,如果已配置以上三项,此处不用配置
jmxUrl: service:jmx:rmi:///jndi/rmi://127.0.0.1:1234/jmxrmi
# 是否使用ssl加密通讯,若要使用,需要额外在被监控组件启动命令中添加以下配置:
# -Djavax.net.ssl.keyStore=/home/user/.keystore -Djavax.net.ssl.keyStorePassword=changeit -Djavax.net.ssl.trustStore=/home/user/.truststore -Djavax.net.ssl.trustStorePassword=changeit
ssl: false
# 是否自动将指标名转换成小写,默认不转换
lowercaseOutputName: false
# 是否自动将指标的标签名转换成小写,默认不转换
lowercaseOutputLabelNames: false
# 白名单列表,只会查询白名单内的Bean。其它的不会被查询,也不会被rules中的规则匹配;如果为空,将匹配所有Bean;支持正则
whitelistObjectNames: ["org.apache.cassandra.metrics:*"]
# 黑名单列表,在黑名单内的Bean不会被查询,也不会被rules中的规则匹配;支持正则
blacklistObjectNames: ["org.apache.cassandra.metrics:type=ColumnFamily,*"]
# 将Bean转换为prometheus指标的规则,支持配置多个;每个规则可生成一个或多个指标
rules:
# 匹配正则表达式,其底层实现是基于java的Pattern和Matcher,全匹配模式
- pattern: 'org.apache.cassandra.metrics<type=(\w+), name=(\w+)><>Value: (\d+)'
# 匹配到的bean,转换为哪个prometheus指标
name: cassandra_$1_$2
# 将attribute转换为蛇形模式,即JavaAgent转换为java_agent,不配置此项时默认不转换
attrNameSnakeCase: false
# 指标的值
value: $3
# 指标值的放大缩小倍数,一般用于单位转换;prometheus指标一般使用基本单位,如果放大可以写1000,缩小写0.0001,根据单位转换实际情况填写
valueFactor: 0.001
# 指标的标签
labels:
"tag1": $2
"tag2": "some tag value"
# 指标的描述说明
help: "Cassandra metric $1 $2"
# 指标的数据类型,可以是Counter,GAUGE,Histogram,Summary,不写是默认为Untyped
type: GAUGE

监控Java应用

1
2
3
4
5
6
nohup java -javaagent:/data/prometheus/jmx_exporter/jmx_prometheus_javaagent-0.16.0.jar=30100:/data/prometheus/jmx_exporter/simple-config.yml -jar /mnt/baimao/sim/sim.jar >> /mnt/baimao/logs/sim.out 2>&1 &
# 参数注释
# -javaagent:/data/prometheus/jmx_exporter/jmx_prometheus_javaagent-0.16.0.jar=30100 表示 JMX Exporter 的代理端口为30100
# :/data/prometheus/jmx_exporter/simple-config.yml 表示 JMX Exporter 的配置文件
# /mnt/baimao/sim/sim.jar 表示 java 应用的位置
# /mnt/baimao/logs/sim.out 表示 java 应用的日志