Skip to content

2026.09.10 — 2026-09-07

Added

  • Make refresh, pause and the metric charts tell the truth (b25868e7)

    The shell reported freshness, but three of its claims were wrong, and the metrics page was wrong in a way a screenshot hides.

    Refresh now means your refresh. The control's busy state came from cache-wide isFetching, so it spun on every background poll — a spinner that never stops says nothing. It now tracks only the promise the operator started, floored at 350ms so a fast refetch reads as an acknowledgement rather than a flicker, and repeated activation joins the running refetch instead of aborting and restarting it (cancelRefetch: false).

    Pause now holds. It stopped intervals but not mounts, so pausing and then navigating silently resumed. refetchOnMount goes through the same seam, gated so a query that has never resolved still fetches once — pausing a screen to stop it moving is not asking for an empty one. The paused control also renders differently, rather than differing only in aria-pressed.

    Metric charts carry time. The x-axis was array position, so an omitted bucket rendered flush against its neighbour — the metrics capability requires a cold subject to show a gap, and it could not. The axis is now a numeric time scale over the requested window. The live window was also frozen at page-open by a useMemo that never re-ran; it now advances, quantized to the bucket width so the query key changes once per bucket rather than once per second. A failed read rendered as "No samples yet" — an absence presented as a fact — and now states the failure.

    The dashboard around them is rebuilt: current depth, added/s, acked/s and consumers as stat tiles that say "Not sampled" rather than showing zero; each chart a titled panel with its unit; a table view of the window; and ?subject= to scope the whole page to one queue, linked from the queue drawer.

    Bounded views. Requests, events, audit and DLQ rendered every row they were given. They page now, through one shared pager, with events and audit moved onto the virtualised grid. Above 24 nodes the topology canvas collapses each pair to one node, drops edge labels, renders only what is visible, and says that detail has been reduced.

    Two fixes found while shooting the screenshots. The command palette mounts on every route and asked for /clusters//queues outside a cluster — a 400, and one errored observed query put the whole shell into its offline state, so every cluster-less screen claimed Studio had lost the brokers. And the consumer chart's y-axis rounded fractional ticks to integers, printing "0" five times beside bars of visibly different heights.

    Colour. The latency panel used the reserved warning and danger colours as series colours; p50/p95/p99 are now a validated sequential blue ramp. The depth chart's two neutral series failed the normal-vision separation floor and are now one hue distinguished by mark shape. Both checked with the palette validator in both schemes rather than by eye.

    Release. The Docker Hub description step has failed with Forbidden on every release, hidden by continue-on-error. It now points at a real docs/dockerhub.md, completes relative URLs so the screenshots resolve, and fails loudly. The credential must be a PAT with read, write and delete scope — the description endpoint rejects a repo-scoped token. It is the last step of the release job, so a failure there cannot burn a version.

    Screenshots are recaptured from a four-node cluster carrying real traffic: just demo brings up two live/backup pairs, registers them through Studio's own API and drives messages with the broker image's own client — nothing is written to metric_sample by hand — and just shots captures the four README images.

    ADR-0055 records the time axis and the quantized window. ADR-0056 records bounded views and topology level of detail.

Apache-2.0. Apache ActiveMQ and Apache ActiveMQ Artemis are trademarks of the Apache Software Foundation. Artemis Studio is an independent project, not produced by, endorsed by, or affiliated with the ASF.