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