RocketMQ 添加監控和系統告警通知

前言

最近由於RocketMQ在使用過程中,發現在某些時候消息堆積,並且還是長時間堆積不消費,這種情況下沒能及時發現,導致客戶投訴,所以就有給RocketMQ增加監控,當出現特定異常時,能夠及時告警,及時處理。
首先提出我們的監控訴求,出現如下情況時,希望能夠及時接收到系統告警通知:

  • RocketMQ 服務宕機
  • RocketMQ 消費者下線
  • RocketMQ 消息出現長時間或者大量堆積

本文將通過修改 rocketmq-console源碼的方式,增加RocketMQ 消費者下線RocketMQ 消息出現長時間或者大量堆積 監控能力。

1. RocketMQ 服務宕機監控告警

這一級別的監控,本質上而言是監控Linux上啓動的Rocket MQ Java進程的運行情況。細分的話,需要監控以下兩個維度:

  1. Linux Java 進程的CPU 使用率,內存使用量;
  2. Java 進程本身的JVM的服務質量,GC,併發數,內存分佈等
    一般的公司在運維方面會有專門的監控組件,如zabbix會做統一處理

監控的方式有很多,比如簡單點的,我們可以寫一個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

2. RocketMQ的集羣組件組成

一個完整的RocketMQ集羣,一般組成關係如下圖所示:
image.png
除了核心組成部分:Name ServerBroker Cluster 之外,RocketMQ還提供了 mqadmin工具,該工具的具體實現代碼在RocketMQ tools模塊(rocketmq-tools-xxxx.jar)中。但是mqadmin命令行在交互上不夠友好,**rocketmq-console**作爲一個社區項目,底層基於mqadmin 核心庫,用Spring Boot+Angularjs實現了一個RocketMQ Web管理端,開發運維人員可以輕鬆地使用此管理端完成日常運維操作。

3. mqadmin–提供一套命令行工具,做RocketMQ的日常管理維護

1.mqadmin 工具在哪兒?

mqadmin本質上是一個Java命令行工具,也就是說執行mqadmin的過程也是執行Java的過程,**mqadmin**的位置和runbrokermqnamesrv並列:
image.png

2.mqadmin能做什麼?

執行./mqadmin,會在命令行輸出其指令列表:
image.png

具體每個指令的作用不是本文的重點,後續會開新的文章介紹~

4. 使用 rocketmq-console添加MQ監控告警

我們可以利用rocketmq-console做如下的監控:

  • RocketMQ 消費者下線
  • RocketMQ 消息出現長時間或者大量堆積

4.1 rocketmq-console的監控告警功能

作爲mqadmin的GUI封裝,rocketmq-console基本上具備了mqadmin的功能外,也提供了一些額外的功能,如dashboard面板統計。但是,作爲開源源碼部分,rocketmq-console將MQ監控功能做了隱藏,我們需要手動放開。如下是使用rocket-console的監控原理:
image.png
當此項功能被放開後,在Consumer菜單下,爲每一個consumer-group 的operation 會增加MONITOR CONFIG 選項,如下圖所示:

image.png
圖中的兩個指標:

指標名稱 說明 備註
minCount 當前消費分組的機器數量最小閾值,低於此值將會告警
minCount 當前消費分組允許的最大消息堆積量,高於辭職將會告警

4.2 如何開啓rocketmq-console的監控告警功能

開源的rocketmq-console將此功能隱藏了,可以通過下載源碼,並修改源碼的方式支持。

4.2.1 下載源碼

從github中獲取源碼,rocketmq-externals
地址:https://github.com/apache/rocketmq-externals

4.2.2 導入項目

項目導入後,如下圖所示,rocketmq-console即爲控制檯代碼
image.png

4.2.3 放開console控制檯的監控參數配置

默認的rocketmq-console將此功能註釋掉了,修改文件:
~/rocketmq-console/src/resources/static/view/pages/consumer.html,將如下圖所示的代碼放開即可。
image.png

4.2.4 開啓定時任務監控,掃描實時數據,做閾值判斷,告警提示

默認情況下,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 
               //根據自身的要求加如通知方式
            }
        }
    }

}
4.2.5 build修改後的代碼,生成可運行的jar包,然後部署運行

image.png

4.2.6 樣例

經筆者改造後的console的控制檯可以顯示出 ‘MONITOR CONFIG’ 配置項:
image.png
釘釘告警樣例:
image.png

5. 總結

rocketmq-console 作爲開發運維人員監控MQ的便捷入口,可根據自身要求改造rocketmq-console,rocketmq-console服務本身可以調用所有mqadmin的所有能力,項目本身基於angularjs +spring boot,作爲java 開發人員來說拓展成本也比較低。不過前期需要對rocketmq的一些概念和各種衡量標準要有明確的認知。

本文沒有對’mqadmin’的具體指令和設計原理展開,將另開文章解釋,有興趣的可關注下,敬請期待~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章