Repository navigation
Description
What happened?
A metric chart on a Sum metric with aggFn: increase and a group-by of two or more columns, given as a comma-separated string, fails with:
An incorrect number of arguments was specified for function 'toString'. Expected 1 argument, got 2 arguments: In scope SELECT tuple(Attributes['destination_service_name'], Attributes['response_code']) AS group, sum(Rate) AS bucket_value FROM Bucketed WHERE (Attributes['destination_service_name'], ((Attributes['response_code']) IS NOT NULL) AND (toString(Attributes['destination_service_name'], Attributes['response_code']) != '')) GROUP BY group, __hdx_time_bucket2.
Expected: one series per (destination_service_name, response_code) pair, the same as with a single group-by column.
What we checked on the same metric and time range:
increasewith one group-by column works.sumwith the same two-column group-by works.increasewith two columns fails both with Map expressions (Attributes['a'], Attributes['b']) and with plain MATERIALIZED columns (`col_a`, `col_b`).
As far as we can tell, the cause is in the top-N ranking added for increase + group-by (packages/common-utils/src/core/renderChartConfig.ts at 7752c88):
renderSelectListreturns a string group-by as a singleChSql(if (typeof selectList === 'string') return chSql\${{ UNSAFE_RAW_SQL: selectList }}``): https://github.com/hyperdxio/hyperdx/blob/7752c880e0f2d96be8926af71beebdf0b1e7d4b6/packages/common-utils/src/core/renderChartConfig.ts#L733-L741- The
increasepath then treats that single fragment as one column.groupByEmptyFilterwraps the wholea, bin(… IS NOT NULL AND toString(…) != ''): https://github.com/hyperdxio/hyperdx/blob/7752c880e0f2d96be8926af71beebdf0b1e7d4b6/packages/common-utils/src/core/renderChartConfig.ts#L2341-L2362 - The series-limit CTE handles the same case by splitting a string group-by with
splitAndTrimWithBracketfirst: https://github.com/hyperdxio/hyperdx/blob/7752c880e0f2d96be8926af71beebdf0b1e7d4b6/packages/common-utils/src/core/renderChartConfig.ts#L1605-L1614
Splitting the string group-by the same way before building groupByEmptyFilter should fix it. The tuple(${groupBySql}) parts already work with the comma-separated form.
Steps to reproduce
Reproduces on play.hyperdx.io? Didn't try. We hit it through the MCP tools on our own deployment.
- Use a Metric source whose sum table has a counter with two attributes, for example Istio's
istio_requests_total(destination_service_name,response_code). - Call the MCP tool
clickstack_tablewith:select: [{"aggFn": "increase", "metricType": "sum", "metricName": "istio_requests_total"}]groupBy: "Attributes['destination_service_name'], Attributes['response_code']"
- It fails with the error above.
- Change
aggFntosum, or drop the second group-by column. It works.
We haven't checked the UI chart editor. It renders through the same renderChartConfig, so we expect a two-column group-by on an increase chart to fail the same way there.
How are you running HyperDX?
Helm (ClickStack chart 2.1.0) with the hyperdx:2-nightly image, which is 2.42.0 plus the Node bump from #3456. Our own ClickHouse 26.2.5.45.
Where does it show up?
The API: the MCP tool clickstack_table.
Debug info
N/A. We saw this through the API's MCP tools, not the UI.
Logs
The error is quoted above.
Written with help from an AI assistant (Claude Code). The behaviour and the error come from our own deployment.
Activity
teeohhem commentedon Oct 27, 2026
Thanks for the report. We will reproduce the issue and prioritize.