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