借助于阿里云ARMS Prometheus监控服务和Grafana的指标存储和展示能力,云消息队列 RocketMQ 版提供仪表盘功能。该功能可帮助您一站式、全方位、多维度地统计和观测指标,进而快速了解业务的运行状态。本文介绍仪表盘的应用场景、业务背景、指标详情、计费说明和查询方式。
应用场景
场景一:线上消息消费有异常,消息不能及时被处理,需要及时收到报警,并快速定位问题。
场景二:线上某些订单状态有异常,需要排查对应的消息链路环节是否正常发送消息。
场景三:需要分析消息流量变化趋势、流量分布特点或消息体量,进而进行业务趋势分析规划。
场景四:需要查看和分析应用上下游依赖拓扑情况,进行架构升级优化或改造。
业务背景
云消息队列 RocketMQ 版的消息收发流程中,队列的堆积情况、缓冲情况以及消息处理各关节的耗时等,会直接反映当前业务处理的性能和服务端运行的状态。因此,云消息队列 RocketMQ 版的重点指标主要涉及以下业务场景。
消息堆积场景
如下图所示,表示指定主题的某一队列中各消息的状态:
上图表示指定主题的某一队列中各消息的状态,云消息队列 RocketMQ 版将处于不同处理阶段的消息数量和耗时进行统计,这些指标可直接反映队列中消息的处理速率和堆积情况,通过观察这些指标可初步判断业务的消费是否异常。具体的指标含义和计算公式如下:
分类 | 指标 | 定义 | 计算公式 |
消息数量指标 | 处理中的消息(inflight messages) | 在消费者客户端正在处理,但客户端还未返回消费结果的消息。 | 最晚一条拉取消息的位点-最晚一条提交消息的位点 |
已就绪的消息(ready messages) | 消息在云消息队列 RocketMQ 版服务端已就绪,对消费者可见可被消费的消息。 | 最大消息位点-最晚一条拉取消息的位点 | |
消息堆积量(consumer lag) | 所有未处理完成的消息量。 | 处理中消息量+已就绪消息量 | |
消息耗时指标 | 已就绪消息的就绪时间(ready time) |
| 不涉及 |
已就绪消息的排队时间(ready message queue time) | 最早一条就绪消息的就绪时间和当前时刻的时间差。 该时间反映消费者拉取消息的及时性。 | 当前时间-最早一条就绪消息的就绪时间 | |
消费处理滞后时间(comsumer lag time) | 最早一条未消费完成的消息的就绪时间和当前时刻的时间差。 该时间反映消费者完成消息处理的及时性。 | 当前时间-最早一条未提交消息的就绪时间 |
PushConsumer消费场景
在PushConsumer类型中,消息的实时处理能力是基于SDK内部的典型Reactor线程模型实现的。如下图所示,SDK内置了一个长轮询线程,先将消息异步拉取到SDK内置的缓存队列中,再分别提交到消费线程中,触发监听器执行本地消费逻辑。
具体原理,请参见PushConsumer。
在PushConsumer消费场景下,本地缓冲队列相关指标如下:
本地缓冲队列中的消息量:本地缓冲队列中的消息总条数。
本地缓冲队列中的消息大小:本地缓冲队列中所有消息大小的总和。
消息等待处理时间:消息暂存在本地缓冲队列中的时间。
Metrics指标详情
所有消息收发TPS、消息收发次数或消息条数的相关指标,在计算时以消息大小4 KB和普通消息类型为基准,在其基础上需要乘以消息大小倍数和高级消息类型倍数。具体计算规则,请参见计算规格说明。
Metrics指标中相关字段说明如下:
字段 | 取值 |
Metrics类型 |
|
Label |
|
服务端Metrics指标
Metrics类型 | Metrics name | 单位 | 指标说明 | Label |
Gauge | rocketmq_instance_requests_max | count/s | 实例每分钟消息收发TPS的最大值(不包含被限流的请求)。 取值规则:以1分钟为周期,每秒钟采样一次,取这60次采样的最大值。 |
|
Gauge | rocketmq_instance_requests_in_max | count/s | 实例每分钟消息发送TPS的最大值(不包含被限流的请求)。 取值规则:以1分钟为周期,每秒钟采样一次,取这60次采样的最大值。 |
|
Gauge | rocketmq_instance_requests_out_max | count/s | 实例每分钟消息消费TPS的最大值(不包含被限流的请求)。 取值规则:以1分钟为周期,每秒钟采样一次,取这60次采样的最大值。 |
|
Gauge | rocketmq_instance_requests_in_threshold | count/s | 实例消息发送的限流阈值。 |
|
Gauge | rocketmq_instance_requests_out_threshold | count/s | 实例消息消费的限流阈值。 |
|
Gauge | rocketmq_throttled_requests_in | count | 消息发送的限流次数。 |
|
Gauge | rocketmq_throttled_requests_out | count | 消息消费的限流次数。 |
|
Gauge | rocketmq_instance_elastic_requests_max | count/s | 实例消息收发TPS的最大弹性值。 |
|
Counter | rocketmq_requests_in_total | count | 消息发送相关API的调用次数。 |
|
Counter | rocketmq_requests_out_total | count | 消息消费相关API的调用次数。 |
|
Counter | rocketmq_messages_in_total | message | 生产者发送到服务端的消息数量。 |
|
Counter | rocketmq_messages_out_total | message | 服务端投递给消费者的消息数量,其中包含消费者处理中、处理成功和处理失败的消息。 |
|
Counter | rocketmq_throughput_in_total | byte | 生产者发送到服务端的消息吞吐量。 |
|
Counter | rocketmq_throughput_out_total | byte | 服务端投递给消费者的消息吞吐量,其中消息数量包含消费者处理中、处理成功和处理失败的消息。 |
|
Counter | rocketmq_internet_throughput_out_total | byte | 消息收发所使用的公网下行流量。 |
|
Histogram | rocketmq_message_size | byte | 消息大小的分布情况,发送成功时统计。 分布区间如下:
|
|
Gauge | rocketmq_consumer_ready_messages | message | 已就绪消息量。 在服务端已就绪,可以被消费者消费的消息数量。 指标反映还未被消费者开始处理的消息规模。 |
|
Gauge | rocketmq_consumer_inflight_messages | message | 处理中消息量。 在消费者客户端正在处理,但客户端还未返回消费结果的消息的总量。 |
|
Gauge | rocketmq_consumer_queueing_latency | ms | 已就绪消息排队时间。 最早一条就绪消息的就绪时间和当前时间差。 该时间反映消费者拉取消息的及时性。 |
|
Gauge | rocketmq_consumer_lag_latency | ms | 消费处理延迟时间。 最早一条未消费完成的消息的就绪时间和当前时刻的时间差。 该时间反映消费者完成消息处理的及时性。 |
|
Counter | rocketmq_send_to_dlq_messages | message | 每分钟转为死信状态的消息量。 变成死信状态指的是消息达到最大重投次数后不再投递。 这些不再投递的消息会根据Group的死信策略配置保存至指定Topic或被丢弃。 |
|
Gauge | rocketmq_storage_size | byte | 实例所使用的存储空间大小,包含所有文件的大小。 |
|
生产者Metrics指标
Metrics类型 | Metrics name | 单位 | 指标说明 | Label |
Histogram | rocketmq_send_cost_time | ms | 调用消息发送接口成功的耗时分布情况。 分布区间如下:
|
|
消费者Metrics指标
Metrics类型 | Metrics name | 单位 | 指标说明 | Label |
Histogram | rocketmq_process_time | ms | PushConsumer的消息处理耗时分布情况,包含处理成功和处理失败。
分布区间如下:
|
|
Gauge | rocketmq_consumer_cached_messages | message | PushConsumer本地缓冲队列中的消息条数。 |
|
Gauge | rocketmq_consumer_cached_bytes | byte | PushConsumer本地缓冲队列中消息的总大小。 |
|
Histogram | rocketmq_await_time | ms | 消息在PushConsumer本地缓冲队列中的排队时间的分布情况。
分布区间如下:
|
|
计费说明
云消息队列 RocketMQ 版的仪表盘指标在阿里云ARMS Prometheus监控服务中属于基础指标,基础指标不收取费用。因此,使用仪表盘功能不收取费用。
前提条件
创建服务关联角色
角色名称:AliyunServiceRoleForOns
角色策略名称:AliyunServiceRolePolicyForOns
权限说明:允许云消息队列 RocketMQ 版使用该角色访问您的服务(云监控和ARMS服务)以完成监控报警和仪表盘相关功能。
具体文档说明:服务关联角色。
查看仪表盘
云消息队列 RocketMQ 版支持通过以下入口查看仪表盘:
仪表盘页面:支持查看实例所有Topic和Group的各个指标。
实例详情页面:主要展示指定实例的生产者概览信息、计费相关指标以及限流相关指标。
Topic 详情页面:主要展示指定Topic的生产相关指标以及生产者客户端相关指标。
Group 详情页面:主要展示指定Group的消费堆积相关指标以及消费者客户端相关指标。
- 登录云消息队列 RocketMQ 版控制台,在左侧导航栏单击实例列表。
- 在顶部菜单栏选择地域,如华东1(杭州),然后在实例列表中,单击目标实例名称。
选择以下任一方式查看仪表盘。
实例详情页面:在实例详情页单击仪表盘页签。
仪表盘页面:在左侧导航栏单击仪表盘。
Topic 详情页面:在左侧导航栏单击Topic 管理,在Topic列表中单击目标Topic名称,然后在Topic 详情页面单击仪表盘页签。
Group 详情页面:在左侧导航栏单击Group 管理,在Group列表中单击目标Group名称,然后在Group 详情页面单击仪表盘页签。
仪表盘常见问题
如何将仪表盘的指标数据接入自建Grafana?
云消息队列 RocketMQ 版的所有指标数据已保存到您的阿里云可观测监控 Prometheus 版中,您可以通过可观测监控 Prometheus 版提供的API将云消息队列 RocketMQ 版的仪表盘的指标数据接入到本地自建Grafana中。
具体操作,请参见将Prometheus的监控数据接入本地Grafana。
如何理解实例的TPS Max值?
TPS Max值:以1分钟为统计周期,每秒采样一次,统计结果取这60个采样值的最大值。
具体示例如下:
假设某实例在1分钟内生产60条消息(均为普通消息、每条4 KB大小),则该实例的生产速率为60条/分钟。
如果这60条消息在第1秒发送完成,则该实例在这1分钟内每秒的TPS分别为60、0、0......0。
实例TPS Max值=60 TPS。
如果这60条消息在第1秒发送了40条,第2秒发送了20条,则该实例在这1分钟内每秒的TPS分别为40、20、0、0......0。
实例TPS Max值=40 TPS。