基於 RocketMQ Prometheus Exporter 打造定製化 DevOps 平臺

2022-01-03 阿里巴巴雲原生

收錄於話題 #RocketMQ 雲原生系列文章 3個

導讀:本文將對 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 install


RocketMQ-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=:5555

Prometheus 默認監聽埠號為 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 RocketMQ


Prometheus 自身的指標展示平臺沒有當前流行的展示平臺 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 知行動手實驗室,沉浸式體驗在線交互教程。

相關焦點

  • 使用Prometheus、Grafana監控Artifactory實踐
    在企業的系統平臺上運行artifactory可能每天有上百萬個製品在不斷流轉,隨著研發團隊不斷擴大,用戶慢慢增多,並發量也相應的逐漸增大,在保證高可用的同時,我們對artifactory所在系統及應用服務進行監控會顯得尤其重要。那麼如何實現系統及應用的監控呢?
  • Prometheus 監控MySQL資料庫
    這裡我們演示中,prometheus以及mysqld_exporter都使用容器進行運行。這裡我的伺服器配置為阿里雲2h4g由於Prometheus及相關的exporter會隨著版本發生變化,官方推薦都是最新的版本。
  • CentOS7下簡單搭建Prometheus+Grafana監控系統
    -g prometheus -m -d /opt/prometheus/ -s /sbin/nologin prometheustar -zxf /data/prometheus-2.17.2.linux-amd64.tar.gz -C /optcd /opt/mv prometheus
  • Prometheus+InfluxDB+Grafana 打造高逼格監控平臺
    node_exporter+Prometheus+Grafana 的數據展示邏輯對性能測試來說,在常用的 Grafana+Prometheus+Exporter 的邏輯中,第一步要看的就是作業系統資源了。
  • 監控工具之Prometheus普羅米修斯,搭建和使用
    /prometheus --version5.修改prometheus.yml配置文件vi prometheus.yml,配置相關監控項6.設置prometheus用戶groupadd prometheususeradd -g prometheus
  • Kubernetes 實戰教學,手把手教您用 Helm 在 K8s 平臺上部署 Prometheus
    ==> v1beta1/DaemonSetNAME                                  AGEexcited-elk-prometheus-node-exporter  1s ==> v1/Pod(related) NAME
  • 使用ssl_exporter監控K8S集群證書
    首先創建一個文件prometheus-additional.yaml,其內容如下:- job_name: ssl-exporter  metrics_path: /probe  static_configs:  - targets:    - kubernetes.default.svc
  • Prometheus(普羅米修斯)——適合k8s和docker的監控系統
    介紹Prometheus(普羅米修斯)是一套開源的監控&報警&時間序列資料庫的組合.由SoundCloud公司開發。Prometheus基本原理是通過HTTP協議周期性抓取被監控組件的狀態,這樣做的好處是任意組件只要提供HTTP接口就可以接入監控系統,不需要任何SDK或者其他的集成過程。這樣做非常適合虛擬化環境比如VM或者Docker 。Prometheus應該是為數不多的適合Docker、Mesos、Kubernetes環境的監控系統之一。
  • 玩轉Prometheus必備技能:PromQL 使用基礎
    Prometheus 通過指標名稱(metrics name)以及對應的一組標籤(label)唯一定義一條時間序列。指標名稱反映了監控樣本的基本標識,而 label 則在這個基本特徵上為採集到的數據提供了多種特徵維度。用戶可以基於這些特徵維度過濾、聚合、統計從而產生新的計算後的一條時間序列。
  • 聊聊下一代監控:Prometheus
    2016 年,Prometheus 正式加入 Cloud Native Computing Foundation(CNCF)基金會的項目,成為受歡迎度僅次於 Kubernetes 的項目。2017 年底發布了基於全新存儲層的 2.0 版本,能更好地與容器平臺、雲平臺配合。
  • 使用 Thanos 實現 Prometheus 的高可用
    上面的幾種方案基本上都可以滿足基本的 Prometheus 高可用,但是對於大型集群來說,一個 Prometheus 實例的壓力始終非常大。聯邦集群當單個 Promthues 實例 無法處理大量的採集任務時,這個時候我們就可以使用基於 Prometheus 聯邦集群的方式來將監控任務劃分到不同的 Prometheus 實例中去。
  • open-monitor 1.7.0 版本發布,基於 Prometheus 的分布式監控平臺
    open-monitor是一套基於Prometheus的分布式監控平臺,適用於wecube,WeCube通過監控插件來對資源以及應用的監控及告警
  • Prometheus+Grafana+Alertmanager實現告警推送教程圖文詳解
    在眾多雲平臺中(AWS,OpenStack),Prometheus可以通過平臺自身的API直接自動發現運行於平臺上的各種服務,並抓取他們的信息Kubernetes掌握並管理著所有的容器以及服務信息,那此時Prometheus只需要與Kubernetes打交道就可以找到所有需要監控的容器以及服務對象.
  • Prometheus+Grafana+Alertmanager實現告警推送教程——圖文詳解
    在眾多雲平臺中(AWS,OpenStack),Prometheus可以 通過平臺自身的API直接自動發現運行於平臺上的各種服務,並抓取他們的信息Kubernetes掌握並管理著所有的容器以及服務信息,那此時Prometheus只需要與Kubernetes打交道就可以找到所有需要監控的容器以及服務對象.
  • 小白也能輕鬆上手的Prometheus教程
    這些規則都是基於Prometheus的表達式語言。無論何時,只要符合條件,告警就會被觸發並發送給Alertmanager。現在來看看我們如何添加規則。在資源->工作負載標籤下,我們可以看到Deployment在運行chart時創建了什麼。我們來詳細看看prometheus-server和prometheus-alertmanager。
  • 中小團隊基於Docker的devops實踐
    devops成了我們不二的選擇。  文章是基於目前的環境和團隊規模做的devops實踐總結,方案簡單易懂,容易落地且效果顯著。  實現方法  先來看下流程圖:十分方便  如果發現流量突然增高,可以通過kubernetes快速調整容器副本數量  軟體和工具  代碼管理: svn,git  持續集成: jenkins,shell,python  Docker化: docker,harbor,kubernetes  監控報警: zabbix,prometheus
  • Prometheus Operator 監控ETCD集群
    kubectl edit prometheus k8s -n monitoring2.修改prometheus.yaml文件vim kube-prometheus-master/manifests/prometheus-prometheus.yaml nodeSelector:
  • 使用golang編寫自定義prometheus metrics
    二、環境組件版本備註k8sv1.14ovsv2.9.5go1.14.1三、目標目標就是要通過prometheus去拉取我的ovs bond的網卡狀態指標,那麼這裡我需要編寫一個go程序去獲取我主機的ovs bond信息,並最終以metrics方式暴露供prometheus來拉取,在grafana上展示。