Skip to content

Formula over a sum/gauge select and a histogram select gives 0 or null when the chart has a group-by #3501

Open

Description

@bcanvural

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):

  1. Insert a cumulative monotonic sum repro.requests and a cumulative histogram repro.latency, both with ServiceName a and b, one point a minute for 6 minutes.
  2. renderChartConfig with select: [{ 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'.
  3. Every row has either A or B null; ratio is null or 0.
  4. Remove groupBy. ratio is 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions