Releases: hyperdxio/hyperdx
@hyperdx/cli v0.5.0
@hyperdx/cli v0.5.0
Minor Changes
- 3123db5: feat: experimental promql support
Patch Changes
-
b20275c: fix(cli): exit with non-zero code when
upload-sourcemapsfailsThe
upload-sourcemapscommand now exits with code 1 when uploads fail
(missing source maps, pre-signed URL request failure, authentication failure,
or any per-file upload failure after retries). Previously these failures were
logged to stderr but the process exited cleanly with code 0, causing CI
pipelines to treat failed uploads as successes. -
19cd7c9: fix: only use pk and row uniqueness to look up a row
-
8810ff0: feat: Add option for force-enabling/disabling text index support
Installation
npm (recommended):
npm install -g @hyperdx/cliOr run directly with npx:
npx @hyperdx/cli tui -s <your-hyperdx-api-url>Manual download (standalone binary, no Node.js required):
# macOS Apple Silicon
curl -L https://github.com/hyperdxio/hyperdx/releases/download/cli-v0.5.0/hdx-darwin-arm64 -o hdx
# macOS Intel
curl -L https://github.com/hyperdxio/hyperdx/releases/download/cli-v0.5.0/hdx-darwin-x64 -o hdx
# Linux x64
curl -L https://github.com/hyperdxio/hyperdx/releases/download/cli-v0.5.0/hdx-linux-x64 -o hdx
chmod +x hdx && sudo mv hdx /usr/local/bin/Usage
hdx auth login -s <your-hyperdx-api-url>
hdx tui@hyperdx/otel-collector@2.28.0
Minor Changes
-
3123db5: feat: experimental promql support
-
cb6a74c: fix(otel-collector): allow
CUSTOM_OTELCOL_CONFIG_FILEto override the
defaultmemory_limiter,batch(and other pipeline processors)Pipeline
processors:lists used to be defined in the OpAMP remote config
sent by the API (packages/api/src/opamp/controllers/opampController.ts).
That meant the remote config overwrote any pipelineprocessors:list a
user supplied viaCUSTOM_OTELCOL_CONFIG_FILE, making it impossible to
substitute the defaultmemory_limiterwith one configured for
limit_percentage/spike_limit_percentagemode (#2145).The pipeline
processors:lists now live in the bootstrap config
(docker/otel-collector/config.yamlfor supervisor mode, and
docker/otel-collector/config.standalone.yamlfor standalone mode). The
OpAMP remote config no longer setsprocessors:on these pipelines, so the
bootstrap+custom merge wins. Receivers and exporters are still configured
dynamically by the OpAMP controller.To override
memory_limiter, define a new processor with a different name
inCUSTOM_OTELCOL_CONFIG_FILEand swap the pipelineprocessors:lists:processors: memory_limiter/custom: check_interval: 5s limit_percentage: 75 spike_limit_percentage: 25 service: pipelines: traces: processors: [memory_limiter/custom, batch] metrics: processors: [memory_limiter/custom, batch] logs/out-default: processors: [memory_limiter/custom, transform, batch] logs/out-rrweb: processors: [memory_limiter/custom, batch]
The default
memory_limiterblock defined in the base config is left in
the merged config but is no longer referenced by any pipeline; the
collector only instantiatesmemory_limiter/customat runtime.The same swap pattern works for the
batchprocessor (and any other base
processor). For example, to lower the export timeout on a specific
pipeline:processors: batch/lowlatency: send_batch_size: 1000 send_batch_max_size: 2000 timeout: 500ms service: pipelines: traces: processors: [memory_limiter, batch/lowlatency] logs/out-default: processors: [memory_limiter, transform, batch/lowlatency]
Lighter-weight env-var tuning is also available for the default
batch
processor without writing a custom config file:
HYPERDX_OTEL_BATCH_SEND_BATCH_SIZE,
HYPERDX_OTEL_BATCH_SEND_BATCH_MAX_SIZE, andHYPERDX_OTEL_BATCH_TIMEOUT.
See the README for details.
Patch Changes
-
ad3f1c9: fix(otel-collector): skip string severity inference when JSON body has a
level/severityfieldWhen the log body parsed as JSON and contained a level-like field, the
pipeline still ran its\b(alert|crit|emerg|fatal|error|err|warn|notice|debug|dbug|trace)
keyword scan over the raw body string. The leading-only\bboundary
matched any word starting with a severity keyword, so bodies containing
words likealertmanager,alerting,errors,warning, etc. produced
the wrong severity. A Grafana sidecar log with body
{"level":"INFO", "msg":"... mimir-alertmanager-dashboard ..."}was being
taggedSeverityText="fatal",SeverityNumber=21becausealertmatched
insidealertmanager, even though the JSONlevelsaidINFO.A new OTTL
log_statementsblock in
docker/otel-collector/config.yamlruns between the existing JSON-parse
block and the string-inference block. It promotes a JSON-derived level
field (now inlog.attributes) tolog.severity_text, which causes the
string-inference block to be skipped via its existing
severity_number == 0 and severity_text == ""guard. The block is
case-insensitive across keys by enumerating common casings of common field
names used by mainstream logging frameworks:level/Level/LEVEL
(pino, winston, zerolog, zap, logrus, slog, Serilog, NLog),
severity/Severity/SEVERITY(Datadog, GCP Cloud Logging), and
log.level(Elastic ECS, flattened from nested JSON). Eachset
self-guards onseverity_text == ""so the first match wins (priority:
level>severity>log.level). The block as a whole is gated on no
producer-set severity, so explicit producer values are always preserved.severity_numberis mapped via case-insensitive(?i)regex over
severity_text, mirroring the existing string-inference keyword set.
Unrecognized values (e.g."verbose") fall back toINFO, matching
block 2's else-branch. The existingConvertCase(severity_text, "lower")
normalization is unchanged.Behavior preserved for: non-JSON bodies, JSON bodies without a level
field, and any log record where the producer already set
severity_textorseverity_number.Fixes HDX-4383.
@hyperdx/common-utils@0.20.0
Minor Changes
-
3123db5: feat: experimental promql support
-
dcab1cb: feat: default the direct_read map column optimization on supported ClickHouse versions
The full-text-search logs schema (
00002_otel_logs.sql) now ships with
ResourceAttributeItems,ScopeAttributeItems, andLogAttributeItems
ALIAS columns plus theirtext(tokenizer='array')skip indexes. The
traces schema (00005_otel_traces.sql) similarly gains
ResourceAttributeItemsandSpanAttributeItemsALIAS columns with
matching items indexes. New installs and freshly migrated tables get
the optimization automatically — no manualALTER TABLErequired.Note: the traces table previously used only
bloom_filterskip indexes
and worked on any ClickHouse version. The addedtext(tokenizer='array')
items indexes raise the minimum ClickHouse version required to create
the traces table to >= 26.2. Existing tables on older clusters are
unaffected (CREATE TABLE IF NOT EXISTSis a no-op).At query time, the app gates the
Map['key'] = 'value'→
has(<MapItems>, concat('key', '=', 'value'))rewrite on the connected
ClickHouse server version (SELECT version(), cached per connection).
The gate only applies to ALIAS items columns, which are computed at
query time and therefore depend on the server being able to perform a
direct_read against the underlying Map's tuple storage. The direct_read
feature was backported into multiple stable 26.x release lines, so the
gate uses a per-branch minimum:- 26.2 line: >= 26.2.19.43
- 26.3 line: >= 26.3.12.3
- 26.4 line: >= 26.4.3.37
- 26.5+ : always supported
ALIAS items columns on servers below their branch's threshold continue
to compile filters into the original Map-subscript form.MATERIALIZED items columns are always used when available, regardless
of ClickHouse version. MATERIALIZED columns are physically stored on
disk, sohas(items, ...)reads them directly and works on any
ClickHouse version that supports the text index itself. Operators who
want the optimization on servers below the backport cutoffs can
ALTER TABLEto materialize the items columns. -
1df7583: feat: emit Lucene conditions from sidebar/dashboard filters to enable KV items direct_read optimization on Map columns
Legacy
type: 'sql'filters in URLs are automatically migrated to Lucene
on page load. The persistedDashboardFilter.expressionin MongoDB is unchanged.
Patch Changes
-
a945fa0: feat(mcp): add hyperdx_event_deltas tool
Add
hyperdx_event_deltasMCP tool that compares two row groups (target
vs baseline) and ranks properties by how much their value distributions
differ. Same algorithm as the in-app Event Deltas view.Extract shared event-deltas algorithm from the UI into
@hyperdx/common-utils/src/core/eventDeltas.tsso it can be used by
both the frontend and the MCP server. -
6a5ac3e: fix(charts): histogram bucket picks the highest-precision DateTime column when
Timestamp Column lists multiple columnsWhen a source's
Timestamp Columnlisted multiple columns (e.g.
"EventDate, EventTime"for partition-pruning), the histogram bucket was
built from only the first token. If that token was aDatecolumn, every
row in a day collapsed into a single bar at midnight UTC of that day.The bucket resolver now walks the comma-split list, queries each column's
type via metadata, and returns the highest-precision DateTime / DateTime64
token. Date columns are skipped. If no DateTime-typed token is found, the
original first-token behavior is preserved with aconsole.warn.The WHERE clause continues to use the multi-column form, so partition
pruning via theDatecolumn keeps working. The same resolved column is
also used for theargMin/argMax/min/maxtime math in delta
expressions.Fixes HDX-4371.
-
e1c4381: fix: bare-text Lucene search now falls back from Implicit Column Expression to
Body Expression on log sourcesPreviously, a log source configured with
bodyExpressionset but
implicitColumnExpressionunset threwCan not search bare text without an implicit column set.on every bare-token search, even though the row panel
rendered correctly using the body column.Search now reuses the same one-way fallback that
getEventBodyalready
implements: when no Implicit Column Expression is set, bare-text search runs
against the configured Body Expression. Trace sources are unchanged
(spanNameExpressionis not a body equivalent for trace search). -
b30dfe0: fix: support text index on lower(Body) with no preprocessor
-
dcb8582: fix: escape colons in Lucene field names so filters on Map sub-keys containing
:(e.g.LogAttributes['foo:bar']) parse correctlyfiltersToQuerynow backslash-escapes:and\in the emitted Lucene field
name, andparseLuceneFilter+ the SQL serializer decode those placeholders
when consuming the AST so the original key is restored end-to-end. -
b5148c8: Dashboard table tiles configured with a row-click action now show a hover hint describing where the click will go (for example,
Search HyperDX LogsorOpen dashboard "API Latency Drilldown"). The cell wrapper is now a real link, so cmd-click and middle-click open the destination in a new tab, right-click shows the browser context menu with "Open in New Tab" and "Copy Link Address", and the destination URL appears in the browser status bar on hover. Keyboard users can Tab to a cell and press Enter to navigate, with a visible focus ring. -
04a5a92: feat: Add source scoping to dashboard filters
-
8810ff0: feat: Add option for force-enabling/disabling text index support
-
a8eb27d: feat: filters reflect all values, not search aware; filters use metadata MVs if available
@hyperdx/cli@0.5.0
Minor Changes
- 3123db5: feat: experimental promql support
Patch Changes
-
b20275c: fix(cli): exit with non-zero code when
upload-sourcemapsfailsThe
upload-sourcemapscommand now exits with code 1 when uploads fail
(missing source maps, pre-signed URL request failure, authentication failure,
or any per-file upload failure after retries). Previously these failures were
logged to stderr but the process exited cleanly with code 0, causing CI
pipelines to treat failed uploads as successes. -
19cd7c9: fix: only use pk and row uniqueness to look up a row
-
8810ff0: feat: Add option for force-enabling/disabling text index support
@hyperdx/app@2.28.0
Minor Changes
-
3123db5: feat: experimental promql support
-
1df7583: feat: emit Lucene conditions from sidebar/dashboard filters to enable KV items direct_read optimization on Map columns
Legacy
type: 'sql'filters in URLs are automatically migrated to Lucene
on page load. The persistedDashboardFilter.expressionin MongoDB is unchanged. -
cb6a74c: fix(otel-collector): allow
CUSTOM_OTELCOL_CONFIG_FILEto override the
defaultmemory_limiter,batch(and other pipeline processors)Pipeline
processors:lists used to be defined in the OpAMP remote config
sent by the API (packages/api/src/opamp/controllers/opampController.ts).
That meant the remote config overwrote any pipelineprocessors:list a
user supplied viaCUSTOM_OTELCOL_CONFIG_FILE, making it impossible to
substitute the defaultmemory_limiterwith one configured for
limit_percentage/spike_limit_percentagemode (#2145).The pipeline
processors:lists now live in the bootstrap config
(docker/otel-collector/config.yamlfor supervisor mode, and
docker/otel-collector/config.standalone.yamlfor standalone mode). The
OpAMP remote config no longer setsprocessors:on these pipelines, so the
bootstrap+custom merge wins. Receivers and exporters are still configured
dynamically by the OpAMP controller.To override
memory_limiter, define a new processor with a different name
inCUSTOM_OTELCOL_CONFIG_FILEand swap the pipelineprocessors:lists:processors: memory_limiter/custom: check_interval: 5s limit_percentage: 75 spike_limit_percentage: 25 service: pipelines: traces: processors: [memory_limiter/custom, batch] metrics: processors: [memory_limiter/custom, batch] logs/out-default: processors: [memory_limiter/custom, transform, batch] logs/out-rrweb: processors: [memory_limiter/custom, batch]
The default
memory_limiterblock defined in the base config is left in
the merged config but is no longer referenced by any pipeline; the
collector only instantiatesmemory_limiter/customat runtime.The same swap pattern works for the
batchprocessor (and any other base
processor). For example, to lower the export timeout on a specific
pipeline:processors: batch/lowlatency: send_batch_size: 1000 send_batch_max_size: 2000 timeout: 500ms service: pipelines: traces: processors: [memory_limiter, batch/lowlatency] logs/out-default: processors: [memory_limiter, transform, batch/lowlatency]
Lighter-weight env-var tuning is also available for the default
batch
processor without writing a custom config file:
HYPERDX_OTEL_BATCH_SEND_BATCH_SIZE,
HYPERDX_OTEL_BATCH_SEND_BATCH_MAX_SIZE, andHYPERDX_OTEL_BATCH_TIMEOUT.
See the README for details. -
b8f51ed: feat: upgrade to clickhouse-server 26.5
Patch Changes
-
55926e5: fix: "Add to Filters" on a JSON-typed ClickHouse column no longer produces an
unparseable Lucene queryPreviously, clicking "Add to Filters" on a field under a JSON column wrapped
the field path withtoString(...)before handing it off as a Lucene filter
key. Lucene's grammar forbids parentheses inside field names, so the resulting
condition liketoString(JSONColumn.\foo`):"…"failed to parse withExpected … but ":" found.`The handler now passes the clean dot-notation path (e.g.
JSONColumn.foo)
to the filter setter. -
1648c22: feat(dashboard): add Table of Contents right rail with bulk collapse/expand
Adds a toggleable right-rail Table of Contents to the dashboard page, plus
"Collapse all sections" and "Expand all sections" actions. All three live
under a new "View" section in the dashboard's existing menu. TOC visibility
is persisted per-user via localStorage; bulk collapse uses the same
per-viewer URL state as single-section toggling, so it's shareable via link
and does not change the dashboard's stored defaults. Clicking a TOC entry
scrolls the section into view, auto-expanding it first if collapsed. -
937e043: fix: collapse duplicate map sub-key entries in the search filter sidebar (HDX-4340)
A map sub-field stored in
filterStateunder dot notation (e.g.LogAttributes.time,
from a Lucene URL round-trip) and the same key returned by the facet query under
bracket notation (e.g.LogAttributes['time']) no longer render as two separate
accordion items. The merged entry keeps the bracket form so "Load more" stays
valid, and the user's selection still resolves via a tolerant filterState lookup. -
dcab1cb: feat: default the direct_read map column optimization on supported ClickHouse versions
The full-text-search logs schema (
00002_otel_logs.sql) now ships with
ResourceAttributeItems,ScopeAttributeItems, andLogAttributeItems
ALIAS columns plus theirtext(tokenizer='array')skip indexes. The
traces schema (00005_otel_traces.sql) similarly gains
ResourceAttributeItemsandSpanAttributeItemsALIAS columns with
matching items indexes. New installs and freshly migrated tables get
the optimization automatically — no manualALTER TABLErequired.Note: the traces table previously used only
bloom_filterskip indexes
and worked on any ClickHouse version. The addedtext(tokenizer='array')
items indexes raise the minimum ClickHouse version required to create
the traces table to >= 26.2. Existing tables on older clusters are
unaffected (CREATE TABLE IF NOT EXISTSis a no-op).At query time, the app gates the
Map['key'] = 'value'→
has(<MapItems>, concat('key', '=', 'value'))rewrite on the connected
ClickHouse server version (SELECT version(), cached per connection).
The gate only applies to ALIAS items columns, which are computed at
query time and therefore depend on the server being able to perform a
direct_read against the underlying Map's tuple storage. The direct_read
feature was backported into multiple stable 26.x release lines, so the
gate uses a per-branch minimum:- 26.2 line: >= 26.2.19.43
- 26.3 line: >= 26.3.12.3
- 26.4 line: >= 26.4.3.37
- 26.5+ : always supported
ALIAS items columns on servers below their branch's threshold continue
to compile filters into the original Map-subscript form.MATERIALIZED items columns are always used when available, regardless
of ClickHouse version. MATERIALIZED columns are physically stored on
disk, sohas(items, ...)reads them directly and works on any
ClickHouse version that supports the text index itself. Operators who
want the optimization on servers below the backport cutoffs can
ALTER TABLEto materialize the items columns. -
923b544: feat: preserve compatible filters when switching sources
-
b94b8ef: fix: persist column widths in search results table
-
996a113: fix(row-panel): hide empty attribute sections and stop showing "[Empty]"
when the source's body column isn't configuredThe row-expand side panel always rendered
Log/Span Attributesand
Resource Attributesaccordion sections, even when both were empty. The
body header fell back to a literal[Empty]paper in two visually
identical cases that meant different things: the body column was
configured but the value was empty, or the body column wasn't configured
on the source at all.The two attribute accordions now mirror the existing
topLevelAttributes
pattern and only render when their content is non-empty. The body header
takes a newbodyConfiguredprop: whenfalse(source has neither body
nor implicit column expression configured), the body paper is suppressed
entirely. Whentrueand the content is empty, the placeholder reads
"No body for this event." instead of[Empty].DBRowOverviewPanelderivesbodyConfiguredfrom
getEventBody(source) !== undefined, which already returnsundefined
when neither expression is set.Fixes HDX-4373.
-
e1c4381: fix: bare-text Lucene search now falls back from Implicit Column Expression to
Body Expression on log sourcesPreviously, a log source configured with
bodyExpressionset but
implicitColumnExpressionunset threwCan not search bare text without an implicit column set.on every bare-token search, even though the row panel
rendered correctly using the body column.Search now reuses the same one-way fallback that
getEventBodyalready
implements: when no Implicit Column Expression is set, bare-text search runs
against the configured Body Expression. Trace sources are unchanged
(spanNameExpressionis not a body equivalent for trace search). -
19cd7c9: fix: only use pk and row uniqueness to look up a row
-
a44fa21: Number tile: pick a static color from the palette in Display Settings. The color picker stores a palette token (not a hex value) so the choice reflows correctly across light, dark, and IDE themes.
-
b5148c8: Dashboard table tiles configured with a row-click action now show a hover hint describing where the click will go (for example,
Search HyperDX LogsorOpen dashboard "API Latency Drilldown"). The cell wrapper is now a real link, so cmd-click and middle-click open the destination in a new tab, right-click shows the browser context menu with "Open in New Tab" and "Copy Link Address", and the destination URL appears in the browser status bar on hover. Keyboard users can Tab to a cell and press Enter to navigate, with a visible focus ring. -
0e8a5b3: chore: use
PageHeadertitleprop on Alerts, Dashboards, and Sav...
@hyperdx/api@2.28.0
Minor Changes
-
3123db5: feat: experimental promql support
-
cb6a74c: fix(otel-collector): allow
CUSTOM_OTELCOL_CONFIG_FILEto override the
defaultmemory_limiter,batch(and other pipeline processors)Pipeline
processors:lists used to be defined in the OpAMP remote config
sent by the API (packages/api/src/opamp/controllers/opampController.ts).
That meant the remote config overwrote any pipelineprocessors:list a
user supplied viaCUSTOM_OTELCOL_CONFIG_FILE, making it impossible to
substitute the defaultmemory_limiterwith one configured for
limit_percentage/spike_limit_percentagemode (#2145).The pipeline
processors:lists now live in the bootstrap config
(docker/otel-collector/config.yamlfor supervisor mode, and
docker/otel-collector/config.standalone.yamlfor standalone mode). The
OpAMP remote config no longer setsprocessors:on these pipelines, so the
bootstrap+custom merge wins. Receivers and exporters are still configured
dynamically by the OpAMP controller.To override
memory_limiter, define a new processor with a different name
inCUSTOM_OTELCOL_CONFIG_FILEand swap the pipelineprocessors:lists:processors: memory_limiter/custom: check_interval: 5s limit_percentage: 75 spike_limit_percentage: 25 service: pipelines: traces: processors: [memory_limiter/custom, batch] metrics: processors: [memory_limiter/custom, batch] logs/out-default: processors: [memory_limiter/custom, transform, batch] logs/out-rrweb: processors: [memory_limiter/custom, batch]
The default
memory_limiterblock defined in the base config is left in
the merged config but is no longer referenced by any pipeline; the
collector only instantiatesmemory_limiter/customat runtime.The same swap pattern works for the
batchprocessor (and any other base
processor). For example, to lower the export timeout on a specific
pipeline:processors: batch/lowlatency: send_batch_size: 1000 send_batch_max_size: 2000 timeout: 500ms service: pipelines: traces: processors: [memory_limiter, batch/lowlatency] logs/out-default: processors: [memory_limiter, transform, batch/lowlatency]
Lighter-weight env-var tuning is also available for the default
batch
processor without writing a custom config file:
HYPERDX_OTEL_BATCH_SEND_BATCH_SIZE,
HYPERDX_OTEL_BATCH_SEND_BATCH_MAX_SIZE, andHYPERDX_OTEL_BATCH_TIMEOUT.
See the README for details.
Patch Changes
-
d134212: feat(mcp): add hyperdx_describe_source tool and slim list_sources to catalog
Add
hyperdx_describe_source— returns full column schema, map attribute
keys, and sampled low-cardinality values (SeverityText, StatusCode,
ServiceName, etc.) for a single source. Uses existing rollup tables for
performant value sampling.Slim
hyperdx_list_sourcesto a lightweight MongoDB-only catalog (no
ClickHouse queries). Source tools moved to a dedicatedtools/sources/
module.All query tool descriptions and prompts updated to reference the two-step
list_sources → describe_sourcediscovery workflow. -
a945fa0: feat(mcp): add hyperdx_event_deltas tool
Add
hyperdx_event_deltasMCP tool that compares two row groups (target
vs baseline) and ranks properties by how much their value distributions
differ. Same algorithm as the in-app Event Deltas view.Extract shared event-deltas algorithm from the UI into
@hyperdx/common-utils/src/core/eventDeltas.tsso it can be used by
both the frontend and the MCP server. -
e1c4381: fix: bare-text Lucene search now falls back from Implicit Column Expression to
Body Expression on log sourcesPreviously, a log source configured with
bodyExpressionset but
implicitColumnExpressionunset threwCan not search bare text without an implicit column set.on every bare-token search, even though the row panel
rendered correctly using the body column.Search now reuses the same one-way fallback that
getEventBodyalready
implements: when no Implicit Column Expression is set, bare-text search runs
against the configured Body Expression. Trace sources are unchanged
(spanNameExpressionis not a body equivalent for trace search). -
c3a8aa5: feat(mcp): rewrite dashboard authoring prompts and expose
filtersonhyperdx_save_dashboardThe
create_dashboardprompt now leads with a design checklist (alias every select item including number tiles, schema gap ongroupByso tables don't renderarrayElement(SpanAttributes, '...')as the column header, RED columns with aliases, per-seriesnumberFormatfor durations,groupByColumnsOnLeftfor inventory tables, dashboard-level filters instead of per-tilewhereliterals, one-metric-per-tile for metric sources, required containers at five or more tiles, post-save validation of every tile, no title-recap markdown). The wall-of-JSON canonical example is gone; thedashboard_examplespatterns carry the concrete shapes.The
dashboard_examplesset is replaced with four verified patterns (service_inventory,service_detail,log_analytics,backend_dependencies) plus the existinginfrastructure_sql. Each non-SQL example leads with a "When to use" header and a "Why this shape" note so the model picks by intent, not by surface keyword match. Examples were built and rendered on a live dev stack before landing.The
query_guideprompt gains aDASHBOARD FILTERSsection that documents thefilters: [{ type, name, expression, sourceId, where?, whereLanguage? }]shape, aNUMBER FORMATsection that explains the per-series vs. chart-level distinction, and aPER-TILE TYPE CONSTRAINTSnote that metric tiles take exactly one select item per tile.hyperdx_save_dashboardnow acceptsfilterson its input schema, reusingexternalDashboardFilterSchemaWithIdso the MCP and REST surfaces stay in lockstep and the existingconvertExternalFiltersToInternalhelper handles the conversion without translation. Filters round-trip through create, get, and update.Voice pass: every prompt string is now em-dash-free.
-
a4b9fa8: feat(mcp): improve MCP tool quality — error hints, shared helpers, better messages
Extract duplicated ClickHouse error handling into a shared helper with
pattern-matched error hints (DateTime64 casting, AS alias quoting, response
size limits) so agents get actionable guidance on common failures. Add
reusable mergeWhereIntoSelectItems() helper for consistent top-level where
injection. Improve source/connection-not-found messages to suggest calling
hyperdx_list_sources. -
07911fd: feat(mcp): add trace waterfall and breakdown tools
Add
hyperdx_trace_waterfall— fetch all spans in a single trace as a
parent/child waterfall tree with optional correlated logs. Supports
auto-pick by slowest, first error, or most recent trace.Add
hyperdx_trace_top_time_consuming_operations— aggregate breakdown
of child operations consuming the most cumulative time across traces
matching a parent-span filter. Same algorithm as the in-app "Top Most
Time Consuming Operations" chart. -
04a5a92: feat: Add source scoping to dashboard filters
-
8810ff0: feat: Add option for force-enabling/disabling text index support
-
a8eb27d: feat: filters reflect all values, not search aware; filters use metadata MVs if available
-
Updated dependencies [3123db5]
-
Updated dependencies [dcab1cb]
-
Updated dependencies [a945fa0]
-
Updated dependencies [1df7583]
-
Updated dependencies [6a5ac3e]
-
Updated dependencies [e1c4381]
-
Updated dependencies [b30dfe0]
-
Updated dependencies [dcb8582]
-
Updated dependencies [b5148c8]
-
Updated dependencies [04a5a92]
-
Updated dependencies [8810ff0]
-
Updated dependencies [a8eb27d]
- @hyperdx/common-utils@0.20.0
@hyperdx/otel-collector@2.27.0
@hyperdx/otel-collector@2.27.0
@hyperdx/common-utils@0.19.1
Patch Changes
- 84117a7: fix: support CAST() form in KV items column expression parsing for direct_read optimization
- 51abe98: fix: Event Patterns and other CTE-using queries now correctly detect Date-typed partition columns and wrap them in toDate(), fixing "No results found" against sources with a Date partition key (e.g. event_date / EventDate).
@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, marking
the active onehdx team current— print the currently active teamhdx team use <name-or-id>— switch the active team (matched by team ID or
case-insensitive name)
The active team is persisted to
~/.config/hyperdx/cli/session.jsonso the
choice survives across CLI invocations, and the CLI now sends anx-hdx-team
header 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.