Release HyperDX - #2975
Open
github-actions[bot] wants to merge 2 commits into
Open
Conversation
Contributor
|
PR author is in the excluded authors list. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
github-actions
Bot
force-pushed
the
changeset-release/main
branch
14 times, most recently
from
August 26, 2026 14:53
253c1b5 to
ab2867a
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
2 times, most recently
from
August 26, 2026 17:10
d699e46 to
e8d905f
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 26, 2026 17:55
e75a98b to
855f999
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
8 times, most recently
from
August 27, 2026 16:34
72cc6bc to
bfa75e1
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 27, 2026 19:24
b08c49c to
51b2003
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 28, 2026 02:51
ff5ddf8 to
67b2d21
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@hyperdx/api@2.37.0
Minor Changes
0558f77: Record and show which notification target an evaluation's delivery time went to.
webhookDurationMswas a single number covering the whole delivery, and because targets are dispatched concurrently the slowest one sets it — so a multi-target alert reported a figure with no way to tell which webhook was responsible, or that the other targets were fine.Each dispatch is now timed individually and aggregated per target across the evaluation, since a grouped alert notifies the same target once per firing group and again on resolve. One entry per distinct target carries its webhook id, display name, summed duration, how many dispatches it took, and how many failed. The evaluation history's "Notification duration" cell expands in place to show the breakdown.
Stored per evaluation rather than per dispatch: a 50-group alert notifying 10 targets would otherwise write 500 entries onto every history row. The array is capped at
ALERT_NOTIFICATION_TARGETS_LIMITand sorted slowest-first, so the cap drops the least interesting rows. Records written before this change keep rendering their total with nothing to expand.Patch Changes
@webhook-<id>mention strings and parsing them back out. That round-trip carried onlytypeandwebhookId, and it appended the channels after whatever the user wrote in the message body — so a body containingMAX_NOTIFICATIONS_PER_EVENTmentions consumed every slot of the per-event cap and the alert's own configured channel, the one target it was set up to notify, was silently never reached. Configured channels are now queued first and are exempt from that cap, which only ever meant to bound ad hoc mentions;channelsis already bounded byMAX_ALERT_CHANNELS. Mentions written into the message body are unchanged, still capped, and still deduplicated against the configured channels so naming one twice notifies it once. This also removes the lossiness that prevented a channel from carrying any field beyond its webhook id through to delivery, which downstream forks with richer channel types (e.g. anemailchannel, or a Slack-app channel that also needs a Slack channel id) could not work around.getDefaultExternalActionsis removed, as nothing needs the mention-string form of a configured channel any more.levelfield as a string enum so Gemini-backed clients can use the server at all.z.union([z.literal(0.5), ...])renders as{ "type": "number", "enum": [0.5, 0.9, 0.95, 0.99] }, and Gemini's function declarations only acceptenumalongsidetype: "string"— so a client that forwards MCP tool schemas to the provider had its entire tool list rejected because of this one field, surfacing as a generic "trouble connecting to the model provider" error that named neither the tool nor the property. Affectedclickstack_timeseries,clickstack_table,clickstack_save_dashboardandclickstack_patch_dashboard. Only the advertised wire type changes: numeric input is still accepted for callers working from a cached schema, the value is coerced back to a number before any consumer sees it, and out-of-set values are still rejected. The external REST API's ownlevelcontract is untouched. A new test asserts that no advertised tool schema carries a non-stringenumor an array-formitems, complementing the draft-2020-12 metaschema check.@hyperdx/app@2.37.0
Minor Changes
0558f77: Record and show which notification target an evaluation's delivery time went to.
webhookDurationMswas a single number covering the whole delivery, and because targets are dispatched concurrently the slowest one sets it — so a multi-target alert reported a figure with no way to tell which webhook was responsible, or that the other targets were fine.Each dispatch is now timed individually and aggregated per target across the evaluation, since a grouped alert notifies the same target once per firing group and again on resolve. One entry per distinct target carries its webhook id, display name, summed duration, how many dispatches it took, and how many failed. The evaluation history's "Notification duration" cell expands in place to show the breakdown.
Stored per evaluation rather than per dispatch: a 50-group alert notifying 10 targets would otherwise write 500 entries onto every history row. The array is capped at
ALERT_NOTIFICATION_TARGETS_LIMITand sorted slowest-first, so the cap drops the least interesting rows. Records written before this change keep rendering their total with nothing to expand.8f3126f: Add a metrics explorer to the chart editor, so you no longer have to already know a metric's name to chart it. A browse control beside the metric select opens a modal with a prefix hierarchy over the metric namespace —
system→cpu→utilization— plus search across every name and description the source is reporting. Each row carries the metric's kind and its description, and the detail pane shows the unit (rendered from its UCUM code), reporting services, and tag keys drilling into their values. Previously the picker was a flat 3,000-entry dropdown and that metadata only appeared after you had already committed to a metric.Names are split per metric: on
.when the name has one (OpenTelemetry), otherwise on_(Prometheus exporters). Deciding per name rather than per source matters in practice — a real deployment carries thousands of underscore-style collector self-telemetry names alongside dozens of dotted application metrics, and a single source-wide separator flattened whichever family was outnumbered. Single-child chains collapse so the tree does not become a corridor, and the unfiltered tree is never truncated, so no namespace can go missing.While browsing a metric's tags you can stage filters and group-bys the same way the chart editor's inline attribute panel allows; they are shown as removable chips and applied together with the metric. Applying also sets an aggregation appropriate to the kind — average for a gauge, sum for a counter, p95 for a histogram — instead of inheriting whatever the previous series used. Both replace rather than merge, since they were written against the newly chosen metric: staged filters replace the series condition, and staged group-bys replace the chart's.
The chart editor's inline attribute panel now also shows the metric's kind. Only chartable kinds are listed (gauge, sum, histogram, exponential histogram);
summaryis omitted because the query renderer cannot translate it. The browser is a self-contained component, so the modal is one shell around it rather than the only possible home.e0d2932: feat: rebuild the Help menu's "What's new" around the release notes. Replaces
the full-changelog modal with an inline section, a "View all releases" drawer,
and a sparkle on the Help icon when the running version hasn't been acknowledged
in this browser.
Everything shown now comes from the root CHANGELOG.md, the release-level summary
written during each release: its headline and opening paragraph lead the
release, breaking changes and new features are listed individually and badged
apart, and the remaining sections are summed up as counts linking to that
release's section of the changelog. Nothing is hand-authored in the app. The
whole changelog is no longer shipped as a fetched asset either — next.config.mjs
parses it at build time and emits a small public/whats-new.json instead.
Patch Changes
cb48c46: Show every notification target an alert is configured with. The alerts page rows and the alert detail header only ever rendered the legacy singular
channel, so an alert notifying three webhooks read as if it notified one, and the label was the generic "Webhook" rather than the webhook's name. Both surfaces now resolve all of an alert's channels: the detail page names each target with its service icon (Slack, incident.io, generic), keeping the first two inline and collapsing the rest into a+N moretooltip, while the alerts-page rows show the icons only with the names on hover, since spelling out up to ten names wrapped the row into an unreadable block. The hover-only names are also placed in the accessibility tree rather than left to anaria-labelon a role-less wrapper.The evaluation history's "Webhook Duration" column is renamed "Notification duration" and gains a tooltip. The value was always the wall time of the whole delivery, which fans out to every target concurrently, so a single slow webhook sets the figure — but the singular heading read as one webhook's latency. Per-target attribution is not available yet; nothing records it. The remaining column headings are corrected to sentence case.
cf8e7e7: Give every alerts-page row the same trailing controls. The row's Terraform import button, source link, and acknowledgement button were each independently conditional — import needs a saved-search alert and the export feature, and
AckAlertrenders nothing for an OK alert that has never been acknowledged — so the flex row collapsed differently per alert and no two rows lined up. The conditional actions move into an overflow menu that always renders, alongside a new "Delete alert" item, and the acknowledgement button gets a reserved slot so its absence no longer shifts everything to its left.The Terraform snippet building is extracted into a
useTerraformSnippetshook so the row menu can present the same snippets in a modal without duplicating it, or movingResourceTerraformPopoveroff the two other pages that use it. Snippets are still built lazily on open, which is what keepswindow.location.originout of the render path and the ClickStack static export building.bb320db: fix: Confirm before discarding unsaved changes when closing the dashboard filter editor
f11038e: feat: Persist variable-keyed dashboard filter value state
f9f7d5b: feat: Add completions for PromQL variables
8218078: feat: Enable dashboard variables for everyone by removing the feature toggle
2ba1b25: fix: Expand variables prior to navigating to search page via drill-down
9155b43: Fix session replays rendering empty, unstyled, or freezing mid-session when a recorded rrweb event exceeds the recorder's ~950KB chunk size. All chunks of a split event share one timestamp, and the replay query ordered by timestamp alone, so ClickHouse could return chunks in arbitrary order — the scrambled reassembly failed to parse and the event (often the full DOM snapshot carrying all inlined CSS) was silently dropped. The replay stream is now ordered deterministically (
rr-web.offsetandrr-web.chunktiebreaks), chunks are reassembled by explicit chunk index per event, and dropped events are reported in the console and flagged with a warning indicator in the player instead of being swallowed. Existing recordings are replayed correctly without re-ingestion. Replaced replay streams are now also cancelled instead of streaming to completion in the background, and the player importsReplayerfrom@rrweb/replay(the replay-only package rrweb recommends over the deprecated combinedrrwebpackage).de9038e: feat: Distribute exact-match lucene variable references
7662fae: feat: Show warnings for invalid promql variable usage
93b51b1: feat: Add generated PromQL preview
64326d0: feat: Support variable substitution in PromQL charts
7f3878b: refactor: Split
DashboardFiltersModalinto smaller components210a3fb: Release markers now show a distinct "couldn't load release markers" notification when the underlying query fails (e.g. a source's version expression references a column, such as
ResourceAttributes, that the table doesn't have), instead of silently rendering no markers indistinguishable from "no releases found in this time range."e995c39: feat(app): mask secrets in API key and MCP install snippets with a shared reveal-to-copy component
057a684: perf: Virtualize the alerts page list
Updated dependencies [3c81bb9]
Updated dependencies [0558f77]
Updated dependencies [f11038e]
Updated dependencies [f9f7d5b]
Updated dependencies [892cc65]
Updated dependencies [82852c3]
Updated dependencies [b52a6fa]
Updated dependencies [de9038e]
Updated dependencies [7662fae]
Updated dependencies [93b51b1]
Updated dependencies [64326d0]
@hyperdx/common-utils@0.28.0
Minor Changes
0558f77: Record and show which notification target an evaluation's delivery time went to.
webhookDurationMswas a single number covering the whole delivery, and because targets are dispatched concurrently the slowest one sets it — so a multi-target alert reported a figure with no way to tell which webhook was responsible, or that the other targets were fine.Each dispatch is now timed individually and aggregated per target across the evaluation, since a grouped alert notifies the same target once per firing group and again on resolve. One entry per distinct target carries its webhook id, display name, summed duration, how many dispatches it took, and how many failed. The evaluation history's "Notification duration" cell expands in place to show the breakdown.
Stored per evaluation rather than per dispatch: a 50-group alert notifying 10 targets would otherwise write 500 entries onto every history row. The array is capped at
ALERT_NOTIFICATION_TARGETS_LIMITand sorted slowest-first, so the cap drops the least interesting rows. Records written before this change keep rendering their total with nothing to expand.Patch Changes
@/*aliases leaking into the local type declarations@hyperdx/hdx-eval@0.3.3
Patch Changes
@hyperdx/otel-collector@2.37.0