2026.09.39 — 2026-09-24
Added
List keyboard shortcuts in a popover from the header's keyboard button (2dae3571)
The shortcut list now opens as a popover under the keyboard button in the header, next to the refresh control, instead of as a full-screen dialog. Press ? or click the button to open it; press Escape to close it, and focus returns to the button. It is no longer offered in the search palette.
Split the graph with a monitoring pane that breaks the selection down per node (9430b9eb)
Flow has a third layout, Split, beside Graph and Table. It puts the graph next to a resizable monitoring pane. Drag the separator, or focus it and use the arrow keys; Enter or dragging past its minimum folds the pane away. This browser remembers the pane's size.
- The selection is now in the address (
?node=), in every layout. A reload or a shared link reopens the inspector, or the pane, on the same client, address or queue. - For a queue or address, the pane lists every broker node with its backlog, consumers, messages in and messages out. It also says in words when one node holds most of the backlog, when a node holds messages but has no consumer while other nodes do, and when a node takes far more of the incoming messages than it delivers. Otherwise it says the resource is balanced. A node that did not answer is listed that way, and its figures read "unknown", never zero.
- For a queue, the pane adds per-node trends over a range you choose: one small chart per node on a shared scale, drawn by the Metrics feature when it is enabled. A client shows its per-node rates and says that client history is not kept. With nothing selected, the pane shows each broker node's totals.
- Only the Split layout asks the server for the per-node breakdown, so the Graph and Table layouts cost what they did before.
- Graph nodes and table rows have a menu. Open it by right-clicking, with Shift+F10 or the ContextMenu key, or from a row's Actions button. It offers the resource's Open and Copy items, and "Focus the view on this" and "Open its connections" for a client. Flow still never changes the broker.
- The inspector's "Open in Queues" now opens that exact queue. An address opens Addresses filtered to its name.
- Metrics: when the view is scoped to one queue, "Break down by broker node" (
?split=node) adds one chart per node under the totals.
- The selection is now in the address (
Break each queue, address and client down per broker node, on request (8d0872b8)
GET /api/v1/clusters/{id}/flow?byNode=trueadds a per-node breakdown to the flow graph:- Queues and addresses carry
byNode: each node's backlog, consumers, and messages in and out per second. - Producing and consuming edges carry each node's rate.
- Each broker node carries its totals across every queue.
The breakdown is read from the same per-node rows the graph is summed from, and the totals are derived from it. So the nodes add up to the graph, and it costs no extra broker call.
Honesty rules:
- A figure a node did not report is null, never 0.
- A node whose figures are old, or whose latest sweep failed, is marked stale.
- Edges with no per-node source (diverts, wildcards, dead-letter, expiry) carry no breakdown.
Without
byNodethe response and its ETag are unchanged. The Split layout on the Flow screen (next) is what asks for it (ADR-0110).- Queues and addresses carry
Split a queue's history by broker node (6638f526)
The metrics API can break one queue's series down by broker node:
GET /api/v1/clusters/{id}/metrics?subjectType=QUEUE&subject=<queue>&splitBy=NODE.- The totals (
series) are unchanged. byNodeadds one entry per node, with the same metrics and buckets. Each node's rate is computed exactly as the total is, so the nodes add up to it.- A serving node that has no sample in the window is listed with
sampled: falseand empty series, never as zero. - At most 16 nodes are returned, and the step widens so that all the nodes' points together stay within 2,000 per metric.
truncatedsays when either bound applied. - A split is refused (400) for the cluster scope. A cluster-scope gauge today is an average across queues, not a total; splitting it would present that average as each node's load (ADR-0110).
No broker is asked for anything new: the split reads the same stored samples, with the same index, as the totals.
- The totals (
Keyboard shortcuts, listed and switchable (315a6b8a)
New single-key shortcuts:
gthen a letter opens that view of the current cluster. For exampleg qQueues,g cConsumers,g nConnections,g fFlow,g mMetrics,g lAlerts,g uAudit./focuses the current view's filter. Every list view's filter now has a visible label.?opens the list of every shortcut, including the grid keys (arrows, Enter, Space, Shift+F10, Ctrl+C). The list is also reachable from the keyboard button in the header and from the palette.
These keys are ignored:
- while typing in a field or editor;
- with a modifier held;
- inside a dialog or a menu, so a stray key can never navigate away from a confirmation.
On a non-Latin keyboard layout they follow the physical key.
If single-key shortcuts get in your way, or you use speech input, turn them off under Settings → Display, or in the shortcuts list itself. The choice is kept in this browser. ⌘K and ⌘B are unaffected. No shortcut takes a key the browser reserves.
Keep your view across clusters, titled tabs, a breadcrumb, and a smarter palette (c865453f)
Moving around Studio keeps more of where you were:
- Choosing another cluster, from the sidebar or the palette, opens the same view there. From Queues on prod-eu you land on Queues on prod-us, without the filter or open queue, which may not exist there. Before, switching always went to Topology.
- Every tab has a title naming the open resource, the view, the cluster and the product (e.g. "orders · Queues · prod-eu · Artemis Studio"), so the right tab can be found among many.
- Every cluster view has a breadcrumb: cluster › group › view › open resource.
The command palette (⌘K) now:
- has a Search button in the header;
- searches queues by name or address as you type (two characters or more), and opens the chosen queue itself rather than a filtered list;
- offers "Search connections / consumers / sessions / producers / addresses for …", which opens that view filtered, without the palette itself querying any broker;
- lists the places you opened most recently on this cluster (kept in this browser only);
- lists views you do not have permission for as unavailable, with the permission they need, as the sidebar does.
The palette no longer polls the queue list while it is closed.
For plugin authors: a palette source now also receives
queryandopened, and should fetch only while the palette is open (ADR-0109).Act on one message from its row, and link to it (4ece6609)
Rows in the message browser have an action menu:
- Open details, Copy message id, and Copy link to this message.
- Move…, Retry… and Delete… for that one message. The dialog states the outcome in place: done, not found (the message was consumed, expired or moved since the page was read), or failed with its cause. Deleting one message is confirmed by typing its id.
The open message is now part of the address (?message=<id>), so a copied link opens that message's detail, and reloading keeps it open.
Open related views, and act on diverts and unhealthy queues, from their rows (d4b4e6b7)
More rows carry the action menu:
- Queue rows gain Browse messages, Open history (the queue's metrics) and Show in Flow. Show in Flow opens the flow view focused on that queue.
- Consumer health rows get the queue menu, so an unhealthy queue can be paused, purged or inspected without leaving the ranking. The queue name is a link to the queue.
- Divert rows (Routing) offer Copy divert name, Show in Flow, and Delete divert…. A message-capture divert explains that it is managed from Settings → Message index.
- Address and connection rows gain Show in Flow. A connection with no client id says why it cannot be focused.
Purge or transfer a queue's messages from its row (2c0120ea)
The queue row menu gains two items:
- Purge messages…: purges the queue on every live node as a bulk run of one queue, with the same preview, blast radius, safety cap and audit.
- Transfer messages…: moves or copies every message the queue holds to a queue on another node or cluster, through the transfer preview. The item is disabled, with the reason, when the queue is empty.
A bulk purge or delete of exactly one queue is now confirmed by typing the queue's name, rather than "purge 1 queue". That matches every other single-queue destroy. Runs over several queues still confirm with the action and the count.
Row menus and cross-links on the live resource views (fe5d64c8)
Addresses, consumers, sessions, connections and producers now have the row action menu. Right-click a row, use its Actions button, or press Shift+F10:
- Open what a row belongs to or holds: a consumer's queue or session, a session's connection, consumers or producers, a connection's sessions, an address's queues or consumers, a producer's session or queues.
- Copy its identifiers: remote address, client id, connection, session, consumer or producer id, address name.
- Close the connection, session or consumer's connection, or close every consumer on an address, through the same previewed and typed confirmation as before.
Names that point to another resource are now links: a consumer's queue and address, a session's connection, a producer's address.
Act on a queue from its row (0f18a7f2)
Every queue row in Queues now has an action menu. Right-click the row, use its Actions button, or press Shift+F10 on it to get:
- Open details, which opens the queue's drawer;
- Copy queue name, and Copy link to this queue;
- Pause… / Resume…: one confirmation, then the per-node outcome, which stays on screen even though the menu is gone;
- Edit configuration…;
- Delete queue…: the same preview, blast radius and typed confirmation as in the drawer.
An action you may not take stays in the menu with its reason. Choosing it explains the reason in full, including the broker.xml that enables it when the connection is the cause.
Keyboard-navigable grids with a per-row action menu (44e8c60b)
Every data grid (queues, addresses, consumers, sessions, connections, producers, messages, audit, events, flow paths, SQL results, bulk and transfer runs) is now one stop in the tab order and is navigated with the arrow keys, as the WAI-ARIA grid pattern describes:
- Arrow keys move between cells; Up/Down keep the column. Home/End go to the row's ends, Ctrl+Home/End to the first and last row, Page Up/Down by a page. The header row is reachable, so sorting works from the keyboard.
- Enter opens the focused row (the queue drawer, a message, an audit event, a flow path) — previously only a mouse click could.
- Space toggles the row's selection where the grid is selectable.
- Ctrl/Cmd+C copies the focused cell's full value and announces it.
- Focus stays on the same row when the listing refreshes or re-sorts, and moves to a neighbour when the row disappears.
- Each grid has an accessible name.
Grids can also carry a per-row action menu, opened by right-click, by a visible Actions button on the row, or by Shift+F10 / the ContextMenu key. Right-click keeps the browser's own menu on links, in fields, with Shift held, and when text is selected. Screens adopt it in the following commits. Blocked items stay focusable with their reason (ADR-0105).
Tab no longer stops on every text cell; it enters the grid once and leaves it once (ADR-0106).
Changed
Merge main into the operator UX branch (dad89e63)
Renumbers this change's ADRs to 0107-0110: main took 0105 (alert delivery channels) and 0106 (setup review) in the meantime.
Fixed
Keep a row menu open when Shift+F10 or the menu key opens it (f21c55de)
A row's actions menu opened from the keyboard, with Shift+F10 or the menu key, closed again at once, in every grid and on Flow's graph nodes. Only the Actions button and right-click worked. The keydown that opened the menu was counted as a key pressed outside it. Now only a pointer press outside the menu closes it.
Also, from checking the new Flow Split layout in a browser:
- Selecting a node that is off-screen, or opening a link with a selection in it, scrolls the graph to that node, so it is no longer lost among dimmed nodes.
- The per-node table fits beside the graph: a node's "did not answer" is shown in its own row, rates are per second as the column headers say, and a client shows only the rate that applies to it (sends or receives). A rate not measured yet reads "measuring…"; only a node that did not answer reads "unknown".
- The monitoring pane opens a little wider by default.
- Per-node history charts name what each one shows, keep the Added/Acked legend with its own chart, and round the shared scale to a readable top.