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

頭圖.png

做者 | 陳厚道  馮慶
來源 | 阿里巴巴雲原生公衆號java

導讀:本文將對 RocketMQ-Exporter 的設計實現作一個簡單的介紹,讀者可經過本文了解到 RocketMQ-Exporter 的實現過程,以及經過 RocketMQ-Exporter 來搭建本身的 RocketMQ 監控系統。RocketMQ 在線可交互教程現已登陸知行動手實驗室,PC 端登陸 start.aliyun.com 便可直達。linux

RocketMQ 雲原生系列文章:git

RocketMQ-Exporter 項目的 GitHub 地址:
https://github.com/apache/rocketmq-exportergithub

文章主要內容包含如下幾個方面:web

  1. RocketMQ 介紹
  2. Prometheus 簡介
  3. RocketMQ-Exporter 的具體實現
  4. RocketMQ-Exporter 的監控指標和告警指標
  5. RocketMQ-Exporter 使用示例

RocketMQ 介紹

RocketMQ 是一個分佈式消息和流數據平臺,具備低延遲、高性能、高可靠性、萬億級容量和靈活的可擴展性。簡單的來講,它由 Broker 服務器和客戶端兩部分組成,其中客戶端一個是消息發佈者客戶端(Producer),它負責向 Broker 服務器發送消息;另一個是消息的消費者客戶端(Consumer),多個消費者能夠組成一個消費組,來訂閱和拉取消費 Broker 服務器上存儲的消息。spring

正因爲它具備高性能、高可靠性和高實時性的特色,與其餘協議組件在 MQTT 等各類消息場景中的結合也愈來愈多,應用愈來愈普遍。而對於這樣一個強大的消息中間件平臺,在實際使用的時候還缺乏一個監控管理平臺。數據庫

當前在開源界,使用最普遍監控解決方案的就是 Prometheus。與其它傳統監控系統相比較,Prometheus 具備易於管理,監控服務的內部運行狀態,強大的數據模型,強大的查詢語言 PromQL,高效的數據處理,可擴展,易於集成,可視化,開放性等優勢。而且藉助於 Prometheus 能夠很快速的構建出一個可以監控 RocketMQ 的監控平臺。apache

Prometheus 簡介

下圖展現了 Prometheus 的基本架構:瀏覽器

1.png

1. Prometheus Server

Prometheus Server 是 Prometheus 組件中的核心部分,負責實現對監控數據的獲取,存儲以及查詢。Prometheus Server 能夠經過靜態配置管理監控目標,也能夠配合使用 Service Discovery 的方式動態管理監控目標,並從這些監控目標中獲取數據。其次 Prometheus Server 須要對採集到的監控數據進行存儲,Prometheus Server 自己就是一個時序數據庫,將採集到的監控數據按照時間序列的方式存儲在本地磁盤當中。最後 Prometheus Server 對外提供了自定義的 PromQL 語言,實現對數據的查詢以及分析。服務器

2. Exporters

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

2.png

RocketMQ-Exporter 的具體實現

當前在 Exporter 當中,實現原理以下圖所示:

3.png

整個系統基於 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 中定義了哪些監控指標和告警指標。

  • 監控指標

4.jpg

rocketmq_message_accumulation 是一個聚合指標,須要根據其它上報指標聚合生成。

  • 告警指標

5.jpg

消費者堆積告警指標也是一個聚合指標,它根據消費堆積的聚合指標生成,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 已經正確啓動。

2. 編譯 RocketMQ-Exporter

用戶當前使用,須要自行下載 git 源碼編譯:

git clone https://github.com/apache/rocketmq-exporter
cd rocketmq-exporter
mvn clean install

3. 配置和運行

RocketMQ-Exporter 有以下的運行選項:

6.jpg

以上的運行選項既能夠在下載代碼後在配置文件中更改,也能夠經過命令行來設置。

編譯出來的 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" ...]

4. 安裝 Prometheus

首先到 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 是否已成功安裝,顯示界面以下:

7.png

因爲 RocketMQ-Exporter 進程已啓動,這個時候能夠經過 Prometheus 來抓取 RocketMQ-Exporter 的數據,這個時候只須要更改 Prometheus 啓動的配置文件便可。

總體配置文件以下:

# my global config
global:
   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']

更改配置文件後,重啓服務便可。重啓後就能夠在 Prometheus 界面查詢 RocketMQ-Exporter 上報的指標,例如查詢 rocketmq_broker_tps 指標,其結果以下:

8.png

5. 告警規則添加

在 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,其文件具體內容以下所示。其中的閾值只起一個示例的做用,具體的閾值還需用戶根據實際使用狀況來自行設定。

###
# 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 的看一下告警展現效果,紅色表示當前處於告警狀態的項,綠色表示正常狀態。

9.png

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.gz
cd grafana-5.4.3/

一樣爲了避免與其它進程的使用端口衝突,能夠修改 conf 目錄下的 defaults.ini 文件的監聽端口,當前將 grafana 的監聽端口改成 55555,而後使用以下的命令啓動便可:

./bin/grafana-server web

而後經過瀏覽器訪問 http://<服務器 IP 地址>:55555,就能夠驗證 grafana 是否已成功安裝。系統默認用戶名和密碼爲 admin/admin,第一次登錄系統會要求修改密碼,修改密碼後登錄,界面顯示以下:

10.png

點擊 Add data source 按鈕,會要求選擇數據源。

11.png

選擇數據源爲 Prometheus,設置數據源的地址爲前面步驟啓動的 Prometheus 的地址。

12.png

回到主界面會要求建立新的 Dashboard。

13.png

點擊建立 dashboard,建立 dashboard 能夠本身手動建立,也能夠以配置文件導入的方式建立,當前已將 RocketMQ 的 dashboard 配置文件上傳到 Grafana 的官網,這裏以配置文件導入的方式進行建立。

14.png

點擊 New dashboard 下拉按鈕。

15.png

選擇 import dashboard。

16.png

這個時候能夠到 Grafana 官網去下載當前已爲 RocketMQ 建立好的配置文件,地址爲:https://grafana.com/dashboards/10477/revisions,以下圖所示:

17.png

點擊 download 就能夠下載配置文件,下載配置文件而後,複製配置文件中的內容粘貼到上圖的粘貼內容處。

最後按上述方式就將配置文件導入到 Grafana 了。

18.png

最終的效果以下所示:

19.png

做者簡介

陳厚道,曾就任於騰訊、盛大、鬥魚等互聯網公司。目前就任於尚德機構,在尚德機構負責基礎架構方面的設計和開發工做。對分佈式消息隊列、微服務架構和落地、DevOps 和監控平臺有比較深刻的研究。

馮慶,曾就任於華爲。目前就任於尚德機構,在尚德機構基礎架構團隊負責基礎組件的開發工做。

相關文章
相關標籤/搜索