RabbitMQ 可观测性最佳实践

RabbitMQ 简介

RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写,支持多种客户端。它通过使用交换机(Exchanges)、队列(Queues)和绑定(Bindings)来路由消息,提供灵活的路由功能。RabbitMQ 支持多种消息协议,包括 AMQP 等,使其能够轻松地与多种应用程序集成。

RabbitMQ 作为一款流行的消息队列中间件,其监控对于确保系统的稳定性和性能至关重要。监控能够帮助我们及时发现并解决潜在问题,避免对用户造成影响;通过监控数据,我们可以优化性能,提升系统的处理能力和响应速度;同时,监控还能揭示系统的行为趋势,辅助我们预测未来的系统需求,合理规划资源和扩容,增强系统的可伸缩性和稳定性。此外,监控还包括对 RabbitMQ 的健康检查,如 Erlang VM 的运行状态,以及对 RabbitMQ 特有的指标和操作系统指标的监控,例如套接字描述符使用量、排队消息总数、节点间通信流量率、CPU 利用率和内存使用量等。

观测云

观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。

前置条件

  • RabbitMQ 版本 >= 3.8.14
  • 安装 rabbitmqUbuntu 为例
sql 复制代码
sudo apt-get update
sudo apt-get install rabbitmq-server
sudo service rabbitmq-server start
  • 开启 REST API plug-ins
bash 复制代码
sudo rabbitmq-plugins enable rabbitmq_management
  • 创建 user,比如:
arduino 复制代码
sudo rabbitmqctl add_user guance <SECRET>
sudo rabbitmqctl set_permissions  -p / guance "^aliveness-test$" "^amq.default$" ".*"sudo rabbitmqctl set_user_tags guance monitoring

安装 DataKit

如果未部署 DataKit 可参考如下操作提前部署。

登录观测云控制台,点击「集成」 -「DataKit」 - 「Linux」,拷贝第 2 步中的安装命令。

在 RabbitMQ 的节点上复制该安装命令,安装 DataKit。

安装完成后,DataKit 会提示您使用 datakit monitor 来检查 DataKit 的运行状态,如下图所示:

开启 RabbitMQ 采集器

进入 DataKit 安装目录下的 /usr/local/datakit/conf.d/rabbitmq 目录,复制 rabbitmq.conf.sample 并命名为 rabbitmq.conf。示例如下:

ini 复制代码
[[inputs.rabbitmq]]
  # rabbitmq url ,required
  url = "http://localhost:15672"

  # rabbitmq user, required
  username = "guest"

  # rabbitmq password, required
  password = "guest"

  # ##(optional) collection interval, default is 30s
  # interval = "30s"

  ## Optional TLS Config
  # tls_ca = "/xxx/ca.pem"
  # tls_cert = "/xxx/cert.cer"
  # tls_key = "/xxx/key.key"
  ## Use TLS but skip chain & host verification
  insecure_skip_verify = false

  ## Set true to enable election
  election = true

  # [inputs.rabbitmq.log]
  # files = []
  # #grok pipeline script path
  # pipeline = "rabbitmq.p"

  [inputs.rabbitmq.tags]
  # some_tag = "some_value"
  # more_tag = "some_other_value"
  # ...

配置完成后重启 DataKit 即可。

bash 复制代码
# 终端执行命令
datakit service -R

指标介绍

Metric Description Unit
message_ack_count 客户端确认的消息数量 count
message_ack_rate 每秒客户端确认的消息速率 percent
message_confirm_count 确认的消息数量 count
message_confirm_rate 每秒确认的消息速率 percent
message_deliver_get_count 确认模式下交付给消费者的消息总数,无确认模式下交付给消费者的消息总数,确认模式下响应basic.get的消息总数,以及无确认模式下响应basic.get的消息总数 count
message_deliver_get_rate 确认模式下交付给消费者的消息速率,无确认模式下交付给消费者的消息速率,确认模式下响应basic.get的消息速率,以及无确认模式下响应basic.get的消息速率 percent
message_publish_count 发布的消息数量 count
message_publish_in_count 从通道发布到此概览的消息数量 count
bindings_count 特定队列的绑定数量 count
consumer_utilization 队列消费者可以接收新消息的时间比例 percent
consumers 消费者数量 count
head_message_timestamp 队列头部消息的时间戳,以毫秒显示 msec
memory 与队列关联的Erlang进程消耗的内存字节,包括栈、堆和内部结构 B
message_ack_count 队列中交付给客户端并被确认的消息数量 count
message_ack_rate 每秒交付给客户端并被确认的消息数量 percent
message_deliver_count 确认模式下交付给消费者的消息数量 count
message_deliver_get_count 队列中确认模式下交付给消费者的消息总数,无确认模式下交付给消费者的消息总数,确认模式下响应basic.get的消息总数,以及无确认模式下响应basic.get的消息总数 count
message_deliver_get_rate 队列中确认模式下交付给消费者的消息速率,无确认模式下交付给消费者的消息速率,确认模式下响应basic.get的消息速率,以及无确认模式下响应basic.get的消息速率 percent
message_deliver_rate 确认模式下交付给消费者的消息速率 percent
message_publish_count 队列中发布的消息数量 count
message_publish_rate 每秒发布的消息数量 percent
message_redeliver_count 队列中deliver_get中设置了重新交付标志的消息子集数量 count
message_redeliver_rate 队列中deliver_get中设置了重新交付标志的消息子集每秒数量 percent
messages 队列中的总消息数量 count
messages_rate 每秒队列中的总消息数量 percent
messages_ready 准备交付给客户端的消息数量 count

场景视图

登录观测云控制台,点击「场景」 -「新建仪表板」,输入 "RabbitMQ", 选择 "RabbitMQ 监控视图",点击 "确定" 即可添加。

监控器(告警)

  • 队列消息数过高

通过实时查询队列中的消息总数来监控队列是否有堆积,如果有堆积,可能会影响到数据的延迟消费。

markdown 复制代码
window("M::`rabbitmq_queue`:(last(`messages`)) BY `queue_name`", '5m')
  • 消息重传次数过多

指标 queue_totals_messages_unacknowledged_rate 描述的是 RabbitMQ 中未确认消息的数量的速率。这个指标反映了在 RabbitMQ 队列中,每秒未被消费者确认的消息数量的变化率。

在 RabbitMQ 中,消息的确认机制是非常重要的,因为它确保了消息的可靠传递。当一个消息被消费者接收后,消费者需要发送一个确认(ack)给 RabbitMQ 服务器,表明消息已经被成功处理。如果消费者在处理消息时失败或没有发送确认,那么该消息就是未确认的。

ruby 复制代码
M::`rabbitmq_overview`:(avg(`queue_totals_messages_unacknowledged_rate`)) BY `host_ip`, `url`
  • 队列新增速率过高

queue_totals_messages_rate 是 RabbitMQ 中的一个监控指标,它描述的是队列中未确认消息数量的变化速率,即每秒未确认消息数量的变化率。这个指标对于了解和监控 RabbitMQ 队列的消费情况非常重要。

ruby 复制代码
M::`rabbitmq_overview`:(avg(`queue_totals_messages_rate`) AS `消息速率`) BY `host_ip`
  • 不可用路由突增过高

message_return_unroutable_count_rate 描述的是每秒返回给发布者作为无法路由的消息的速率。在 RabbitMQ 中,当一个消息被发送到交换机(exchange),而该交换机无法将消息路由到任何绑定的队列时,这个消息就被认为是无法路由的。这种情况下,如果设置了备用交换机(alternate exchange),消息将被发送到备用交换机;如果没有设置备用交换机,或者备用交换机同样无法路由该消息,则消息将被返回给发布者。

ruby 复制代码
M::`rabbitmq_overview`:(avg(`message_return_unroutable_count_rate`)) BY `host_ip`, `url`

总结

结合观测云的可视化监控,可以达到实时监控 RabbitMQ 的运行性能,优化资源使用,减少数据延迟,从而改善用户的体验。

相关推荐
AlickLbc13 小时前
RabbitMQ安装记录
分布式·rabbitmq
pursue.dreams13 小时前
Windows 安装 RabbitMQ 保姆级教程
windows·rabbitmq
切糕师学AI2 天前
RabbitMQ 是什么?
微服务·消息队列·rabbitmq
Anastasiozzzz2 天前
解决 RabbitMQ 的可靠性投递与消息重复消费问题思路
分布式·rabbitmq
Ronin3052 天前
订阅者模块
rabbitmq
fchampion2 天前
最终一致性
java·spring·rabbitmq·github·mvc
予枫的编程笔记4 天前
【Kafka基础篇】RabbitMQ、RocketMQ、Kafka怎么选?3种主流MQ核心差异实测解析
kafka·rabbitmq·rocketmq·分布式流处理·发布订阅模型·消息队列(mq)·点对点模型
Ronin3054 天前
连接管理模块和服务器模块
服务器·rabbitmq·网络通信·tcp连接
Jinkxs5 天前
RabbitMQ - 第一个 Hello World 程序:SpringBoot 版极简集成
spring boot·rabbitmq·java-rabbitmq
希忘auto5 天前
详解RabbitMQ高级特性之延迟队列
rabbitmq