监控实战应用

对于RocketMQ的监控应用有较多的实践案例,除了RocketMQ原生提供的console,还支持集成到Prometheus,搜狐开源的MQCloud也是很好的实现方式,下面着重介绍下集成Promethus的具体步骤。

Prometheus是由SoundCloud开源的监控告警解决方案,主要结构如图10-4所示。

image 2025 02 06 21 01 10 522
Figure 1. 图10-4 Prometheus结构图

Prometheus Server是Prometheus组件的核心部分,负责实现对监控数据的获取、存储以及查询。Prometheus Server可以通过静态配置管理监控目标,也可以配合使用Service Discovery的方式动态管理监控目标,并从这些监控目标中获取数据。Prometheus Server需要对采集到的监控数据进行存储,而它本身就是一个时序数据库,可以将采集到的监控数据按照时间序列存储在本地磁盘中。Prometheus Server对外提供了自定义的PromQL语言,实现了对数据的查询及分析。

Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server访问Exporter提供的端点,即可获取需要采集的监控数据。RocketMQ-Exporter就是这样一个Exporter,它首先从RocketMQ集群采集数据,然后借助Prometheus提供的第三方客户端库将采集的数据规范化成符合Prometheus系统要求的数据,Prometheus定时从Exporter中拉取数据即可。当前RocketMQ Exporter已被Prometheus官方收录,地址为 https://github.com/apache/rocketmq-exporter

RocketMQ-Exporter 的核心结构如图10-5所示。

image 2025 02 06 21 02 11 419
Figure 2. 图10-5 RocketrMQ-Exporter核心结构

整个系统基于Spring Boot框架实现。因为RocketMQ内部提供了比较全面的数据统计信息,所以对于Exporter而言,只需要将RocketMQ集群提供的统计信息取出并进行加工。RocketMQ-Exporter的基本逻辑是内部启动多个定时任务,周期性地从RocketMQ集群拉取数据,然后将数据规范化后通过端点暴露给Prometheus。其中主要包含如下功能。

1)MQAdminExt模块通过封装RocketMQ系统客户端提供的接口来获取集群内部的统计信息。

2)MetricService负责将RocketMQ集群返回的结果数据进行加工,使其成为符合Prometheus 要求的格式化数据。

3)Collect模块负责存储规范化后的数据,最后当Prometheus定时从Exporter拉取数据的时候,Exporter将Collector收集的数据通过HTTP的形式在/metrics端点进行暴露。

通过RocketMQ-Collector集成Prometheus监控的使用示例如下。

确保有在运行的borker和nameserver用于监控。编译RocketMQ-Exporter,用户当前使用需要自行下载Git源码并编译,如代码清单10-11所示。

代码清单10-11 下载Git源码并编译
git clone https://github.com/apache/rocketmq-exporter
cd rocketmq-exporter
mvn clean install

RocketMQ-Exporter的运行选项如表10-1所示。

image 2025 02 06 21 03 49 084
Figure 3. 表10-1 RocketMQ-Exporter的运行选项

表10-1所示的运行选项既可以在下载代码后在配置文件中更改,也可以通过命令行进行设置。编译出来的 JAR 包为 rocketmq-exporter-0.0.1-SNAPSHOT.jar ,可以通过如下命令运行。

java -jar rocketmq-exporter-0.0.1-SNAPSHOT.jar

下面安装Prometheus。首先到Prometheus官方网站下载安装包,本节以Linux系统为例,选择的安装包为prometheus-2.7.0-rc.1.linux-amd64.tar.gz,如代码清单10-12所示,然后就可以启动prometheus进程了。

代码清单10-12 下载安装包
tar -xzf prometheus-2.7.0-rc.1.linux-amd64.tar.gz
cd prometheus-2.7.0-rc.1.linux-amd64/./prometheus  --config.file=prometheus.yml -

Prometheus 默认监听端口号为9090,通过浏览器访问 http://<服务器IP地址>:9090 ,可以验证 Prometheus 是否成功安装。

因为 RocketMQ-Exporter 进程已启动,所以此时只需要更改 Prometheus 启动的配置文件,就可以通过 Prometheus 抓取 RocketMQ-Exporter 的数据。配置文件如图10-6所示。

image 2025 02 06 21 05 41 222
Figure 4. 图10-6 Prometheus启动配置文件

更改配置文件后,重启服务。重启后就可以在Prometheus界面查询RocketMQ-Exporter上报的指标了,例如查询rocketmq_broker_tps指标。

接下来介绍如何在Prometheus中配置RocketMQ的告警指标。在Prometheus的配置文件中添加如代码清单10-13所示的告警配置项,*.rules 表示可以匹配多个后缀为rules的文件。

rule_files:
    # - "first_rules.yml"
    # - "second_rules.yml"
    - /home/prometheus/prometheus-2.7.0-rc.1.linux-amd64/rules/*.rules

当前设置的告警配置文件为warn.rules,文件具体内容详见https://github.com/apache/rocketmq-exporter/blob/master/example.rules ,其中的阈值只起示例作用,具体的阈值还需根据实际使用情况自行设定。

接下来我们看一下告警效果。RocketMQ-Exporter主要用于配合Prometheus监控,下面我们来看当前定义了哪些告警指标,如表10-2所示。

image 2025 02 06 21 07 45 617
Figure 5. 表10-2 RocketMQ-Exporter告警指标

消费堆积告警是一个聚合指标,它是根据消费堆积的聚合指标生成的。value这个阈值对不同的消费者是不固定的,需根据过去5min生产者生产的消息数量而定,用户也可以根据实际情况自行设定该阈值。

告警指标设置的值只是个象征性的值,用户可根据实际使用情况自行设定。这里重点介绍消费堆积告警指标,在以往的监控系统中,因为没有像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

借助这一条语句不仅可以实现为任意一个消费者创建消费告警堆积告警,还可以使消费堆积的阈值与生产者发送速度相关联,这样大大增加了消费堆积告警的准确性,在日常工作中,大家还可以根据实际情况自定义规则。

Prometheus自身的指标展示平台没有当前流行的展示平台Grafana优秀,为了更好地展示RocketMQ的指标,可以使用Grafana展示Prometheus获取的指标。

首先在官网下载Grafana安装包( 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/./bin/grafana-server web

安装、启动完成后点击Add data source按钮,选择Prometheus数据源,我们用Grafana官网10477rocektmq模板进行展示( https://grafana.com/dashboards/10477/revisions )。

以上我们介绍了 RocketMQ-Connector 的实现方式以及使用它集成 Prometheus和Grafana展示监控数据的步骤,具体监控指标如表10-3所示。

image 2025 02 06 21 10 30 910
Figure 6. 表10-3 监控指标

另外,MQCloud是集客户端SDK、运维、监控、预警等功能的RocketMQ企业级一站式服务平台,主要特征如下。

1)跨集群:可以同时管理多个集群,对使用者透明,可以把多套RocketMQ集群进行统一监控与管理,用户在使用的时候无须关注服务端集群资源信息,只需要关注主题的维度。 2)预警功能:针对生产或消费堆积、失败、异常等情况进行预警,可以灵活配置阈值和预警方式。 3)简单明了:直接展示用户视图,包括拓扑、流量、消费状况等指标,优化了原生console的展示界面并提供了更灵活的搜索功能。管理员视图包括集群运维、监控、流程审批,通过管理后台,统一管控集群的启停,创建或删除主题需要经过审核,记录各项操作。 4)安全:用户隔离、操作审批、数据安全,不同用户只能查询和操作自己使用的主题,所有变更操作都需要经过后台管理员审核后才可执行,避免误操作。

MQCloud的核心功能如图10-7所示。

image 2025 02 06 21 11 02 482
Figure 7. 图10-7 MQCloud的核心功能