2026.09.25 — 2026-09-15
Added
Diverts, bridges, cluster hops and dead-letter routes on the flow graph (e248b700)
The Flow graph now shows how messages route beyond an address and its queues, as layers switched on and off in the toolbar (kept in the URL):
- Diverts (on by default): an address rerouting (exclusive) or copying to another address. Artemis does not count what a divert moves, so the edge says "not counted by broker" instead of showing a rate. An exclusive divert without a filter marks its address's own queues "bypassed".
- Bridges (on by default): a queue forwarded to an address in this cluster or on another broker, with its rate, and "not connected" when it is down.
- Cluster hops (on by default): messages a node moves to another node of the cluster through its store-and-forward queue, drawn to that node by name.
- Dead letter & expiry (off by default): where a failed or expired message from each shown queue goes.
- Temporary queues (off by default): one node per client for all its short-lived reply queues, instead of hundreds of uniquely named ones.
- Studio capture (off by default): Studio's own capture taps, marked as Studio's.
A divert or bridge deployed on only some nodes is a fault ("on 1 of 2 nodes"). A queue bound to a wildcard address such as orders.# is joined to the addresses it matches, and the view states that this assumes the broker's default wildcard syntax. Producers that name no address get their own node instead of being left out. Filtered queues show their filter on the route into them. A node whose routing could not be read still shows its clients and says its diverts and bridges may be missing.
Broker load is unchanged in shape: all of this travels in the same single request per node per sweep that client sampling already sends, and still only while a Flow view is open. A new cache table, flow_route, is created by migration and needs no action.
Animated flow graph with inspector, focus and path emphasis (f65a51cb)
Flow now opens on a graph instead of a table. Producers, addresses, queues and consumers sit in four columns laid out automatically; an edge's thickness, its label and dots moving along it show the rate — faster and denser dots mean a busier path, a dashed line is idle, a dotted line is still being measured, and a fault (no consumer, stalled consumer) is drawn in the fault colour and named in words. Hovering, focusing or selecting a node emphasises the whole path through it and fades the rest.
Selecting a node opens an inspector with its figures, the flow into and out of it with each rate's source and age, and buttons to focus the view on it or open it in Queues, Consumers, Producers or Connections. Flow itself never changes the broker. A find box jumps to any client, address or queue on screen; Escape closes the inspector and returns keyboard focus to where it was.
Motion can be paused, stops on its own when the tab or canvas is out of view, and is not drawn at all when the operating system asks for reduced motion — the width and labels still carry every rate. The table remains one click away (Graph | Table, kept in the URL) and lists exactly what the graph draws. Large graphs render only what is on screen and show a minimap.
Layout runs in a web worker (new frontend dependency: elkjs 0.12.0), so a large graph never freezes the page, and a refresh that only changes rates never moves a node. See ADR-0080.
Client connectivity and message-flow view, sampled only while watched (2e7b51f9)
A new Flow screen under Observe shows, for a cluster, which clients produce to which addresses, how those route into queues, and which clients consume them. It opens on the 40 busiest paths and says how many it left out; ranking (messages in, out, backlog), client grouping (client id, user, host), the bound, a focus on one client, address or queue, and the table sort all live in the URL. Totals lead the view; every rate names its source and age, and an unknown rate reads "measuring…", never zero. A node that did not answer, refused to list clients (with the management.xml access that grants it), or was only partly sampled is named where its data would be.
Per-client rates are new. While a Flow view is open on a cluster, Studio reads listProducers and listConsumers once per serving node every 15s in one batched request, under the existing per-node limiter. When no view is open, it sends nothing extra. With several Studio instances, one samples and all serve the same result from the database.
New settings (Settings → Flow): flow.sample-interval (15s, floor 10s), flow.max-rows-per-node (5000), flow.demand-lease (60s). Three new cache tables (flow_demand, flow_client_edge, flow_node_sample) are created by migration and need no action. GET /api/v1/clusters/{id}/flow and the
flowstream topic are new; the view needs cluster:read.
Fixed
Let the demo seed change the one-time admin password on a fresh stack (40e0f00f)
On a fresh stack the password
just dev-upprints must be changed before Studio answers anything else, soADMIN_PASSWORD=… just demostopped at its first call with a 423. PassNEW_ADMIN_PASSWORD=…on the first run and the seed changes it, then continues; later runs need onlyADMIN_PASSWORDset to the new one. Without it, the seed stops and says exactly that rather than failing on a parse error.Compute counter rates per node, so a queue on two nodes reads its real rate (9c89f0fc)
Rate-threshold alerts, the slow-consumer check and the Metrics throughput charts subtracted one node's lifetime counter from another's whenever a queue existed on more than one node. A queue at 1,000,000 messages on one node and 10 on another read as a rate in the tens of thousands per second: rate alerts fired falsely, and the slow-consumer rule saw an acknowledgement rate high enough to hide a consumer that had stopped. Rates are now computed on each node and summed.
Open a large graph at a readable zoom, busiest paths first (693c0cdc)
A cluster with more than a screenful of paths opened shrunk to fit, where labels were specks and the zoom was below the level that draws rates and moving dots. The view now opens at a legible zoom from the top of the graph, each column is ordered busiest first so that top is where the traffic is, the canvas is nearly a full screen tall, and a minimap is always there to reach the rest. Opening the inspector no longer resets the operator's pan and zoom.
Lay the graph out in ELK's own worker so the production build renders (23ab6c98)
The production bundle ran elk.bundled inside a second worker, which failed with "is not a constructor" and left the Flow canvas loading forever. Layout now posts to ELK's shipped worker. Fault text on flow nodes is a brighter red in the dark scheme so it clears the 4.5:1 contrast floor.
Name a cluster hop after the pair's serving broker, not its standby (408e7544)