简介: 本文将对 RocketMQ-Exporter 的设计实现做一个简略的介绍,读者可通过本文理解到 RocketMQ-Exporter 的实现过程,以及通过 RocketMQ-Exporter 来搭建本人的 RocketMQ 监控零碎。RocketMQ 在线可交互教程现已登录知口头手实验室,PC 端登录 start.aliyun.com 即可中转。
作者 | 陈厚道 冯庆
起源 | 阿里巴巴云原生公众号
导读:本文将对 RocketMQ-Exporter 的设计实现做一个简略的介绍,读者可通过本文理解到 RocketMQ-Exporter 的实现过程,以及通过 RocketMQ-Exporter 来搭建本人的 RocketMQ 监控零碎。RocketMQ 在线可交互教程现已登录知口头手实验室,PC 端登录 start.aliyun.com 即可中转。
RocketMQ 云原生系列文章:
- 阿里的 RocketMQ 如何让双十一峰值之下 0 故障
- 当 RocketMQ 遇上 Serverless,会碰撞出怎么的火花?
- 云原生时代 RocketMQ 运维管控的利器 – RocketMQ Operator
- 云原生时代消息中间件的演进路线
- 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台(本文)
RocketMQ-Exporter 我的项目的 GitHub 地址:
https://github.com/apache/rocketmq-exporter
文章次要内容蕴含以下几个方面:
- RocketMQ 介绍
- Prometheus 简介
- RocketMQ-Exporter 的具体实现
- RocketMQ-Exporter 的监控指标和告警指标
- RocketMQ-Exporter 应用示例
RocketMQ 介绍
RocketMQ 是一个分布式音讯和流数据平台,具备低提早、高性能、高可靠性、万亿级容量和灵便的可扩展性。简略的来说,它由 Broker 服务器和客户端两局部组成,其中客户端一个是音讯发布者客户端(Producer),它负责向 Broker 服务器发送音讯;另外一个是音讯的消费者客户端(Consumer),多个消费者能够组成一个生产组,来订阅和拉取生产 Broker 服务器上存储的音讯。
正因为它具备高性能、高可靠性和高实时性的特点,与其余协定组件在 MQTT 等各种音讯场景中的联合也越来越多,利用越来越宽泛。而对于这样一个弱小的消息中间件平台,在理论应用的时候还短少一个监控治理平台。
以后在开源界,应用最宽泛监控解决方案的就是 Prometheus。与其它传统监控零碎相比拟,Prometheus 具备易于治理,监控服务的外部运行状态,弱小的数据模型,弱小的查询语言 PromQL,高效的数据处理,可扩大,易于集成,可视化,开放性等长处。并且借助于 Prometheus 能够很疾速的构建出一个可能监控 RocketMQ 的监控平台。
Prometheus 简介
下图展现了 Prometheus 的根本架构:
-
Prometheus Server
Prometheus Server 是 Prometheus 组件中的外围局部,负责实现对监控数据的获取,存储以及查问。Prometheus Server 能够通过动态配置管理监控指标,也能够配合应用 Service Discovery 的形式动静治理监控指标,并从这些监控指标中获取数据。其次 Prometheus Server 须要对采集到的监控数据进行存储,Prometheus Server 自身就是一个时序数据库,将采集到的监控数据依照工夫序列的形式存储在本地磁盘当中。最初 Prometheus Server 对外提供了自定义的 PromQL 语言,实现对数据的查问以及剖析。
-
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。
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_message_accumulation 是一个聚合指标,须要依据其它上报指标聚合生成。
- 告警指标
消费者沉积告警指标也是一个聚合指标,它依据生产沉积的聚合指标生成,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 应用示例
-
启动 NameServer 和 Broker
要验证 RocketMQ 的 Spring-Boot 客户端,首先要确保 RocketMQ 服务正确的下载并启动。能够参考 RocketMQ 主站的疾速开始来进行操作。确保启动 NameServer 和 Broker 曾经正确启动。
-
编译 RocketMQ-Exporter
用户以后应用,须要自行下载 git 源码编译:
git clone https://github.com/apache/rocketmq-exporter
cd rocketmq-exporter
mvn clean install
-
配置和运行
RocketMQ-Exporter 有如下的运行选项:
以上的运行选项既能够在下载代码后在配置文件中更改,也能够通过命令行来设置。
编译进去的 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 官网下载地址去下载 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 启动的配置文件即可。
整体配置文件如下:
# 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 指标,其后果如下:
-
告警规定增加
在 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 的看一下告警展现成果,红色示意以后处于告警状态的项,绿色示意失常状态。
-
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,第一次登陆零碎会要求批改明码,批改明码后登陆,界面显示如下:
点击 Add data source 按钮,会要求抉择数据源。
抉择数据源为 Prometheus,设置数据源的地址为后面步骤启动的 Prometheus 的地址。
回到主界面会要求创立新的 Dashboard。
点击创立 dashboard,创立 dashboard 能够本人手动创立,也能够以配置文件导入的形式创立,以后已将 RocketMQ 的 dashboard 配置文件上传到 Grafana 的官网,这里以配置文件导入的形式进行创立。
点击 New dashboard 下拉按钮。
抉择 import dashboard。
这个时候能够到 Grafana 官网去下载以后已为 RocketMQ 创立好的配置文件,地址为:https://grafana.com/dashboards/10477/revisions,如下图所示:
点击 download 就能够下载配置文件,下载配置文件而后,复制配置文件中的内容粘贴到上图的粘贴内容处。
最初按上述形式就将配置文件导入到 Grafana 了。
最终的成果如下所示:
作者简介
陈厚道,曾就任于腾讯、隆重、斗鱼等互联网公司。目前就任于尚德机构,在尚德机构负责基础架构方面的设计和开发工作。对分布式音讯队列、微服务架构和落地、DevOps 和监控平台有比拟深刻的钻研。
冯庆 ,曾就任于华为。目前就任于尚德机构,在尚德机构基础架构团队负责根底组件的开发工作。
原文链接
本文为阿里云原创内容,未经容许不得转载。