diff --git a/.changeset/axis-tick-mantissa-precision.md b/.changeset/axis-tick-mantissa-precision.md deleted file mode 100644 index e36cf32af2..0000000000 --- a/.changeset/axis-tick-mantissa-precision.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@hyperdx/app': patch -'@hyperdx/cli': patch ---- - -fix: stop discarding chart axis-tick decimals for large numbers - -Axis ticks at or above 1k were always rounded to a whole number regardless of the configured Number Format, so nearby values (e.g. 950 and 1080) could both render as `1k` — ticks now use as much precision as the axis's width allows, on both the web app and CLI terminal charts. Also fixed: a tightly fit Y-axis could show two ticks with the identical rounded label. diff --git a/.changeset/bounded-map-key-discovery.md b/.changeset/bounded-map-key-discovery.md deleted file mode 100644 index 841f6d4504..0000000000 --- a/.changeset/bounded-map-key-discovery.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -'@hyperdx/common-utils': patch -'@hyperdx/app': patch -'@hyperdx/api': patch ---- - -fix: don't scan the whole table to discover Map keys - -`getMapKeys` only applied a time predicate when the caller passed both a date -range and a timestamp expression; otherwise the raw `sampledKeys` scan ran with -no `WHERE` and touched every part of the table. It now defaults a missing date -range to the last 24 hours and skips the raw scan entirely when there is no -timestamp expression to filter on. The chart, alert and dashboard-filter -editors pass the source and date range they already have so Map keys keep -autocompleting there. diff --git a/.changeset/chart-editor-source-filtering.md b/.changeset/chart-editor-source-filtering.md deleted file mode 100644 index 8a0aa862d8..0000000000 --- a/.changeset/chart-editor-source-filtering.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: Only offer PromQL sources in the chart editor's PromQL mode diff --git a/.changeset/cli-duration-axis-tick-compact.md b/.changeset/cli-duration-axis-tick-compact.md deleted file mode 100644 index a665a68c13..0000000000 --- a/.changeset/cli-duration-axis-tick-compact.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/cli': patch ---- - -fix: use compact duration labels on terminal chart axis ticks - -`axisTickFormatter` is a documented port of the web's `formatAxisTick` (fixed in #3148) and is expected to stay behaviorally in sync with it, but it fell through to the wide `formatDurationMs` instead of the compact formatter for duration-formatted charts. `hdx chart` now renders the same short labels (e.g. "13m" instead of "13.33min") as the web app. diff --git a/.changeset/configurable-external-api-rate-limit.md b/.changeset/configurable-external-api-rate-limit.md deleted file mode 100644 index 51ef43339a..0000000000 --- a/.changeset/configurable-external-api-rate-limit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperdx/api': minor ---- - -Make the external API v2 rate limit (`/api/v2/*`) configurable via `EXTERNAL_API_RATE_LIMIT_MAX`. Defaults to 100 requests/minute, matching the previous hardcoded value. \ No newline at end of file diff --git a/.changeset/dashboard-tags-filter.md b/.changeset/dashboard-tags-filter.md deleted file mode 100644 index 3202fdde18..0000000000 --- a/.changeset/dashboard-tags-filter.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: rework the dashboards list with tabs, sort, and tag filtering - -Tagged dashboards no longer repeat under every tag they carry — the grid lists -each dashboard once. Tags are now a filter behind a fixed-width Tags button -with a count badge (a dashboard must carry every selected tag). Favorites -moved from a pinned row of cards into an "All / -Favorites / My dashboards" tab strip, and a sort control offers last updated -(default), name, and recently created. Import and New dashboard moved into the -page header. diff --git a/.changeset/dashboard-tiles-refresh-pulse.md b/.changeset/dashboard-tiles-refresh-pulse.md deleted file mode 100644 index 13588b524c..0000000000 --- a/.changeset/dashboard-tiles-refresh-pulse.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: show that number, bar and pie tiles are refreshing - -During a dashboard refresh these tiles kept the previous result on screen with -no sign that new data was loading, so stale values looked current. They now -pulse while the refetch runs, like line and stacked-bar time charts already do. diff --git a/.changeset/heatmap-tile-refresh-pulse.md b/.changeset/heatmap-tile-refresh-pulse.md deleted file mode 100644 index a2a76ee8de..0000000000 --- a/.changeset/heatmap-tile-refresh-pulse.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: keep heatmap tiles on screen while a dashboard refreshes - -During a refresh, heatmap tiles replaced the chart with a "Loading..." message -until the new data arrived. They now keep the current heatmap on screen and -pulse while the refetch runs, like the other dashboard tiles. diff --git a/.changeset/live-tail-time-picker-presets.md b/.changeset/live-tail-time-picker-presets.md deleted file mode 100644 index 2ecda5bc0b..0000000000 --- a/.changeset/live-tail-time-picker-presets.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: expand live tail time picker presets to 6h and clarify switch label - -Enable 3h and 6h presets in live tail mode (previously capped at 1h in the picker, though longer ranges already worked via URL). Ranges above 6h remain disabled because the refresh tick (10s default) re-queries the full window, and 12–24h scans would be excessive. Rename the toggle switch from "Relative Time" to "Live tail ranges" to clarify that it controls which preset intervals are available, not whether live tail is active. Add a "Not available for Live Tail" tooltip to disabled presets (12h+). diff --git a/.changeset/map-attribute-column-alias.md b/.changeset/map-attribute-column-alias.md deleted file mode 100644 index fa6b21687c..0000000000 --- a/.changeset/map-attribute-column-alias.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: label Map attribute columns added from the search sidebars by their key - -Adding a Map attribute such as `ResourceAttributes['service.name']` as a column -from the filters sidebar or the row side panel now writes it into the SELECT as -`ResourceAttributes['service.name'] AS "service.name"`, so the results column -reads `service.name` instead of -`arrayElement(ResourceAttributes, 'service.name')`. The alias is visible and -editable in the SELECT, and queries typed by hand are not changed. A key named -like a table column, or one already used as a name in the SELECT, is added -without an alias. diff --git a/.changeset/markdown-tile-variables.md b/.changeset/markdown-tile-variables.md deleted file mode 100644 index 1787c97f30..0000000000 --- a/.changeset/markdown-tile-variables.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/common-utils': patch -'@hyperdx/app': patch -'@hyperdx/api': patch ---- - -feat: Substitute dashboard variables in markdown tiles diff --git a/.changeset/metric-materialized-column-group-by.md b/.changeset/metric-materialized-column-group-by.md deleted file mode 100644 index 0e8eb97900..0000000000 --- a/.changeset/metric-materialized-column-group-by.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@hyperdx/common-utils': patch -'@hyperdx/api': patch -'@hyperdx/app': patch ---- - -fix: allow grouping gauge and sum metric charts by materialized and alias columns - -Grouping or selecting a MATERIALIZED or ALIAS column on a gauge or sum metric chart failed with `Unknown expression identifier`, because the intermediate query didn't carry those columns through. diff --git a/.changeset/olive-pugs-arrive.md b/.changeset/olive-pugs-arrive.md deleted file mode 100644 index b9ea28f2d5..0000000000 --- a/.changeset/olive-pugs-arrive.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -Fix search results going blank after expanding and collapsing rows. A row and -its inline expansion are two `tr`s sharing one virtual index, and both were -measured by the virtualizer, so the expanded row took over that index's -ResizeObserver registration and left its height cached there after it -collapsed. Each expand/collapse shrank the render window a little further until -scrolling showed only a handful of rows above empty space. The row and its -expansion are now wrapped in a `tbody` that is measured as one unit. diff --git a/.changeset/polite-queens-help.md b/.changeset/polite-queens-help.md deleted file mode 100644 index ec1b70b0c0..0000000000 --- a/.changeset/polite-queens-help.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@hyperdx/app": patch ---- - -fix(app): stop event deltas selection failing on Distributed tables diff --git a/.changeset/promql-macros.md b/.changeset/promql-macros.md deleted file mode 100644 index 185f7d3206..0000000000 --- a/.changeset/promql-macros.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperdx/common-utils': minor -'@hyperdx/app': minor ---- - -feat: Support macros in PromQL charts diff --git a/.changeset/promql-multi-expression-tiles.md b/.changeset/promql-multi-expression-tiles.md deleted file mode 100644 index 53ee16af37..0000000000 --- a/.changeset/promql-multi-expression-tiles.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/common-utils': minor -'@hyperdx/app': minor -'@hyperdx/api': patch ---- - -feat: Plot several PromQL expressions on one chart diff --git a/.changeset/promql-number-instant-query.md b/.changeset/promql-number-instant-query.md deleted file mode 100644 index 8ef71e3234..0000000000 --- a/.changeset/promql-number-instant-query.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperdx/app': patch -'@hyperdx/common-utils': patch ---- - -fix: Support instant queries and reductions on PromQL number tiles diff --git a/.changeset/promql-number-sparkline.md b/.changeset/promql-number-sparkline.md deleted file mode 100644 index 606ede7336..0000000000 --- a/.changeset/promql-number-sparkline.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperdx/app': patch -'@hyperdx/common-utils': patch ---- - -feat: Support background sparklines on PromQL range number tiles diff --git a/.changeset/promql-pie-bar-tiles.md b/.changeset/promql-pie-bar-tiles.md deleted file mode 100644 index d1bbb971f7..0000000000 --- a/.changeset/promql-pie-bar-tiles.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperdx/common-utils': patch -'@hyperdx/app': patch ---- - -feat: Support pie and bar tiles on PromQL sources diff --git a/.changeset/promql-table-tiles.md b/.changeset/promql-table-tiles.md deleted file mode 100644 index b2b370b4a3..0000000000 --- a/.changeset/promql-table-tiles.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperdx/common-utils': patch -'@hyperdx/app': patch ---- - -feat: Support table tiles on PromQL sources diff --git a/.changeset/quiet-filters-hide.md b/.changeset/quiet-filters-hide.md deleted file mode 100644 index c3bb2ea08d..0000000000 --- a/.changeset/quiet-filters-hide.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@hyperdx/app': patch -'@hyperdx/common-utils': patch ---- - -fix: Show distribution only labels a value "<1%" when the sample shows it is rare, not when it has no matching rows, and shows 100% when the field's filter allows only that value diff --git a/.changeset/row-panel-materialized-alias-columns.md b/.changeset/row-panel-materialized-alias-columns.md deleted file mode 100644 index d14af7b81d..0000000000 --- a/.changeset/row-panel-materialized-alias-columns.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -feat: add an option to show MATERIALIZED and ALIAS columns in the row details panel - -ClickHouse leaves MATERIALIZED and ALIAS columns out of `SELECT *`, so the row -details panel never showed them. A new "Show materialized and alias columns" -item in the properties view options menu, off by default, adds -`asterisk_include_materialized_columns` and `asterisk_include_alias_columns` to -the row query. It has no effect on a source with a Known Columns List, and a -value that the source's query settings give for either setting wins. If the row -fails to load while the option is on (for example, because the connection's user -is `readonly = 1`, or an ALIAS column cannot be evaluated), the error state -offers to turn the option off. diff --git a/.changeset/row-panel-source-query-settings.md b/.changeset/row-panel-source-query-settings.md deleted file mode 100644 index e25444dc9d..0000000000 --- a/.changeset/row-panel-source-query-settings.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: Apply source query settings to the row side panel's row lookup diff --git a/.changeset/search-bar-drop-where-label.md b/.changeset/search-bar-drop-where-label.md deleted file mode 100644 index 72fcd54222..0000000000 --- a/.changeset/search-bar-drop-where-label.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: drop the search bar WHERE label and `/` keycap overlay - -The `WHERE` label repeated the SQL placeholder, and the `/` hint clipped long queries. `/` and `s` still focus the input; the overlay is gone. diff --git a/.changeset/search-editor-css-leak.md b/.changeset/search-editor-css-leak.md deleted file mode 100644 index adb29fd58b..0000000000 --- a/.changeset/search-editor-css-leak.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -Fix the Search page using more and more browser memory with Live Tail on. Each -refresh added CSS rules for the SELECT and ORDER BY editors that were never -removed, so a tab left open could grow by gigabytes. diff --git a/.changeset/search-row-select-hover-reveal.md b/.changeset/search-row-select-hover-reveal.md deleted file mode 100644 index dc1b197646..0000000000 --- a/.changeset/search-row-select-hover-reveal.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -feat: reveal search row-selection checkboxes on hover - -The multi-select checkbox now fades in when a row is hovered or the checkbox -takes keyboard focus, instead of sitting on every row all the time, and is a -little smaller so its column costs less horizontal room. Selecting -any row reveals every checkbox so shift-click ranges stay aimable, and touch -devices (no hover) keep them visible. The cell keeps its width in every state, -so nothing reflows on hover. diff --git a/.changeset/settings-keyword-in-identifiers.md b/.changeset/settings-keyword-in-identifiers.md deleted file mode 100644 index a7ff5fb66a..0000000000 --- a/.changeset/settings-keyword-in-identifiers.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@hyperdx/common-utils': patch -'@hyperdx/api': patch -'@hyperdx/app': patch ---- - -fix: only split a query at a standalone SETTINGS keyword - -`extractSettingsClauseFromEnd` cut the query at the first "settings" anywhere in -it, including inside a string or an identifier. A multi-series metric chart with -a metric such as `app.settings.reloads` produced SQL with an unterminated -string, and a SQL filter on a column such as `AppSettings` was rewritten to -reference `App`. The keyword now has to stand alone outside quotes. diff --git a/.changeset/source-min-auto-granularity.md b/.changeset/source-min-auto-granularity.md deleted file mode 100644 index de734bed84..0000000000 --- a/.changeset/source-min-auto-granularity.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/common-utils': minor -'@hyperdx/app': minor -'@hyperdx/api': patch ---- - -Add a per-source floor for auto granularity. A metric source can now set "Minimum auto granularity" (Team Settings → Sources → your Metrics source) so that auto-inferred time buckets never go below it — useful when the underlying metric is reported on a fixed interval (e.g. a 60s scrape), since a short selected date range can otherwise auto-infer a smaller bucket than that interval and render a sparse/steppy series (alternating real-sample/empty buckets). Mirrors Grafana's per-datasource "Min interval" setting. Unset (the default) preserves the existing unfloored behavior, and an explicit (non-auto) granularity chosen on a tile is never affected. diff --git a/.changeset/statsd-receiver.md b/.changeset/statsd-receiver.md deleted file mode 100644 index af8cb78bf9..0000000000 --- a/.changeset/statsd-receiver.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"@hyperdx/otel-collector": minor ---- - -feat(otel-collector): compile in statsdreceiver - -Available for a user's own pipeline config (e.g. via -`CUSTOM_OTELCOL_CONFIG_FILE`) to ingest StatsD/DogStatsD metrics -directly, without a separate StatsD-to-OTLP bridge. Purely additive: -being compiled in changes no default pipeline or behavior on its own. diff --git a/.changeset/table-tile-refresh-pulse.md b/.changeset/table-tile-refresh-pulse.md deleted file mode 100644 index 12c73f5d08..0000000000 --- a/.changeset/table-tile-refresh-pulse.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: keep table tile rows on screen while a dashboard refreshes - -A dashboard refresh cleared the table tile and showed "Loading Chart Data..." -until the new result arrived. The tile now keeps its current rows and pulses -while the refetch runs, like the other dashboard tiles. diff --git a/.changeset/top-align-growing-query-toolbars.md b/.changeset/top-align-growing-query-toolbars.md deleted file mode 100644 index e7aa6981be..0000000000 --- a/.changeset/top-align-growing-query-toolbars.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: keep toolbar controls level with the first line of a wrapping query field - -Date pickers, Run, and nearby row actions stay top-aligned as a SQL or Lucene field grows. Sessions opts into PageHeader block padding so a taller search bar still has room. diff --git a/.changeset/trace-logs-side-panel-tab.md b/.changeset/trace-logs-side-panel-tab.md deleted file mode 100644 index d8846177d7..0000000000 --- a/.changeset/trace-logs-side-panel-tab.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/app': minor ---- - -Add a "Trace logs" tab to the event side panel, listing the trace's logs as a flat chronological table over the same time window the waterfall uses. It appears on any row that carries a trace id and resolves a log source — a span (via the trace source's correlated log source) or a log (its own source). Previously the only route to a trace's logs was hunting for the green rows interleaved in the waterfall, which a log-heavy trace buries. - -The tab lists the trace unfiltered; "Open in search" hands the same query — same source, same trace, same window — to the search page for anything narrower. Picking a log opens it in the panel: a breadcrumb hop from a span, or a row change from another log. Sorting is ascending, which inside a trace is execution order. diff --git a/.changeset/trace-waterfall-time-bound.md b/.changeset/trace-waterfall-time-bound.md deleted file mode 100644 index b55df8f6bc..0000000000 --- a/.changeset/trace-waterfall-time-bound.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -"@hyperdx/api": patch ---- - -fix(mcp): time-bound the trace waterfall span/log fetches so they prune -partitions instead of scanning the full retention window. The -`clickstack_trace_waterfall` tool now threads the search window into its span -and correlated-log queries, adds a `max_execution_time` ceiling, and probes a -trace's `[min, max]` span extent so an explicit `traceId` older than the -default window — or a trace that ran longer than an hour — still resolves in -full. The probe also runs for auto-picked traces, so a picked trace whose root -predates the window is no longer truncated into a partial tree. The fetch window -is width-clamped to the recent tail so a reused or sentinel `traceId` (e.g. an -all-zero id from an uninstrumented emitter) can't widen the scan back toward the -retention edge or stitch unrelated occurrences into one tree. Empty-result hints -now name the recoverable action (pass an explicit `startTime`) instead of the -misleading "widen the window", and a probe that fails is surfaced rather than -silently swallowed. ClickHouse query timeouts are also reclassified from `user` -to `server` errors. diff --git a/.changeset/viewport-initial-scale.md b/.changeset/viewport-initial-scale.md deleted file mode 100644 index 2535ea034d..0000000000 --- a/.changeset/viewport-initial-scale.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: set viewport initial scale to 1 so mobile browsers no longer load the app zoomed out to 75% diff --git a/.changeset/witty-mangos-listen.md b/.changeset/witty-mangos-listen.md deleted file mode 100644 index c9ef18614f..0000000000 --- a/.changeset/witty-mangos-listen.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@hyperdx/app': minor ---- - -Add a Preferences → Search results → Row click setting. Leave it at `Open side -panel` (the default) for the existing behavior, or set it to `Expand inline` to -have a row click expand the row in place — the chevron's 16px hit target is hard -to aim at while scanning logs. With inline expansion on, the side panel moves to -a hover button on the row, stays one click away from an expanded row, and keeps -receiving row clicks while it is open. diff --git a/.changeset/y-axis-even-tick-spacing.md b/.changeset/y-axis-even-tick-spacing.md deleted file mode 100644 index 7e6d8bfa1f..0000000000 --- a/.changeset/y-axis-even-tick-spacing.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@hyperdx/app': patch ---- - -fix: keep Y-axis ticks evenly spaced and cleanly rounded - -A chart's Y-axis could render unevenly spaced or fractional ticks (e.g. `0, 300, 1k` instead of `0, 250, 500, 750, 1k`), or even show two ticks with the identical label. Ticks now round to clean, evenly-spaced, always-distinct values instead. diff --git a/.env b/.env index d9b44fb233..aab1af1728 100644 --- a/.env +++ b/.env @@ -8,8 +8,8 @@ NEXT_ALL_IN_ONE_IMAGE_NAME_DOCKERHUB=clickhouse/clickstack-all-in-one ALL_IN_ONE_IMAGE_NAME_DOCKERHUB=hyperdx/hyperdx-all-in-one NEXT_OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB=clickhouse/clickstack-otel-collector OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB=hyperdx/hyperdx-otel-collector -CODE_VERSION=2.39.1 -IMAGE_VERSION_SUB_TAG=.39.1 +CODE_VERSION=2.40.0 +IMAGE_VERSION_SUB_TAG=.40.0 IMAGE_VERSION=2 IMAGE_NIGHTLY_TAG=2-nightly IMAGE_LATEST_TAG=latest diff --git a/CHANGELOG.md b/CHANGELOG.md index 76ba9a5241..441e54a7f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,243 @@ PR — keep the `hyperdx-release-notes` comment marker intact when editing so yo edits survive regeneration. Per-package detail lives in each `packages/*/CHANGELOG.md`. +## v2.40.0 — 2026-10-01 + + + +**Trace logs tab and multi-expression PromQL** + +The event side panel now has a "Trace logs" tab, listing a trace's logs as a flat +chronological table instead of leaving you to hunt for them among the spans in +the waterfall. A PromQL chart can now hold more than one expression, so you can +compare related series on the same axes instead of spreading them across +separate tiles. A metric source can also set a minimum auto granularity, so a +short date range no longer auto-infers buckets smaller than the interval your +metrics arrive on and leaves you with a sparse, steppy series. Search gets a +tidier bar and a toolbar that stays put as a long query wraps, the dashboards +list gains tabs, sorting and tag filtering, and the `hdx chart` command picks up +the compact duration axis labels the web app already uses, so a tick reads "13m" +instead of "13.33min". The bundled OTel collector also ships with the StatsD +receiver compiled in, ready for a custom pipeline to ingest StatsD and +DogStatsD metrics directly. + +### ✨ New Features + +- **A "Trace logs" tab in the event side panel**: any row carrying a trace id + that resolves a log source — a span, through the trace source's correlated log + source, or a log through its own — now gets a tab listing the trace's logs as + a flat chronological table over the same window the waterfall uses, so a + log-heavy trace no longer buries them among the green rows interleaved in the + waterfall. The tab lists the trace unfiltered and sorts ascending, which inside + a trace is execution order; "Open in search" hands the same query — same + source, same trace, same window — to the search page for anything narrower, + and picking a log opens it in the panel (#3127, thanks @MikeShi42!). +- **Choose what a click on a search result does**: a new Preferences → Search + results → Row click setting keeps `Open side panel`, the existing behaviour, + by default, or can be set to `Expand inline` so a row click expands the row + where it sits — the chevron's 16px hit target is hard to aim at while scanning + logs. With inline expansion on, the side panel moves to a hover button on the + row, stays one click away from an expanded row, and keeps taking row clicks + while it is open (#3117, thanks @MikeShi42!). +- **`MATERIALIZED` and `ALIAS` columns in the row details panel**: ClickHouse + leaves those columns out of `SELECT *`, so the row details panel never showed + them. A new "Show materialized and alias columns" item in the properties view + options menu, off by default, asks for them along with the rest of the row. It + has no effect on a source with a Known Columns List, and a value the source's + own query settings give for either setting wins; if a row fails to load while + the option is on — a `readonly = 1` connection user, say, or an `ALIAS` column + that cannot be evaluated — the error state offers to turn it back off (#3231, + thanks @BilalAtique!). +- **Plot several PromQL expressions on one chart**: a PromQL chart is no longer + limited to a single expression, so related queries can share one set of axes + rather than one tile each (#3146, thanks @pulpdrew!). +- **PromQL number tiles take instant queries and reductions**: a number tile + backed by PromQL can now run an instant query, or reduce a range query down to + the single value the tile shows, so a PromQL expression fits a number tile as + readily as it fits a time series (#3169, thanks @pulpdrew!). +- **Sparklines behind PromQL number tiles**: a number tile backed by a PromQL + range query can now draw that range as a sparkline behind the value, so the + tile shows where the number came from as well as what it currently is (#3178, + thanks @pulpdrew!). +- **Table tiles on PromQL sources**: a tile backed by a PromQL source can now be + displayed as a table, so a query's series can be read as rows and values + rather than only as a chart (#3238, thanks @pulpdrew!). +- **Pie and bar tiles on PromQL sources**: a tile backed by a PromQL source can + also be displayed as a pie or a bar chart, so a query's series can be compared + as shares of a whole or side by side rather than only over time (#3253, thanks + @pulpdrew!). +- **Macros in PromQL charts**: a PromQL chart now expands macros in its + expression, so the same templating the rest of your charts are built with is + available to PromQL queries too (#3244, thanks @pulpdrew!). +- **Markdown tiles pick up dashboard variables**: a dashboard's variables are now + substituted into its markdown tiles, so a tile's text can name the service, + environment or whatever else the dashboard is currently scoped to instead of + going stale the moment you change a filter (#3246, thanks @pulpdrew!). +- **A per-source floor for auto granularity**: a metric source can now set a + "Minimum auto granularity" (Team Settings → Sources → your Metrics source) so + that auto-inferred time buckets never go below it. That helps when the + underlying metric is reported on a fixed interval — a 60s scrape, say — where + a short date range could otherwise infer a smaller bucket than the interval + and render a sparse, steppy series that alternates real samples with empty + buckets, much like Grafana's per-datasource "Min interval". Left unset, the + default, nothing changes, and an explicit granularity chosen on a tile is + never affected (#3149, thanks @arj22!). +- **StatsD metrics from your own collector pipeline**: the OTel collector now + has the `statsdreceiver` compiled in, ready to reference from a custom + pipeline supplied via `CUSTOM_OTELCOL_CONFIG_FILE` to ingest StatsD and + DogStatsD metrics directly, without a separate StatsD-to-OTLP bridge. The + change is purely additive: no default pipeline or behaviour changes on its own + (#3100, thanks @arj22!). + +### 🔧 Improvements + +- **Search row-selection checkboxes appear on hover**: the multi-select checkbox + now fades in when you hover a row or move keyboard focus to it, and is a little + smaller, so its column costs less horizontal room. Selecting any row reveals + every checkbox so shift-click ranges stay aimable, touch devices keep them + visible, and the cell holds its width in every state so nothing reflows under + the cursor (#3164, thanks @MikeShi42!). +- **A less cluttered search bar**: the `WHERE` label duplicated the SQL + placeholder already in the input, and the `/` keycap overlay sat on top of long + queries and clipped them, so both are gone. Pressing `/` or `s` still focuses + the search input (#3168, thanks @elizabetdev!). +- **A reworked dashboards list**: a tagged dashboard is now listed once in the + grid rather than repeated under every tag it carries, and tags became a filter + behind a Tags button with a count badge, showing only dashboards that carry + every tag you select. Favourites moved out of a pinned row of cards into an + "All / Favorites / My dashboards" tab strip, a sort control offers last updated + (the default), name and recently created, and Import and New dashboard now sit + in the page header (#3199, thanks @elizabetdev!). +- **Live tail time presets reach 6h**: the time picker capped live tail at 1h, + even though longer ranges already worked when set from the URL — 3h and 6h are + now offered. Anything above that stays disabled, and now says why with a "Not + available for Live Tail" tooltip, since each refresh tick re-queries the whole + window and a 12–24h scan every 10 seconds is more than it is worth. The toggle + beside the presets is also renamed from "Relative Time" to "Live tail ranges", + which is what it actually controls — which intervals are on offer, not whether + live tail is running (#3219, thanks @krishs01!). +- **The external API's rate limit is configurable**: the cap on `/api/v2/*` + requests can now be set with `EXTERNAL_API_RATE_LIMIT_MAX`, so a busy + integration or an export job no longer has to live within a fixed ceiling. It + defaults to 100 requests per minute, the value that was previously hardcoded, + so nothing changes unless you set it (#3200, thanks @vinzee!). +- **Map attribute columns are labelled by their key**: adding a Map attribute + such as `ResourceAttributes['service.name']` as a column from the filters + sidebar or the row side panel now writes it into the SELECT as + `ResourceAttributes['service.name'] AS "service.name"`, so the results column + reads `service.name` rather than + `arrayElement(ResourceAttributes, 'service.name')`. The alias is visible and + editable in the SELECT, queries you type by hand are left alone, and a key + named like a table column, or already used as a name in the SELECT, is added + without an alias (#3163, thanks @DevShoaib78!). +- **Map key autocomplete stops scanning whole tables**: discovering the keys in + a `Map` column only applied a time predicate when the caller had both a date + range and a timestamp expression to hand, so otherwise its sampling query ran + without a `WHERE` clause and touched every part of the table. It now falls + back to the last 24 hours when no date range is given, and skips the raw scan + altogether when there is no timestamp expression to filter on; the chart, + alert and dashboard-filter editors pass the source and date range they already + have, so keys keep autocompleting there (#3082, thanks @niladrix719!). + +### 🐛 Bug Fixes + +- **Search results no longer go blank after expanding and collapsing rows**: a + row and its inline expansion share one virtual index, and the expansion left + its own height cached against that index once it collapsed, so every + expand/collapse shrank the render window a little further until scrolling + showed a handful of rows above empty space. The two are now measured as a + single unit (#3171, thanks @MikeShi42!). +- **The Search page stops growing in memory with Live Tail on**: every refresh + added CSS rules for the SELECT and ORDER BY editors that were never cleaned + up, so a Search tab left open on Live Tail could grow by gigabytes of browser + memory. The rules are now removed with the editors (#3193, thanks + @jordan-simonovski!). +- **Filter distribution percentages say only what the sample backs**: the "Show + distribution" labels read `<1%` both when the sample genuinely found a value + rare and when it turned up no matching rows at all, so the two were + indistinguishable. A `<1%` label now means the former, and a value that its + field's own filter has narrowed the results down to reads 100% (#3230, thanks + @jordan-simonovski!). +- **Event deltas no longer fail on Distributed tables**: making a selection in + event deltas failed when the source's table is a `Distributed` table. It now + works there as it does against a local one (#3235, thanks @karl-power!). +- **Toolbar controls stay level with a growing query field**: the date pickers, + Run button and nearby row actions now stay aligned with the first line of a SQL + or Lucene field as it wraps onto several lines, instead of sliding down with it. + Sessions also leaves room for a taller search bar (#3151, thanks + @elizabetdev!). +- **Dashboard tiles show when they are refreshing**: during a dashboard refresh + the number, bar and pie tiles held the previous result on screen with nothing + to say new data was on its way, so a stale value looked current, while the + table and heatmap tiles went further and cleared what they were showing for a + loading message until the new result arrived. All five now keep what they are + showing and pulse while the refetch runs, as line and stacked-bar time charts + already did (#3211, #3212, #3221, thanks @Harshul1484!). +- **Axis ticks keep their decimals on large values**: a tick at or above 1k was + rounded to a whole number whatever the chart's Number Format asked for, so + nearby values such as 950 and 1080 could both read `1k`. Ticks now carry as + much precision as the width of the axis allows, in the web app and in the + CLI's terminal charts, and a tightly fitted Y axis no longer shows two ticks + with the identical label (#3162, thanks @arj22!). +- **Y-axis ticks stay evenly spaced and cleanly rounded**: a chart's Y axis could + space its ticks unevenly or land them on fractional values — `0, 300, 1k` where + `0, 250, 500, 750, 1k` reads far better — and could repeat a label across two + of them. Ticks now round to clean, evenly spaced, always-distinct values + (#3172, thanks @arj22!). +- **Terminal charts use compact duration labels**: duration-formatted charts in + `hdx chart` fell through to the wide duration formatter for their axis ticks, + so they rendered "13.33min" where the web app renders "13m". The CLI now + matches the web app's formatting (#3158, thanks @arj22!). +- **Gauge and sum metric charts group by `MATERIALIZED` and `ALIAS` columns**: + grouping or selecting one of those columns on a gauge or sum metric chart + failed with `Unknown expression identifier`, because the intermediate query + did not carry the column through. Both now work as any other column does + (#3191, thanks @jordan-simonovski!). +- **A metric or column named like "settings" no longer corrupts a query**: a + query was split at the first "settings" found anywhere in it, including inside + a string or an identifier, so a multi-series metric chart on a metric such as + `app.settings.reloads` produced SQL with an unterminated string, and a SQL + filter on a column such as `AppSettings` was rewritten to reference `App`. The + `SETTINGS` keyword now has to stand alone outside quotes to be treated as one + (#3216, thanks @breken-ai!). +- **The chart editor offers only PromQL sources in PromQL mode**: the source + picker listed every source, including ones a PromQL query cannot be run + against, so a chart switched to PromQL could be pointed at a source that was + never going to answer it. It now offers only the sources that support PromQL + (#3185, thanks @pulpdrew!). +- **The row side panel honours its source's query settings**: the lookup that + fetches a row for the side panel now runs with the query settings configured + on that source, as the rest of the queries against it already do (#3234, + thanks @pulpdrew!). +- **Trace waterfalls over MCP stop scanning the whole retention window**: the + `clickstack_trace_waterfall` tool now carries the search window into its span + and correlated-log queries so ClickHouse can prune partitions, and puts a + `max_execution_time` ceiling over them. It first probes the trace's span + extent, so a trace older than the default window — or one that ran for longer + than an hour — still resolves in full rather than as a partial tree, while the + fetch window stays clamped to the recent tail so a reused or all-zero + `traceId` from an uninstrumented emitter cannot widen the scan back towards + the retention edge or stitch unrelated occurrences into one tree. An empty + result now names the action that would fix it, passing an explicit + `startTime`, instead of suggesting you widen the window, a failed probe is + surfaced rather than swallowed, and a ClickHouse query timeout is reported as + a server error rather than a user one (#3116). +- **Mobile browsers no longer open the app zoomed out**: the page's viewport + initial scale is now 1, so the app loads at full size on a phone or tablet + instead of at 75% (#3249, thanks @elizabetdev!). + + + +### 📦 Package changelogs + +- `@hyperdx/api` 2.39.1 → 2.40.0 — [changelog](https://github.com/hyperdxio/hyperdx/blob/main/packages/api/CHANGELOG.md#2400) +- `@hyperdx/app` 2.39.1 → 2.40.0 — [changelog](https://github.com/hyperdxio/hyperdx/blob/main/packages/app/CHANGELOG.md#2400) +- `@hyperdx/cli` 0.6.3 → 0.6.4 — [changelog](https://github.com/hyperdxio/hyperdx/blob/main/packages/cli/CHANGELOG.md#064) +- `@hyperdx/common-utils` 0.29.0 → 0.30.0 — [changelog](https://github.com/hyperdxio/hyperdx/blob/main/packages/common-utils/CHANGELOG.md#0300) +- `@hyperdx/otel-collector` 2.39.1 → 2.40.0 — [changelog](https://github.com/hyperdxio/hyperdx/blob/main/packages/otel-collector/CHANGELOG.md#2400) + + + ## v2.39.1 — 2026-09-19 diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 7af721be08..06edbc42d3 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,67 @@ # @hyperdx/api +## 2.40.0 + +### Minor Changes + +- d91e66b8: Make the external API v2 rate limit (`/api/v2/*`) configurable via `EXTERNAL_API_RATE_LIMIT_MAX`. Defaults to 100 requests/minute, matching the previous hardcoded value. + +### Patch Changes + +- 1e355ac4: fix: don't scan the whole table to discover Map keys + + `getMapKeys` only applied a time predicate when the caller passed both a date + range and a timestamp expression; otherwise the raw `sampledKeys` scan ran with + no `WHERE` and touched every part of the table. It now defaults a missing date + range to the last 24 hours and skips the raw scan entirely when there is no + timestamp expression to filter on. The chart, alert and dashboard-filter + editors pass the source and date range they already have so Map keys keep + autocompleting there. + +- 793fe19e: feat: Substitute dashboard variables in markdown tiles +- ec4f5087: fix: allow grouping gauge and sum metric charts by materialized and alias columns + + Grouping or selecting a MATERIALIZED or ALIAS column on a gauge or sum metric chart failed with `Unknown expression identifier`, because the intermediate query didn't carry those columns through. + +- 08d9a908: feat: Plot several PromQL expressions on one chart +- 19182e7e: fix: only split a query at a standalone SETTINGS keyword + + `extractSettingsClauseFromEnd` cut the query at the first "settings" anywhere in + it, including inside a string or an identifier. A multi-series metric chart with + a metric such as `app.settings.reloads` produced SQL with an unterminated + string, and a SQL filter on a column such as `AppSettings` was rewritten to + reference `App`. The keyword now has to stand alone outside quotes. + +- d9e2c58b: Add a per-source floor for auto granularity. A metric source can now set "Minimum auto granularity" (Team Settings → Sources → your Metrics source) so that auto-inferred time buckets never go below it — useful when the underlying metric is reported on a fixed interval (e.g. a 60s scrape), since a short selected date range can otherwise auto-infer a smaller bucket than that interval and render a sparse/steppy series (alternating real-sample/empty buckets). Mirrors Grafana's per-datasource "Min interval" setting. Unset (the default) preserves the existing unfloored behavior, and an explicit (non-auto) granularity chosen on a tile is never affected. +- a5e7841c: fix(mcp): time-bound the trace waterfall span/log fetches so they prune + partitions instead of scanning the full retention window. The + `clickstack_trace_waterfall` tool now threads the search window into its span + and correlated-log queries, adds a `max_execution_time` ceiling, and probes a + trace's `[min, max]` span extent so an explicit `traceId` older than the + default window — or a trace that ran longer than an hour — still resolves in + full. The probe also runs for auto-picked traces, so a picked trace whose root + predates the window is no longer truncated into a partial tree. The fetch window + is width-clamped to the recent tail so a reused or sentinel `traceId` (e.g. an + all-zero id from an uninstrumented emitter) can't widen the scan back toward the + retention edge or stitch unrelated occurrences into one tree. Empty-result hints + now name the recoverable action (pass an explicit `startTime`) instead of the + misleading "widen the window", and a probe that fails is surfaced rather than + silently swallowed. ClickHouse query timeouts are also reclassified from `user` + to `server` errors. +- Updated dependencies [1e355ac4] +- Updated dependencies [793fe19e] +- Updated dependencies [ec4f5087] +- Updated dependencies [8a9fcd2f] +- Updated dependencies [08d9a908] +- Updated dependencies [a8a72c11] +- Updated dependencies [8cfb2672] +- Updated dependencies [4570d5ee] +- Updated dependencies [78ed5921] +- Updated dependencies [23423c13] +- Updated dependencies [19182e7e] +- Updated dependencies [d9e2c58b] + - @hyperdx/common-utils@0.30.0 + ## 2.39.1 ## 2.39.0 diff --git a/packages/api/package.json b/packages/api/package.json index a72eb1ea25..48648822a5 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@hyperdx/api", - "version": "2.39.1", + "version": "2.40.0", "license": "MIT", "private": true, "engines": { @@ -21,7 +21,7 @@ "@braintree/sanitize-url": "^7.1.1", "@clickhouse/client-common": "1.23.0-head.fae5998.1", "@esm2cjs/p-queue": "^7.3.0", - "@hyperdx/common-utils": "^0.29.0", + "@hyperdx/common-utils": "^0.30.0", "@hyperdx/node-opentelemetry": "^0.9.0", "@hyperdx/passport-local-mongoose": "^9.0.1", "@modelcontextprotocol/sdk": "^1.27.1", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 1faec1a126..80dc09437c 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,164 @@ # @hyperdx/app +## 2.40.0 + +### Minor Changes + +- 8a9fcd2f: feat: Support macros in PromQL charts +- 08d9a908: feat: Plot several PromQL expressions on one chart +- d9e2c58b: Add a per-source floor for auto granularity. A metric source can now set "Minimum auto granularity" (Team Settings → Sources → your Metrics source) so that auto-inferred time buckets never go below it — useful when the underlying metric is reported on a fixed interval (e.g. a 60s scrape), since a short selected date range can otherwise auto-infer a smaller bucket than that interval and render a sparse/steppy series (alternating real-sample/empty buckets). Mirrors Grafana's per-datasource "Min interval" setting. Unset (the default) preserves the existing unfloored behavior, and an explicit (non-auto) granularity chosen on a tile is never affected. +- d76cb7ed: Add a "Trace logs" tab to the event side panel, listing the trace's logs as a flat chronological table over the same time window the waterfall uses. It appears on any row that carries a trace id and resolves a log source — a span (via the trace source's correlated log source) or a log (its own source). Previously the only route to a trace's logs was hunting for the green rows interleaved in the waterfall, which a log-heavy trace buries. + + The tab lists the trace unfiltered; "Open in search" hands the same query — same source, same trace, same window — to the search page for anything narrower. Picking a log opens it in the panel: a breadcrumb hop from a span, or a row change from another log. Sorting is ascending, which inside a trace is execution order. + +- f800b090: Add a Preferences → Search results → Row click setting. Leave it at `Open side +panel` (the default) for the existing behavior, or set it to `Expand inline` to + have a row click expand the row in place — the chevron's 16px hit target is hard + to aim at while scanning logs. With inline expansion on, the side panel moves to + a hover button on the row, stays one click away from an expanded row, and keeps + receiving row clicks while it is open. + +### Patch Changes + +- 416c92a0: fix: stop discarding chart axis-tick decimals for large numbers + + Axis ticks at or above 1k were always rounded to a whole number regardless of the configured Number Format, so nearby values (e.g. 950 and 1080) could both render as `1k` — ticks now use as much precision as the axis's width allows, on both the web app and CLI terminal charts. Also fixed: a tightly fit Y-axis could show two ticks with the identical rounded label. + +- 1e355ac4: fix: don't scan the whole table to discover Map keys + + `getMapKeys` only applied a time predicate when the caller passed both a date + range and a timestamp expression; otherwise the raw `sampledKeys` scan ran with + no `WHERE` and touched every part of the table. It now defaults a missing date + range to the last 24 hours and skips the raw scan entirely when there is no + timestamp expression to filter on. The chart, alert and dashboard-filter + editors pass the source and date range they already have so Map keys keep + autocompleting there. + +- ec25b813: fix: Only offer PromQL sources in the chart editor's PromQL mode +- c47b9b9e: fix: rework the dashboards list with tabs, sort, and tag filtering + + Tagged dashboards no longer repeat under every tag they carry — the grid lists + each dashboard once. Tags are now a filter behind a fixed-width Tags button + with a count badge (a dashboard must carry every selected tag). Favorites + moved from a pinned row of cards into an "All / + Favorites / My dashboards" tab strip, and a sort control offers last updated + (default), name, and recently created. Import and New dashboard moved into the + page header. + +- 5e3031da: fix: show that number, bar and pie tiles are refreshing + + During a dashboard refresh these tiles kept the previous result on screen with + no sign that new data was loading, so stale values looked current. They now + pulse while the refetch runs, like line and stacked-bar time charts already do. + +- 517ffd90: fix: keep heatmap tiles on screen while a dashboard refreshes + + During a refresh, heatmap tiles replaced the chart with a "Loading..." message + until the new data arrived. They now keep the current heatmap on screen and + pulse while the refetch runs, like the other dashboard tiles. + +- 6452baaf: fix: expand live tail time picker presets to 6h and clarify switch label + + Enable 3h and 6h presets in live tail mode (previously capped at 1h in the picker, though longer ranges already worked via URL). Ranges above 6h remain disabled because the refresh tick (10s default) re-queries the full window, and 12–24h scans would be excessive. Rename the toggle switch from "Relative Time" to "Live tail ranges" to clarify that it controls which preset intervals are available, not whether live tail is active. Add a "Not available for Live Tail" tooltip to disabled presets (12h+). + +- 0c93eab0: fix: label Map attribute columns added from the search sidebars by their key + + Adding a Map attribute such as `ResourceAttributes['service.name']` as a column + from the filters sidebar or the row side panel now writes it into the SELECT as + `ResourceAttributes['service.name'] AS "service.name"`, so the results column + reads `service.name` instead of + `arrayElement(ResourceAttributes, 'service.name')`. The alias is visible and + editable in the SELECT, and queries typed by hand are not changed. A key named + like a table column, or one already used as a name in the SELECT, is added + without an alias. + +- 793fe19e: feat: Substitute dashboard variables in markdown tiles +- ec4f5087: fix: allow grouping gauge and sum metric charts by materialized and alias columns + + Grouping or selecting a MATERIALIZED or ALIAS column on a gauge or sum metric chart failed with `Unknown expression identifier`, because the intermediate query didn't carry those columns through. + +- 4fa3c376: Fix search results going blank after expanding and collapsing rows. A row and + its inline expansion are two `tr`s sharing one virtual index, and both were + measured by the virtualizer, so the expanded row took over that index's + ResizeObserver registration and left its height cached there after it + collapsed. Each expand/collapse shrank the render window a little further until + scrolling showed only a handful of rows above empty space. The row and its + expansion are now wrapped in a `tbody` that is measured as one unit. +- bd40e3cb: fix(app): stop event deltas selection failing on Distributed tables +- a8a72c11: fix: Support instant queries and reductions on PromQL number tiles +- 8cfb2672: feat: Support background sparklines on PromQL range number tiles +- 4570d5ee: feat: Support pie and bar tiles on PromQL sources +- 78ed5921: feat: Support table tiles on PromQL sources +- 23423c13: fix: Show distribution only labels a value "<1%" when the sample shows it is rare, not when it has no matching rows, and shows 100% when the field's filter allows only that value +- 5bdb68db: feat: add an option to show MATERIALIZED and ALIAS columns in the row details panel + + ClickHouse leaves MATERIALIZED and ALIAS columns out of `SELECT *`, so the row + details panel never showed them. A new "Show materialized and alias columns" + item in the properties view options menu, off by default, adds + `asterisk_include_materialized_columns` and `asterisk_include_alias_columns` to + the row query. It has no effect on a source with a Known Columns List, and a + value that the source's query settings give for either setting wins. If the row + fails to load while the option is on (for example, because the connection's user + is `readonly = 1`, or an ALIAS column cannot be evaluated), the error state + offers to turn the option off. + +- 9647ad3d: fix: Apply source query settings to the row side panel's row lookup +- 4c4792f5: fix: drop the search bar WHERE label and `/` keycap overlay + + The `WHERE` label repeated the SQL placeholder, and the `/` hint clipped long queries. `/` and `s` still focus the input; the overlay is gone. + +- 67673498: Fix the Search page using more and more browser memory with Live Tail on. Each + refresh added CSS rules for the SELECT and ORDER BY editors that were never + removed, so a tab left open could grow by gigabytes. +- c2c26093: feat: reveal search row-selection checkboxes on hover + + The multi-select checkbox now fades in when a row is hovered or the checkbox + takes keyboard focus, instead of sitting on every row all the time, and is a + little smaller so its column costs less horizontal room. Selecting + any row reveals every checkbox so shift-click ranges stay aimable, and touch + devices (no hover) keep them visible. The cell keeps its width in every state, + so nothing reflows on hover. + +- 19182e7e: fix: only split a query at a standalone SETTINGS keyword + + `extractSettingsClauseFromEnd` cut the query at the first "settings" anywhere in + it, including inside a string or an identifier. A multi-series metric chart with + a metric such as `app.settings.reloads` produced SQL with an unterminated + string, and a SQL filter on a column such as `AppSettings` was rewritten to + reference `App`. The keyword now has to stand alone outside quotes. + +- 1edc042a: fix: keep table tile rows on screen while a dashboard refreshes + + A dashboard refresh cleared the table tile and showed "Loading Chart Data..." + until the new result arrived. The tile now keeps its current rows and pulses + while the refetch runs, like the other dashboard tiles. + +- 16c7a6c3: fix: keep toolbar controls level with the first line of a wrapping query field + + Date pickers, Run, and nearby row actions stay top-aligned as a SQL or Lucene field grows. Sessions opts into PageHeader block padding so a taller search bar still has room. + +- fb2aebc9: fix: set viewport initial scale to 1 so mobile browsers no longer load the app zoomed out to 75% +- e24acf73: fix: keep Y-axis ticks evenly spaced and cleanly rounded + + A chart's Y-axis could render unevenly spaced or fractional ticks (e.g. `0, 300, 1k` instead of `0, 250, 500, 750, 1k`), or even show two ticks with the identical label. Ticks now round to clean, evenly-spaced, always-distinct values instead. + +- Updated dependencies [1e355ac4] +- Updated dependencies [d91e66b8] +- Updated dependencies [793fe19e] +- Updated dependencies [ec4f5087] +- Updated dependencies [8a9fcd2f] +- Updated dependencies [08d9a908] +- Updated dependencies [a8a72c11] +- Updated dependencies [8cfb2672] +- Updated dependencies [4570d5ee] +- Updated dependencies [78ed5921] +- Updated dependencies [23423c13] +- Updated dependencies [19182e7e] +- Updated dependencies [d9e2c58b] +- Updated dependencies [a5e7841c] + - @hyperdx/common-utils@0.30.0 + - @hyperdx/api@2.40.0 + ## 2.39.1 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index fcafccff7e..92d15fa9aa 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@hyperdx/app", - "version": "2.39.1", + "version": "2.40.0", "private": true, "license": "MIT", "engines": { @@ -38,7 +38,7 @@ "@hookform/resolvers": "^3.9.0", "@hyperdx/api": "workspace:*", "@hyperdx/browser": "^0.22.1", - "@hyperdx/common-utils": "^0.29.0", + "@hyperdx/common-utils": "^0.30.0", "@hyperdx/node-opentelemetry": "^0.9.0", "@mantine/core": "^9.0.0", "@mantine/dates": "^9.0.0", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index d0eacd515d..a40cdad27f 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,17 @@ # @hyperdx/cli +## 0.6.4 + +### Patch Changes + +- 416c92a0: fix: stop discarding chart axis-tick decimals for large numbers + + Axis ticks at or above 1k were always rounded to a whole number regardless of the configured Number Format, so nearby values (e.g. 950 and 1080) could both render as `1k` — ticks now use as much precision as the axis's width allows, on both the web app and CLI terminal charts. Also fixed: a tightly fit Y-axis could show two ticks with the identical rounded label. + +- c42dda80: fix: use compact duration labels on terminal chart axis ticks + + `axisTickFormatter` is a documented port of the web's `formatAxisTick` (fixed in #3148) and is expected to stay behaviorally in sync with it, but it fell through to the wide `formatDurationMs` instead of the compact formatter for duration-formatted charts. `hdx chart` now renders the same short labels (e.g. "13m" instead of "13.33min") as the web app. + ## 0.6.3 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 6170b3e198..dd4eb114e5 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@hyperdx/cli", - "version": "0.6.3", + "version": "0.6.4", "license": "MIT", "type": "module", "repository": { @@ -41,7 +41,7 @@ }, "devDependencies": { "@clickhouse/client": "1.23.0-head.fae5998.1", - "@hyperdx/common-utils": "^0.29.0", + "@hyperdx/common-utils": "^0.30.0", "@jest/globals": "^30.2.0", "@types/crypto-js": "^4.2.2", "@types/jest": "^29.5.14", diff --git a/packages/common-utils/CHANGELOG.md b/packages/common-utils/CHANGELOG.md index f595ae0fbc..1dc4b981cf 100644 --- a/packages/common-utils/CHANGELOG.md +++ b/packages/common-utils/CHANGELOG.md @@ -1,5 +1,43 @@ # @hyperdx/common-utils +## 0.30.0 + +### Minor Changes + +- 8a9fcd2f: feat: Support macros in PromQL charts +- 08d9a908: feat: Plot several PromQL expressions on one chart +- d9e2c58b: Add a per-source floor for auto granularity. A metric source can now set "Minimum auto granularity" (Team Settings → Sources → your Metrics source) so that auto-inferred time buckets never go below it — useful when the underlying metric is reported on a fixed interval (e.g. a 60s scrape), since a short selected date range can otherwise auto-infer a smaller bucket than that interval and render a sparse/steppy series (alternating real-sample/empty buckets). Mirrors Grafana's per-datasource "Min interval" setting. Unset (the default) preserves the existing unfloored behavior, and an explicit (non-auto) granularity chosen on a tile is never affected. + +### Patch Changes + +- 1e355ac4: fix: don't scan the whole table to discover Map keys + + `getMapKeys` only applied a time predicate when the caller passed both a date + range and a timestamp expression; otherwise the raw `sampledKeys` scan ran with + no `WHERE` and touched every part of the table. It now defaults a missing date + range to the last 24 hours and skips the raw scan entirely when there is no + timestamp expression to filter on. The chart, alert and dashboard-filter + editors pass the source and date range they already have so Map keys keep + autocompleting there. + +- 793fe19e: feat: Substitute dashboard variables in markdown tiles +- ec4f5087: fix: allow grouping gauge and sum metric charts by materialized and alias columns + + Grouping or selecting a MATERIALIZED or ALIAS column on a gauge or sum metric chart failed with `Unknown expression identifier`, because the intermediate query didn't carry those columns through. + +- a8a72c11: fix: Support instant queries and reductions on PromQL number tiles +- 8cfb2672: feat: Support background sparklines on PromQL range number tiles +- 4570d5ee: feat: Support pie and bar tiles on PromQL sources +- 78ed5921: feat: Support table tiles on PromQL sources +- 23423c13: fix: Show distribution only labels a value "<1%" when the sample shows it is rare, not when it has no matching rows, and shows 100% when the field's filter allows only that value +- 19182e7e: fix: only split a query at a standalone SETTINGS keyword + + `extractSettingsClauseFromEnd` cut the query at the first "settings" anywhere in + it, including inside a string or an identifier. A multi-series metric chart with + a metric such as `app.settings.reloads` produced SQL with an unterminated + string, and a SQL filter on a column such as `AppSettings` was rewritten to + reference `App`. The keyword now has to stand alone outside quotes. + ## 0.29.0 ### Minor Changes diff --git a/packages/common-utils/package.json b/packages/common-utils/package.json index 6ba9affaa3..6acd5e364f 100644 --- a/packages/common-utils/package.json +++ b/packages/common-utils/package.json @@ -1,7 +1,7 @@ { "name": "@hyperdx/common-utils", "description": "Common utilities for HyperDX application", - "version": "0.29.0", + "version": "0.30.0", "license": "MIT", "private": true, "files": [ diff --git a/packages/otel-collector/CHANGELOG.md b/packages/otel-collector/CHANGELOG.md index 5493886de2..d241c974d2 100644 --- a/packages/otel-collector/CHANGELOG.md +++ b/packages/otel-collector/CHANGELOG.md @@ -1,5 +1,16 @@ # @hyperdx/otel-collector +## 2.40.0 + +### Minor Changes + +- 3ab758e4: feat(otel-collector): compile in statsdreceiver + + Available for a user's own pipeline config (e.g. via + `CUSTOM_OTELCOL_CONFIG_FILE`) to ingest StatsD/DogStatsD metrics + directly, without a separate StatsD-to-OTLP bridge. Purely additive: + being compiled in changes no default pipeline or behavior on its own. + ## 2.39.1 ## 2.39.0 diff --git a/packages/otel-collector/package.json b/packages/otel-collector/package.json index 074b37f38d..8561ec1bcf 100644 --- a/packages/otel-collector/package.json +++ b/packages/otel-collector/package.json @@ -1,7 +1,7 @@ { "name": "@hyperdx/otel-collector", "description": "HyperDX OpenTelemetry Collector configuration and Docker image", - "version": "2.39.1", + "version": "2.40.0", "license": "MIT", "private": true } diff --git a/yarn.lock b/yarn.lock index 9e30b4f777..408e3ac185 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4625,7 +4625,7 @@ __metadata: "@braintree/sanitize-url": "npm:^7.1.1" "@clickhouse/client-common": "npm:1.23.0-head.fae5998.1" "@esm2cjs/p-queue": "npm:^7.3.0" - "@hyperdx/common-utils": "npm:^0.29.0" + "@hyperdx/common-utils": "npm:^0.30.0" "@hyperdx/node-opentelemetry": "npm:^0.9.0" "@hyperdx/passport-local-mongoose": "npm:^9.0.1" "@modelcontextprotocol/sdk": "npm:^1.27.1" @@ -4717,7 +4717,7 @@ __metadata: "@hookform/resolvers": "npm:^3.9.0" "@hyperdx/api": "workspace:*" "@hyperdx/browser": "npm:^0.22.1" - "@hyperdx/common-utils": "npm:^0.29.0" + "@hyperdx/common-utils": "npm:^0.30.0" "@hyperdx/node-opentelemetry": "npm:^0.9.0" "@mantine/core": "npm:^9.0.0" "@mantine/dates": "npm:^9.0.0" @@ -4844,7 +4844,7 @@ __metadata: resolution: "@hyperdx/cli@workspace:packages/cli" dependencies: "@clickhouse/client": "npm:1.23.0-head.fae5998.1" - "@hyperdx/common-utils": "npm:^0.29.0" + "@hyperdx/common-utils": "npm:^0.30.0" "@jest/globals": "npm:^30.2.0" "@types/crypto-js": "npm:^4.2.2" "@types/jest": "npm:^29.5.14" @@ -4871,7 +4871,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperdx/common-utils@npm:^0.29.0, @hyperdx/common-utils@workspace:packages/common-utils": +"@hyperdx/common-utils@npm:^0.30.0, @hyperdx/common-utils@workspace:packages/common-utils": version: 0.0.0-use.local resolution: "@hyperdx/common-utils@workspace:packages/common-utils" dependencies: