DEV Community

Cover image for A Better RabbitMQ UI: What the Management Plugin Gets Wrong
Nicolas Keller
Nicolas Keller

Posted on Originally published at rabbitgui.com AI-assisted

A Better RabbitMQ UI: What the Management Plugin Gets Wrong

RabbitMQ comes with a UI, and it does the job. But if you use RabbitMQ every day, the small frictions add up: logging in again for every environment, "getting" messages that you then have to requeue, typing JSON into a plain text area. This is the story of why we built RabbitGUI, a desktop RabbitMQ UI for Mac, Windows and Linux, and what we changed.

The built-in RabbitMQ UI

Yes, RabbitMQ comes with a built-in UI, the management plugin. This is what 99% of people using RabbitMQ use today. And to be frank, it is an incredibly useful piece of software. It might be old and not the most user-friendly tool you've used, but it gets the job done. It lives at http://localhost:15672 (see RabbitMQ ports for why 15672 and not 5672), and on a fresh install you log in with the RabbitMQ default login, guest / guest.

rabbitmq management plugin screenshot

The interface is also incredibly stable. It has barely changed in a decade, and it never breaks on you as a result. If you are new to it, our complete guide to the RabbitMQ Management UI walks through every tab.

What the management plugin gets wrong

None of these are bugs. They are design choices that made sense for a web admin panel bundled with the broker, but they hurt when the UI is your daily debugging tool.

One broker per tab, one login per broker

The management UI is served by each broker. Local, staging and production are three URLs, three logins, and three tabs that look exactly the same. Sessions expire, so you log in again. Most teams end up with a folder of bookmarks and a password manager doing the work a connection list should do.

Reading a message means consuming it

There is no way to look at a message without taking it off the queue. "Get messages" consumes messages and, depending on the ack mode you pick, either requeues them (which sets the redelivered flag and can change their order) or drops them. You also read them one long list at a time, with no search and no filter. That is fine for one test message. It is painful for a dead-letter queue with 4,000 messages, and the wrong ack mode deletes data. We wrote more about this in how to browse RabbitMQ messages without consuming them.

Large payloads are truncated

The UI cuts payloads off at 50,000 characters, so big JSON documents show up incomplete (see RabbitMQ max message size).

Publishing is a text area

To send a test message you type the payload into a plain text box and the headers into key/value fields. No syntax highlighting, no validation, no formatting. One missing comma and your consumer rejects the message.

Routing is spread across pages

Bindings live on the exchange page and on the queue page. Dead-letter exchanges and alternate exchanges are hidden in arguments and policies. Names are mostly plain text, so following a message from an exchange to its queue and on to its dead-letter queue means a lot of copy, paste and filter.

No search across the broker

The list pages have a filter box, but there is no global "jump to" that finds a queue, exchange or vhost from anywhere.

Why we needed something better

When you use a tool every day, those frustrations add up. Combine that with the addiction of building tools, and the spark goes off pretty quickly. After fighting the urge to stop everything and build the tool I wished existed, I ended up writing the first lines of code for what would become RabbitGUI.

It was a tedious start, since the management HTTP API is only lightly documented, so there was a lot of reverse engineering at first. Once the first bricks were in place, I could finally focus on the experience I had in mind. If you are curious about the internals, we wrote about how we built RabbitGUI with Electron.

Our proudest improvements for RabbitGUI

Here are the features I am the most proud of, the ones that really motivated me to get RabbitGUI started. They are not just a polished version of something you could already do, but a rethink of how to get the job done much, much faster.

All your connections in a single place

This is the most common complaint about the management UI: switching environments means switching tabs and logging in again. Can you imagine doing that for database connections?

quick connections to rabbitmq

This is the welcome screen of RabbitGUI. Just like a database tool, you add as many connections as you need and never see a login screen again. Your credentials are stored encrypted on your machine, see how security is built into RabbitGUI for how encryption and offline use work.

To switch environment later, a quick access menu at the top lets you jump to any connection instantly while keeping your context.

quick switch between rabbitmq connections

Finally, a way to manage dead-letter queues

This could be an app of its own, given how bad the problem is. RabbitMQ has no way to explore the messages sitting in a queue, which makes dead-letter management tedious and painful.

RabbitGUI consumes the queue locally and stores the messages in a database on your machine. With every message local, you can search and filter at will, without the constraints of RabbitMQ.

Explore, search and filter messages, select the ones you are interested in, and republish only those, either to their original queue or to any queue you choose.

screenshot explorer rabbit mq dead letter queue messages

If you want to know more about how RabbitGUI handles dead letters, we wrote a dedicated article: dead-letter queue introspection with RabbitGUI.

Watch live traffic without touching consumers

To see what is flowing through a queue right now, RabbitGUI creates a temporary shadow queue with the same bindings and captures a copy of every message. Your consumers keep working as if nothing happened. The details are in how to spy on real-time queue traffic.

An actual JSON editor to send messages

This one is so obvious, I do not understand why the management plugin does not have it. Writing JSON by hand in a text area is painful, and the chance of making a mistake is high. For RabbitGUI, I took the editor from VS Code and put it right into the app.

json editor to publish messages to rabbitmq

We have a dedicated article that goes more in depth about publishing messages to RabbitMQ. As a bonus, it also compares it with the publish form of the management plugin.

Buttery-smooth navigation

Navigation was a big focus for RabbitGUI. I didn't see it as a single feature, but as a set of principles that make the user's life much easier.

The first thing users expect is a reliable quick search from anywhere. So we implemented the classic CMD+K to search for anything (queue, exchange, vhost...) using the same string matching and highlighting algorithm as WebStorm.

quick search

Once you can jump to anything, the next cornerstone of navigation is hopping from one entity to another by clicking on it. Anytime you see the name of an entity, whether in bindings, settings, a dead-letter exchange, an alternate exchange or a policy, you can click on it.

clickable dead letter from policy in rabbitmq

The last piece of the puzzle is managing routing in a single place. It builds on clickable names, but most importantly it groups bindings, dead-letter queues and alternate exchanges in one view. We wrote an entire article on exploring RabbitMQ bindings if you are curious.

a queue with bindings and a dead letter exchange in rabbitmq

Management plugin vs RabbitGUI at a glance

Task Management plugin RabbitGUI
Switch between brokers New tab and login per broker Saved connections, one click
Read messages in a queue "Get messages", consumes then requeues or drops Browse, search and filter locally
Replay dead letters Shovel or a script Select messages, republish, throttle
Watch live traffic Not available Spy via a temporary shadow queue
Publish a JSON message Plain text area VS Code editor
Find a queue or exchange Filter box per list page CMD+K from anywhere
Follow routing Bindings split across pages Clickable names, one routing view
Where it runs In the broker, in your browser Desktop app for Mac, Windows and Linux

The management plugin still wins on one thing: it is already there, on every broker, for free. RabbitGUI talks to the same management API, so you keep the plugin enabled and use whichever fits the task.

Compared with other tools

RabbitGUI is not the only alternative. If you are evaluating options, we keep sourced, side-by-side comparisons up to date:

Wrapping up

Those are only the features we are the most proud of. RabbitGUI is built with love, and a lot of small details went into it. For backlog ETAs, see queue drain time. If you want to know what is coming next, check out our public roadmap. And if there is something you've always wanted in a RabbitMQ UI, give us some feedback to shape what we build next.

You can download RabbitGUI and connect it to your local broker in a minute.


Originally published on the RabbitGUI blog.

Top comments (0)