一個(gè)服務(wù)搭建起來了妖泄,那總得要監(jiān)控其性能指標(biāo),有問題的時(shí)候要及時(shí)告警通知游添。對(duì)于監(jiān)控類似數(shù)據(jù)庫(kù)、消息隊(duì)列通熄、緩存或者系統(tǒng)性能指標(biāo)的唆涝,使用prometheus+grafana最合適不過了。下面將會(huì) 介紹如何去監(jiān)控RocketMQ唇辨,原文 點(diǎn)我
本文將對(duì) RocketMQ-Exporter 的設(shè)計(jì)實(shí)現(xiàn)做一個(gè)簡(jiǎn)單的介紹廊酣,讀者可以通過本文了解到 RocketMQ-Exporter 的實(shí)現(xiàn)過程,以及通過 RocketMQ-Exporter 來搭建自己的 RocketMQ 監(jiān)控系統(tǒng)赏枚。該項(xiàng)目的 git 地址 https://github.com/apache/rocketmq-exporter
文章主要內(nèi)容包含以下幾個(gè)方面:
- RocketMQ 介紹
- Prometheus 簡(jiǎn)介
- RocketMQ-Exporter 的具體實(shí)現(xiàn)
- RocketMQ-Exporter 的監(jiān)控指標(biāo)和告警指標(biāo)
- RocketMQ-Exporter 使用示例
RocketMQ 介紹
RocketMQ 是一個(gè)分布式消息和流數(shù)據(jù)平臺(tái)亡驰,具有低延遲、高性能饿幅、高可靠性凡辱、萬億級(jí)容量和靈活的可擴(kuò)展性。簡(jiǎn)單的來說栗恩,它由 Broker 服務(wù)器和客戶端兩部分組成透乾,其中客戶端一個(gè)是消息發(fā)布者客戶端 (Producer),它負(fù)責(zé)向 Broker 服務(wù)器發(fā)送消息;另外一個(gè)是消息的消費(fèi)者客戶端 (Consumer)续徽,多個(gè)消費(fèi)者可以組成一個(gè)消費(fèi)組蚓曼,來訂閱和拉取消費(fèi) Broker 服務(wù)器上存儲(chǔ)的消息。正由于它具有高性能钦扭、高可靠性和高實(shí)時(shí)性的特點(diǎn)纫版,與其他協(xié)議組件在 MQTT 等各種消息場(chǎng)景中的結(jié)合也越來越多,應(yīng)用越來越廣泛客情。而對(duì)于這樣一個(gè)強(qiáng)大的消息中間件平臺(tái)其弊,在實(shí)際使用的時(shí)候還缺少一個(gè)監(jiān)控管理平臺(tái)。而當(dāng)前在開源界膀斋,使用最廣泛監(jiān)控解決方案的就是 Prometheus梭伐。與其它傳統(tǒng)監(jiān)控系統(tǒng)相比較,Prometheus 具有易于管理仰担,監(jiān)控服務(wù)的內(nèi)部運(yùn)行狀態(tài)糊识,強(qiáng)大的數(shù)據(jù)模型,強(qiáng)大的查詢語言 PromQL摔蓝,高效的數(shù)據(jù)處理赂苗,可擴(kuò)展,易于集成贮尉,可視化拌滋,開放性等優(yōu)點(diǎn)。并且借助于 Prometheus 可以很快速的構(gòu)建出一個(gè)能夠監(jiān)控 RocketMQ 的監(jiān)控平臺(tái)猜谚。
Prometheus 簡(jiǎn)介
下圖展示了 Prometheus 的基本架構(gòu):
Prometheus Server
Prometheus Server 是 Prometheus 組件中的核心部分败砂,負(fù)責(zé)實(shí)現(xiàn)對(duì)監(jiān)控?cái)?shù)據(jù)的獲取,存儲(chǔ)以及查詢魏铅。 Prometheus Server 可以通過靜態(tài)配置管理監(jiān)控目標(biāo)昌犹,也可以配合使用 Service Discovery 的方式動(dòng)態(tài)管理監(jiān)控目標(biāo),并從這些監(jiān)控目標(biāo)中獲取數(shù)據(jù)沦零。其次 Prometheus Server 需要對(duì)采集到的監(jiān)控?cái)?shù)據(jù)進(jìn)行存儲(chǔ)祭隔,Prometheus Server 本身就是一個(gè)時(shí)序數(shù)據(jù)庫(kù),將采集到的監(jiān)控?cái)?shù)據(jù)按照時(shí)間序列的方式存儲(chǔ)在本地磁盤當(dāng)中路操。最后 Prometheus Server 對(duì)外提供了自定義的 PromQL 語言,實(shí)現(xiàn)對(duì)數(shù)據(jù)的查詢以及分析千贯。
Exporters
Exporter 將監(jiān)控?cái)?shù)據(jù)采集的端點(diǎn)通過 HTTP 服務(wù)的形式暴露給 Prometheus Server屯仗,Prometheus Server 通過訪問該 Exporter 提供的 Endpoint 端點(diǎn),即可獲取到需要采集的監(jiān)控?cái)?shù)據(jù)搔谴。RocketMQ-Exporter 就是這樣一個(gè) Exporter魁袜,它首先從 RocketMQ 集群采集數(shù)據(jù),然后借助 Prometheus 提供的第三方客戶端庫(kù)將采集的數(shù)據(jù)規(guī)范化成符合 Prometheus 系統(tǒng)要求的數(shù)據(jù),Prometheus 定時(shí)去從 Exporter 拉取數(shù)據(jù)即可峰弹。當(dāng)前 RocketMQ Exporter 已被 Prometheus 官方收錄店量,其地址為 https://github.com/apache/rocketmq-exporter
RocketMQ-Exporter 的具體實(shí)現(xiàn)
當(dāng)前在 Exporter 當(dāng)中,實(shí)現(xiàn)原理如下圖所示:
整個(gè)系統(tǒng)基于 spring boot 框架來實(shí)現(xiàn)鞠呈。由于 MQ 內(nèi)部本身提供了比較全面的數(shù)據(jù)統(tǒng)計(jì)信息融师,所以對(duì)于 Exporter 而言,只需要將 MQ 集群提供的統(tǒng)計(jì)信息取出然后進(jìn)行加工而已蚁吝。所以 RocketMQ-Exporter 的基本邏輯是內(nèi)部啟動(dòng)多個(gè)定時(shí)任務(wù)周期性的從 MQ 集群拉取數(shù)據(jù)旱爆,然后將數(shù)據(jù)規(guī)范化后通過端點(diǎn)暴露給 Prometheus 即可。其中主要包含如下主要的三個(gè)功能部分:
- MQAdminExt 模塊通過封裝 MQ 系統(tǒng)客戶端提供的接口來獲取 MQ 集群內(nèi)部的統(tǒng)計(jì)信息窘茁。
- MetricService 負(fù)責(zé)將 MQ 集群返回的結(jié)果數(shù)據(jù)進(jìn)行加工怀伦,使其符合 Prometheus 要求的格式化數(shù)據(jù)。
- Collect 模塊負(fù)責(zé)存儲(chǔ)規(guī)范化后的數(shù)據(jù)山林,最后當(dāng) Prometheus 定時(shí)從 Exporter 拉取數(shù)據(jù)的時(shí)候房待,Exporter 就將 Collector 收集的數(shù)據(jù)通過 HTTP 的形式在 /metrics 端點(diǎn)進(jìn)行暴露。
RocketMQ-Exporter 的監(jiān)控指標(biāo)和告警指標(biāo)
RocketMQ-Exporter 主要是配合 Prometheus 來做監(jiān)控驼抹,下面來看看當(dāng)前在 Expoter 中定義了哪些監(jiān)控指標(biāo)和告警指標(biāo)
- 監(jiān)控指標(biāo)
監(jiān)控指標(biāo) | 含義 |
---|---|
rocketmq_broker_tps | broker 每秒生產(chǎn)消息數(shù)量 |
rocketmq_broker_qps | broker 每秒消費(fèi)消息數(shù)量 |
rocketmq_producer_tps | 某個(gè) topic 每秒生產(chǎn)的消息數(shù)量 |
rocketmq_producer_put_size | 某個(gè) topic 每秒生產(chǎn)的消息大小 (字節(jié)) |
rocketmq_producer_offset | 某個(gè) topic 的生產(chǎn)消息的進(jìn)度 |
rocketmq_consumer_tps | 某個(gè)消費(fèi)組每秒消費(fèi)的消息數(shù)量 |
rocketmq_consumer_get_size | 某個(gè)消費(fèi)組每秒消費(fèi)的消息大小 (字節(jié)) |
rocketmq_consumer_offset | 某個(gè)消費(fèi)組的消費(fèi)消息的進(jìn)度 |
rocketmq_group_get_latency_by_storetime | 某個(gè)消費(fèi)組的消費(fèi)延時(shí)時(shí)間 |
rocketmq_message_accumulation(rocketmq_producer_offset-rocketmq_consumer_offset) | 消息堆積量(生產(chǎn)進(jìn)度 - 消費(fèi)進(jìn)度) |
rocketmq_message_accumulation 是一個(gè)聚合指標(biāo)桑孩,需要根據(jù)其它上報(bào)指標(biāo)聚合生成。
- 告警指標(biāo)
告警指標(biāo) | 含義 |
---|---|
sum(rocketmq_producer_tps) by (cluster) >= 10 | 集群發(fā)送 tps 太高 |
sum(rocketmq_producer_tps) by (cluster) < 1 | 集群發(fā)送 tps 太低 |
sum(rocketmq_consumer_tps) by (cluster) >= 10 | 集群消費(fèi) tps 太高 |
sum(rocketmq_consumer_tps) by (cluster) < 1 | 集群消費(fèi) tps 太低 |
rocketmq_group_get_latency_by_storetime > 1000 | 集群消費(fèi)延時(shí)告警 |
rocketmq_message_accumulation > value | 消費(fèi)堆積告警 |
消費(fèi)者堆積告警指標(biāo)也是一個(gè)聚合指標(biāo)砂蔽,它根據(jù)消費(fèi)堆積的聚合指標(biāo)生成洼怔,value 這個(gè)閾值對(duì)每個(gè)消費(fèi)者是不固定的,當(dāng)前是根據(jù)過去 5 分鐘生產(chǎn)者生產(chǎn)的消息數(shù)量來定左驾,用戶也可以根據(jù)實(shí)際情況自行設(shè)定該閾值镣隶。 告警指標(biāo)設(shè)置的值只是個(gè)閾值只是象征性的值,用戶可根據(jù)在實(shí)際使用 RocketMQ 的情況下自行設(shè)定诡右。這里重點(diǎn)介紹一下消費(fèi)者堆積告警指標(biāo)安岂,在以往的監(jiān)控系統(tǒng)中,由于沒有像 Prometheus 那樣有強(qiáng)大的 PromQL 語言帆吻,在處理消費(fèi)者告警問題時(shí)勢(shì)必需要為每個(gè)消費(fèi)者設(shè)置告警域那,那這樣就需要 RocketMQ 系統(tǒng)的維護(hù)人員為每個(gè)消費(fèi)者添加,要么在系統(tǒng)后臺(tái)檢測(cè)到有新的消費(fèi)者創(chuàng)建時(shí)自動(dòng)添加猜煮。在 Prometheus 中次员,這可以通過一條如下的語句來實(shí)現(xiàn):
(sum(rocketmq_producer_offset) by (topic) - on(topic) group_right sum(rocketmq_consumer_offset) by (group,topic)) - ignoring(group) group_left sum (avg_over_time(rocketmq_producer_tps[5m])) by (topic)*5*60 > 0
借助 PromQL 這一條語句不僅可以實(shí)現(xiàn)為任意一個(gè)消費(fèi)者創(chuàng)建消費(fèi)告警堆積告警,而且還可以使消費(fèi)堆積的閾值取一個(gè)跟生產(chǎn)者發(fā)送速度相關(guān)的閾值王带。這樣大大增加了消費(fèi)堆積告警的準(zhǔn)確性淑蔚。
RocketMQ-Exporter 使用示例
1 啟動(dòng) NameServer 和 Broker
要驗(yàn)證 RocketMQ 的 Spring-Boot 客戶端,首先要確保 RocketMQ 服務(wù)正確的下載并啟動(dòng)愕撰∩采溃可以參考 RocketMQ 主站的快速開始來進(jìn)行操作醋寝。確保啟動(dòng) NameServer 和 Broker 已經(jīng)正確啟動(dòng)。
2 編譯 RocketMQ-Exporter
用戶當(dāng)前使用带迟,需要自行下載 git 源碼編譯
git clone https://github.com/apache/rocketmq-exportercd rocketmq-exportermvn clean install
3 配置和運(yùn)行
RocketMQ-Exporter 有如下的運(yùn)行選項(xiàng)
選項(xiàng) | 默認(rèn)值 | 含義 |
---|---|---|
rocketmq.config.namesrvAddr | 127.0.0.1:9876 | MQ 集群的 nameSrv 地址 |
rocketmq.config.webTelemetryPath | /metrics | 指標(biāo)搜集路徑 |
server.port | 5557 | HTTP 服務(wù)暴露端口 |
以上的運(yùn)行選項(xiàng)既可以在下載代碼后在配置文件中更改音羞,也可以通過命令行來設(shè)置。
編譯出來的 jar 包就叫 rocketmq-exporter-0.0.1-SNAPSHOT.jar仓犬,可以通過如下的方式來運(yùn)行嗅绰。
java -jar rocketmq-exporter-0.0.1-SNAPSHOT.jar [--rocketmq.config.namesrvAddr="127.0.0.1:9876" ...]
4 安裝 Prometheus
首先到 Prometheus 官方下載地址 https://prometheus.io/download/ 去下載 Prometheus 安裝包,當(dāng)前以 linux 系統(tǒng)安裝為例婶肩,選擇的安裝包為 prometheus-2.7.0-rc.1.linux-amd64.tar.gz办陷,經(jīng)過如下的操作步驟就可以啟動(dòng) prometheus 進(jìn)程。
tar -xzf prometheus-2.7.0-rc.1.linux-amd64.tar.gzcd prometheus-2.7.0-rc.1.linux-amd64/./prometheus --config.file=prometheus.yml --web.listen-address=:5555
Prometheus 默認(rèn)監(jiān)聽端口號(hào)為 9090律歼,為了不與系統(tǒng)上的其它進(jìn)程監(jiān)聽端口沖突民镜,我們?cè)趩?dòng)參數(shù)里面重新設(shè)置了監(jiān)聽端口號(hào)為 5555。然后通過瀏覽器訪問 http://< 服務(wù)器 IP 地址 >:5555, 就可以驗(yàn)證 Prometheus 是否已成功安裝险毁,顯示界面如下
由于 RocketMQ-Exporter 進(jìn)程已啟動(dòng)制圈,這個(gè)時(shí)候可以通過 Prometheus 來抓取 RocketMQ-Exporter 的數(shù)據(jù),這個(gè)時(shí)候只需要更改 Prometheus 啟動(dòng)的配置文件即可
整體配置文件如下:
# my global configglobal: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:5555'] - job_name: 'exporter' static_configs: - targets: ['localhost:5557']
更改配置文件后畔况,重啟服務(wù)即可鲸鹦。重啟后就可以在 Prometheus 界面查詢 RocketMQ-Exporter 上報(bào)的指標(biāo),例如查詢 rocketmq_broker_tps 指標(biāo)跷跪,其結(jié)果如下
5 告警規(guī)則添加
在 Prometheus 可以展示 RocketMQ-Exporter 的指標(biāo)后馋嗜,就可以在 Prometheus 中配置 RocketMQ 的告警指標(biāo)了。在 Prometheus 的配置文件中添加如下的告警配置項(xiàng)吵瞻,*.rules 表示可以匹配多個(gè)后綴為 rules 的文件葛菇。
rule_files: # - "first_rules.yml" # - "second_rules.yml" - /home/prometheus/prometheus-2.7.0-rc.1.linux-amd64/rules/*.rules
當(dāng)前設(shè)置的告警配置文件為 warn.rules,其文件具體內(nèi)容如下所示橡羞。其中的閾值只起一個(gè)示例的作用眯停,具體的閾值還需用戶根據(jù)實(shí)際使用情況來自行設(shè)定。
#### Sample prometheus rules/alerts for rocketmq.##### Galera Alerts groups:- name: GaleraAlerts rules: - alert: RocketMQClusterProduceHigh expr: sum(rocketmq_producer_tps) by (cluster) >= 10 for: 3m labels: severity: warning annotations: description: '{{$labels.cluster}} Sending tps too high.' summary: cluster send tps too high - alert: RocketMQClusterProduceLow expr: sum(rocketmq_producer_tps) by (cluster) < 1 for: 3m labels: severity: warning annotations: description: '{{$labels.cluster}} Sending tps too low.' summary: cluster send tps too low - alert: RocketMQClusterConsumeHigh expr: sum(rocketmq_consumer_tps) by (cluster) >= 10 for: 3m labels: severity: warning annotations: description: '{{$labels.cluster}} consuming tps too high.' summary: cluster consume tps too high - alert: RocketMQClusterConsumeLow expr: sum(rocketmq_consumer_tps) by (cluster) < 1 for: 3m labels: severity: warning annotations: description: '{{$labels.cluster}} consuming tps too low.' summary: cluster consume tps too low - alert: ConsumerFallingBehind expr: (sum(rocketmq_producer_offset) by (topic) - on(topic) group_right sum(rocketmq_consumer_offset) by (group,topic)) - ignoring(group) group_left sum (avg_over_time(rocketmq_producer_tps[5m])) by (topic)*5*60 > 0 for: 3m labels: severity: warning annotations: description: 'consumer {{$labels.group}} on {{$labels.topic}} lag behind and is falling behind (behind value {{$value}}).' summary: consumer lag behind - alert: GroupGetLatencyByStoretime expr: rocketmq_group_get_latency_by_storetime > 1000 for: 3m labels: severity: warning annotations: description: 'consumer {{$labels.group}} on {{$labels.broker}}, {{$labels.topic}} consume time lag behind message store time and (behind value is {{$value}}).' summary: message consumes time lag behind message store time too much
最終卿泽,可以在 Prometheus 的看一下告警展示效果莺债,紅色表示當(dāng)前處于告警狀態(tài)的項(xiàng),綠色表示正常狀態(tài)签夭。
6 Grafana dashboard for RocketMQ
Prometheus 自身的指標(biāo)展示平臺(tái)沒有當(dāng)前流行的展示平臺(tái) Grafana 好齐邦, 為了更好的展示 RocketMQ 的指標(biāo),可以使用 Grafana 來展示 Prometheus 獲取的指標(biāo)第租。首先到官網(wǎng)去下載https://grafana.com/grafana/download , 這里仍以二進(jìn)制文件安裝為例進(jìn)行介紹侄旬。
wget https://dl.grafana.com/oss/release/grafana-6.2.5.linux-amd64.tar.gz tar -zxvf grafana-6.2.5.linux-amd64.tar.gzcd grafana-5.4.3/
同樣為了不與其它進(jìn)程的使用端口沖突,可以修改 conf 目錄下的 defaults.ini 文件的監(jiān)聽端口煌妈,當(dāng)前將 grafana 的監(jiān)聽端口改為 55555,然后使用如下的命令啟動(dòng)即可
./bin/grafana-server web
然后通過瀏覽器訪問 http://< 服務(wù)器 IP 地址 >:55555, 就可以驗(yàn)證 grafana 是否已成功安裝。系統(tǒng)默認(rèn)用戶名和密碼為 admin/admin璧诵,第一次登陸系統(tǒng)會(huì)要求修改密碼汰蜘,修改密碼后登陸,界面顯示如下:
點(diǎn)擊 Add data source 按鈕之宿,會(huì)要求選擇數(shù)據(jù)源族操。
選擇數(shù)據(jù)源為 Prometheus,設(shè)置數(shù)據(jù)源的地址為前面步驟啟動(dòng)的 Prometheus 的地址
回到主界面會(huì)要求創(chuàng)建新的 Dashboard
點(diǎn)擊創(chuàng)建 dashboard比被,創(chuàng)建 dashboard 可以自己手動(dòng)創(chuàng)建色难,也可以以配置文件導(dǎo)入的方式創(chuàng)建,當(dāng)前已將 RocketMQ 的 dashboard 配置文件上傳到 Grafana 的官網(wǎng)等缀,這里以配置文件導(dǎo)入的方式進(jìn)行創(chuàng)建枷莉。
點(diǎn)擊 New dashboard 下拉按鈕
選擇 import dashboard
這個(gè)時(shí)候可以到 Grafana 官網(wǎng)去下載當(dāng)前已為 RocketMQ 創(chuàng)建好的配置文件,地址為https://grafana.com/dashboards/10477/revisions 尺迂,如下圖所示
笤妙,點(diǎn)擊 download 就可以下載配置文件,下載配置文件然后噪裕,復(fù)制配置文件中的內(nèi)容粘貼到上圖的粘貼內(nèi)容處蹲盘。
最后按上述方式就將配置文件導(dǎo)入到 Grafana 了。
最終的效果如下所示