rocketmq-exporter 安装配置

介绍

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

RocketMQ 介绍

RocketMQ 是一个分布式消息和流数据平台,具有低延迟、高性能、高可靠性、万亿级容量和灵活的可扩展性。简单的来说,它由 Broker 服务器和客户端两部分组成,其中客户端一个是消息发布者客户端(Producer),它负责向 Broker 服务器发送消息;另外一个是消息的消费者客户端(Consumer),多个消费者可以组成一个消费组,来订阅和拉取消费 Broker 服务器上存储的消息。
正由于它具有高性能、高可靠性和高实时性的特点,与其他协议组件在 MQTT 等各种消息场景中的结合也越来越多,应用越来越广泛。而对于这样一个强大的消息中间件平台,在实际使用的时候还缺少一个监控管理平台。
当前在开源界,使用最广泛监控解决方案的就是 Prometheus。与其它传统监控系统相比较,Prometheus 具有易于管理,监控服务的内部运行状态,强大的数据模型,强大的查询语言 PromQL,高效的数据处理,可扩展,易于集成,可视化,开放性等优点。并且借助于 Prometheus 可以很快速的构建出一个能够监控 RocketMQ 的监控平台。

RocketMQ-Exporter 的具体实现

当前在 Exporter 当中,实现原理如下图所示:
image.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 中定义了哪些监控指标和告警指标。

Broker

监控指标指标描述
rocketmq_broker_tpsBroker 每秒生成消息数
rocketmq_broker_qpsBroker 每秒消耗消息

Producer

监控指标指标描述
rocketmq_producer_tps每个topic 每秒生成的消息数
rocketmq_producer_message_sizetopic 每秒生成的消息大小(以字节为单位)
rocketmq_producer_offsettopic 的生产消息进度

Consumer Groups

监控指标指标描述
rocketmq_consumer_tps某个消费组每秒消费的消息数量
rocketmq_consumer_message_size某个消费组每秒消耗的消息大小(以字节为单位)
rocketmq_consumer_offset某个消费组的消费消息进度
rocketmq_group_get_latency一个队列在某个topic上的消费延迟
rocketmq_group_get_latency_by_storetime某个消费组的消费延时时间
rocketmq_message_accumulation消费堆积量(生产进度-消费进度)

rocketmq_message_accumulation 是一个聚合指标,需要根据其它上报指标聚合生成。

Consumer

监控指标指标描述
rocketmq_client_consume_fail_msg_count一小时内消息消耗失败数量
rocketmq_client_consume_fail_msg_tps每秒消息消耗失败数
rocketmq_client_consume_ok_msg_tps每秒消费成功的消息数
rocketmq_client_consume_rt消费每条消息的平均时间
rocketmq_client_consumer_pull_rt拉取每条消息的平均时间
rocketmq_client_consumer_pull_tps客户端每秒拉取的消息数

RocketMQ-Exporter 的监控指标

###告警指标
image.png
消费者堆积告警指标也是一个聚合指标,它根据消费堆积的聚合指标生成,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

官方未直接提供镜像,需要我们下载源码然后mvn package -Dmaven.test.skip=true docker:build 生成镜像

编译 RocketMQ-Exporter

用户当前使用,需要自行下载 git 源码编译:

#clone 
git clone https://github.com/apache/rocketmq-exporter.git
cd rocketmq-exporter

#Build Binary
mvn clean install -DskipTests=true -Dcheckstyle.skip=true

#Build Docker Image
mvn package -Dmaven.test.skip=true docker:build

编译docker镜像时出现以下报错:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  10.404 s
[INFO] Finished at: 2024-07-03T17:11:14+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:0.4.11:build (default-cli) on project rocketmq-exporter: Exception caught: manifest for java:8 not found: manifest unknown: manifest unknown -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

原因
官方的 Java 镜像已经被重命名为 openjdk,尝试将 java:8 更改为 openjdk:8。
解决方法

cd rocketmq-exporter
sed -i 's/java:8/openjdk:8/g' src/main/docker/Dockerfile

出现以下报错:
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:0.4.11:build (default-cli) on project rocketmq-exporter: Exception caught: ADD failed: file not found in build context or excluded by .dockerignore: stat rocketmq-exporter-0.0.2-SNAPSHOT-exec.jar: file does not exist -> [Help 1]

解决方法

# Dockerfile 修改正确的生成包版本
sed -i 's/0.0.2-SNAPSHOT-exec/0.0.3-SNAPSHOT-exec/g' src/main/docker/Dockerfile

查看生成的docker镜像

# docker images -a |grep 'rocketmq-exporter'
rocketmq-exporter                                                             0.0.3-SNAPSHOT                              f51b77bb1132   54 seconds ago   580MB
rocketmq-exporter                                                             latest                                      f51b77bb1132   54 seconds ago   580MB

配置 application.yml​

RocketMQ-Exporter 有如下的运行选项。有关配置示例,请参阅 application.properties

nameDefaultDescription
rocketmq.config.namesrvAddr127.0.0.1:9876MQ集群的nameSrv地址
rocketmq.config.webTelemetryPath/metrics指标的搜集路径,使用默认值即可.
server.port5557要侦听 Web 界面和探测的地址
rocketmq.config.rocketmqVersionV4_3_2rocketmq broker version
rocketmq.config.enableACLfalse如果 RocketMQ 集群开启了 ACL 验证,需要配置为 true, 并在 accessKey 和 secretKey 中配置相应的 ak, sk.
rocketmq.config.outOfTimeSeconds60配置存储指标和相应的值的过期时间,若超过该时间,cache 中的 key 对应的节点没有发生写更改,则会进行删除.一般配置为 60s 即可(根据 prometheus 获取指标的时间间隔进行合理配置,只要保证过期时间大于等于 prometheus 收集指标的时间间隔即可)

以上的运行选项既可以在下载代码后在配置文件中更改,也可以通过命令行来设置。

运行服务

运行二进制文件

编译出来的 jar 包就叫 rocketmq-exporter-0.0.1-SNAPSHOT.jar,可以通过如下的方式来运行。

java -jar target/rocketmq-exporter-0.0.2-SNAPSHOT-exec.jar [--rocketmq.config.namesrvAddr="127.0.0.1:9876" ...]
运行 Docker 镜像

笔者已经制作好并上传至docker hub,嫌构建麻烦的同学可直接使用。
docker pull sawyerlan/rocketmq-exporter:latest # https://hub.docker.com/repository/docker/sawyerlan/rocketmq-exporter

docker run --name rocketmq-exporter --restart=always  -p 5557:5557 -d  sawyerlan/rocketmq-exporter  --rocketmq.config.namesrvAddr="172.30.0.150:9876;172.30.0.151:9876"

将上面的地址修改为你RocketMQ nameserver 的地址,笔者的nameserver有2个。
接下来访问 http://{{你的ip}}:5557/metrics 就可以获取到监控指标

编写 docker-compose
version: "3"

services:
  rocketmq-exporter-service:
    container_name: rocketmq-exporter
    image: rocketmq-exporter:0.0.3-SNAPSHOT
    restart: always
    ports:
      - "5557:5557"
    command: ["--rocketmq.config.namesrvAddr=172.30.0.11:9876;172.30.0.12:9876"]
# 运行容器 rocketmq-exporter
docker-compose -f /opt/rocketmq-exporter/docker-compose-rocketmq-exporter.yaml up -d
编写 deployment
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: rocketmq-exporter
    app.kubernetes.io/name: rocketmq-exporter
  name: rocketmq-exporter
  namespace: monitoring
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
  selector:
    matchLabels:
      app.kubernetes.io/component: rocketmq-exporter
      app.kubernetes.io/name: rocketmq-exporter
  template:
    metadata:
      labels:
        app.kubernetes.io/component: rocketmq-exporter
        app.kubernetes.io/name: rocketmq-exporter
    spec:
      automountServiceAccountToken: false
      containers:
      - args:
        - --rocketmq.config.namesrvAddr=172.30.0.11:9876;172.30.0.12:9876
        - --rocketmq.config.enableACL=true
        - --rocketmq.config.accessKey=ops
        - --rocketmq.config.secretKey=pw.123
        image: rocketmq-exporter:0.0.3-SNAPSHOT
        name: rocketmq-exporter
        ports:
        - containerPort: 5557
          name: http
          protocol: TCP
        resources:
          limits:
            cpu: 500m
            memory: 1000Mi
          requests:
            cpu: 100m
            memory: 180Mi
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          readOnlyRootFilesystem: false
          seccompProfile:
            type: RuntimeDefault
---
apiVersion: v1
kind: Service
metadata:
  name: rocketmq-exporter
  namespace: monitoring
  labels:
    app.kubernetes.io/component: rocketmq-exporter
    app.kubernetes.io/name: rocketmq-exporter
  annotations:
    prometheus.io/port: '5557'
    #prometheus.io/scrape: 'true'
spec:
  ports:
  - name: http
    protocol: TCP
    port: 5557
    targetPort: 5557
  selector:
    app.kubernetes.io/component: rocketmq-exporter
    app.kubernetes.io/name: rocketmq-exporter
    

配置Prometheus监控RocketMQ

静态方式

  - job_name: 'rocketmq-exporter'
    static_configs:
    - targets: ['localhost:5557']
      labels:
        Env: 'develop'
        Cluster: 'local'

reload 你的Prometheus使配置生效

curl -X POST http:/localhost:9090/-/reload

配置告警规则

# rules_rocketmq.yml 
groups:
- name: rocketmq
  rules:
  - alert: RocketMQ Exporter is Down 
    expr: up{job="rocketmq"} == 0
    for: 20s
    labels: 
      severity: '灾难'
    annotations:
      summary: RocketMQ {{ $labels.instance }} is down
  - alert: RocketMQ 存在消息积压
    expr: (sum(irate(rocketmq_producer_offset[1m])) by (topic)  - on(topic) group_right sum(irate(rocketmq_consumer_offset[1m])) by (group,topic)) > 5
    for: 5m
    labels: 
      severity: '警告'
    annotations:
      summary: RocketMQ (group={{ $labels.group }} topic={{ $labels.topic }})积压数 = {{ .Value }}
  - alert: GroupGetLatencyByStoretime 消费组的消费延时时间过高
    expr: rocketmq_group_get_latency_by_storetime/1000  > 5 and rate(rocketmq_group_get_latency_by_storetime[5m]) >0
    for: 3m
    labels:
      severity: 警告
    annotations:
      description: 'consumer {{$labels.group}} on {{$labels.broker}}, {{$labels.topic}} consume time lag behind message store time
        and (behind value is {{$value}}).'
      summary: 消费组的消费延时时间过高
  - alert: RocketMQClusterProduceHigh 集群TPS > 20
    expr: sum(rocketmq_producer_tps) by (cluster) >= 20
    for: 3m
    labels:
      severity: 警告
    annotations:
      description: '{{$labels.cluster}} Sending tps too high. now TPS = {{ .Value }}'
      summary: cluster send tps too high

reload 你的Prometheus使配置生效

curl -X POST http:/localhost:9090/-/reload
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑、在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值