@hyperdx/app@2.37.0
Minor Changes
-
db6ee45: feat(alerts): tidy the alert detail header and its properties block
Edit, Delete and Terraform export move behind the same overflow menu the
alerts list uses, so the header no longer spreads four buttons across the top
and both surfaces offer the same actions. The link to what the alert watches
becomes an icon beside the alert name, where it reads as part of the alert's
identity rather than another action.The properties block splits configuration from provenance: the creator now
sits with the created and updated timestamps in a dimmed line beneath, instead
of competing with the alert's settings. -
0558f77: Record and show which notification target an evaluation's delivery time went to.
webhookDurationMswas a single number covering the whole delivery, and because targets are dispatched concurrently the slowest one sets it — so a multi-target alert reported a figure with no way to tell which webhook was responsible, or that the other targets were fine.Each dispatch is now timed individually and aggregated per target across the evaluation, since a grouped alert notifies the same target once per firing group and again on resolve. One entry per distinct target carries its webhook id, display name, summed duration, how many dispatches it took, and how many failed. The evaluation history's "Notification duration" cell expands in place to show the breakdown.
Stored per evaluation rather than per dispatch: a 50-group alert notifying 10 targets would otherwise write 500 entries onto every history row. The array is capped at
ALERT_NOTIFICATION_TARGETS_LIMITand sorted slowest-first, so the cap drops the least interesting rows. Records written before this change keep rendering their total with nothing to expand. -
db6ee45: feat(alerts): edit from the alerts list, filter by alert source, and label the source icons
The alerts page row menu now opens the alert editor directly, so changing a
threshold no longer means navigating to the alert first. The source icon on
each row gets a tooltip and accessible label naming what it watches ("Saved
search" / "Dashboard tile"), and a new filter narrows the list by that source
— free-text search matches it too, so typing "tile" works without touching the
dropdown. Team settings tabs gain icons. -
8f3126f: Add a metrics explorer to the chart editor, so you no longer have to already know a metric's name to chart it. A browse control beside the metric select opens a modal with a prefix hierarchy over the metric namespace —
system→cpu→utilization— plus search across every name and description the source is reporting. Each row carries the metric's kind and its description, and the detail pane shows the unit (rendered from its UCUM code), reporting services, and tag keys drilling into their values. Previously the picker was a flat 3,000-entry dropdown and that metadata only appeared after you had already committed to a metric.Names are split per metric: on
.when the name has one (OpenTelemetry), otherwise on_(Prometheus exporters). Deciding per name rather than per source matters in practice — a real deployment carries thousands of underscore-style collector self-telemetry names alongside dozens of dotted application metrics, and a single source-wide separator flattened whichever family was outnumbered. Single-child chains collapse so the tree does not become a corridor, and the unfiltered tree is never truncated, so no namespace can go missing.While browsing a metric's tags you can stage filters and group-bys the same way the chart editor's inline attribute panel allows; they are shown as removable chips and applied together with the metric. Applying also sets an aggregation appropriate to the kind — average for a gauge, sum for a counter, p95 for a histogram — instead of inheriting whatever the previous series used. Both replace rather than merge, since they were written against the newly chosen metric: staged filters replace the series condition, and staged group-bys replace the chart's.
The chart editor's inline attribute panel now also shows the metric's kind. Only chartable kinds are listed (gauge, sum, histogram, exponential histogram);
summaryis omitted because the query renderer cannot translate it. The browser is a self-contained component, so the modal is one shell around it rather than the only possible home. -
6b7ca4a: Show reverse span links and resolved span-link details in the span detail Overview panel.
-
e0d2932: feat: rebuild the Help menu's "What's new" around the release notes. Replaces
the full-changelog modal with an inline section, a "View all releases" drawer,
and a sparkle on the Help icon when the running version hasn't been acknowledged
in this browser.Everything shown now comes from the root CHANGELOG.md, the release-level summary
written during each release: its headline and opening paragraph lead the
release, breaking changes and new features are listed individually and badged
apart, and the remaining sections are summed up as counts linking to that
release's section of the changelog. Nothing is hand-authored in the app. The
whole changelog is no longer shipped as a fetched asset either — next.config.mjs
parses it at build time and emits a small public/whats-new.json instead.
Patch Changes
-
cb48c46: Show every notification target an alert is configured with. The alerts page rows and the alert detail header only ever rendered the legacy singular
channel, so an alert notifying three webhooks read as if it notified one, and the label was the generic "Webhook" rather than the webhook's name. Both surfaces now resolve all of an alert's channels: the detail page names each target with its service icon (Slack, incident.io, generic), keeping the first two inline and collapsing the rest into a+N moretooltip, while the alerts-page rows show the icons only with the names on hover, since spelling out up to ten names wrapped the row into an unreadable block. The hover-only names are also placed in the accessibility tree rather than left to anaria-labelon a role-less wrapper.The evaluation history's "Webhook Duration" column is renamed "Notification duration" and gains a tooltip. The value was always the wall time of the whole delivery, which fans out to every target concurrently, so a single slow webhook sets the figure — but the singular heading read as one webhook's latency. Per-target attribution is not available yet; nothing records it. The remaining column headings are corrected to sentence case.
-
cf8e7e7: Give every alerts-page row the same trailing controls. The row's Terraform import button, source link, and acknowledgement button were each independently conditional — import needs a saved-search alert and the export feature, and
AckAlertrenders nothing for an OK alert that has never been acknowledged — so the flex row collapsed differently per alert and no two rows lined up. The conditional actions move into an overflow menu that always renders, alongside a new "Delete alert" item, and the acknowledgement button gets a reserved slot so its absence no longer shifts everything to its left.The Terraform snippet building is extracted into a
useTerraformSnippetshook so the row menu can present the same snippets in a modal without duplicating it, or movingResourceTerraformPopoveroff the two other pages that use it. Snippets are still built lazily on open, which is what keepswindow.location.originout of the render path and the ClickStack static export building. -
bb320db: fix: Confirm before discarding unsaved changes when closing the dashboard filter editor
-
f11038e: feat: Persist variable-keyed dashboard filter value state
-
f9f7d5b: feat: Add completions for PromQL variables
-
8218078: feat: Enable dashboard variables for everyone by removing the feature toggle
-
2ba1b25: fix: Expand variables prior to navigating to search page via drill-down
-
9155b43: Fix session replays rendering empty, unstyled, or freezing mid-session when a recorded rrweb event exceeds the recorder's ~950KB chunk size. All chunks of a split event share one timestamp, and the replay query ordered by timestamp alone, so ClickHouse could return chunks in arbitrary order — the scrambled reassembly failed to parse and the event (often the full DOM snapshot carrying all inlined CSS) was silently dropped. The replay stream is now ordered deterministically (
rr-web.offsetandrr-web.chunktiebreaks), chunks are reassembled by explicit chunk index per event, and dropped events are reported in the console and flagged with a warning indicator in the player instead of being swallowed. Existing recordings are replayed correctly without re-ingestion. Replaced replay streams are now also cancelled instead of streaming to completion in the background, and the player importsReplayerfrom@rrweb/replay(the replay-only package rrweb recommends over the deprecated combinedrrwebpackage). -
de9038e: feat: Distribute exact-match lucene variable references
-
7662fae: feat: Show warnings for invalid promql variable usage
-
93b51b1: feat: Add generated PromQL preview
-
64326d0: feat: Support variable substitution in PromQL charts
-
7f3878b: refactor: Split
DashboardFiltersModalinto smaller components -
210a3fb: Release markers now show a distinct "couldn't load release markers" notification when the underlying query fails (e.g. a source's version expression references a column, such as
ResourceAttributes, that the table doesn't have), instead of silently rendering no markers indistinguishable from "no releases found in this time range." -
e995c39: feat(app): mask secrets in API key and MCP install snippets with a shared reveal-to-copy component
-
057a684: perf: Virtualize the alerts page list
-
Updated dependencies [3c81bb9]
-
Updated dependencies [0558f77]
-
Updated dependencies [f11038e]
-
Updated dependencies [df4a7a5]
-
Updated dependencies [f9f7d5b]
-
Updated dependencies [892cc65]
-
Updated dependencies [82852c3]
-
Updated dependencies [b52a6fa]
-
Updated dependencies [de9038e]
-
Updated dependencies [5fc3341]
-
Updated dependencies [7662fae]
-
Updated dependencies [93b51b1]
-
Updated dependencies [64326d0]
- @hyperdx/api@2.37.0
- @hyperdx/common-utils@0.28.0