@@ -6,6 +6,153 @@ 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-27
10+
11+ <!-- hyperdx-release-notes version=2.37.0 inputs=4b5e6edb34f2 -->
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 (#3000 , thanks
39+ @MikeShi42 !).
40+ - ** "What's new" lives in the app** : the Help menu's full-changelog modal is
41+ replaced by an inline section, a "View all releases" drawer, and a sparkle on
42+ the Help icon when the running version has not been acknowledged in this
43+ browser. Everything comes from the release notes themselves — headline and
44+ summary lead each release, breaking changes and new features are listed and
45+ badged apart, and the remaining sections are summarised as counts. The
46+ changelog is parsed at build time rather than shipped as a fetched asset
47+ (#2993 , thanks @jordan-simonovski !).
48+ - ** Dashboard variables are available to everyone** : the feature toggle that
49+ gated dashboard variables is gone, so every deployment gets variables — and
50+ the filter, Lucene and PromQL work below — without turning a flag on first
51+ (#3009 , thanks @pulpdrew !).
52+ - ** Dashboard filter values persist per variable** : filter value state is now
53+ stored keyed by its variable, so a dashboard keeps the selections you made
54+ (#2963 , thanks @pulpdrew !).
55+ - ** Exact-match Lucene variable references are distributed** : a Lucene search
56+ that matches a field exactly against a dashboard variable now expands across
57+ the variable's values (#2987 , thanks @pulpdrew !).
58+ - ** Dashboard variables work in PromQL charts** : a PromQL query on a dashboard
59+ tile now has its variable references substituted before it runs, so PromQL
60+ charts respond to the dashboard's variables like the rest of your tiles, and
61+ the PromQL editor completes the variables available to it as you type. A
62+ variable used somewhere PromQL cannot take one is now called out with a
63+ warning instead of leaving you to work out why the chart is empty, and a
64+ preview shows the generated PromQL the chart will run (#2994 , #2995 , #2997 ,
65+ #2998 , thanks @pulpdrew !).
66+
67+ ### 🔧 Improvements
68+
69+ - ** Every alerts-page row has the same trailing controls** : the Terraform
70+ import, source link and acknowledgement actions were each conditional, so no
71+ two rows lined up. The conditional actions move into an overflow menu that
72+ always renders — with a new "Delete alert" item alongside them — and the
73+ acknowledgement button gets a reserved slot, so its absence no longer shifts
74+ the row (#3002 , thanks @jordan-simonovski !).
75+ - ** The alerts page stays responsive with a long list of alerts** : the list is
76+ virtualised, so only the rows on screen are rendered and scrolling no longer
77+ slows down on a team with hundreds of alerts (#3012 , thanks @pulpdrew !).
78+ - ** API keys and MCP install snippets stay masked until revealed** : both now
79+ hide their secret behind a shared reveal-to-copy control, so you can open
80+ those pages without the key on screen (#2988 ).
81+ - ** Closing the dashboard filter editor confirms first** : you are asked before
82+ unsaved changes to a dashboard filter are discarded, so a stray click no
83+ longer loses the edits you were part-way through (#3005 , thanks @pulpdrew !).
84+ - ** Better metric discovery over MCP** : the MCP server's metric discovery is
85+ improved, so an agent working with your metrics finds the right one more
86+ reliably (#2861 , thanks @karl-power !).
87+
88+ ### 🐛 Bug Fixes
89+
90+ - ** Alerts reliably notify their configured channels** : configured channels were
91+ encoded as ` @webhook-<id> ` mention strings and appended after whatever you
92+ wrote in the alert message, so a body containing enough mentions consumed the
93+ entire per-event notification cap and the alert's own channel — the one target
94+ it was set up to notify — was silently never reached. Configured channels are
95+ now built directly, queued first, and exempt from a cap that only ever meant
96+ to bound ad hoc mentions. Mentions in the message body are unchanged, still
97+ capped, and still deduplicated against the configured channels, so naming one
98+ twice notifies it once (#2984 , thanks @jordan-simonovski !).
99+ - ** The alerts pages show every notification target** : rows and the alert detail
100+ header only rendered the legacy singular channel, so an alert notifying three
101+ webhooks read as if it notified one, labelled a generic "Webhook" rather than
102+ the webhook's name. The detail page now names each target with its service
103+ icon, keeping the first two inline and collapsing the rest into a ` +N more `
104+ tooltip, while rows show the icons with names on hover. The evaluation
105+ history's "Webhook Duration" column is renamed "Notification duration" with a
106+ tooltip, since the figure was always the wall time of a delivery that fans out
107+ to every target at once (#3001 , thanks @jordan-simonovski !).
108+ - ** Session replays survive very large recorded events** : an rrweb event over
109+ the recorder's ~ 950KB chunk size is split into chunks that all share one
110+ timestamp, and the replay query ordered by timestamp alone, so ClickHouse
111+ could return them scrambled and the event — often the full DOM snapshot with
112+ all its inlined CSS — was silently dropped, leaving replays empty, unstyled or
113+ frozen mid-session. The stream is now ordered deterministically, chunks are
114+ reassembled by explicit index, and any event that still cannot be rebuilt is
115+ flagged in the player instead of swallowed. Existing recordings play back
116+ correctly without re-ingestion (#2956 ).
117+ - ** Gemini-backed MCP clients can connect again** : the quantile ` level ` field
118+ was advertised as a numeric enum, and Gemini's function declarations accept
119+ ` enum ` only alongside ` type: "string" ` — so a client forwarding tool schemas
120+ to the provider had its whole tool list rejected over this one field, with a
121+ generic "trouble connecting to the model provider" error that named neither
122+ the tool nor the property. ` level ` is now advertised as a string enum on
123+ ` clickstack_timeseries ` , ` clickstack_table ` , ` clickstack_save_dashboard ` and
124+ ` clickstack_patch_dashboard ` ; numeric input is still accepted and
125+ out-of-set values are still rejected, and the external REST API's own contract
126+ is untouched (#2971 , thanks @RIP21 !).
127+ - ** Drilling down to Search carries the variable's value, not its name** :
128+ dashboard variables are now expanded before a drill-down opens the search
129+ page, so the search runs against the values you were looking at instead of the
130+ unresolved variable references (#3008 , thanks @pulpdrew !).
131+ - ** A failed release-marker query says so** : when the query behind release
132+ markers fails — for example because a source's version expression references a
133+ column such as ` ResourceAttributes ` that the table does not have — you now get
134+ a distinct "couldn't load release markers" notification, instead of an empty
135+ chart indistinguishable from "no releases in this time range" (#3007 , thanks
136+ @teeohhem !).
137+
138+ ### 📦 Build / Packaging
139+
140+ - ** ` @hyperdx/common-utils ` ships usable type declarations** : internal ` @/* `
141+ path aliases no longer leak into the published ` .d.ts ` files, where they could
142+ not be resolved by consumers (#2969 , thanks @pulpdrew !).
143+
144+ <!-- hyperdx-package-list -->
145+
146+ ### 📦 Package changelogs
147+
148+ - ` @hyperdx/api ` 2.36.0 → 2.37.0 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/api/CHANGELOG.md#2370 )
149+ - ` @hyperdx/app ` 2.36.0 → 2.37.0 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/app/CHANGELOG.md#2370 )
150+ - ` @hyperdx/common-utils ` 0.27.0 → 0.27.1 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/common-utils/CHANGELOG.md#0271 )
151+ - ` @hyperdx/hdx-eval ` 0.3.2 → 0.3.3 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/hdx-eval/CHANGELOG.md#033 )
152+ - ` @hyperdx/otel-collector ` 2.36.0 → 2.37.0 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/otel-collector/CHANGELOG.md#2370 )
153+
154+ <!-- /hyperdx-package-list -->
155+
9156## v2.36.0 — 2026-08-21
10157
11158<!-- hyperdx-release-notes version=2.36.0 inputs=f975367d849a -->
0 commit comments