RabbitMQ 可观测性最佳实践

    banner.png

    RabbitMQ 简介

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

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

    观测云

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

    前置条件

    • RabbitMQ 版本 >= 3.8.14
    • 安装 rabbitmqUbuntu 为例
    sudo apt-get update
    sudo apt-get install rabbitmq-server
    sudo service rabbitmq-server start
    
    • 开启 REST API plug-ins
    sudo rabbitmq-plugins enable rabbitmq_management
    
    • 创建 user,比如:
    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。示例如下:

    [[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 即可。

    # 终端执行命令
    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 监控视图”,点击 “确定” 即可添加。

    监控器(告警)

    • 队列消息数过高

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

    window("M::`rabbitmq_queue`:(last(`messages`)) BY `queue_name`", '5m')
    

    • 消息重传次数过多

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

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

    M::`rabbitmq_overview`:(avg(`queue_totals_messages_unacknowledged_rate`)) BY `host_ip`, `url`
    

    • 队列新增速率过高

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

    M::`rabbitmq_overview`:(avg(`queue_totals_messages_rate`) AS `消息速率`) BY `host_ip`
    

    • 不可用路由突增过高

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

    M::`rabbitmq_overview`:(avg(`message_return_unroutable_count_rate`)) BY `host_ip`, `url`
    

    总结

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

    联系我们

    加入社区

    微信扫码
    加入官方交流群

    立即体验

    在线开通,按量计费,真正的云服务!

    立即开始

    选择观测云版本

    代码托管平台