Description
What happened?
A chart has two selects: A, a Sum metric (aggFn: sum), and B, a Histogram metric (aggFn: count). It has the formula A / B, group-by ServiceName and 5-minute granularity. A and B never end up on the same row, so the formula never gets both operands:
{"sum(repro.requests)": 660, "count(repro.latency)": null, "ratio": null, "ServiceName": "a", "group": []}
{"sum(repro.requests)": null, "count(repro.latency)": 40, "ratio": 0, "ServiceName": null, "group": ["a"]}
The query returns ratio 0 on the histogram rows (a missing A counts as 0) and null on the sum rows, so a chart draws 0s. Without the group-by, the same formula is correct: 660 / 40 = 16.5, and 300 / 10 = 30.
This looks deliberate in the multi-series rendering. Histogram branches pack the group values into group and pad the scalar group columns with NULL. Scalar branches pad group with [] "so scalar rows never share a grouping key with histogram rows":
The pivot then groups by the scalar columns and group, so A and B for service a land on different rows.
Expected: A and B for the same group value on one row, and the formula per group. If a sum/gauge and a histogram select can't share a group-by, the editor and the API should reject the formula, not show a series of 0s.
Use case: per-service ratios that mix a counter with a histogram's count, for example errors per request when requests are only recorded as a latency histogram.
Steps to reproduce
Reproduces on play.hyperdx.io? Didn't try.
An integration test in the style of renderChartConfig.int.test.ts, on main (2bfc630):
- Insert a cumulative monotonic sum
repro.requestsand a cumulative histogramrepro.latency, both withServiceNameaandb, one point a minute for 6 minutes. renderChartConfigwithselect: [{ aggFn: 'sum', metricType: 'sum', metricName: 'repro.requests' }, { aggFn: 'count', metricType: 'histogram', metricName: 'repro.latency' }],formulas: [{ expression: 'A / B', alias: 'ratio' }],groupBy: 'ServiceName',granularity: '5 minute'.- Every row has either A or B null;
ratiois null or 0. - Remove
groupBy.ratiois correct.
How are you running HyperDX?
Helm (ClickStack chart 2.1.0) with the hyperdx:2-nightly image (2.42.0 plus the Node bump from #3456), our own ClickHouse 26.2.5.45. Reproduced on main 2bfc630.
Where does it show up?
Dashboard tiles with formulas. We hit it through the MCP dashboard tools; the UI renders through the same renderChartConfig.
Debug info
N/A.
Logs
None; no error is raised.
Written with help from an AI assistant (Claude Code). The behaviour comes from our own deployment and an integration test on main.
Activity