Uh oh!
There was an error while loading. Please reload this page.
Release HyperDX - #3036
Open
github-actions[bot] wants to merge 2 commits into
Open
Conversation
The latest updates on your projects. Learn more about Vercel for GitHub. 2 Skipped Deployments
|
Contributor
PR author is in the excluded authors list. |
github-actionsBotforce-pushed
the
changeset-release/main
branch
28 times, most recently
from
September 4, 2026 06:24
25d5ce1 to
20ec63cComparegithub-actionsBotforce-pushed
the
changeset-release/main
branch
from
September 4, 2026 11:45
64ce84e to
0180396Compare
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 freeto 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/cli@0.6.3
Patch Changes
53336f7: fix(charts): show decimals on Y-axis ticks under 10 in magnitude
The Y-axis of a time series chart (and the CLI's termchart equivalent)
always rounded tick labels to 0 decimal places, regardless of the chart's
Number Format settings. Charts whose values live under 1 (fractional
gauges, ratios, sub-1 rates) rendered every axis tick as
0even thoughthe tooltip and legend showed the correct value.
A tick under 10 in magnitude (as displayed - a percent tick's magnitude is
checked against its ×100 value, not its raw 0-1 ratio) now honors the
chart's configured decimals, capped at 2 to keep the label within the
axis's fixed width. A tick of 10 or more, and a tick of exactly 0, stay
integers exactly as before, whatever the chart's Number Format configures
templates are unaffected.
@hyperdx/api@2.38.0
Minor Changes
9c4f94f: Add enriched template variables to Generic and incident.io webhook bodies:
{{alertId}},{{status}},{{alertType}},{{comparator}},{{threshold}},{{value}},{{groupKey}},{{sourceQuery}},{{teamId}},{{note}}, andISO-8601
{{startTimeISO}}/{{endTimeISO}}alongside the existing Unix-ms{{startTime}}/{{endTime}}.Receivers can now route, filter and dedupe on an alert's identity and condition
without parsing the rendered message body. Existing templates are unaffected —
every new variable is additive and renders empty when an alert doesn't carry it.
f0d1cef: Support inline chart alerts (source
inline+chartConfig) in the externalAPI v2 and the MCP
clickstack_save_alert/clickstack_get_alerttools.Inline alerts can now be created, updated, listed, and deleted through
/api/v2/alertsusing the same tile-config dialect as v2 dashboards, with thesame validation rules as the internal API: display-type allowlist, metric
formula validation, the formula source-kind gate, raw SQL template validation,
and team-scoped source/connection ownership. Passing a
chartConfigto atileorsaved_searchalert is now rejected instead of silently dropped,and reading an inline alert whose config carries internal-only fields omits
chartConfigrather than returning a lossy approximation.Also fixes three pre-existing issues on the external v2 dashboards path: a
gauge tile saved through
clickstack_save_dashboardwithisDelta: truewaspersisted as a non-delta (the flag was dropped converting MCP tiles to the
internal shape); a tile config carrying an unrecognized
configType(e.g.promql) was silently stored as a builder config and skipped the formula andnumber-select rules, and is now rejected; and validation errors on alert
bodies no longer collapse to
Invalid input— the schema reports the failingbranch's own message.
d9c5c45: fix: preserve a Connection host path prefix when proxying PromQL.
proxyToPrometheusjoined absolute Prometheus paths (/api/v1/query_range,/api/v1/query,/api/v1/query_exemplars,/api/v1/label/.../values) withnew URL(path, host), which replaces the host pathname instead of appending toit. VictoriaMetrics cluster
vmselectURLs such ashttp://vmselect:8481/select/0/prometheuswere rewritten to/api/v1/query_rangeand rejected. The join now keeps the existing pathname.This is a behavior change for Connections whose host already included a path
that was never meant as a Prometheus API prefix — for example
http://prom:9090/graphcopied from the Prometheus UI. That previously happenedto work because the absolute API path replaced
/graph; requests now go to/graph/api/v1/query_rangeand will 404. Trim stray paths from existingConnection hosts before upgrading. Root-mounted hosts (
http://prom:9090orhttp://prom:9090/) are unchanged.Query parameters on the Connection host are now only a fallback for a fixed set
of real Prometheus API params (
query,time,start,end,step,match/match[],limit,timeout,stats): a request value for one ofthese (including repeatable ones such as
match[]) always wins and replaces asame-named host value outright, rather than being dropped. Any other host query
key the request never mentions -- for example
?extra_label=namespace%3Dprodpinning a VictoriaMetrics tenant scope -- is left as-is and is never overridable
by the request, since a param name outside that fixed set is not forwarded at
all regardless of what the host carries. This also means a host copied with a
stray query string (not just a stray path) now forwards its non-Prometheus keys
upstream as a fallback on every request -- trim those too if they weren't
intended as Prometheus API params.
This is also a behavior change for a direct API caller (e.g. curl or Terraform)
that previously relied on sending an arbitrary, non-Prometheus query param
through this endpoint: that param is now silently dropped rather than forwarded,
regardless of whether the Connection host carries anything under the same name.
Patch Changes
25a3b01: Fix
{{sourceQuery}}returning empty for inline-query and dashboard-tilealerts. It read only the saved search's filter, so alerts backed by a chart
config — where the query lives on the alert or the tile — advertised a variable
that never rendered. It now resolves the query from whichever config backs the
alert: the builder
whereor the rawsqlTemplate.Add
{{thresholdMax}}, the upper bound of abetween/outsidecondition.Receivers previously saw only the lower bound and could not reconstruct the
range that fired. It renders empty for every other comparator.
Test Webhook now sends a sample value for every template variable. It carried
only the original seven, so a body using an enriched variable rendered it empty
— and because
threshold,thresholdMaxandvalueare emitted unquoted, abody like
{"value": {{value}}}was sent as{"value": }and rejected,failing the test for a template that works on a real firing.
808b345: Accept
Bearer-prefixed Authorization header values on the OTel ingest endpoint in OpAMP-managed mode. The collector's bearer-token authenticator matches the full header value exactly and was configured with only the bare API key, so RFC 6750 clients that sendAuthorization: Bearer <token>were rejected. The generated collector config now also acceptsBearer,bearer, andBEARERprefixed forms of each ingestion API key.bf4443d: feat: Support autocomplete for PromQL label filters
55db91f: feat: Support static filters in MCP
89a897e: Fixed single-series histogram charts failing with "Unknown expression or function identifier" when sorted by a group-by column or expression. The histogram translation packs group values into a single
groupArray, so the table default ORDER BY (the raw group-by text) referenced source columns that no longer exist in scope; matched sort items now address the packed array positionally.f1062a7: Fixed multi-series metric charts failing with "Unknown expression or function identifier" when sorted by an expression group-by (e.g.
ResourceAttributes['service.name']). Table tiles default their ORDER BY to the group-by text, so any multi-series metric table grouped by a resource/attribute-derived expression failed to render. Such sort expressions are now evaluated inside each per-series branch through internal companion columns instead of being re-evaluated in the composed outer query, where the source columns no longer exist.4184a89: feat: Support dashboard filters based on Prometheus label values
bcf0257: feat: Accept optional time bounds on Prometheus label values endpoint
cff6388: feat: Add static filters to schemas and APIs
Updated dependencies [b917308]
Updated dependencies [55db91f]
Updated dependencies [89a897e]
Updated dependencies [f1062a7]
Updated dependencies [4184a89]
Updated dependencies [c796592]
Updated dependencies [cff6388]
@hyperdx/app@2.38.0
Minor Changes
503aac8: Show GPU utilization and GPU memory utilization charts in the log/span side
panel Infrastructure section when
hw.gpu.*metrics (OTel hardware semconv)exist for the correlated host/node. Multiple GPUs on a host render as separate
series grouped by
hw.id, and utilization is split per GPU engine byhw.gpu.task(general/encoder/decoder) so a node saturated on video encode isstill visible; a missing task is reported as
general. The section is fullyhidden when no GPU metrics are present and partially rendered when only one
metric is available.
The Infrastructure tab now also treats a Kubernetes resource attribute that is
present but empty (for example
k8s.node.name: "") as absent. Such rowspreviously surfaced an Infrastructure tab that could render nothing.
Fix GPU chart availability leaking across rows: switching the side panel to a
row on a different host briefly rendered the previous host's set of GPU
charts, because the availability query keeps the prior result readable while
the new one runs.
38e99a3: Add a read-time, schema-agnostic LLM observability dashboard at
/llm(beta, linked from the dashboards list) — no ingestion changes required, and it works retroactively on already-ingested telemetry. Traces instrumented with the OTel GenAI semantic conventions, OpenLLMetry, OpenInference, or the Vercel AI SDK are interpreted at query time to chart traffic, token split (uncached/cached/cache-write/output/reasoning), estimated cost by model (bundled price catalog with cache-read discounts and cache-write premiums; an instrumentation-provided cost attribute always wins), latency/TTFT, tool analytics, per-session timelines with lazy-loaded conversation views, and side-by-side LLM span/log search. Aggregations elect an app's own cost-reporting spans as the authoritative per-call reporters so apps emitting several instrumentation dialects in parallel (e.g. opencode emitting OpenInference and Vercel AI spans for each call) are counted once — verified to match opencode's self-reported session cost exactly.Patch Changes
b917308: fix: metric names in the chart editor are now listed deterministically instead of sampled. The dropdown discovered names with
groupUniqArray(3000)(MetricName), which keeps an arbitrary subset once a metrics table holds more than 3000 distinct names — the survivors follow hash order, not name order — so metrics that exist and are actively reporting could be unselectable, with no warning and no way to search for what had been dropped. Names are now fetched with an ordered, paginated query and matched server-side, ranked so an exact match is always on the first page, and the dropdown says when the list is incomplete. Also fixes the metric list ignoring the chart's selected time range, which pinned it to the last 24 hours.bf4443d: feat: Support autocomplete for PromQL label filters
55db91f: feat: Support static filters in MCP
89a897e: Fixed single-series histogram charts failing with "Unknown expression or function identifier" when sorted by a group-by column or expression. The histogram translation packs group values into a single
groupArray, so the table default ORDER BY (the raw group-by text) referenced source columns that no longer exist in scope; matched sort items now address the packed array positionally.fbb1e20: Preserve conditional color rules for SQL and PromQl chart configs
020e85f: Fix two problems with the chart editor's metric name picker. The truncation and load-failure notices now render below the input instead of above it, so they no longer push the field down out of alignment with the browse-metrics button beside it, and both were shortened to fit the tile editor's column without wrapping. A search that matches nothing now says so rather than silently hiding the dropdown, and offers the searched name as a selectable option — the catalog only covers the most recent three days of the chart's time range, so a metric that stopped reporting was previously impossible to chart by name.
f1062a7: Fixed multi-series metric charts failing with "Unknown expression or function identifier" when sorted by an expression group-by (e.g.
ResourceAttributes['service.name']). Table tiles default their ORDER BY to the group-by text, so any multi-series metric table grouped by a resource/attribute-derived expression failed to render. Such sort expressions are now evaluated inside each per-series branch through internal companion columns instead of being re-evaluated in the composed outer query, where the source columns no longer exist.cdcb023: fix: Reliably show service name and level in pattern sample drawer
4184a89: feat: Support dashboard filters based on Prometheus label values
bcf0257: feat: Accept optional time bounds on Prometheus label values endpoint
c796592: feat: Support a custom template for PromQL series legends
83c1b57: feat: Display static value filters
66f6cf0: Add a
window.hdxbrowser-console debug handle and a "Copy debug info" action in the Help menu, so you can confirm which build is deployed and grab the context worth attaching when filing an issue.window.hdx.report()(and the Help menu action) produces a pasteable summary: frontend version (from package.json), backend/API version (from/api/health— the two deploy separately), deployment mode, user/team ids, enabled env-configurable feature flags, current URL, screen/viewport/OS/browser info, and the RUM session id. The handle is installed once and reads its async fields (server version, identity, features, session id) live via getters.cff6388: feat: Add static filters to schemas and APIs
53336f7: fix(charts): show decimals on Y-axis ticks under 10 in magnitude
The Y-axis of a time series chart (and the CLI's termchart equivalent)
always rounded tick labels to 0 decimal places, regardless of the chart's
Number Format settings. Charts whose values live under 1 (fractional
gauges, ratios, sub-1 rates) rendered every axis tick as
0even thoughthe tooltip and legend showed the correct value.
A tick under 10 in magnitude (as displayed - a percent tick's magnitude is
checked against its ×100 value, not its raw 0-1 ratio) now honors the
chart's configured decimals, capped at 2 to keep the label within the
axis's fixed width. A tick of 10 or more, and a tick of exactly 0, stay
integers exactly as before, whatever the chart's Number Format configures
templates are unaffected.
25a3b01: List every supported template variable in the webhook form, including the
enriched set added to Generic and incident.io bodies (
{{alertId}},{{status}},{{alertType}},{{comparator}},{{threshold}},{{thresholdMax}},{{value}},{{groupKey}},{{sourceQuery}},{{teamId}},{{note}}and ISO-8601{{startTimeISO}}/{{endTimeISO}}).Each variable now carries a one-line description, so a webhook body can be
written without leaving the form.
0a18745: feat: Allow creation and editing of static list filters in the UI
Updated dependencies [25a3b01]
Updated dependencies [9c4f94f]
Updated dependencies [808b345]
Updated dependencies [b917308]
Updated dependencies [bf4443d]
Updated dependencies [55db91f]
Updated dependencies [89a897e]
Updated dependencies [f0d1cef]
Updated dependencies [f1062a7]
Updated dependencies [4184a89]
Updated dependencies [bcf0257]
Updated dependencies [c796592]
Updated dependencies [d9c5c45]
Updated dependencies [cff6388]
@hyperdx/common-utils@0.28.1
Patch Changes
groupUniqArray(3000)(MetricName), which keeps an arbitrary subset once a metrics table holds more than 3000 distinct names — the survivors follow hash order, not name order — so metrics that exist and are actively reporting could be unselectable, with no warning and no way to search for what had been dropped. Names are now fetched with an ordered, paginated query and matched server-side, ranked so an exact match is always on the first page, and the dropdown says when the list is incomplete. Also fixes the metric list ignoring the chart's selected time range, which pinned it to the last 24 hours.groupArray, so the table default ORDER BY (the raw group-by text) referenced source columns that no longer exist in scope; matched sort items now address the packed array positionally.ResourceAttributes['service.name']). Table tiles default their ORDER BY to the group-by text, so any multi-series metric table grouped by a resource/attribute-derived expression failed to render. Such sort expressions are now evaluated inside each per-series branch through internal companion columns instead of being re-evaluated in the composed outer query, where the source columns no longer exist.@hyperdx/otel-collector@2.38.0
Patch Changes
Bearer-prefixed Authorization header values on the OTLP receiver in standalone mode (OTLP_AUTH_TOKEN). Previously only the bare-token form of the header was accepted, rejecting RFC 6750 clients that sendAuthorization: Bearer <token>. TheBearer,bearer, andBEARERprefixed forms are now accepted alongside the bare token.