Release HyperDX - #3036

Open
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main
Open

Release HyperDX#3036
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actionsgithub-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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}}, and
    ISO-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 external
    API v2 and the MCP clickstack_save_alert / clickstack_get_alert tools.
    Inline alerts can now be created, updated, listed, and deleted through
    /api/v2/alerts using the same tile-config dialect as v2 dashboards, with the
    same 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 chartConfig to a
    tile or saved_search alert is now rejected instead of silently dropped,
    and reading an inline alert whose config carries internal-only fields omits
    chartConfig rather than returning a lossy approximation.

    Also fixes three pre-existing issues on the external v2 dashboards path: a
    gauge tile saved through clickstack_save_dashboard with isDelta: true was
    persisted 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 and
    number-select rules, and is now rejected; and validation errors on alert
    bodies no longer collapse to Invalid input — the schema reports the failing
    branch's own message.

  • d9c5c45: fix: preserve a Connection host path prefix when proxying PromQL.
    proxyToPrometheus joined absolute Prometheus paths (/api/v1/query_range,
    /api/v1/query, /api/v1/query_exemplars, /api/v1/label/.../values) with
    new URL(path, host), which replaces the host pathname instead of appending to
    it. VictoriaMetrics cluster vmselect URLs such as
    http://vmselect:8481/select/0/prometheus were rewritten to
    /api/v1/query_range and 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/graph copied from the Prometheus UI. That previously happened
    to work because the absolute API path replaced /graph; requests now go to
    /graph/api/v1/query_range and will 404. Trim stray paths from existing
    Connection hosts before upgrading. Root-mounted hosts (http://prom:9090 or
    http://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 of
    these (including repeatable ones such as match[]) always wins and replaces a
    same-named host value outright, rather than being dropped. Any other host query
    key the request never mentions -- for example ?extra_label=namespace%3Dprod
    pinning 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-tile
    alerts. 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 where or the raw sqlTemplate.

    Add {{thresholdMax}}, the upper bound of a between / outside condition.
    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, thresholdMax and value are emitted unquoted, a
    body 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 send Authorization: Bearer <token> were rejected. The generated collector config now also accepts Bearer, bearer, and BEARER prefixed 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 group Array, 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/common-utils@0.28.1

@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 by
    hw.gpu.task (general/encoder/decoder) so a node saturated on video encode is
    still visible; a missing task is reported as general. The section is fully
    hidden 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 rows
    previously 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 group Array, 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.hdx browser-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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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/api@2.38.0
    • @hyperdx/common-utils@0.28.1

@hyperdx/common-utils@0.28.1

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.
  • 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 group Array, 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
  • c796592: feat: Support a custom template for PromQL series legends
  • cff6388: feat: Add static filters to schemas and APIs

@hyperdx/otel-collector@2.38.0

Patch Changes

  • 808b345: Accept 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 send Authorization: Bearer <token>. The Bearer, bearer, and BEARER prefixed forms are now accepted alongside the bare token.

@vercel

vercelBot commented Aug 31, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
ProjectDeploymentActionsUpdated
hyperdx-ossIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC
hyperdx-storybookIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC

Request Review

@greptile-apps

Copy link
Copy Markdown
Contributor

PR author is in the excluded authors list.

@github-actions
github-actionsBotforce-pushed the changeset-release/main branch 28 times, most recently from 25d5ce1 to 20ec63cCompareSeptember 4, 2026 06:24
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Release HyperDX - #3036

Open
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main
Open

Release HyperDX#3036
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actionsgithub-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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}}, and
    ISO-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 external
    API v2 and the MCP clickstack_save_alert / clickstack_get_alert tools.
    Inline alerts can now be created, updated, listed, and deleted through
    /api/v2/alerts using the same tile-config dialect as v2 dashboards, with the
    same 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 chartConfig to a
    tile or saved_search alert is now rejected instead of silently dropped,
    and reading an inline alert whose config carries internal-only fields omits
    chartConfig rather than returning a lossy approximation.

    Also fixes three pre-existing issues on the external v2 dashboards path: a
    gauge tile saved through clickstack_save_dashboard with isDelta: true was
    persisted 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 and
    number-select rules, and is now rejected; and validation errors on alert
    bodies no longer collapse to Invalid input — the schema reports the failing
    branch's own message.

  • d9c5c45: fix: preserve a Connection host path prefix when proxying PromQL.
    proxyToPrometheus joined absolute Prometheus paths (/api/v1/query_range,
    /api/v1/query, /api/v1/query_exemplars, /api/v1/label/.../values) with
    new URL(path, host), which replaces the host pathname instead of appending to
    it. VictoriaMetrics cluster vmselect URLs such as
    http://vmselect:8481/select/0/prometheus were rewritten to
    /api/v1/query_range and 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/graph copied from the Prometheus UI. That previously happened
    to work because the absolute API path replaced /graph; requests now go to
    /graph/api/v1/query_range and will 404. Trim stray paths from existing
    Connection hosts before upgrading. Root-mounted hosts (http://prom:9090 or
    http://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 of
    these (including repeatable ones such as match[]) always wins and replaces a
    same-named host value outright, rather than being dropped. Any other host query
    key the request never mentions -- for example ?extra_label=namespace%3Dprod
    pinning 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-tile
    alerts. 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 where or the raw sqlTemplate.

    Add {{thresholdMax}}, the upper bound of a between / outside condition.
    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, thresholdMax and value are emitted unquoted, a
    body 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 send Authorization: Bearer <token> were rejected. The generated collector config now also accepts Bearer, bearer, and BEARER prefixed 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 group Array, 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/common-utils@0.28.1

@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 by
    hw.gpu.task (general/encoder/decoder) so a node saturated on video encode is
    still visible; a missing task is reported as general. The section is fully
    hidden 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 rows
    previously 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 group Array, 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.hdx browser-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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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/api@2.38.0
    • @hyperdx/common-utils@0.28.1

@hyperdx/common-utils@0.28.1

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.
  • 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 group Array, 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
  • c796592: feat: Support a custom template for PromQL series legends
  • cff6388: feat: Add static filters to schemas and APIs

@hyperdx/otel-collector@2.38.0

Patch Changes

  • 808b345: Accept 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 send Authorization: Bearer <token>. The Bearer, bearer, and BEARER prefixed forms are now accepted alongside the bare token.

@vercel

vercelBot commented Aug 31, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
ProjectDeploymentActionsUpdated
hyperdx-ossIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC
hyperdx-storybookIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC

Request Review

@greptile-apps

Copy link
Copy Markdown
Contributor

PR author is in the excluded authors list.

@github-actions
github-actionsBotforce-pushed the changeset-release/main branch 28 times, most recently from 25d5ce1 to 20ec63cCompareSeptember 4, 2026 06:24
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Release HyperDX - #3036

Open
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main
Open

Release HyperDX#3036
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actionsgithub-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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}}, and
    ISO-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 external
    API v2 and the MCP clickstack_save_alert / clickstack_get_alert tools.
    Inline alerts can now be created, updated, listed, and deleted through
    /api/v2/alerts using the same tile-config dialect as v2 dashboards, with the
    same 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 chartConfig to a
    tile or saved_search alert is now rejected instead of silently dropped,
    and reading an inline alert whose config carries internal-only fields omits
    chartConfig rather than returning a lossy approximation.

    Also fixes three pre-existing issues on the external v2 dashboards path: a
    gauge tile saved through clickstack_save_dashboard with isDelta: true was
    persisted 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 and
    number-select rules, and is now rejected; and validation errors on alert
    bodies no longer collapse to Invalid input — the schema reports the failing
    branch's own message.

  • d9c5c45: fix: preserve a Connection host path prefix when proxying PromQL.
    proxyToPrometheus joined absolute Prometheus paths (/api/v1/query_range,
    /api/v1/query, /api/v1/query_exemplars, /api/v1/label/.../values) with
    new URL(path, host), which replaces the host pathname instead of appending to
    it. VictoriaMetrics cluster vmselect URLs such as
    http://vmselect:8481/select/0/prometheus were rewritten to
    /api/v1/query_range and 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/graph copied from the Prometheus UI. That previously happened
    to work because the absolute API path replaced /graph; requests now go to
    /graph/api/v1/query_range and will 404. Trim stray paths from existing
    Connection hosts before upgrading. Root-mounted hosts (http://prom:9090 or
    http://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 of
    these (including repeatable ones such as match[]) always wins and replaces a
    same-named host value outright, rather than being dropped. Any other host query
    key the request never mentions -- for example ?extra_label=namespace%3Dprod
    pinning 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-tile
    alerts. 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 where or the raw sqlTemplate.

    Add {{thresholdMax}}, the upper bound of a between / outside condition.
    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, thresholdMax and value are emitted unquoted, a
    body 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 send Authorization: Bearer <token> were rejected. The generated collector config now also accepts Bearer, bearer, and BEARER prefixed 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 group Array, 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/common-utils@0.28.1

@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 by
    hw.gpu.task (general/encoder/decoder) so a node saturated on video encode is
    still visible; a missing task is reported as general. The section is fully
    hidden 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 rows
    previously 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 group Array, 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.hdx browser-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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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/api@2.38.0
    • @hyperdx/common-utils@0.28.1

@hyperdx/common-utils@0.28.1

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.
  • 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 group Array, 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
  • c796592: feat: Support a custom template for PromQL series legends
  • cff6388: feat: Add static filters to schemas and APIs

@hyperdx/otel-collector@2.38.0

Patch Changes

  • 808b345: Accept 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 send Authorization: Bearer <token>. The Bearer, bearer, and BEARER prefixed forms are now accepted alongside the bare token.

@vercel

vercelBot commented Aug 31, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
ProjectDeploymentActionsUpdated
hyperdx-ossIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC
hyperdx-storybookIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC

Request Review

@greptile-apps

Copy link
Copy Markdown
Contributor

PR author is in the excluded authors list.

@github-actions
github-actionsBotforce-pushed the changeset-release/main branch 28 times, most recently from 25d5ce1 to 20ec63cCompareSeptember 4, 2026 06:24
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Release HyperDX - #3036

Open
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main
Open

Release HyperDX#3036
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actionsgithub-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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}}, and
    ISO-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 external
    API v2 and the MCP clickstack_save_alert / clickstack_get_alert tools.
    Inline alerts can now be created, updated, listed, and deleted through
    /api/v2/alerts using the same tile-config dialect as v2 dashboards, with the
    same 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 chartConfig to a
    tile or saved_search alert is now rejected instead of silently dropped,
    and reading an inline alert whose config carries internal-only fields omits
    chartConfig rather than returning a lossy approximation.

    Also fixes three pre-existing issues on the external v2 dashboards path: a
    gauge tile saved through clickstack_save_dashboard with isDelta: true was
    persisted 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 and
    number-select rules, and is now rejected; and validation errors on alert
    bodies no longer collapse to Invalid input — the schema reports the failing
    branch's own message.

  • d9c5c45: fix: preserve a Connection host path prefix when proxying PromQL.
    proxyToPrometheus joined absolute Prometheus paths (/api/v1/query_range,
    /api/v1/query, /api/v1/query_exemplars, /api/v1/label/.../values) with
    new URL(path, host), which replaces the host pathname instead of appending to
    it. VictoriaMetrics cluster vmselect URLs such as
    http://vmselect:8481/select/0/prometheus were rewritten to
    /api/v1/query_range and 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/graph copied from the Prometheus UI. That previously happened
    to work because the absolute API path replaced /graph; requests now go to
    /graph/api/v1/query_range and will 404. Trim stray paths from existing
    Connection hosts before upgrading. Root-mounted hosts (http://prom:9090 or
    http://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 of
    these (including repeatable ones such as match[]) always wins and replaces a
    same-named host value outright, rather than being dropped. Any other host query
    key the request never mentions -- for example ?extra_label=namespace%3Dprod
    pinning 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-tile
    alerts. 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 where or the raw sqlTemplate.

    Add {{thresholdMax}}, the upper bound of a between / outside condition.
    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, thresholdMax and value are emitted unquoted, a
    body 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 send Authorization: Bearer <token> were rejected. The generated collector config now also accepts Bearer, bearer, and BEARER prefixed 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 group Array, 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/common-utils@0.28.1

@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 by
    hw.gpu.task (general/encoder/decoder) so a node saturated on video encode is
    still visible; a missing task is reported as general. The section is fully
    hidden 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 rows
    previously 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 group Array, 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.hdx browser-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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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/api@2.38.0
    • @hyperdx/common-utils@0.28.1

@hyperdx/common-utils@0.28.1

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.
  • 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 group Array, 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
  • c796592: feat: Support a custom template for PromQL series legends
  • cff6388: feat: Add static filters to schemas and APIs

@hyperdx/otel-collector@2.38.0

Patch Changes

  • 808b345: Accept 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 send Authorization: Bearer <token>. The Bearer, bearer, and BEARER prefixed forms are now accepted alongside the bare token.

@vercel

vercelBot commented Aug 31, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
ProjectDeploymentActionsUpdated
hyperdx-ossIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC
hyperdx-storybookIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC

Request Review

@greptile-apps

Copy link
Copy Markdown
Contributor

PR author is in the excluded authors list.

@github-actions
github-actionsBotforce-pushed the changeset-release/main branch 28 times, most recently from 25d5ce1 to 20ec63cCompareSeptember 4, 2026 06:24
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Release HyperDX - #3036

Open
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main
Open

Release HyperDX#3036
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actionsgithub-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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}}, and
    ISO-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 external
    API v2 and the MCP clickstack_save_alert / clickstack_get_alert tools.
    Inline alerts can now be created, updated, listed, and deleted through
    /api/v2/alerts using the same tile-config dialect as v2 dashboards, with the
    same 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 chartConfig to a
    tile or saved_search alert is now rejected instead of silently dropped,
    and reading an inline alert whose config carries internal-only fields omits
    chartConfig rather than returning a lossy approximation.

    Also fixes three pre-existing issues on the external v2 dashboards path: a
    gauge tile saved through clickstack_save_dashboard with isDelta: true was
    persisted 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 and
    number-select rules, and is now rejected; and validation errors on alert
    bodies no longer collapse to Invalid input — the schema reports the failing
    branch's own message.

  • d9c5c45: fix: preserve a Connection host path prefix when proxying PromQL.
    proxyToPrometheus joined absolute Prometheus paths (/api/v1/query_range,
    /api/v1/query, /api/v1/query_exemplars, /api/v1/label/.../values) with
    new URL(path, host), which replaces the host pathname instead of appending to
    it. VictoriaMetrics cluster vmselect URLs such as
    http://vmselect:8481/select/0/prometheus were rewritten to
    /api/v1/query_range and 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/graph copied from the Prometheus UI. That previously happened
    to work because the absolute API path replaced /graph; requests now go to
    /graph/api/v1/query_range and will 404. Trim stray paths from existing
    Connection hosts before upgrading. Root-mounted hosts (http://prom:9090 or
    http://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 of
    these (including repeatable ones such as match[]) always wins and replaces a
    same-named host value outright, rather than being dropped. Any other host query
    key the request never mentions -- for example ?extra_label=namespace%3Dprod
    pinning 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-tile
    alerts. 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 where or the raw sqlTemplate.

    Add {{thresholdMax}}, the upper bound of a between / outside condition.
    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, thresholdMax and value are emitted unquoted, a
    body 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 send Authorization: Bearer <token> were rejected. The generated collector config now also accepts Bearer, bearer, and BEARER prefixed 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 group Array, 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/common-utils@0.28.1

@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 by
    hw.gpu.task (general/encoder/decoder) so a node saturated on video encode is
    still visible; a missing task is reported as general. The section is fully
    hidden 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 rows
    previously 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 group Array, 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.hdx browser-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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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/api@2.38.0
    • @hyperdx/common-utils@0.28.1

@hyperdx/common-utils@0.28.1

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.
  • 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 group Array, 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
  • c796592: feat: Support a custom template for PromQL series legends
  • cff6388: feat: Add static filters to schemas and APIs

@hyperdx/otel-collector@2.38.0

Patch Changes

  • 808b345: Accept 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 send Authorization: Bearer <token>. The Bearer, bearer, and BEARER prefixed forms are now accepted alongside the bare token.

@vercel

vercelBot commented Aug 31, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
ProjectDeploymentActionsUpdated
hyperdx-ossIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC
hyperdx-storybookIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC

Request Review

@greptile-apps

Copy link
Copy Markdown
Contributor

PR author is in the excluded authors list.

@github-actions
github-actionsBotforce-pushed the changeset-release/main branch 28 times, most recently from 25d5ce1 to 20ec63cCompareSeptember 4, 2026 06:24
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Release HyperDX - #3036

Open
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main
Open

Release HyperDX#3036
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actionsgithub-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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}}, and
    ISO-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 external
    API v2 and the MCP clickstack_save_alert / clickstack_get_alert tools.
    Inline alerts can now be created, updated, listed, and deleted through
    /api/v2/alerts using the same tile-config dialect as v2 dashboards, with the
    same 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 chartConfig to a
    tile or saved_search alert is now rejected instead of silently dropped,
    and reading an inline alert whose config carries internal-only fields omits
    chartConfig rather than returning a lossy approximation.

    Also fixes three pre-existing issues on the external v2 dashboards path: a
    gauge tile saved through clickstack_save_dashboard with isDelta: true was
    persisted 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 and
    number-select rules, and is now rejected; and validation errors on alert
    bodies no longer collapse to Invalid input — the schema reports the failing
    branch's own message.

  • d9c5c45: fix: preserve a Connection host path prefix when proxying PromQL.
    proxyToPrometheus joined absolute Prometheus paths (/api/v1/query_range,
    /api/v1/query, /api/v1/query_exemplars, /api/v1/label/.../values) with
    new URL(path, host), which replaces the host pathname instead of appending to
    it. VictoriaMetrics cluster vmselect URLs such as
    http://vmselect:8481/select/0/prometheus were rewritten to
    /api/v1/query_range and 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/graph copied from the Prometheus UI. That previously happened
    to work because the absolute API path replaced /graph; requests now go to
    /graph/api/v1/query_range and will 404. Trim stray paths from existing
    Connection hosts before upgrading. Root-mounted hosts (http://prom:9090 or
    http://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 of
    these (including repeatable ones such as match[]) always wins and replaces a
    same-named host value outright, rather than being dropped. Any other host query
    key the request never mentions -- for example ?extra_label=namespace%3Dprod
    pinning 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-tile
    alerts. 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 where or the raw sqlTemplate.

    Add {{thresholdMax}}, the upper bound of a between / outside condition.
    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, thresholdMax and value are emitted unquoted, a
    body 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 send Authorization: Bearer <token> were rejected. The generated collector config now also accepts Bearer, bearer, and BEARER prefixed 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 group Array, 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/common-utils@0.28.1

@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 by
    hw.gpu.task (general/encoder/decoder) so a node saturated on video encode is
    still visible; a missing task is reported as general. The section is fully
    hidden 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 rows
    previously 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 group Array, 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.hdx browser-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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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/api@2.38.0
    • @hyperdx/common-utils@0.28.1

@hyperdx/common-utils@0.28.1

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.
  • 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 group Array, 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
  • c796592: feat: Support a custom template for PromQL series legends
  • cff6388: feat: Add static filters to schemas and APIs

@hyperdx/otel-collector@2.38.0

Patch Changes

  • 808b345: Accept 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 send Authorization: Bearer <token>. The Bearer, bearer, and BEARER prefixed forms are now accepted alongside the bare token.

@vercel

vercelBot commented Aug 31, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
ProjectDeploymentActionsUpdated
hyperdx-ossIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC
hyperdx-storybookIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC

Request Review

@greptile-apps

Copy link
Copy Markdown
Contributor

PR author is in the excluded authors list.

@github-actions
github-actionsBotforce-pushed the changeset-release/main branch 28 times, most recently from 25d5ce1 to 20ec63cCompareSeptember 4, 2026 06:24
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Release HyperDX - #3036

Open
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main
Open

Release HyperDX#3036
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actionsgithub-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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}}, and
    ISO-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 external
    API v2 and the MCP clickstack_save_alert / clickstack_get_alert tools.
    Inline alerts can now be created, updated, listed, and deleted through
    /api/v2/alerts using the same tile-config dialect as v2 dashboards, with the
    same 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 chartConfig to a
    tile or saved_search alert is now rejected instead of silently dropped,
    and reading an inline alert whose config carries internal-only fields omits
    chartConfig rather than returning a lossy approximation.

    Also fixes three pre-existing issues on the external v2 dashboards path: a
    gauge tile saved through clickstack_save_dashboard with isDelta: true was
    persisted 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 and
    number-select rules, and is now rejected; and validation errors on alert
    bodies no longer collapse to Invalid input — the schema reports the failing
    branch's own message.

  • d9c5c45: fix: preserve a Connection host path prefix when proxying PromQL.
    proxyToPrometheus joined absolute Prometheus paths (/api/v1/query_range,
    /api/v1/query, /api/v1/query_exemplars, /api/v1/label/.../values) with
    new URL(path, host), which replaces the host pathname instead of appending to
    it. VictoriaMetrics cluster vmselect URLs such as
    http://vmselect:8481/select/0/prometheus were rewritten to
    /api/v1/query_range and 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/graph copied from the Prometheus UI. That previously happened
    to work because the absolute API path replaced /graph; requests now go to
    /graph/api/v1/query_range and will 404. Trim stray paths from existing
    Connection hosts before upgrading. Root-mounted hosts (http://prom:9090 or
    http://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 of
    these (including repeatable ones such as match[]) always wins and replaces a
    same-named host value outright, rather than being dropped. Any other host query
    key the request never mentions -- for example ?extra_label=namespace%3Dprod
    pinning 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-tile
    alerts. 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 where or the raw sqlTemplate.

    Add {{thresholdMax}}, the upper bound of a between / outside condition.
    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, thresholdMax and value are emitted unquoted, a
    body 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 send Authorization: Bearer <token> were rejected. The generated collector config now also accepts Bearer, bearer, and BEARER prefixed 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 group Array, 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/common-utils@0.28.1

@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 by
    hw.gpu.task (general/encoder/decoder) so a node saturated on video encode is
    still visible; a missing task is reported as general. The section is fully
    hidden 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 rows
    previously 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 group Array, 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.hdx browser-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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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/api@2.38.0
    • @hyperdx/common-utils@0.28.1

@hyperdx/common-utils@0.28.1

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.
  • 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 group Array, 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
  • c796592: feat: Support a custom template for PromQL series legends
  • cff6388: feat: Add static filters to schemas and APIs

@hyperdx/otel-collector@2.38.0

Patch Changes

  • 808b345: Accept 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 send Authorization: Bearer <token>. The Bearer, bearer, and BEARER prefixed forms are now accepted alongside the bare token.

@vercel

vercelBot commented Aug 31, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
ProjectDeploymentActionsUpdated
hyperdx-ossIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC
hyperdx-storybookIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC

Request Review

@greptile-apps

Copy link
Copy Markdown
Contributor

PR author is in the excluded authors list.

@github-actions
github-actionsBotforce-pushed the changeset-release/main branch 28 times, most recently from 25d5ce1 to 20ec63cCompareSeptember 4, 2026 06:24
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Release HyperDX - #3036

Open
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main
Open

Release HyperDX#3036
github-actions[bot] wants to merge 2 commits into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actionsgithub-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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}}, and
    ISO-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 external
    API v2 and the MCP clickstack_save_alert / clickstack_get_alert tools.
    Inline alerts can now be created, updated, listed, and deleted through
    /api/v2/alerts using the same tile-config dialect as v2 dashboards, with the
    same 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 chartConfig to a
    tile or saved_search alert is now rejected instead of silently dropped,
    and reading an inline alert whose config carries internal-only fields omits
    chartConfig rather than returning a lossy approximation.

    Also fixes three pre-existing issues on the external v2 dashboards path: a
    gauge tile saved through clickstack_save_dashboard with isDelta: true was
    persisted 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 and
    number-select rules, and is now rejected; and validation errors on alert
    bodies no longer collapse to Invalid input — the schema reports the failing
    branch's own message.

  • d9c5c45: fix: preserve a Connection host path prefix when proxying PromQL.
    proxyToPrometheus joined absolute Prometheus paths (/api/v1/query_range,
    /api/v1/query, /api/v1/query_exemplars, /api/v1/label/.../values) with
    new URL(path, host), which replaces the host pathname instead of appending to
    it. VictoriaMetrics cluster vmselect URLs such as
    http://vmselect:8481/select/0/prometheus were rewritten to
    /api/v1/query_range and 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/graph copied from the Prometheus UI. That previously happened
    to work because the absolute API path replaced /graph; requests now go to
    /graph/api/v1/query_range and will 404. Trim stray paths from existing
    Connection hosts before upgrading. Root-mounted hosts (http://prom:9090 or
    http://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 of
    these (including repeatable ones such as match[]) always wins and replaces a
    same-named host value outright, rather than being dropped. Any other host query
    key the request never mentions -- for example ?extra_label=namespace%3Dprod
    pinning 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-tile
    alerts. 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 where or the raw sqlTemplate.

    Add {{thresholdMax}}, the upper bound of a between / outside condition.
    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, thresholdMax and value are emitted unquoted, a
    body 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 send Authorization: Bearer <token> were rejected. The generated collector config now also accepts Bearer, bearer, and BEARER prefixed 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 group Array, 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/common-utils@0.28.1

@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 by
    hw.gpu.task (general/encoder/decoder) so a node saturated on video encode is
    still visible; a missing task is reported as general. The section is fully
    hidden 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 rows
    previously 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 group Array, 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.hdx browser-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 0 even though
    the 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

    • so ordinary counts and the byte/percent tiles in the bundled dashboard
      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/api@2.38.0
    • @hyperdx/common-utils@0.28.1

@hyperdx/common-utils@0.28.1

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.
  • 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 group Array, 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
  • c796592: feat: Support a custom template for PromQL series legends
  • cff6388: feat: Add static filters to schemas and APIs

@hyperdx/otel-collector@2.38.0

Patch Changes

  • 808b345: Accept 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 send Authorization: Bearer <token>. The Bearer, bearer, and BEARER prefixed forms are now accepted alongside the bare token.

@vercel

vercelBot commented Aug 31, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
ProjectDeploymentActionsUpdated
hyperdx-ossIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC
hyperdx-storybookIgnoredIgnoredPreviewSep 4, 2026 11:55am UTC

Request Review

@greptile-apps

Copy link
Copy Markdown
Contributor

PR author is in the excluded authors list.

@github-actions
github-actionsBotforce-pushed the changeset-release/main branch 28 times, most recently from 25d5ce1 to 20ec63cCompareSeptember 4, 2026 06:24
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants