Check RabbitMQ queue size from client
.NetMessage QueueRabbitmqAmqp.Net Problem Overview
Does anyone know if there's a way to check the number of messages in a RabbitMQ queue from a client application?
I'm using the .NET client library.
.Net Solutions
Solution 1 - .Net
You can actually retrieve this via the client.
When you perform a queue_declare
operation, RabbitMQ returns a tuple with three values: (<queue name>, <message count>, <consumer count>)
. The passive
argument to queue_declare
allows you to check whether a queue exists without modifying the server state, so you can use queue_declare
with the passive
option to check the queue length.
Not sure about .NET, but in Python, it looks something like this:
name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
Solution 2 - .Net
I am 2 years too late but I was searching for it myself and found that rabbitmq gives u simple script to communicate to erlang nodes..its in sbin folder where the starting script for RabbitMQ is located..so you can basically say
./rabbitmqctl list_queues
this will display the queues along with the count of messages pending to those queues similarly you can also say
./rabbitmqctl list_channels
./rabbitmqctl list_connections
etc. For more info you can visit here
Solution 3 - .Net
If you want to do this in .NET, check which version of the client library you are using.
I'm using the 2.2.0 version and I had to use BasicGet(queue, noAck).
In this version of the library, QueueDeclare() only returns a string containing the queue name.
BasicGetResult result = channel.BasicGet("QueueName", false);
uint count = result != null ? result.MessageCount : 0;
I know from the 2.6.1 version, QueueDeclare() returns an object of type QueueDeclareOk.
QueueDeclareOk result = channel.QueueDeclare();
uint count = result.MessageCount;
Alternatively, you can call from the command line:
<InstallPathToRabbitMq>\sbin\rabbitmqctl.bat list_queues
And you see the following output:
> Listing queues...
QueueName 1
...done.
Solution 4 - .Net
I'm using version 3.3.1 of the .NET client library.
I use the following, which is very similar to Ralph Willgoss's second suggestion, but you can supply the queue name as an argument.
QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;
Solution 5 - .Net
my little snippet based on Myydrralls' answer. I think if he had code in his answer I might have noticed it much quicker.
public uint GetMessageCount(string queueName)
{
using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel())
{
return channel.MessageCount(queueName);
}
}
Solution 6 - .Net
You can use the IModel's MessageCount method, documented here
edit: I know this is a very old post, but it is the first google response, and I hope it will help people looking for this answer in the future.
Solution 7 - .Net
Update: it appears that the pika implementation of queue_declare(..) has changed since mmalone's very helpful post.
In python/pika (v0.9.5) it's still possible to check the queue depth via pika, but it requires a slightly more indirect approach.
queue_declare(...) passes a method object into its callback function, which you can then inspect. For example, to check the number of messages and consumers in the queue named 'myQueue'
:
def cbInspect(qb):
messagesInQueue = qb.method.message_count
print "There are %d messages in myQueue" % messagesInQueue
consumersInQueue = qb.method.consumer_count
print "There are %d consumers in myQueue" % consumersInQueue
return
myChannel = channel.queue_declare(callback=cbInspect, queue='myQueue', passive=True)
Hope this helps, and please go easy on me, I'm new around here :-)
Solution 8 - .Net
At least as of RabbitMQ 3.3.5, you can do this in a C# program without any RabbitMQ client library by calling the RabbitMQ Management HTTP API:
// The last segment of the URL is the RabbitMQ "virtual host name".
// The default virtual host name is "/", represented urlEncoded by "%2F".
string queuesUrl = "http://MY_RABBITMQ_SERVER:15672/api/queues/%2F";
WebClient webClient = new WebClient { Credentials = new NetworkCredential("MY_RABBITMQ_USERNAME", "MY_RABBITMQ_PASSWORD") };
string response = webClient.DownloadString(queuesUrl);
The username and password are the same as those you use to log into the RabbitMQ management console UI.
Response will be a JSON string with the list of queues, including their message counts, among other properties. (If you like, you can deserialize that JSON into a C# object using a library like Json.NET.)
The API documentation is installed along with the RabbitMQ management console and should be available on that server at http://MY_RABBITMQ_SERVER:15672/api .
Solution 9 - .Net
I was able to get the size/depth of queue from python program.
- using py_rabbit
from pyrabbit.api import Client
cl = Client('10.111.123.54:15672', 'userid', 'password',5)
depth = cl.get_queue_depth('vhost', 'queue_name')
- kombu [a python package usually comes with celery installation]
conn = kombu.Connection('amqp://userid:[email protected]:5672/vhost')
conn.connect()
client = conn.get_manager()
queues = client.get_queues('vhost')
for queue in queues:
if queue == queue_name:
print("tasks waiting in queue:"+str(queue.get("messages_ready")))
print("tasks currently running:"+str(queue.get("messages_unacknowledged")))
the ip address is just an example.
Edit:
3
I have found a better way to do this . curl appears to be more convenient and faster way to do it
curl -s -i -u $user:$password http://$host_ip_address:15672/api/queues/$vhost_name/$queue_name | sed 's/,/\n/g' | grep '"messages"' | sed 's/"messages"://g'