導讀:本文將對 RocketMQ-Exporter 的設計實現做一個簡單的介紹,讀者可通過本文了解到 RocketMQ-Exporter 的實現過程,以及通過 RocketMQ-Exporter 來搭建自己的 RocketMQ 監控系統。RocketMQ 在線可交互教程現已登錄知行動手實驗室,PC 端登錄 start.aliyun.com 即可直達。
RocketMQ 雲原生系列文章:
RocketMQ-Exporter 項目的 GitHub 地址:https://github.com/apache/rocketmq-exporterRocketMQ-Exporter 的監控指標和告警指標RocketMQ 介紹
RocketMQ 是一個分布式消息和流數據平臺,具有低延遲、高性能、高可靠性、萬億級容量和靈活的可擴展性。簡單的來說,它由 Broker 伺服器和客戶端兩部分組成,其中客戶端一個是消息發布者客戶端(Producer),它負責向 Broker 伺服器發送消息;另外一個是消息的消費者客戶端(Consumer),多個消費者可以組成一個消費組,來訂閱和拉取消費 Broker 伺服器上存儲的消息。正由於它具有高性能、高可靠性和高實時性的特點,與其他協議組件在 MQTT 等各種消息場景中的結合也越來越多,應用越來越廣泛。而對於這樣一個強大的消息中間件平臺,在實際使用的時候還缺少一個監控管理平臺。當前在開源界,使用最廣泛監控解決方案的就是 Prometheus。與其它傳統監控系統相比較,Prometheus 具有易於管理,監控服務的內部運行狀態,強大的數據模型,強大的查詢語言 PromQL,高效的數據處理,可擴展,易於集成,可視化,開放性等優點。並且藉助於 Prometheus 可以很快速的構建出一個能夠監控 RocketMQ 的監控平臺。Prometheus 簡介
Prometheus Server 是 Prometheus 組件中的核心部分,負責實現對監控數據的獲取,存儲以及查詢。Prometheus Server 可以通過靜態配置管理監控目標,也可以配合使用 Service Discovery 的方式動態管理監控目標,並從這些監控目標中獲取數據。其次 Prometheus Server 需要對採集到的監控數據進行存儲,Prometheus Server 本身就是一個時序資料庫,將採集到的監控數據按照時間序列的方式存儲在本地磁碟當中。最後 Prometheus Server 對外提供了自定義的 PromQL 語言,實現對數據的查詢以及分析。Exporter 將監控數據採集的端點通過 HTTP 服務的形式暴露給 Prometheus Server,Prometheus Server 通過訪問該 Exporter 提供的 Endpoint 端點,即可獲取到需要採集的監控數據。RocketMQ-Exporter 就是這樣一個 Exporter,它首先從 RocketMQ 集群採集數據,然後藉助 Prometheus 提供的第三方客戶端庫將採集的數據規範化成符合 Prometheus 系統要求的數據,Prometheus 定時去從 Exporter 拉取數據即可。當前 RocketMQ Exporter 已被 Prometheus 官方收錄,其地址為 https://github.com/apache/rocketmq-exporter。RocketMQ-Exporter 的具體實現
當前在 Exporter 當中,實現原理如下圖所示:整個系統基於 spring boot 框架來實現。由於 MQ 內部本身提供了比較全面的數據統計信息,所以對於 Exporter 而言,只需要將 MQ 集群提供的統計信息取出然後進行加工而已。所以 RocketMQ-Exporter 的基本邏輯是內部啟動多個定時任務周期性的從 MQ 集群拉取數據,然後將數據規範化後通過端點暴露給 Prometheus 即可。其中主要包含如下主要的三個功能部分:MQAdminExt 模塊通過封裝 MQ 系統客戶端提供的接口來獲取 MQ 集群內部的統計信息。MetricService 負責將 MQ 集群返回的結果數據進行加工,使其符合 Prometheus 要求的格式化數據。Collect 模塊負責存儲規範化後的數據,最後當 Prometheus 定時從 Exporter 拉取數據的時候,Exporter 就將 Collector 收集的數據通過 HTTP 的形式在/metrics 端點進行暴露。RocketMQ-Exporter 的監控指標和告警指標
RocketMQ-Exporter 主要是配合 Prometheus 來做監控,下面來看看當前在 Expoter 中定義了哪些監控指標和告警指標。rocketmq_producer_put_sizerocketmq_consumer_get_sizerocketmq_group_get_latency_by_storetimerocketmq_message_accumulation(rocketmq_producer_offset-rocketmq_consumer_offset)rocketmq_message_accumulation 是一個聚合指標,需要根據其它上報指標聚合生成。sum(rocketmq_producer_tps) by (cluster) >= 10sum(rocketmq_producer_tps) by (cluster) < 1sum(rocketmq_consumer_tps) by (cluster) >= 10sum(rocketmq_consumer_tps) by (cluster) < 1rocketmq_group_get_latency_by_storetime > 1000rocketmq_message_accumulation > value消費者堆積告警指標也是一個聚合指標,它根據消費堆積的聚合指標生成,value 這個閾值對每個消費者是不固定的,當前是根據過去 5 分鐘生產者生產的消息數量來定,用戶也可以根據實際情況自行設定該閾值。告警指標設置的值只是個閾值只是象徵性的值,用戶可根據在實際使用 RocketMQ 的情況下自行設定。這裡重點介紹一下消費者堆積告警指標,在以往的監控系統中,由於沒有像 Prometheus 那樣有強大的 PromQL 語言,在處理消費者告警問題時勢必需要為每個消費者設置告警,那這樣就需要 RocketMQ 系統的維護人員為每個消費者添加,要麼在系統後臺檢測到有新的消費者創建時自動添加。在 Prometheus 中,這可以通過一條如下的語句來實現:(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 這一條語句不僅可以實現為任意一個消費者創建消費告警堆積告警,而且還可以使消費堆積的閾值取一個跟生產者發送速度相關的閾值。這樣大大增加了消費堆積告警的準確性。RocketMQ-Exporter 使用示例
1. 啟動 NameServer 和 Broker要驗證 RocketMQ 的 Spring-Boot 客戶端,首先要確保 RocketMQ 服務正確的下載並啟動。可以參考 RocketMQ 主站的快速開始來進行操作。確保啟動 NameServer 和 Broker 已經正確啟動。
git clone https://github.com/apache/rocketmq-exportercd rocketmq-exportermvn clean installRocketMQ-Exporter 有如下的運行選項rocketmq.config.namesrvAddrrocketmq.config.webTelemetryPath以上的運行選項既可以在下載代碼後在配置文件中更改,也可以通過命令行來設置。編譯出來的 jar 包就叫 rocketmq-exporter-0.0.1-SNAPSHOT.jar,可以通過如下的方式來運行。
java -jar rocketmq-exporter-0.0.1-SNAPSHOT.jar [--rocketmq.config.namesrvAddr="127.0.0.1:9876" ...]首先到 Prometheus官方下載地址去下載 Prometheus 安裝包,當前以 linux 系統安裝為例,選擇的安裝包為 prometheus-2.7.0-rc.1.linux-amd64.tar.gz,經過如下的操作步驟就可以啟動 prometheus 進程。
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=:5555Prometheus 默認監聽埠號為 9090,為了不與系統上的其它進程監聽埠衝突,我們在啟動參數裡面重新設置了監聽埠號為 5555。然後通過瀏覽器訪問 http://<伺服器 IP 地址>:5555,就可以驗證 Prometheus 是否已成功安裝,顯示界面如下:由於 RocketMQ-Exporter 進程已啟動,這個時候可以通過 Prometheus 來抓取 RocketMQ-Exporter 的數據,這個時候只需要更改 Prometheus 啟動的配置文件即可global: scrape_interval: 15s evaluation_interval: 15s
rule_files:
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:5555']
- job_name: 'exporter' static_configs: - targets: ['localhost:5557']更改配置文件後,重啟服務即可。重啟後就可以在 Prometheus 界面查詢 RocketMQ-Exporter 上報的指標,例如查詢 rocketmq_broker_tps 指標,其結果如下:在 Prometheus 可以展示 RocketMQ-Exporter 的指標後,就可以在 Prometheus 中配置 RocketMQ 的告警指標了。在 Prometheus 的配置文件中添加如下的告警配置項,*.rules 表示可以匹配多個後綴為 rules 的文件。
rule_files: # - "first_rules.yml" # - "second_rules.yml" - /home/prometheus/prometheus-2.7.0-rc.1.linux-amd64/rules/*.rules當前設置的告警配置文件為 warn.rules,其文件具體內容如下所示。其中的閾值只起一個示例的作用,具體的閾值還需用戶根據實際使用情況來自行設定。
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 的看一下告警展示效果,紅色表示當前處於告警狀態的項,綠色表示正常狀態。6. Grafana dashboard for RocketMQPrometheus 自身的指標展示平臺沒有當前流行的展示平臺 Grafana 好, 為了更好的展示 RocketMQ 的指標,可以使用 Grafana 來展示 Prometheus 獲取的指標。首先到官網去下載:https://grafana.com/grafana/download,這裡仍以二進位文件安裝為例進行介紹。
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/同樣為了不與其它進程的使用埠衝突,可以修改 conf 目錄下的 defaults.ini 文件的監聽埠,當前將 grafana 的監聽埠改為 55555,然後使用如下的命令啟動即可:然後通過瀏覽器訪問 http://<伺服器 IP 地址>:55555,就可以驗證 grafana 是否已成功安裝。系統默認用戶名和密碼為 admin/admin,第一次登陸系統會要求修改密碼,修改密碼後登陸,界面顯示如下:點擊 Add data source 按鈕,會要求選擇數據源。選擇數據源為 Prometheus,設置數據源的地址為前面步驟啟動的 Prometheus 的地址。點擊創建 dashboard,創建 dashboard 可以自己手動創建,也可以以配置文件導入的方式創建,當前已將 RocketMQ 的 dashboard 配置文件上傳到 Grafana 的官網,這裡以配置文件導入的方式進行創建。這個時候可以到 Grafana 官網去下載當前已為 RocketMQ 創建好的配置文件,地址為:https://grafana.com/dashboards/10477/revisions,如下圖所示:點擊 download 就可以下載配置文件,下載配置文件然後,複製配置文件中的內容粘貼到上圖的粘貼內容處。最後按上述方式就將配置文件導入到 Grafana 了。陳厚道,曾就職於騰訊、盛大、鬥魚等網際網路公司。目前就職於尚德機構,在尚德機構負責基礎架構方面的設計和開發工作。對分布式消息隊列、微服務架構和落地、DevOps 和監控平臺有比較深入的研究。馮慶,曾就職於華為。目前就職於尚德機構,在尚德機構基礎架構團隊負責基礎組件的開發工作。
在 PC 端登錄 start.aliyun.com 知行動手實驗室,沉浸式體驗在線交互教程。