Minor Changes
- be26530: Add plural alert notification channel schemas:
zAlertChannels(1–10 entries),MAX_ALERT_CHANNELS, and a sharedchannel/channelscross-field validator, ahead of multi-channel alert support in the API. - b1d8dc1: Formulas now work on log and trace sources, not just metrics. Time series, table and number charts on event sources can define derived series via letter-ref arithmetic expressions (e.g.
A / B * 100), with the same editor controls (Add Formula, series letter badges, Show input series) previously offered only on metric sources. Event formulas compile inline into the chart's single-scan SELECT — no per-series query fan-out — with the same missing-data semantics as the existing events ratio toggle. - dc29d57: Chart formulas are now supported across every API surface that persists or accepts chart configs. The external dashboards API v2 and the MCP
save_dashboard/patch_dashboardtools acceptformulas(letter-ref arithmetic over the tile's select items, e.g.A / (A + B) * 100) andshowOperandSerieson line, stacked bar, table and number builder tiles, round-trip them through GET/PUT, and validate the expressions on write — unknown series refs, malformed syntax, combining formulas withasRatio, multiple formulas on a number tile, and formulas on formula-incapable source kinds (anything other than metric, log, or trace) are all rejected with actionable errors. MCPquery_tilecomputes formula columns for both metric and log/trace event tiles, the query-guide prompt documents the feature, and the OpenAPI spec includes the newFormulaschema. The CLI's dashboard tile pipeline now delegates its number/table config transforms to the shared common-utils implementations, so formula tiles render with operand-hiding behavior identical to the web. - 3ecf73c: Render metric formulas (
formulason builder chart configs) in the composed multi-series metric query. Letter-ref expressions likeA / (A + B + C) * 100compile into the final SELECT projection over the pivoted per-series columns, with ratio-consistent missing-data semantics: a missing operand counts as 0 while a zero or missing division denominator yields NULL (a rendered gap).showOperandSeries: falseemits only the formula column(s). Works for grouped and ungrouped line, table, and number charts, and single-series charts with a formula now route through the composed query path. - 3ecf73c: "Convert to SQL" now supports multi-series, ratio, and formula metric charts. The composed UNION ALL + pivot query is emitted as a macro-based raw-SQL template with a
$__sourceTable(<metricType>)macro per series branch, instead of returning a "cannot be auto-converted" error. Non-time-series metric charts remain unsupported, matching the existing single-series restriction.
Patch Changes
-
c349a5d: HAVING, ORDER BY and LIMIT on multi-series metric charts now apply to the final joined result instead of leaking into each per-series branch. They reference the chart's output columns — operand aliases, formula names/aliases, the ratio column, group-by columns and the time bucket — so a HAVING like
"err rate" > 0.5filters the joined rows, ORDER BY actually orders the result (previously it was applied per branch and then discarded by the join), and LIMIT/OFFSET paginate one consistent group set across all series. -
68d2ed2: feat: Support dependent variable value queries
-
2eedfb2: feat: Substitute dashboard variables in chart builder tiles
-
1ce61c0: feat: Expand dashboard variables and macros nested in macro arguments
-
43f6856: Allow editing and deleting alerts directly from the alert details page. An
"Edit alert" action opens a modal for changing the alert's threshold,
evaluation interval, schedule, group-by (saved-search alerts), notification
webhook, and note, and a Delete action (with confirmation) removes the alert
and returns to the alerts list. Alert API responses now include the
notification channel's webhook id and the alert's name/message template so
edits round-trip these fields. -
40ec085: feat: Add dashboard variable properties to external dashboards API
-
b0b1380: Align alert firing/recovery chart markers with the evaluated data: markers are now drawn at the start of the newest evaluated bucket (matching the evaluation history table and the plotted data point) instead of at the evaluation time, which sat one bucket to the right.
-
a94d6da: Fix filter sidebar values disappearing behind query proxies. Batched facet-value
queries (KV rollup and map text-index lookups) previously bound one query
parameter per key; with ~100 keys this exceeded the ClickHouse web client's URL
parameter budget, silently promoting the request to a multipart/form-data body
that proxy gateways can reject — every LowCardinality-column and map-attribute
filter then vanished without an error. Keys are now inlined as SQL-escaped
literals so the query rides the POST body with a constant parameter count. Also
fixes an operator-precedence bug that applied the KV rollup time filter (and
notEmpty guard) to only the last OR branch. -
8be6810: Fix dashboard filter selection state breaking on complex expressions. The
filter parser (shared with the search page) now tracks parenthesis depth in
addition to quote depth, so selections stored for expression-based filters such
asif(SeverityText = 'error' OR SeverityText = 'fatal', 'Errors', 'Non-errors')
orif(SeverityText IN ('error', 'fatal'), 'Errors', 'Non-errors')are parsed
correctly instead of being dropped or split on operators/keywords nested inside
the expression. -
c592207: Fix MCP tool schemas being rejected by strict JSON Schema draft 2020-12 clients. The number-tile
colorRulesbetweenrule declared itsvalueas a Zod tuple, whichzod-to-json-schemarenders in the draft-07 tuple form (items: [ ... ]). Draft 2020-12 requiresitemsto be a schema rather than an array, soclickstack_save_dashboardandclickstack_patch_dashboardfailed validation — and clients that forward MCP tool schemas straight to an LLM provider (e.g. the Anthropic API) rejected the entire tool list withtools.N.custom.input_schema: JSON schema is invalid, making the MCP server unusable.valueis now a fixed-length array, which validates identically and serializes to the same[min, max]wire format. A new test validates every MCP tool's input schema against the 2020-12 metaschema so this cannot regress. -
9c7742f: Fix multi-series metric charts mixing float and integer aggregations (e.g. histogram quantile + histogram count) failing with "No value columns found in result column metadata". The composed UNION ALL query now normalizes every series value to Float64, so the merged column type is deterministic instead of erroring with NO_COMMON_TYPE or producing a Variant(Float64, Int64) column depending on the ClickHouse server's
use_variant_as_common_typesetting. As a defensive layer, all-numericVariant(...)result columns (e.g. from raw-SQL charts) are now also classified as numeric. -
7294944: fix: route per-query SQL debug logging through an injectable logger (#2416)
BaseClickhouseClientdumped raw SQL to the console on every ClickHouse query,
unconditionally and outside the pino logger, flooding API logs with query spam.Query logging now goes through an optional per-client
customLoggeron
ClickhouseClientOptions, logged atdebug, and is silent when no logger is
passed. The API injects a pino-backed logger, so query logging follows the
existingHYPERDX_LOG_LEVELsetting instead of writing toconsole.debug. The
browser client defaults to a console logger that pretty-prints the SQL as a
single multi-line block, so query SQL stays visible and readable in devtools in
all builds instead of wrapping into one long line.The API's log level now defaults to
info(wasdebug), so SQL logging is
silent in production unlessHYPERDX_LOG_LEVEL=debugis set. Dev and CI env
files already pin their levels explicitly and are unaffected. The default also
now applies whenHYPERDX_LOG_LEVELis set but empty — which is what Compose
passes when the variable is unset in the environment, and which previously made
pino throw at startup. -
e153f46: Number charts on metric formula configs always hide their operand series:
convertToNumberChartConfigforcesshowOperandSeries: falsewhen formulas are present, so the number tile renders the formula column rather than the first raw operand — regardless of the tile's "Show input series" setting on other display types or when a formula chart is switched to the Number display type. -
9f640a6: Add a Rotate action for the personal API access key in Team Settings → API & Agents. Previously the personal access key — the bearer token for the external API v2 and the MCP server — was generated once at account creation and could never be changed, so a leaked key could only be remediated by deleting the user. Rotating immediately revokes the previous key, so MCP / AI agent configs, external API v2 clients, Terraform / IaC providers, and CI scripts using the old key must be updated with the new one. Browser sessions are unaffected.
-
ea12707: Apply the Map KV text-index rewrite (
Map['k'] = 'v'→has(ItemsCol, concat('k', '=', 'v')), enabling ClickHouse's direct-read optimization) to SQL predicates in the top-levelwhere(search box, saved searches, alerts) and to SQLaggConditions copied into the WHERE clause — previously onlysql-typefilters[]entries were rewritten