共计 4251 个字符,预计需要花费 11 分钟才能阅读完成。
JVM 默认会通过 JMX 的形式裸露根底指标,很多中间件也会通过 JMX 的形式裸露业务指标,比方 Kafka、Zookeeper、ActiveMQ、Cassandra、Spark、Tomcat、Flink 等等。把握了 JMX 监控形式,就把握了一批程序的监控形式。本节介绍 JMX-Exporter 的应用,利用 JMX-Exporter 把 JMX 监控数据裸露为 Prometheus 可辨认的格局。
JMX
JMX(Java Management Extensions)是 Java 治理扩大的简称,是一种为 Java 应用程序植入治理性能的框架。Java 类程序常常应用 JMX 裸露监控指标数据,也能够通过 JMX 来管制 Java 类程序,典型的比方通过 JMX 触发程序 GC。
Java 程序里,某个类如果实现了 MBean 接口,那么这个类就能够通过 JMX 来读取和批改这个类的属性,也能够调用这个类的办法。JMX 通过 MBeanServer 来治理 MBean,MBeanServer 是一个管理器,它能够治理多个 MBean,每个 MBean 都有一个 ObjectName,用来惟一标识这个 MBean。
更新信息能够参考 JMX Specification。非本文重点。
JMX-Exporter 简介
JMX-Exporter 是 Prometheus 社区提供的一个工具,用来把 JMX 裸露的监控指标数据转换为 Prometheus 可辨认的格局。JMX-Exporter 通过 HTTP 服务的形式裸露监控指标数据,Prometheus 通过 HTTP 协定来拉取监控指标数据。
JMX-Exporter 就是个 jar 包,以 javaagent(何为 javaagent,须要读者自行 Google)的形式运行,和业务 Java(或 Scala)程序运行在一个 JVM 虚拟机里。有了 JMX-Exporter,业务程序无需裸露 JMX 端口了,JMX-Exporter 会把 JMX 裸露的监控指标数据转换为 Prometheus 可辨认的格局,而后通过 HTTP 只读形式裸露进来,也更为平安。
JMX-Exporter 装置
因为 JMX-Exporter 是个 jar 包,所以装置非常简单,只须要把 jar 包下载到服务器上就能够了。JMX-Exporter 的下载地址是 https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/,下载最新版本的 jar 包即可。
比方咱们把下载的 jar 包放在 /opt/jmx-exporter
目录,另外,建设 /etc/jmx-exporter
目录搁置 JMX-Exporter 所需配置文件。像 Kafka,裸露的 JMX 指标十分十分多,咱们不须要全副采集,只须要采集咱们关怀的指标即可。所以,咱们须要配置文件来通知 JMX-Exporter,咱们须要采集哪些指标。
JMX-Exporter 提供了很多样例配置,地址在这里:https://github.com/prometheus/jmx_exporter/tree/main/example_configs。
应用 JMX 监控 Zookeeper
实际上,新版 Zookeeper 曾经间接裸露了 Prometheus 协定的监控数据,无需通过 JMX 形式采集了。另外,Zookeeper 还提供了四字命令的监控数据采集形式,比方 Categraf 的 input.zookeeper 插件就是采纳的这种形式。
不过,本文次要是演示 JMX 的形式,所以还是应用 JMX 的形式来采集 Zookeeper 的监控数据。
首先,从 https://github.com/prometheus/jmx_exporter/tree/main/example_configs 这里找到 Zookeeper 的配置样例文件,下载到 /etc/jmx-exporter/zookeeper.yml
。而后把 jmx-exporter 的 jar 包作为 javaagent 启动参数退出 Zookeeper 的启动命令即可。
# zookeeper-env.sh
SERVER_JVMFLAGS="-javaagent:/opt/jmx-exporter/jmx-exporter.jar=7070:/etc/jmx-exporter/zookeeper.yml"
Zookeeper 有个 zookeeper-env.sh 管制 Zookeeper 的启动参数,咱们在这里退出 javaagent 启动参数,而后重启 Zookeeper 即可。上例是把 JMX-Exporter 的 HTTP 服务端口设置为 7070,能够依据理论状况批改,配置文件指定为 /etc/jmx-exporter/zookeeper.yml
。
OK,当初能够测试了,先看 7070 端口是否在监听,如果在监听,就能够申请这个端口的 /metrics
接口采集 Prometheus 协定的监控数据了。
$ netstat -tlnp | grep 7070
tcp 0 0 0.0.0.0:7070 0.0.0.0:* LISTEN 892/java
$ curl -s localhost:7070/metrics | head
# HELP jvm_threads_current Current thread count of a JVM
# TYPE jvm_threads_current gauge
jvm_threads_current 16.0
# HELP jvm_threads_daemon Daemon thread count of a JVM
# TYPE jvm_threads_daemon gauge
jvm_threads_daemon 12.0
# HELP jvm_threads_peak Peak thread count of a JVM
# TYPE jvm_threads_peak gauge
jvm_threads_peak 16.0
# HELP jvm_threads_started_total Started thread count of a JVM
能够看到,Zookeeper 的监控数据曾经裸露进去了,接下来就能够采集这些数据了,抓取 Prometheus 协定的监控数据有很多形式,能够间接应用 Prometheus 本身来抓取,也能够通过 Categraf 的 input.prometheus 插件来抓取,也能够通过 vmagent 来抓取,大家自行决策即可。
应用 JMX 监控 Kafka
从 JMX-Exporter 提供的样例配置目录,下载 kafka.yml,而后导出 KAFKA_OPTS 环境变量即可。
$ export KAFKA_OPTS='-javaagent:/opt/jmx-exporter/jmx-exporter.jar=7071:/etc/jmx-exporter/kafka.yml'
$ /opt/kafka_2.11-0.10.1.0/bin/kafka-server-start.sh /opt/kafka_2.11-0.10.1.0/conf/server.properties
上例中,咱们把端口换成了 7071,配置文件指定为 /etc/jmx-exporter/kafka.yml
。测试一下端口是否胜利监听:
$ netstap -tlnp | grep 7071
tcp6 0 0 :::7071 :::* LISTEN 19288/java
$ curl -s localhost:7071 | grep -i kafka | head
# HELP kafka_server_replicafetchermanager_minfetchrate Attribute exposed for management (kafka.server<type=ReplicaFetcherManager, name=MinFetchRate, clientId=Replica><>Value)
# TYPE kafka_server_replicafetchermanager_minfetchrate untyped
kafka_server_replicafetchermanager_minfetchrate{clientId="Replica",} 0.0
# HELP kafka_network_requestmetrics_totaltimems Attribute exposed for management (kafka.network<type=RequestMetrics, name=TotalTimeMs, request=OffsetFetch><>Count)
# TYPE kafka_network_requestmetrics_totaltimems untyped
kafka_network_requestmetrics_totaltimems{request="OffsetFetch",} 0.0
kafka_network_requestmetrics_totaltimems{request="JoinGroup",} 0.0
kafka_network_requestmetrics_totaltimems{request="DescribeGroups",} 0.0
kafka_network_requestmetrics_totaltimems{request="LeaveGroup",} 0.0
kafka_network_requestmetrics_totaltimems{request="GroupCoordinator",} 0.0
一切正常哈,如果你的 Kafka 是通过 systemd 运行的,能够相似上面的形式来配置 kafka.service 文件:
...
[Service]
Restart=on-failure
Environment=KAFKA_OPTS=-javaagent:/opt/jmx-exporter/jmx-exporter.jar=7071:/etc/jmx-exporter/kafka.yml
ExecStart=/opt/kafka/bin/kafka-server-start.sh /etc/kafka/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
TimeoutStopSec=600
User=kafka
...
文章次要翻译了 https://alex.dzyoba.com/blog/jmx-exporter/ 并退出了一些集体了解。enjoy…make a better world :)