bigywater.tech
RabbitMQ · 31

管理 API 与监控指标

监控 RabbitMQ 用管理 API 还是 Prometheus?它们的数据多新?哪些指标最该报警?管理插件会不会拖慢 broker?这篇用同一个 broker 把几种读数摆在一起比。

7.7 s
发布 1000 条后,管理 API 才反映出消息数的时间(rabbitmqctl 立即可见)
1689 行
Prometheus /metrics 默认返回的指标行数,抓取一次 16 ms
339 vs 333 ms
带 / 不带管理插件时发布 20000 条的耗时,没有可测的差别

入口

实测 · 本机执行输出
  /api/overview 顶层键: cluster_name, erlang_version, listeners, message_stats, node, object_totals, queue_totals, rabbitmq_version
  刚建好队列时 /api/queues/%2F/mq 一共 15 个键: ['arguments', 'auto_delete', 'consumer_details', 'deliveries', 'durable', 'exclusive', 'garbage_collection', 'incoming', 'internal', 'internal_owner', 'name', 'node', 'state', 'type', 'vhost'](没有 messages、consumers 这些——统计还没来)
  过了 12 秒再读:/api/nodes[0] 里和资源有关的键: disk_free, disk_free_alarm, disk_free_details, disk_free_limit, fd_used, fd_used_details, mem_limit, mem_used, mem_used_details, proc_used, proc_used_details, run_queue, sockets_used, sockets_used_details, uptime
  /api/queues/%2F/mq 的键(节选): consumers, memory, messages, messages_details, messages_persistent, messages_ram, messages_ready, messages_ready_details, messages_ready_ram, messages_unacknowledged, messages_unacknowledged_details, messages_unacknowledged_ram, node, state, type

管理 API(/api/overview、/api/nodes、/api/queues/…)提供 JSON;Prometheus 插件在另一个端口提供 /metrics。

滞后

实测 · 本机执行输出
  采样 (秒, rabbitmqctl, 管理 API): [(0.4, 1000, 0), (1.4, 1000, 0), (2.3, 1000, 0), (3.1, 1000, 0)] … [(7.7, 1000, 1000), (8.6, 1000, 1000)]
  rabbitmqctl 一开始就是 1000;管理 API 在 7.7 秒后才显示 1000
  $ rabbitmqctl eval "application:get_env(rabbit, collect_statistics_interval)."  →  {ok,5000}

管理 API 的统计按 collect_statistics_interval(5000 ms)周期收集,刚发完的消息要等数秒才反映在队列的 messages 里;rabbitmqctl list_queues 是实时的。

速率

实测 · 本机执行输出
  (第几秒, publish_details.rate, messages): [(1, 0, None), (4, 0.0, 0), (7, 0.0, 0), (10, 200.0, 1000), (13, 200.0, 1000), (16, 200.0, 2001), (19, 200.0, 3002)]
  最后 5 次读数的 rate: [200.0, 200.0, 200.0, 200.0, 200.0](真实速率 200 条/秒;rate 是按统计周期平滑出来的)

publish_details.rate 在统计到来后稳定显示 200.0,和真实速率一致,但绝对数量仍然滞后。

Prometheus

实测 · 本机执行输出
  /metrics 返回 181956 字节,1689 行指标(不含注释)
  rabbitmq_queue_messages_ready               → rabbitmq_queue_messages_ready 5003
  rabbitmq_queue_messages_unacked             → rabbitmq_queue_messages_unacked 0
  rabbitmq_connections                        → rabbitmq_connections 2
  rabbitmq_channels                           → rabbitmq_channels 2
  rabbitmq_process_resident_memory_bytes      → rabbitmq_process_resident_memory_bytes 92848128
  rabbitmq_global_messages_received_total     → rabbitmq_global_messages_received_total{protocol="amqp091"} 5027.0
  抓取一次 /metrics 用了 16 ms
  请求一次 /api/overview 用了 9 ms
  /metrics/per-object 返回 186111 字节,默认 /metrics 返回 181956 字节(这里只有 3 个队列、2 条连接,差别很小;对象多了 per-object 会按对象数线性变大)

默认 1689 行指标、约 180 KB,抓取 16 ms;per-object 模式会随队列、连接数增大。

该盯什么

实测 · 本机执行输出
  这个节点: mem_used 85 MiB / mem_limit 614 MiB;proc_used 442 / proc_total 1048576
  macOS 上的 fd_used=0、sockets_used=0、disk_free=0:这三个读数在这台机器上拿不到真实值(显示 0),监控它们要在 Linux 上做
  队列 rq: messages_ready 3002, messages_unacknowledged 0, consumers 0

messages_ready(堆积)、messages_unacknowledged、consumers、内存、文件描述符;macOS 上 fd / sockets / disk_free 读数为 0,不能用来验证。

开销

实测 · 本机执行输出
  带管理插件: 339 ms;不带管理插件: 333 ms

带管理插件和不带管理插件,发布吞吐没有可测的差别。

分步演示

管理 API 与监控
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / RabbitMQ 4.3.6 / Erlang/OTP 28.5 / pika 1.4.4(Homebrew 与临时虚拟环境);所有节点都是本机自己起的 RabbitMQ 进程(127.0.0.1,端口 9500 以上,每个实验独立的数据目录与节点名,不连任何外部服务);命令输出来自真实的 rabbitmqctl 与管理 API,发布与消费用 pika 的真实连接;计时用 time.perf_counter,数字每次运行会有小幅抖动。管理 API 用 guest 账号 HTTP 读取;Prometheus 插件启用在 9590 端口;“实时”读数来自 rabbitmqctl list_queues;速率实验以 200 条/秒发布 20 秒,每秒读一次;开销实验各自起一个独立节点(带 / 不带管理插件),3 轮取中位数
    • 没有验证:集群里管理 API 的聚合延迟;大量队列(上万)时管理 API 与 Prometheus 的开销;Linux 上 fd / socket / 磁盘读数;rabbitmq_top 插件和 rabbitmq_tracing 插件;把 collect_statistics_interval 调小的效果与代价;告警规则的具体阈值
    京ICP备2026067502号-1京公网安备11010502063487号