版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1432219
最近由于RocketMQ在使用过程中,发现在某些时候消息堆积,并且还是长时间堆积不消费,这种情况下没能及时发现,导致客户投诉,所以就有给RocketMQ增加监控,当出现特定异常时,能够及时告警,及时处理。
首先提出我们的监控诉求,出现如下情况时,希望能够及时接收到系统告警通知:
本文将通过修改 rocketmq-console源码的方式,增加RocketMQ 消费者下线 和RocketMQ 消息出现长时间或者大量堆积 监控能力。
这一级别的监控,本质上而言是监控Linux上启动的Rocket MQ Java进程的运行情况。细分的话,需要监控以下两个维度:
监控的方式有很多,比如简单点的,我们可以写一个shell脚本,监控执行rocketmqJava进程的存活状态,如果rocketmq crash了,发送告警:
#!/bin/bash
## monitor.sh
while true
do
echo "开始监控rocket broker 进程..."
PID=$(ps -ef | grep java | grep org.apache.rocketmq.broker.BrokerStartup | awk '{printf $2}');
if [ -z $PID ];then
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxx' -H 'Content-Type: application/json' \
-d '
{"msgtype": "text",
"text": {
"content": "【172.xxx.xxx.xxx】rocketmq broker 进程不存在,可能宕机,请尽快排查!"
}
}'
fi
sleep 10
done
一个完整的RocketMQ集群,一般组成关系如下图所示:
除了核心组成部分:Name Server
和 Broker Cluster
之外,RocketMQ还提供了 mqadmin
工具,该工具的具体实现代码在RocketMQ tools
模块(rocketmq-tools-xxxx.jar)中。但是mqadmin命令行在交互上不够友好,**rocketmq-console
**作为一个社区项目,底层基于mqadmin 核心库,用Spring Boot+Angularjs实现了一个RocketMQ Web管理端,开发运维人员可以轻松地使用此管理端完成日常运维操作。
mqadmin本质上是一个Java命令行工具,也就是说执行mqadmin的过程也是执行Java的过程,**mqadmin
**的位置和runbroker
和mqnamesrv
并列:
执行./mqadmin
,会在命令行输出其指令列表:
具体每个指令的作用不是本文的重点,后续会开新的文章介绍~
我们可以利用rocketmq-console做如下的监控:
作为mqadmin的GUI封装,rocketmq-console基本上具备了mqadmin的功能外,也提供了一些额外的功能,如dashboard面板统计。但是,作为开源源码部分,rocketmq-console将MQ监控功能做了隐藏,我们需要手动放开。如下是使用rocket-console的监控原理:
当此项功能被放开后,在Consumer菜单下,为每一个consumer-group 的operation 会增加MONITOR CONFIG
选项,如下图所示:
图中的两个指标:
指标名称 | 说明 | 备注 |
---|---|---|
minCount | 当前消费分组的机器数量最小阈值,低于此值将会告警 | |
minCount | 当前消费分组允许的最大消息堆积量,高于辞职将会告警 | |
开源的rocketmq-console将此功能隐藏了,可以通过下载源码,并修改源码的方式支持。
从github中获取源码,rocketmq-externals
地址:https://github.com/apache/rocketmq-externals
项目导入后,如下图所示,rocketmq-console即为控制台代码
默认的rocketmq-console将此功能注释掉了,修改文件:
~/rocketmq-console/src/resources/static/view/pages/consumer.html
,将如下图所示的代码放开即可。
默认情况下,rocketmq-console只定义了定时任务入口,具体的策略没有任何处理,我们需要根据自己的需求加入自身的告警方式,比如:邮箱,钉钉,短信,微信等等。
其预留的定时任务实现类为:
org.apache.rocketmq.console.task.MonitorTask
定时任务的扫描频率可根据自身系统要求考量设置。
@Component
public class MonitorTask {
private Logger logger = LoggerFactory.getLogger(MonitorTask.class);
@Resource
private MonitorService monitorService;
@Resource
private ConsumerService consumerService;
// @Scheduled(cron = "* * * * * ?")
// 定时任务的扫描频率可根据自身系统要求考量设置
public void scanProblemConsumeGroup() {
for (Map.Entry<String, ConsumerMonitorConfig> configEntry : monitorService.queryConsumerMonitorConfig().entrySet()) {
GroupConsumeInfo consumeInfo = consumerService.queryGroup(configEntry.getKey());
if (consumeInfo.getCount() < configEntry.getValue().getMinCount() || consumeInfo.getDiffTotal() > configEntry.getValue().getMaxDiffTotal()) {
logger.info("op=look consumeInfo {}", JsonUtil.obj2String(consumeInfo));
// notify the alert system
//根据自身的要求加如通知方式
}
}
}
}
经笔者改造后的console的控制台可以显示出 ‘MONITOR CONFIG’ 配置项:
钉钉告警样例:
rocketmq-console 作为开发运维人员监控MQ的便捷入口,可根据自身要求改造rocketmq-console,rocketmq-console服务本身可以调用所有mqadmin
的所有能力,项目本身基于angularjs +spring boot,作为java 开发人员来说拓展成本也比较低。不过前期需要对rocketmq的一些概念和各种衡量标准要有明确的认知。
本文没有对’mqadmin’的具体指令和设计原理展开,将另开文章解释,有兴趣的可关注下,敬请期待~