Release HyperDX#2169
Merged
Merged
Conversation
8ac3bf7 to
aa8d829
Compare
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
aa8d829 to
de2fa7e
Compare
de2fa7e to
c7ef5a2
Compare
c7ef5a2 to
2033ee1
Compare
2033ee1 to
ffb7af5
Compare
ffb7af5 to
c6374bd
Compare
c6374bd to
435d853
Compare
435d853 to
618696e
Compare
618696e to
12a658d
Compare
12a658d to
a1347e5
Compare
a1347e5 to
5a8280b
Compare
5a8280b to
ca73d82
Compare
ca73d82 to
10222fa
Compare
10222fa to
5b953c7
Compare
5b953c7 to
231c537
Compare
7240169 to
85f367c
Compare
85f367c to
419db0a
Compare
419db0a to
83c730c
Compare
83c730c to
d14e66b
Compare
548feb3 to
1f76e2d
Compare
1f76e2d to
2f75b2d
Compare
2f75b2d to
87fff9f
Compare
87fff9f to
461cff3
Compare
461cff3 to
45f980d
Compare
45f980d to
2279af6
Compare
2279af6 to
40ae926
Compare
40ae926 to
0326d7e
Compare
0326d7e to
df3fe63
Compare
wrn14897
approved these changes
May 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@hyperdx/cli@0.4.1
Patch Changes
f6a1d02: Add support for event patterns in MCP server, reduce code duplication
253cf5b: Fix CLI version flag reporting hardcoded 0.1.0 instead of the actual package version
4104364: feat: support multiple teams and kubectx-style team switching in the CLI
Adds three new commands for users that belong to multiple teams (HyperDX Cloud /
EE):
hdx team list— list every team the authenticated user belongs to, markingthe active one
hdx team current— print the currently active teamhdx team use <name-or-id>— switch the active team (matched by team ID orcase-insensitive name)
The active team is persisted to
~/.config/hyperdx/cli/session.jsonso thechoice survives across CLI invocations, and the CLI now sends an
x-hdx-teamheader on every API and ClickHouse-proxy request so the server scopes data to
the chosen team.
hdx auth statusalso surfaces the active team.On single-team OSS deployments these commands are effectively no-ops.
@hyperdx/api@2.25.0
Minor Changes
eb16df4: Add ability to disable data sources with improved UX
143f7a7: feat: Add per-series number formats
f6a1d02: Add support for event patterns in MCP server, reduce code duplication
4d22d4b: feat(api): support heatmap tiles in external dashboards API
Heatmap is the only builder-mode display type that did not round-trip
through the external dashboards API. The serializer dropped it into the
"unsupported" fall-through, so creating, fetching, and updating heatmap
tiles via
/api/v2/dashboardslost the config. Heatmap now serializesand parses on both directions, with
valueExpression,countExpression,heatmapScaleType, andnumberFormatpreservedacross save/get. The heatmap select item does not expose
aggFnoralias: the chart-leveldisplayType: "heatmap"is the discriminator,the heatmap aggregation function is fixed internally, and
HeatmapSeriesEditordoes not render an alias input. Raw-SQL heatmapremains unsupported (heatmap rendering requires builder mode).
7d7269a: feat: introducing rollup and source support for full autocomplete
4cc5eb3: Add support for increase aggFn on sum counter metrics and rewrite sum metric rate computation to fix correctness issues.
41395ca: External Dashboards API now round-trips the new dashboard organization
layer added in refactor: Unify section/group into single Group with collapsible/bordered options #2015:
containerson the dashboard, optionaltabson eachcontainer, and
containerId/tabIdon each tile. Create, get, list, andupdate all preserve the structure. The body validates that tile
containerIdreferences resolve to a real container, that tiletabIdreferences resolve to a tab inside that container, and that tab ids are
unique within a container. Container id uniqueness is already enforced by
the shared schema. Dashboards saved without
containersround-tripunchanged.
41eefec: MCP
hyperdx_save_dashboardnow accepts the dashboard organization layeradded in feat(external-api): round-trip dashboard containers, tabs, and tile container/tab refs #2201: an optional
containersarray on the dashboard, pluscontainerIdandtabIdon each tile. The same five cross-field rulesthe external API enforces fire on the MCP path: container ids unique,
tab ids unique within a container, tile.containerId resolves, tile.tabId
resolves to a tab on that container, and tile.tabId requires
tile.containerId. The MCP
buildQueryGuidePromptdocuments the newshape under a CONTAINERS AND TABS section.
d3a5a57: feat: add optional note field to alerts
Adds a freeform note/reason field to alerts that supports markdown formatting,
allowing on-call responders to document why an alert exists, threshold decision
history, and links to runbooks.
notefield on the Alert model (optional, max 4096 chars, supportsmarkdown)
alert editor
default) with full markdown rendering
alongside the webhook channel icon, matching the AlertStatusIcon pattern
used on dashboard tiles and the app nav
alert in the saved search is firing
notefield in OpenAPI docs5c6da48: refactor(alerts/search): consolidate the saved-search → chart-config builder
into a single shared helper,
buildSearchChartConfig, in@hyperdx/common-utils/core/searchChartConfig.ts. The app search page, thealert preview chart, and the scheduled alert task's
SAVED_SEARCHbranch nowall route through it, so
tableFilterExpression,implicitColumnExpression,sample-weight expressions, SELECT precedence, and the
count()defaultSELECT shape are applied identically by construction.
Behavior fixes that fall out of consolidation:
source.tableFilterExpressionon Log sources, matching what the search page already did.
filtersarray no longer silently drops the
tableFilterExpressionSQL filter viaspread-overwrite.
a50db92: fix(security): redact sensitive fields from internal webhook API responses
The
GET /api/webhooksendpoint now masks webhook URLs (<origin>/****) andredacts header and query parameter values (keys preserved, values replaced with
****), preventing team members from retrieving secrets configured by others.The
PUThandler merges redacted markers back to stored values so editing awebhook without re-entering secrets preserves the originals. Changing the URL
while preserving masked secrets is rejected to prevent exfiltration.
GET /api/webhooks,POST /api/webhooks, andPUT /api/webhooks/:idresponses now return masked values for
url,headers, andqueryParamsinstead of plaintext secrets.
Patch Changes
fecbfff: fix: flatten MCP query tool schema so SDK serializes inputSchema correctly
41395ca: External Dashboards API: tighten validation around container/tab references
on the v2 dashboards routes.
containerIdandtabIdat 256 characters to mirror theinternal
DashboardContainerschema and theDASHBOARD_CONTAINER_ID_MAXconstant, now exported from
@hyperdx/common-utils.DASHBOARD_MAX_TILESconstant to keep one request from pushing tens ofMB into Mongo.
containerId/tabIdon legacy Mongo docs asabsent on read, so dashboards predating the containers feature still
round-trip through the external schema's
min(1)cap.validateDashboardContainersConsistencyhelper so the canonicalschema and the request body schema agree on what a valid payload is.
maxLengthandmaxItemsboundson
DashboardContainer.id,DashboardContainerTab.id, thecontainersarray, and the requesttilesarray.41395ca: External Dashboards API: fix
PUTround-trip when the request body omitscontainers, and self-heal orphancontainerId/tabIdreferences onread.
body schema and into the
POSTandPUThandlers, so aPUTwhosebody omits
containersvalidates tile refs against the existingdashboard's containers (the documented "preserve on omit" branch)
rather than against an empty fallback. Without this, a
PUTthatchanges only
tileswhile keeping a tile homed in a real preservedcontainer was rejected with
Tile references unknown containerId.(
validateDashboardContainersStructure) and a tile-ref pass(
validateDashboardTileContainerRefs) on@hyperdx/common-utils. The compositevalidateDashboardContainersConsistencynow wraps both, so existingcallers keep their current behavior.
tile.containerId/tile.tabIdwhen the ref does notresolve to a container (or tab) in the same dashboard. A pre-existing
doc with an orphan ref now round-trips on
GETas if the ref wereabsent, so the next
PUTvalidates instead of failing withTile references unknown containerId. Each drop is logged with thedashboard id, tile id, and the offending ref.
PUT /api/v2/dashboards/{id}description thatthe endpoint does not support optimistic concurrency. Concurrent PUTs
may silently overwrite each other; clients should serialize edits to
a given dashboard.
41395ca: Internal refactor: move
validateDashboardContainersStructureandvalidateDashboardTileContainerRefs(and their two helper types) outof
@hyperdx/common-utils/dist/typesinto a new@hyperdx/common-utils/dist/dashboardValidationmodule. Thetypesfile now only contains types and type guards, matching the rest of the
codebase. The previously exported
validateDashboardContainersConsistencycomposite was only used by its own unit test and is dropped; production
code in the v2 dashboards router uses the two underlying helpers
directly. No behaviour change for callers of the external API.
29586e7: Enable end-to-end PR testing on Vercel previews by inlining the Express API into the Next.js
/api/[...all]serverless function (opt-in viaHDX_PREVIEW_INLINE_API=true). Production deploys (Docker fullstack image, standalone Next output) are unchanged — they keep proxying/api/*to the separately-deployed API service.Also realigns
clickhouseProxy.tswith the upstream EE implementation (modulo CHC and RBAC code paths): query params are now parsed from the request URL viavalidateAndSanitizePath()+URL.searchParamsinstead ofreq.query, which fixes aSetting all is neither a builtin setting nor started with the prefix 'custom_'regression on Vercel previews where Next.js's[...all]catch-all route pollutedreq.query. Adds path-injection hardening, POST-only enforcement, and exposesX-ClickHouse-Mixed-Response/X-ClickHouse-Service-Unavailableresponse headers for the browser ClickHouse client.1c73d0c: Add groupByColumnsOnLeft to MCP dashboard table tile schema
694e3c9: Increase MCP rate limit to 10 req/s
eb7fdb4: fix(api): tighten redactSecrets after deep-review on feat(api): redactSecrets util for LLM input from observability data #2188
Several security/correctness gaps surfaced by deep-review across
two passes on the original redactSecrets PR.
bearervalue alphabet is now\S+. Real-world payloadscarry plenty of opaque non-JWT bearers with
:,%, or quotechars in them, and any alphabet narrower than
\S+leaks thesuffix past
[REDACTED]. RFC 6750's b64token alphabet is astrict subset of
\S+. (Same fix subsumes the earlier changethat added
_to cover JWT signatures.)basic-auth-urlscheme allowlist now covershttp(s) / ws(s) / ftp / sftp / ssh / postgres(ql) / mysql /
mariadb / mongodb(+srv) / mssql / sqlserver / snowflake /
redis(s) / amqp(s) / kafka(+ssl) / clickhouse / smtp(s) /
ldap(s) / nats. The match is also case-insensitive (RFC 3986
declares schemes case-insensitive), so
HTTPS://user:pw@hostno longer bypasses redaction.
llm-vendor-keypattern now catches OpenAI ("sk-..."),Anthropic ("sk-ant-..."), and Google Gemini ("AIza..." with 35
trailing chars). Without Gemini coverage, a Gemini API key in
an observability payload would be exfiltrated to the very
provider that issued it.
Docstring scopes the redactor explicitly to LLM input. Tests
cover each new shape, the JWT-with-underscore regression, the
opaque-bearer-with-
:/%regressions, the uppercase-schemebypass, and the Gemini key shape.
9d5f14f: feat: Add custom onClick field to external dashboards API
88b2b64: fix: use block_number/block_offset to uniquely identify log rows
Updated dependencies [a5294f8]
Updated dependencies [eb16df4]
Updated dependencies [24699cd]
Updated dependencies [143f7a7]
Updated dependencies [f6a1d02]
Updated dependencies [aa1a852]
Updated dependencies [022fe89]
Updated dependencies [7d7269a]
Updated dependencies [41395ca]
Updated dependencies [41395ca]
Updated dependencies [41395ca]
Updated dependencies [d3a5a57]
Updated dependencies [5c6da48]
Updated dependencies [ef571cc]
Updated dependencies [c2a9f96]
Updated dependencies [a36c5b1]
Updated dependencies [9d5f14f]
Updated dependencies [401dff5]
@hyperdx/app@2.25.0
Minor Changes
eb16df4: Add ability to disable data sources with improved UX
143f7a7: feat: Add per-series number formats
7d7269a: feat: introducing rollup and source support for full autocomplete
4cc5eb3: Add support for increase aggFn on sum counter metrics and rewrite sum metric rate computation to fix correctness issues.
d3a5a57: feat: add optional note field to alerts
Adds a freeform note/reason field to alerts that supports markdown formatting,
allowing on-call responders to document why an alert exists, threshold decision
history, and links to runbooks.
notefield on the Alert model (optional, max 4096 chars, supportsmarkdown)
alert editor
default) with full markdown rendering
alongside the webhook channel icon, matching the AlertStatusIcon pattern
used on dashboard tiles and the app nav
alert in the saved search is firing
notefield in OpenAPI docs5c6da48: refactor(alerts/search): consolidate the saved-search → chart-config builder
into a single shared helper,
buildSearchChartConfig, in@hyperdx/common-utils/core/searchChartConfig.ts. The app search page, thealert preview chart, and the scheduled alert task's
SAVED_SEARCHbranch nowall route through it, so
tableFilterExpression,implicitColumnExpression,sample-weight expressions, SELECT precedence, and the
count()defaultSELECT shape are applied identically by construction.
Behavior fixes that fall out of consolidation:
source.tableFilterExpressionon Log sources, matching what the search page already did.
filtersarray no longer silently drops the
tableFilterExpressionSQL filter viaspread-overwrite.
a50db92: fix(security): redact sensitive fields from internal webhook API responses
The
GET /api/webhooksendpoint now masks webhook URLs (<origin>/****) andredacts header and query parameter values (keys preserved, values replaced with
****), preventing team members from retrieving secrets configured by others.The
PUThandler merges redacted markers back to stored values so editing awebhook without re-entering secrets preserves the originals. Changing the URL
while preserving masked secrets is rejected to prevent exfiltration.
GET /api/webhooks,POST /api/webhooks, andPUT /api/webhooks/:idresponses now return masked values for
url,headers, andqueryParamsinstead of plaintext secrets.
ef571cc: feat: heatmap charts in chart editor and dashboards
DBHeatmapChartcomponentPatch Changes
a5294f8: fix: prevent false "data source not set" error on markdown dashboard tiles
24699cd: fix: Infer singular quantileXXX() from MV quantilesXXXState()
4e9caec: Support per-signal OTLP exporter endpoints for Hyperdx internal telemetry
32b38c3: fix: ClickStack switch checked-state color not applying theme tokens
29586e7: Enable end-to-end PR testing on Vercel previews by inlining the Express API into the Next.js
/api/[...all]serverless function (opt-in viaHDX_PREVIEW_INLINE_API=true). Production deploys (Docker fullstack image, standalone Next output) are unchanged — they keep proxying/api/*to the separately-deployed API service.Also realigns
clickhouseProxy.tswith the upstream EE implementation (modulo CHC and RBAC code paths): query params are now parsed from the request URL viavalidateAndSanitizePath()+URL.searchParamsinstead ofreq.query, which fixes aSetting all is neither a builtin setting nor started with the prefix 'custom_'regression on Vercel previews where Next.js's[...all]catch-all route pollutedreq.query. Adds path-injection hardening, POST-only enforcement, and exposesX-ClickHouse-Mixed-Response/X-ClickHouse-Service-Unavailableresponse headers for the browser ClickHouse client.6811ea0: fix: numbers from filters bar was always showing 0 instead of the count
3af4e92: Standardize query param libraries
c2a9f96: feat: Add more dashboard onClick linking options
a36c5b1: feat: Add filter templating to custom dashboard on-click
6dc5d01: fix: Ensure search histogram count matches result table count
401dff5: feat: Support import/export for dashboard onClicks
88b2b64: fix: use block_number/block_offset to uniquely identify log rows
Updated dependencies [a5294f8]
Updated dependencies [eb16df4]
Updated dependencies [24699cd]
Updated dependencies [143f7a7]
Updated dependencies [f6a1d02]
Updated dependencies [aa1a852]
Updated dependencies [4d22d4b]
Updated dependencies [fecbfff]
Updated dependencies [022fe89]
Updated dependencies [7d7269a]
Updated dependencies [4cc5eb3]
Updated dependencies [41395ca]
Updated dependencies [41395ca]
Updated dependencies [41395ca]
Updated dependencies [41395ca]
Updated dependencies [41eefec]
Updated dependencies [d3a5a57]
Updated dependencies [5c6da48]
Updated dependencies [29586e7]
Updated dependencies [a50db92]
Updated dependencies [ef571cc]
Updated dependencies [1c73d0c]
Updated dependencies [694e3c9]
Updated dependencies [eb7fdb4]
Updated dependencies [c2a9f96]
Updated dependencies [a36c5b1]
Updated dependencies [9d5f14f]
Updated dependencies [401dff5]
Updated dependencies [88b2b64]
@hyperdx/common-utils@0.19.0
Minor Changes
eb16df4: Add ability to disable data sources with improved UX
143f7a7: feat: Add per-series number formats
7d7269a: feat: introducing rollup and source support for full autocomplete
d3a5a57: feat: add optional note field to alerts
Adds a freeform note/reason field to alerts that supports markdown formatting,
allowing on-call responders to document why an alert exists, threshold decision
history, and links to runbooks.
notefield on the Alert model (optional, max 4096 chars, supportsmarkdown)
alert editor
default) with full markdown rendering
alongside the webhook channel icon, matching the AlertStatusIcon pattern
used on dashboard tiles and the app nav
alert in the saved search is firing
notefield in OpenAPI docs5c6da48: refactor(alerts/search): consolidate the saved-search → chart-config builder
into a single shared helper,
buildSearchChartConfig, in@hyperdx/common-utils/core/searchChartConfig.ts. The app search page, thealert preview chart, and the scheduled alert task's
SAVED_SEARCHbranch nowall route through it, so
tableFilterExpression,implicitColumnExpression,sample-weight expressions, SELECT precedence, and the
count()defaultSELECT shape are applied identically by construction.
Behavior fixes that fall out of consolidation:
source.tableFilterExpressionon Log sources, matching what the search page already did.
filtersarray no longer silently drops the
tableFilterExpressionSQL filter viaspread-overwrite.
Patch Changes
a5294f8: fix: prevent false "data source not set" error on markdown dashboard tiles
24699cd: fix: Infer singular quantileXXX() from MV quantilesXXXState()
f6a1d02: Add support for event patterns in MCP server, reduce code duplication
aa1a852: feat: adds optimization for lucene rendering based on a keyvalue concatenated Array(String)
022fe89: Fix issue with incorrect cache key being set in settings queries in nodejs
41395ca: External Dashboards API: tighten validation around container/tab references
on the v2 dashboards routes.
containerIdandtabIdat 256 characters to mirror theinternal
DashboardContainerschema and theDASHBOARD_CONTAINER_ID_MAXconstant, now exported from
@hyperdx/common-utils.DASHBOARD_MAX_TILESconstant to keep one request from pushing tens ofMB into Mongo.
containerId/tabIdon legacy Mongo docs asabsent on read, so dashboards predating the containers feature still
round-trip through the external schema's
min(1)cap.validateDashboardContainersConsistencyhelper so the canonicalschema and the request body schema agree on what a valid payload is.
maxLengthandmaxItemsboundson
DashboardContainer.id,DashboardContainerTab.id, thecontainersarray, and the requesttilesarray.41395ca: External Dashboards API: fix
PUTround-trip when the request body omitscontainers, and self-heal orphancontainerId/tabIdreferences onread.
body schema and into the
POSTandPUThandlers, so aPUTwhosebody omits
containersvalidates tile refs against the existingdashboard's containers (the documented "preserve on omit" branch)
rather than against an empty fallback. Without this, a
PUTthatchanges only
tileswhile keeping a tile homed in a real preservedcontainer was rejected with
Tile references unknown containerId.(
validateDashboardContainersStructure) and a tile-ref pass(
validateDashboardTileContainerRefs) on@hyperdx/common-utils. The compositevalidateDashboardContainersConsistencynow wraps both, so existingcallers keep their current behavior.
tile.containerId/tile.tabIdwhen the ref does notresolve to a container (or tab) in the same dashboard. A pre-existing
doc with an orphan ref now round-trips on
GETas if the ref wereabsent, so the next
PUTvalidates instead of failing withTile references unknown containerId. Each drop is logged with thedashboard id, tile id, and the offending ref.
PUT /api/v2/dashboards/{id}description thatthe endpoint does not support optimistic concurrency. Concurrent PUTs
may silently overwrite each other; clients should serialize edits to
a given dashboard.
41395ca: Internal refactor: move
validateDashboardContainersStructureandvalidateDashboardTileContainerRefs(and their two helper types) outof
@hyperdx/common-utils/dist/typesinto a new@hyperdx/common-utils/dist/dashboardValidationmodule. Thetypesfile now only contains types and type guards, matching the rest of the
codebase. The previously exported
validateDashboardContainersConsistencycomposite was only used by its own unit test and is dropped; production
code in the v2 dashboards router uses the two underlying helpers
directly. No behaviour change for callers of the external API.
ef571cc: feat: heatmap charts in chart editor and dashboards
DBHeatmapChartcomponentc2a9f96: feat: Add more dashboard onClick linking options
a36c5b1: feat: Add filter templating to custom dashboard on-click
9d5f14f: feat: Add custom onClick field to external dashboards API
401dff5: feat: Support import/export for dashboard onClicks
@hyperdx/otel-collector@2.25.0
Minor Changes
aaba3e9: feat: new optimized otel schema based on weeks of benchmarks.
The Primary Key is now grouped by
toStartOfFiveMinutes. At extremely largedata sizes, it may be helpful to reduce granularity to 1 minute instead of 5.
Bloom Filter indexes can be used instead, but full text search performs better
across the board. Additionally, tests show that TimestampTime is effectively
not necessary, which is especially true with data grouped by 5 minute
boundaries by default.