基于 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 和监控平台有比较深刻的研究。

冯庆,曾就任于华为。目前就任于尚德机构,在尚德机构基础架构团队负责基础组件的开发工做。

相关文章
相关标签/搜索