@@ -6,6 +6,120 @@ PR — keep the `hyperdx-release-notes` comment marker intact when editing so yo
66edits survive regeneration. Per-package detail lives in each
77` packages/*/CHANGELOG.md ` .
88
9+ ## v2.37.0 — 2026-08-26
10+
11+ <!-- hyperdx-release-notes version=2.37.0 inputs=2058b3ca5f23 -->
12+
13+ ** Metrics explorer and in-app release notes**
14+
15+ You no longer have to know a metric's name to chart it: the chart editor gains a
16+ metrics explorer that browses your metric namespace as a tree, searches every
17+ name and description the source reports, and shows a metric's kind, unit,
18+ reporting services and tag values before you commit to it. The Help menu's
19+ "What's new" is rebuilt around these release notes, so each release's highlights
20+ are readable in the app itself. Multi-webhook alerts are now honoured end to
21+ end — every configured channel is notified, and every target is shown on the
22+ alerts pages — and session replays no longer break when a recording contains a
23+ very large event.
24+
25+ ### ✨ New Features
26+
27+ - ** Metrics explorer in the chart editor** : a browse control beside the metric
28+ select opens a modal with a prefix hierarchy over your metric namespace
29+ (` system ` → ` cpu ` → ` utilization ` ) plus search across every metric name and
30+ description. Each row shows the metric's kind and description, and the detail
31+ pane gives the unit, reporting services and tag keys you can drill into,
32+ replacing a flat dropdown of thousands of names that only revealed that
33+ metadata after you had chosen. Names split on ` . ` when they have one and on
34+ ` _ ` otherwise, decided per metric, so dotted OpenTelemetry names and
35+ underscore-style exporter names both nest sensibly. While browsing a metric's
36+ tags you can stage filters and group-bys as removable chips and apply them
37+ with the metric, and applying sets an aggregation suited to the kind — average
38+ for a gauge, sum for a counter, p95 for a histogram.
39+ - ** "What's new" lives in the app** : the Help menu's full-changelog modal is
40+ replaced by an inline section, a "View all releases" drawer, and a sparkle on
41+ the Help icon when the running version has not been acknowledged in this
42+ browser. Everything comes from the release notes themselves — headline and
43+ summary lead each release, breaking changes and new features are listed and
44+ badged apart, and the remaining sections are summarised as counts. The
45+ changelog is parsed at build time rather than shipped as a fetched asset
46+ (#2993 , thanks @jordan-simonovski !).
47+ - ** Dashboard filter values persist per variable** : filter value state is now
48+ stored keyed by its variable, so a dashboard keeps the selections you made
49+ (#2963 , thanks @pulpdrew !).
50+ - ** Exact-match Lucene variable references are distributed** : a Lucene search
51+ that matches a field exactly against a dashboard variable now expands across
52+ the variable's values (#2987 , thanks @pulpdrew !).
53+
54+ ### 🔧 Improvements
55+
56+ - ** Every alerts-page row has the same trailing controls** : the Terraform
57+ import, source link and acknowledgement actions were each conditional, so no
58+ two rows lined up. The conditional actions move into an overflow menu that
59+ always renders — with a new "Delete alert" item alongside them — and the
60+ acknowledgement button gets a reserved slot, so its absence no longer shifts
61+ the row (#3002 , thanks @jordan-simonovski !).
62+ - ** API keys and MCP install snippets stay masked until revealed** : both now
63+ hide their secret behind a shared reveal-to-copy control, so you can open
64+ those pages without the key on screen (#2988 ).
65+
66+ ### 🐛 Bug Fixes
67+
68+ - ** Alerts reliably notify their configured channels** : configured channels were
69+ encoded as ` @webhook-<id> ` mention strings and appended after whatever you
70+ wrote in the alert message, so a body containing enough mentions consumed the
71+ entire per-event notification cap and the alert's own channel — the one target
72+ it was set up to notify — was silently never reached. Configured channels are
73+ now built directly, queued first, and exempt from a cap that only ever meant
74+ to bound ad hoc mentions. Mentions in the message body are unchanged, still
75+ capped, and still deduplicated against the configured channels, so naming one
76+ twice notifies it once (#2984 , thanks @jordan-simonovski !).
77+ - ** The alerts pages show every notification target** : rows and the alert detail
78+ header only rendered the legacy singular channel, so an alert notifying three
79+ webhooks read as if it notified one, labelled a generic "Webhook" rather than
80+ the webhook's name. The detail page now names each target with its service
81+ icon, keeping the first two inline and collapsing the rest into a ` +N more `
82+ tooltip, while rows show the icons with names on hover. The evaluation
83+ history's "Webhook Duration" column is renamed "Notification duration" with a
84+ tooltip, since the figure was always the wall time of a delivery that fans out
85+ to every target at once (#3001 , thanks @jordan-simonovski !).
86+ - ** Session replays survive very large recorded events** : an rrweb event over
87+ the recorder's ~ 950KB chunk size is split into chunks that all share one
88+ timestamp, and the replay query ordered by timestamp alone, so ClickHouse
89+ could return them scrambled and the event — often the full DOM snapshot with
90+ all its inlined CSS — was silently dropped, leaving replays empty, unstyled or
91+ frozen mid-session. The stream is now ordered deterministically, chunks are
92+ reassembled by explicit index, and any event that still cannot be rebuilt is
93+ flagged in the player instead of swallowed. Existing recordings play back
94+ correctly without re-ingestion (#2956 ).
95+ - ** Gemini-backed MCP clients can connect again** : the quantile ` level ` field
96+ was advertised as a numeric enum, and Gemini's function declarations accept
97+ ` enum ` only alongside ` type: "string" ` — so a client forwarding tool schemas
98+ to the provider had its whole tool list rejected over this one field, with a
99+ generic "trouble connecting to the model provider" error that named neither
100+ the tool nor the property. ` level ` is now advertised as a string enum on
101+ ` clickstack_timeseries ` , ` clickstack_table ` , ` clickstack_save_dashboard ` and
102+ ` clickstack_patch_dashboard ` ; numeric input is still accepted and
103+ out-of-set values are still rejected, and the external REST API's own contract
104+ is untouched (#2971 , thanks @RIP21 !).
105+
106+ ### 📦 Build / Packaging
107+
108+ - ** ` @hyperdx/common-utils ` ships usable type declarations** : internal ` @/* `
109+ path aliases no longer leak into the published ` .d.ts ` files, where they could
110+ not be resolved by consumers (#2969 , thanks @pulpdrew !).
111+
112+ <!-- hyperdx-package-list -->
113+
114+ ### 📦 Package changelogs
115+
116+ - ` @hyperdx/api ` 2.36.0 → 2.37.0 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/api/CHANGELOG.md#2370 )
117+ - ` @hyperdx/app ` 2.36.0 → 2.37.0 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/app/CHANGELOG.md#2370 )
118+ - ` @hyperdx/common-utils ` 0.27.0 → 0.27.1 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/common-utils/CHANGELOG.md#0271 )
119+ - ` @hyperdx/otel-collector ` 2.36.0 → 2.37.0 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/otel-collector/CHANGELOG.md#2370 )
120+
121+ <!-- /hyperdx-package-list -->
122+
9123## v2.36.0 — 2026-08-21
10124
11125<!-- hyperdx-release-notes version=2.36.0 inputs=f975367d849a -->
0 commit comments