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 :)

使用 JMX-Exporter 监控 Kafka 和 Zookeeper的更多相关文章

  1. 使用jmx exporter采集kafka指标

    预置条件 安装kafka.prometheus 使用JMX exporter暴露指标 下载jmx exporter以及配置文件.Jmx exporter中包含了kafka各个组件的指标,如server ...

  2. 使用JMX Exporter监控Rainbond上的Java应用

    场景 Prometheus 社区开发了 JMX Exporter 用于导出 JVM 的监控指标,以便使用 Prometheus 来采集监控数据.当您的 Java 应用部署在Rainbond上后 可通过 ...

  3. 如何使用JMX监控Kafka

    使用kafka做消息队列中间件时,为了实时监控其性能时,免不了要使用jmx调取kafka broker的内部数据,不管是自己重新做一个kafka集群的监控系统,还是使用一些开源的产品,比如yahoo的 ...

  4. Prometheus+Grafana通过kafka_exporter监控kafka

    Prometheus+Grafana通过kafka_exporter监控kafka 一.暴露 kafka-metric 方式 二.jmx_exporter方式 2.1 下载jmx_prometheus ...

  5. 使用kafka-eagle监控Kafka

    # 监控kafka集群,开启监控趋势图使用 # 有一个问题,需要在kafka-server-start.sh文件中配置端口,有如下三种办法 # 第一种:复制并修改kafka目录,比如kafka-1,k ...

  6. Kafka 消息监控 - Kafka Eagle

    1.概述 在开发工作当中,消费 Kafka 集群中的消息时,数据的变动是我们所关心的,当业务并不复杂的前提下,我们可以使用 Kafka 提供的命令工具,配合 Zookeeper 客户端工具,可以很方便 ...

  7. 脚本检测Kafka和Zookeeper

    Java测试环境中Kafka最近总是自动停止,所有写了一个简单的脚本来监听Kafka和Zookeeper,其中Kafka监听端口为9092,Zookeeper监听端口为2181,脚本如下: #!/bi ...

  8. Kafka学习之路 (五)Kafka在zookeeper中的存储

    一.Kafka在zookeeper中存储结构图 二.分析 2.1 topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 [zk: ...

  9. KafkaOffsetMonitor监控kafka

    KafkaOffsetMonitor监控kafka 1. KafkaOffsetMonitor是一个可以用于监控Kafka的Topic及Consumer消费状况的工具,其配置和使用特别的方便.源项目G ...

  10. Kafka(四)Kafka在zookeeper中的存储

    一 Kafka在zookeeper中存储结构图 二 分析 2.1 topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 [zk: ...

随机推荐

  1. 云原生消息队列Pulsar浅析

    简介: 云原生消息队列Pulsar浅析 一.前言 Pulsar是一个多租户,高性能的服务间消息解决方案.最初由Yahoo开发,现在由Apache Software Foundation负责.Pulsa ...

  2. Istio 从懵圈到熟练:二分之一活的微服务

    作者 | 声东  阿里云售后技术专家 <关注阿里巴巴云原生公众号,回复 排查 即可下载电子书> <深入浅出 Kubernetes>一书共汇集 12 篇技术文章,帮助你一次搞懂 ...

  3. Flink 源码 | 自定义 Format 消费 Maxwell CDC 数据

    Flink 1.11 最重要的 Feature -- Hive Streaming 之前已经和大家分享过了,今天就和大家来聊一聊另一个特别重要的功能 -- CDC. CDC概述 何为CDC?Chang ...

  4. 阿里云 VPC 内网性能测试最佳实践

    ​简介:本文介绍了在阿里云 VPC 内网执行性能测试的方法.相较于传统的公网性能测试,VPC 内网性能测试完全在客户 VPC 环境进行,无需暴露服务到公网,安全性更高,灵活性更强. 作者:风起 背景 ...

  5. Java Map中那些巧妙的设计

    简介: 他山之石可以攻玉,这些巧妙的设计思想非常有借鉴价值,可谓是最佳实践.然而,大多数有关Java Map原理的科普类文章都是专注于"点",并没有连成"线", ...

  6. 智能数据构建与管理平台Dataphin的前世今生:缘起

    简介: 阿里巴巴提出的OneData方法论帮助企业捋清了数据全生命周期的管理思路,更将其植入到产品Dataphin(智能数据构建与管理)中,通过阿里云为企业提供服务. Dataphin 智能数据构建与 ...

  7. EDA 事件驱动架构与 EventBridge 二三事

    ​简介: 事件驱动型架构 (EDA) 方兴未艾,作为一种 Serverless 化的应用概念对云原生架构具有着深远影响.当我们讨论到一个具体架构时,首当其冲的是它的发展是否具有技术先进性.这里从我们熟 ...

  8. 在 Dubbo3.0 上服务治理的实践

    ​简介: Dubbo 3.0 是在云原生背景下诞生的,使用 Dubbo 构建的微服务遵循云原生思想,能更好的复用底层云原生基础设施.贴合云原生微服务架构. Dubbo3.0 介绍 作者 | 十眠 自从 ...

  9. DataWorks 功能实践速览03期 — 生产开发环境隔离

    ​简介: DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率! 往期回顾: DataWorks 功能实践速览01期--数据同步解决方案:为您介绍不同场景下可选的数据同 ...

  10. [FAQ] eggjs/egg 自定义 favicon.ico

      从  egg 项目配置里找到这一段代码: https://github.com/eggjs/egg/blob/master/config/config.default.js#L205C21-L20 ...