Most RabbitMQ monitoring guides hand you a list of metric names and leave you to figure out what a bad value actually looks like. This guide does the opposite: it connects each metric to the failure mode it predicts, tells you what threshold to alert on, and explains what to do when the number looks wrong. If your queue depth is climbing or your broker just threw a memory alarm, you’ll find your answer here.
Why RabbitMQ Metrics Differ From Standard Application Metrics
RabbitMQ operates as a stateful broker. Its actionable RabbitMQ metrics don’t describe a single service endpoint, they describe the health of message flow across producers, queues, and consumers simultaneously. A spike in one metric almost always has a cause upstream and a consequence downstream.
A web server metric like response time tells you something went wrong right now. A RabbitMQ metric like unacknowledged message count tells you something is about to go wrong for your downstream consumers, your broker’s memory, and potentially every producer connected to the system. The failure propagates. That’s what makes RabbitMQ monitoring different, and that’s why you need to understand the causal relationships between metrics, not just the individual numbers.
Every RabbitMQ deployment needs two monitoring layers working together:
- Queue-level message flow metrics: ready messages, unacknowledged messages, publish rate, deliver rate, acknowledgment rate, consumer count
- Node-level resource metrics: memory usage, disk free space, file descriptor count, Erlang process count, socket count
Skip either layer and you’ll find yourself diagnosing a memory alarm without knowing which queue caused it, or watching queue depth grow without knowing whether the broker itself is healthy.
Queue Metrics: The Core Signal of Message Flow Health
Queue metrics are your first line of visibility. They tell you whether messages are moving through your system or stacking up somewhere they shouldn’t be.
Messages Ready
Messages ready is the count of messages sitting in a queue, waiting to be delivered to a consumer. A steady, low ready count is normal. A sustained increase means your consumers can’t keep up with your producers.
The key word is “sustained.” A brief spike during a traffic burst is expected. A ready count that climbs for five minutes straight without leveling off means you have a throughput imbalance. Either your consumers are too slow, you don’t have enough of them, or something has stopped them from receiving messages entirely.
Run rabbitmqctl list_queues name messages_ready to pull a live snapshot of ready message counts across all queues.
Messages Unacknowledged
Messages unacknowledged counts messages that RabbitMQ has delivered to consumers but hasn’t received an acknowledgment for yet. This number reveals consumer processing health more honestly than deliver rate does.
A growing unacknowledged count points to one of three things: consumers are processing too slowly, consumers have crashed after receiving messages, or your prefetch count (the maximum number of unacknowledged messages a consumer can hold) is set too high. When prefetch is misconfigured, RabbitMQ floods a single consumer with more messages than it can process, while other consumers sit idle. The unacknowledged count climbs, and the queue appears to drain — but messages aren’t actually completing.
Consumer Count Per Queue
Zero consumers on an active queue is an immediate incident. Messages will pile up with no one to receive them. A drop from your expected consumer count — say, from four consumers to two — warrants investigation before queue depth has a chance to climb.
Consumer count is one of the few RabbitMQ metrics where any unexpected change is a signal worth acting on. It doesn’t drift gradually. It drops suddenly, and when it does, the ready message count will follow.
Message Rate Metrics: Reading the Flow of Your System
Rate metrics show you how fast messages are moving at each stage of the pipeline. The relationship between publish rate, deliver rate, and acknowledgment rate tells you more than any single number can.
Publish Rate and Deliver Rate
Publish rate measures how fast producers are sending messages to your exchanges. A sudden drop in publish rate can indicate a producer crash, a network partition, or an upstream dependency failure. If your publish rate drops to zero and you haven’t deployed anything, start checking producer logs immediately.
Deliver rate measures how fast RabbitMQ is handing messages to consumers. When deliver rate falls below publish rate, queue depth will grow. This is the most direct mathematical relationship in RabbitMQ monitoring: if messages arrive faster than they leave, they accumulate.
Acknowledgment Rate: The Most Honest Consumer Signal
Acknowledgment rate measures how fast consumers are completing work, not just receiving it. This distinction matters. A consumer can receive messages quickly and acknowledge them slowly — or not at all. Deliver rate looks healthy; acknowledgment rate tells the truth.
Watch for divergence between deliver rate and acknowledgment rate. If deliver rate is 500 messages per second and acknowledgment rate is 200 messages per second, your consumers are falling behind. The gap will eventually show up as a growing unacknowledged count, then memory pressure on the broker.
Redelivery Rate: The Failure Indicator
Redelivery rate tracks messages that RabbitMQ has had to redeliver because a consumer nacked them or crashed before acknowledging. A low redelivery rate is normal. A high or growing redelivery rate means consumers are failing consistently, which can cause infinite retry loops if you don’t have a dead letter exchange (a queue that receives messages after they’ve been rejected a configured number of times) configured.
Node-Level Metrics: Catching Resource Exhaustion Early
Node metrics tell you whether the broker itself is healthy. These are the metrics that, when ignored, produce the most dramatic failures — a complete publishing halt, connection errors that look like network problems, or a broker restart that drops all in-flight messages.
Memory Usage and the High Watermark
RabbitMQ blocks all producers when memory usage crosses the configured high watermark. The default watermark is 40% of available RAM. When the broker hits this threshold, it stops accepting new publishes and your producers see their connections blocked.
Don’t just monitor raw memory usage. Monitor the ratio of used memory to the watermark. If your broker is using 35% of RAM and your watermark is set to 40%, you’re close to a publishing halt even if the absolute memory number looks fine. The official RabbitMQ documentation recommends keeping the watermark at 40% for most deployments, leaving headroom for the Erlang VM’s garbage collector and message persistence overhead.
Run rabbitmqctl status to see current memory usage and the configured watermark side by side.
Disk Free Space
RabbitMQ blocks all publishing when disk free space drops below the disk_free_limit. The default limit is 50MB, which is dangerously low for any production deployment that persists messages to disk. Many teams set this to 2GB or more, depending on their message volume.
Disk alarms are a common silent killer. The broker keeps running, connections stay open, but no new messages can be published. Your producers will hang waiting for acknowledgment that never comes. Set an alert when disk free space drops below twice your configured disk_free_limit — that gives you time to act before the alarm fires.
File Descriptor Usage
Each connection and channel consumes file descriptors from the operating system’s limit. When a broker runs out of file descriptors, new connection attempts fail with errors that look like network problems. This is a common misdiagnosis in production incidents.
The Erlang VM also uses file descriptors for internal processes. RabbitMQ exposes fd_used and fd_total through its management API. Alert when fd_used exceeds 80% of fd_total. If you’re hitting this limit regularly, increase the OS-level file descriptor limit for the RabbitMQ process.
Erlang Process Count and Scheduler Utilization
RabbitMQ runs on the Erlang VM, and its internal concurrency model uses lightweight Erlang processes — not OS threads. Each queue, connection, and channel runs as a separate Erlang process. The Prometheus exporter exposes rabbitmq_erlang_processes_used and rabbitmq_erlang_processes_limit.
Erlang scheduler utilization measures how busy the VM’s schedulers are. High scheduler utilization (consistently above 90%) means the broker is CPU-bound and may start dropping throughput. Reductions per second is a related metric that measures Erlang function call activity — a sudden drop in reductions per second can indicate the broker is stalling on I/O or waiting on a lock.
Connection and Channel Metrics: Diagnosing Application Behavior
Connection and channel metrics reveal problems in your application code, not the broker. They’re the metrics that catch connection leaks, anti-patterns, and resource misuse before they cascade into broker-level failures.
Connection Count and Connection Churn
Connection count should be stable between deployments. A steadily growing connection count means your application is opening connections without closing them, which indicates a connection leak. Left unchecked, this will exhaust file descriptors and eventually prevent new connections from opening.
Connection churn rate measures how frequently connections open and close. Applications that open a new connection per message instead of reusing a long-lived connection add significant overhead. Each connection handshake involves TLS negotiation, authentication, and channel setup. Use long-lived connections with reconnect logic built in.
Channel Count Per Connection and Blocked Connections
Opening too many channels per connection is a common anti-pattern. Channels are cheap to create, which tempts developers to open one per thread or per operation. But each channel consumes memory on the broker, and hundreds of channels per connection complicates debugging significantly when something goes wrong.
Blocked connections are the clearest signal that your broker is under resource pressure. RabbitMQ reports connections it has blocked due to memory or disk alarms. A non-zero blocked connection count means producers are being throttled right now. Check your memory and disk metrics immediately when you see blocked connections appear.
Setting Up Metrics Collection With Prometheus
The recommended approach for production RabbitMQ monitoring is the rabbitmq_prometheus plugin, available since RabbitMQ 3.8. Enable it with rabbitmq-plugins enable rabbitmq_prometheus, and your broker will expose a /metrics endpoint that Prometheus can scrape directly.
Before RabbitMQ 3.8, per-object metrics (individual queue stats, per-connection data) weren’t available through Prometheus — you had to poll the management API. The 3.8+ Prometheus integration exposes per-object metrics natively, which is a significant improvement for high-queue-count deployments. If you’re running an older version, check which metrics are actually available through your exporter.
Key Prometheus Metric Names to Alert On
rabbitmq_queue_messages_ready: alert when this exceeds 10x your normal peak for a given queuerabbitmq_queue_messages_unacked: alert when this grows continuously for more than 5 minutesrabbitmq_node_mem_used: alert when this exceeds 80% of your configured watermarkrabbitmq_node_disk_free: alert when this drops below 2x yourdisk_free_limitrabbitmq_connections: alert on unexpected growth trends, not absolute values
The official RabbitMQ Grafana dashboard gives you a solid baseline. Add custom panels for your highest-traffic queues and set alert thresholds based on your system’s observed peak throughput, not generic defaults. Monitoring vendors like Datadog and Sematext offer pre-built RabbitMQ integrations that pull from the management API, which can be a faster starting point if you’re not already running Prometheus.
Five Failure Scenarios and What the Numbers Show
Metrics only help you if you can connect a pattern of numbers to a specific problem. These five scenarios cover the most common RabbitMQ failure modes you’ll encounter in production.
Scenario 1: Consumer Crash
Ready messages climb steadily. Unacknowledged messages drop to zero. Consumer count drops by one or more. This is a crashed consumer. The messages it held get redelivered (watch for a redelivery spike), and the remaining consumers inherit the load. Check consumer application logs and restart the consumer process. If the consumer crashes repeatedly on the same message, that message may be malformed — configure a dead letter exchange to route it out of the main queue.
Scenario 2: Consumer Slowdown
Unacknowledged messages grow steadily. Deliver rate stays high but acknowledgment rate falls. Consumer count is unchanged. Your consumers are receiving messages but processing them too slowly. Check consumer processing time — a slow external API call or database query inside your message handler is the usual culprit. Adjust prefetch count downward to prevent a single slow consumer from holding too many unacknowledged messages at once.
Scenario 3: Producer Flood
Publish rate spikes sharply. Queue depth grows faster than consumers can drain it. Memory usage climbs toward the watermark. You have more messages arriving than your consumers can process. Implement producer-side rate limiting or add consumer instances. If the flood is temporary, the queue will drain once the burst ends. If it’s sustained, you need more consumer capacity.
Scenario 4: Memory Alarm Triggered
Blocked connections appear. Publish rate drops to zero. Broker logs show the memory high watermark was crossed. Identify which queues hold the most messages using rabbitmqctl list_queues name messages memory. Drain or purge the largest queues to release memory. Consider enabling lazy queues (which store messages on disk rather than in RAM) for queues that accumulate large backlogs.
Scenario 5: Disk Alarm Triggered
All publishing stops. The rabbitmq_node_disk_free metric drops below the configured limit. The broker is still running but completely silent from a producer perspective. Free disk space immediately — delete old log files, expand the volume, or purge large queues. The broker will resume publishing automatically once disk free space exceeds the limit again. Don’t restart the broker to resolve a disk alarm; address the underlying disk space problem first.
Frequently Asked Questions About RabbitMQ Monitoring
What causes RabbitMQ queue depth to grow?
Queue depth grows when your publish rate exceeds your acknowledgment rate. The most common causes are consumers processing too slowly, too few consumer instances for the message volume, consumers crashing and leaving messages unacknowledged, or prefetch count configured too high. Check consumer count and acknowledgment rate first before assuming a producer problem.
What is a healthy consumer utilization percentage?
Consumer utilization measures the percentage of time a consumer channel is actively delivering messages. A value above 80% is healthy and indicates consumers are keeping up with demand. Values below 50% suggest consumers are idle, which can indicate a prefetch misconfiguration, a slow consumer, or a queue that’s not receiving the message volume you expect.
How do I know if RabbitMQ is running out of memory?
Watch the ratio of rabbitmq_node_mem_used to your configured memory watermark. When used memory reaches 80% of the watermark, alert your on-call team. When it crosses the watermark (default 40% of total RAM), RabbitMQ blocks all publishers. You’ll see blocked connections appear in the management UI and publish rate drop to zero in your metrics dashboard.
How do I tell the difference between a slow consumer and a dead consumer?
A dead consumer shows zero consumer count on the queue and zero unacknowledged messages, and any messages it held get redelivered. A slow consumer shows a stable consumer count but a growing unacknowledged message count paired with a falling acknowledgment rate. The consumer is alive and receiving messages; it just can’t process them fast enough.
Which RabbitMQ metrics should I set up first?
Start with these five: messages ready per queue, messages unacknowledged per queue, node memory usage vs. watermark, disk free space vs. disk_free_limit, and consumer count per queue. These five metrics cover the most common production failure modes and give you a working alert set within an hour of enabling the Prometheus plugin.
Your Next Steps for RabbitMQ Observability
You now have a complete picture of which RabbitMQ metrics matter, what each one signals, and how to act when a number looks wrong. The gap between a monitoring dashboard full of numbers and actual operational confidence comes down to understanding these causal relationships.
Start by enabling the rabbitmq_prometheus plugin if you haven’t already, then configure alerts for the five priority metrics above. Once those are in place, add the node-level metrics and connection monitoring to catch resource exhaustion before it becomes an outage. Use the five failure scenarios as your diagnostic playbook when an alert fires — they cover the patterns you’ll see most often in production.

Heather Gram is a seasoned software engineer and an authoritative voice in the world of version control systems, with a particular focus on Git. With over a decade of experience in managing large-scale software development projects, Heather has become a go-to expert for advanced Git techniques. Her journey in the tech industry began with a degree in Computer Science, followed by roles in various high-tech companies where she honed her skills in code management and team collaboration.
