Skip to content

Commit e75a98b

Browse files
chore(release): update root CHANGELOG.md
1 parent e8d905f commit e75a98b

1 file changed

Lines changed: 114 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,120 @@ PR — keep the `hyperdx-release-notes` comment marker intact when editing so yo
66
edits 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

Comments
 (0)