简言
想要监控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
可访问: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 应用的日志
|