@@ -6,6 +6,150 @@ 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=25857962aacd -->
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+ - ** API keys and MCP install snippets stay masked until revealed** : both now
76+ hide their secret behind a shared reveal-to-copy control, so you can open
77+ those pages without the key on screen (#2988 ).
78+ - ** Closing the dashboard filter editor confirms first** : you are asked before
79+ unsaved changes to a dashboard filter are discarded, so a stray click no
80+ longer loses the edits you were part-way through (#3005 , thanks @pulpdrew !).
81+ - ** Better metric discovery over MCP** : the MCP server's metric discovery is
82+ improved, so an agent working with your metrics finds the right one more
83+ reliably (#2861 , thanks @karl-power !).
84+
85+ ### 🐛 Bug Fixes
86+
87+ - ** Alerts reliably notify their configured channels** : configured channels were
88+ encoded as ` @webhook-<id> ` mention strings and appended after whatever you
89+ wrote in the alert message, so a body containing enough mentions consumed the
90+ entire per-event notification cap and the alert's own channel — the one target
91+ it was set up to notify — was silently never reached. Configured channels are
92+ now built directly, queued first, and exempt from a cap that only ever meant
93+ to bound ad hoc mentions. Mentions in the message body are unchanged, still
94+ capped, and still deduplicated against the configured channels, so naming one
95+ twice notifies it once (#2984 , thanks @jordan-simonovski !).
96+ - ** The alerts pages show every notification target** : rows and the alert detail
97+ header only rendered the legacy singular channel, so an alert notifying three
98+ webhooks read as if it notified one, labelled a generic "Webhook" rather than
99+ the webhook's name. The detail page now names each target with its service
100+ icon, keeping the first two inline and collapsing the rest into a ` +N more `
101+ tooltip, while rows show the icons with names on hover. The evaluation
102+ history's "Webhook Duration" column is renamed "Notification duration" with a
103+ tooltip, since the figure was always the wall time of a delivery that fans out
104+ to every target at once (#3001 , thanks @jordan-simonovski !).
105+ - ** Session replays survive very large recorded events** : an rrweb event over
106+ the recorder's ~ 950KB chunk size is split into chunks that all share one
107+ timestamp, and the replay query ordered by timestamp alone, so ClickHouse
108+ could return them scrambled and the event — often the full DOM snapshot with
109+ all its inlined CSS — was silently dropped, leaving replays empty, unstyled or
110+ frozen mid-session. The stream is now ordered deterministically, chunks are
111+ reassembled by explicit index, and any event that still cannot be rebuilt is
112+ flagged in the player instead of swallowed. Existing recordings play back
113+ correctly without re-ingestion (#2956 ).
114+ - ** Gemini-backed MCP clients can connect again** : the quantile ` level ` field
115+ was advertised as a numeric enum, and Gemini's function declarations accept
116+ ` enum ` only alongside ` type: "string" ` — so a client forwarding tool schemas
117+ to the provider had its whole tool list rejected over this one field, with a
118+ generic "trouble connecting to the model provider" error that named neither
119+ the tool nor the property. ` level ` is now advertised as a string enum on
120+ ` clickstack_timeseries ` , ` clickstack_table ` , ` clickstack_save_dashboard ` and
121+ ` clickstack_patch_dashboard ` ; numeric input is still accepted and
122+ out-of-set values are still rejected, and the external REST API's own contract
123+ is untouched (#2971 , thanks @RIP21 !).
124+ - ** Drilling down to Search carries the variable's value, not its name** :
125+ dashboard variables are now expanded before a drill-down opens the search
126+ page, so the search runs against the values you were looking at instead of the
127+ unresolved variable references (#3008 , thanks @pulpdrew !).
128+ - ** A failed release-marker query says so** : when the query behind release
129+ markers fails — for example because a source's version expression references a
130+ column such as ` ResourceAttributes ` that the table does not have — you now get
131+ a distinct "couldn't load release markers" notification, instead of an empty
132+ chart indistinguishable from "no releases in this time range" (#3007 , thanks
133+ @teeohhem !).
134+
135+ ### 📦 Build / Packaging
136+
137+ - ** ` @hyperdx/common-utils ` ships usable type declarations** : internal ` @/* `
138+ path aliases no longer leak into the published ` .d.ts ` files, where they could
139+ not be resolved by consumers (#2969 , thanks @pulpdrew !).
140+
141+ <!-- hyperdx-package-list -->
142+
143+ ### 📦 Package changelogs
144+
145+ - ` @hyperdx/api ` 2.36.0 → 2.37.0 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/api/CHANGELOG.md#2370 )
146+ - ` @hyperdx/app ` 2.36.0 → 2.37.0 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/app/CHANGELOG.md#2370 )
147+ - ` @hyperdx/common-utils ` 0.27.0 → 0.27.1 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/common-utils/CHANGELOG.md#0271 )
148+ - ` @hyperdx/hdx-eval ` 0.3.2 → 0.3.3 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/hdx-eval/CHANGELOG.md#033 )
149+ - ` @hyperdx/otel-collector ` 2.36.0 → 2.37.0 — [ changelog] ( https://github.com/hyperdxio/hyperdx/blob/main/packages/otel-collector/CHANGELOG.md#2370 )
150+
151+ <!-- /hyperdx-package-list -->
152+
9153## v2.36.0 — 2026-08-21
10154
11155<!-- hyperdx-release-notes version=2.36.0 inputs=f975367d849a -->
0 commit comments