前言
在微服务架构日益普及的今天,消息队列已成为系统解耦、异步处理和流量削峰的核心组件。而Apache RocketMQ凭借其高吞吐、低延迟和强一致性,被广泛应用于金融、电商、物流等关键业务场景。然而,“能跑”不等于“可控”——当消息积压、消费延迟或Broker异常发生时,若缺乏有效的监控手段,运维人员往往只能被动响应,甚至陷入“盲人摸象”的困境。RocketMQ Exporter正是打通可观测性“最后一公里”的关键工具。它将RocketMQ内部指标(如Topic堆积量、Broker磁盘使用率、消息生产/消费TPS等)以标准Prometheus格式暴露出来。但对许多开发者而言,从零开始配置Exporter仍面临依赖环境、权限配置、指标采集范围等实际问题。本文将手把手带你完成RocketMQ_Exporter的部署、配置与集成,避开常见坑点,真正让消息队列的运行状态“看得见、查得清、管得住”,为生产环境的稳定运行提供坚实保障。

1.RocketMQ Exporter
RocketMQ Exporter是一个用于将Apache RocketMQ的内部运行指标暴露给Prometheus的监控中间件,属于Prometheus生态中的Exporter组件。
1.1 核心作用
将RocketMQ集群的各类关键指标(如消息生产/消费TPS、堆积量、Broker状态等)以标准的Prometheus的Metrics格式(文本格式)通过HTTP接口暴露出来,便于:
- 被Prometheus抓取(scrape)
- 在Grafana中可视化展示
- 实现告警(如消费延迟、堆积告警)
1.2 主要功能(采集的指标示例)
RocketMQ_Exporter主要是配合Prometheus来做监控,下面来看看当前在Expoter中定义了哪些监控指标和告警指标。
| 指标类别 | 示例指标 | 说明 |
|---|---|---|
| Broker | rocketmq_broker_tpsrocketmq_broker_qps |
Broker的消息生产与消费吞吐量 |
| Topic | rocketmq_producer_tpsrocketmq_topic_offset |
各Topic的生产速率、最新位点 |
| Consumer Group | rocketmq_consumer_lagrocketmq_group_get_latency |
消费组堆积量、拉取消息延迟 |
| 集群状态 | rocketmq_commitlog_dir_capacity |
CommitLog磁盘使用情况 |
1.3 架构与工作原理
- Exporter启动后,定期调用RocketMQ的Admin接口(如examineBrokerClusterInfo, queryConsumeStats)获取数据。
- 将原始数据转换为Prometheus支持的格式(如counter, gauge)。
- 通过内嵌Web服务(默认端口5557)提供 /metrics接口。
访问: http://
2.安装RocketMQ Exporter
2.1 下载maven构建
Maven 官方下载地址:http://maven.apache.org/download.cgi
下载图中版本:

上传到/user/local目录下并解压:
tar -zxvf apache-maven-3.9.12-bin.tar.gz

查看一下java版本:
java -version
修改/etc/profile文件:
vim /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.9.12
export PATH=$MAVEN_HOME/bin:$PATH
source /etc/profile

看到Maven版本,下面信息表示安装成功:
mvn -v

2.2 部署RocketMQ Exporter
从Git下载RocketMQ Exporter的源代码:
git clone https://github.com/apache/rocketmq-exporter.git

进入项目根目录:
cd rocketmq-exporter
编译并打包成可执行JAR文件:
mvn clean install -DskipTests=true -Dcheckstyle.skip=true

构建Docker镜像:
mvn package -Dmaven.test.skip=true docker:build

构建成功后,检查 target/ 目录,返回下面信息代表成功:
ls -l target/rocketmq-exporter-*.jar

开启rocketmq的nameserver:
nohup sh bin/mqnamesrv -n "0.0.0.0:9876" &

开启rocketmq的borker:
nohup sh bin/mqbroker -n 192.168.42.140:9876 -c conf/broker.conf &

验证是否开启:
jps

进入rocketmq_exporter目录下,开启rocketmq_exporter服务:
java -jar target/rocketmq-exporter-0.0.3-SNAPSHOT-exec.jar --rocketmq.config.namesrvAddr=192.168.42.140:9876 --server.port=5557

访问: http://

3.prometheus配置RocketMQ Exporter监控
进入prometheus安装目录下,编辑prometheus配置文件:
vi prometheus.yml
- targets: ['localhost:5557']
labels:
app: "rocketmq_exporter"

重启Prometheus:
systemctl restart prometheus

prometheus 成功抓取了rocketmq_exporter指标数据:

4.配置alertmanager监控rocketmq的数据
配置alertmanager告警:
进入prometheus的安装目录,编辑prometheus.yml:
vi prometheus.yml
如图填写:

编辑6.yml添加下面信息:
# rules_rocketmq.yml
groups:
- name: rocketmq
rules:
- alert: RocketMQ Exporter is Down
expr: up{job="rocketmq"} == 0
for: 20s
labels:
severity: '灾难'
annotations:
summary: RocketMQ {{ $labels.instance }} is down
- alert: RocketMQ 存在消息积压
expr: (sum(irate(rocketmq_producer_offset[1m])) by (topic) - on(topic) group_right sum(irate(rocketmq_consumer_offset[1m])) by (group,topic)) > 5
for: 5m
labels:
severity: '警告'
annotations:
summary: RocketMQ (group={{ $labels.group }} topic={{ $labels.topic }})积压数 = {{ .Value }}
- alert: GroupGetLatencyByStoretime 消费组的消费延时时间过高
expr: rocketmq_group_get_latency_by_storetime/1000 > 5 and rate(rocketmq_group_get_latency_by_storetime[5m]) >0
for: 3m
labels:
severity: 警告
annotations:
description: 'consumer {{$labels.group}} on {{$labels.broker}}, {{$labels.topic}} consume time lag behind message store time
and (behind value is {{$value}}).'
summary: 消费组的消费延时时间过高
- alert: RocketMQClusterProduceHigh 集群TPS > 20
expr: sum(rocketmq_producer_tps) by (cluster) >= 20
for: 3m
labels:
severity: 警告
annotations:
description: '{{$labels.cluster}} Sending tps too high. now TPS = {{ .Value }}'
summary: cluster send tps too high
重启Prometheus:
systemctl restart prometheus

登到prometheus网页后,可以看到我们的告警添加成功啦:

倘若rocketmq_exporter和prometheus不在一个局域网怎么办呢?别急cpolar来帮你!
5.安装cpolar随时随地开发(被监控主机安装)
5.1 为什么需要cpolar?
跨网络监控RocketMQ?别担心,cpolar来帮你!
在实际运维场景中,你可能会遇到这样的问题:RocketMQ Exporter部署在内网(如公司 IDC 或私有云),而Prometheus Server位于公网或另一个隔离的网络环境(如云上监控平台)——两者不在同一个局域网,无法直接通信!
此时,传统的Prometheus -> Exporter拉取模型就失效了。难道要开放防火墙、配置复杂VPN或反向代理? 太重了!
解决方案:使用cpolar内网穿透工具
cpolar是一款简单高效的内网穿透工具,它能将内网服务安全地暴露到公网,无需公网IP、无需复杂配置。
cpolar可以将你本地电脑中的服务(如SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。
5.1 部署cpolar
❤️以下是安装cpolar步骤:
使用一键脚本安装命令:
sudo curl https://get.cpolar.sh | sh

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)
sudo systemctl status cpolar

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:
打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

6.配置公网地址
登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:
- 隧道名称:可自定义,本例使用了:rocketmq,注意不要与已有的隧道名称重复
-
协议:http
-
本地地址:5557
-
域名类型:随机域名
-
地区:选择China TOP

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。

访问成功。

7.将node_exporter暴露给Prometheus进行远程抓取
返回到监控主机,编辑prometheus配置文件:
vi prometheus.yml
Prometheus可以通过3b745a12.r2.cpolar.top这个公网地址访问到运行在192.168.42.145:9100的rocketmq_exporter服务,从而抓取系统指标。
- targets: ["3b745a12.r2.cpolar.top"]
labels:
app: "rocketmq_exporter"

重启Prometheus:
systemctl restart prometheus

登到prometheus网页后,可以看到我们的抓取成功:

8.保留固定公网地址
使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我这里演示使用的是rocketmq,大家可以自定义。填写备注信息,点击保留。

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道node_exporter,点击右侧的编辑。

修改隧道信息,将保留成功的二级子域名配置到隧道中
- 域名类型:选择二级子域名
- Sub Domain:填写保留成功的二级子域名
- 地区: China TOP
点击更新

更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。

最后,这样一个永久不会变化的二级子域名公网网址即设置好了。至此,我们完成了远程服务器监控搭建。
结尾
至此,我们已完整走通了 从源码编译、本地部署、指标采集到跨网络监控 的全流程。无论是内网环境还是混合云架构,借助RocketMQ Exporter与Prometheus的黄金组合,你都能轻松实现对RocketMQ集群的全面可观测性——不再“盲跑”,不再“猜错”,一切以数据说话。
更重要的是,通过像cpolar这样的轻量级工具,我们打破了网络隔离的壁垒,让监控无处不在,运维更加从容。这不仅是技术的胜利,更是稳定性与效率的双重保障。
可观测性不是奢侈品,而是现代消息中间件的基础设施。 今天你为RocketMQ加上Exporter,明天就能在故障发生前收到告警,在容量瓶颈出现前完成扩容。
现在,就去部署你的第一个/metrics接口吧!
让每一条消息的轨迹清晰可见,让每一个消费延迟无所遁形。
感谢您对本篇文章的喜爱,有任何问题欢迎留言交流。cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站



