Skip to content

Materialized views for cumulative metrics (counter increase/rate, histograms) #3483

Open

Description

@bcanvural

What are you trying to do?

Make counter-rate and histogram-quantile charts fast over long ranges, for example increase of an Istio request counter grouped by response code over 24 h. On our deployment (@hyperdx/app 2.42.0, about 4.7 B metric rows per day) that panel takes 6–7 s and reads 52 GiB. Most of the cost is the per-series step: the chart keys each series on cityHash64(ScopeAttributes, ResourceAttributes, Attributes) and computes deltas with lagInFrame over it, so it reads both full Maps whatever the filter. Materialized columns can't help.

What would you like to see?

Materialized view support for cumulative metrics: Sum (counters) and histograms. It's related to #3482 (gauges), but it needs a different shape, because today the delta is computed per series before aggregation:

  • Sum: IF(AggregationTemporality = 1, Value, greatest(Value - lagInFrame(Value) OVER (PARTITION BY AttributesHash ORDER BY TimeUnix), 0))
  • Histogram: per-series, per-bounds deltas of Count / BucketCounts (core/histogram.ts)

So a rollup can't just aggregate Value. One shape that works for us: a view (likely a refreshable MV) that stores, per time bucket and per group, the sum of per-series increases. For histograms, it would store summed per-bucket count deltas with the same ExplicitBounds. HyperDX would read increase / rate from that column as a plain sum per bucket (rate = sum / bucket seconds), and derive quantiles from the summed bucket counts. We'd like your view on:

  • how such a view should be declared on the source: a "pre-computed delta" column type next to the aggFn mappings;
  • reset handling: the rollup would do the same greatest(..., 0) / reset logic once, at write time;
  • whether refreshable MVs (REFRESH EVERY 1 MINUTE) are acceptable as the producer, since an incremental MV can't see the previous point of a series.

Alternatives you've considered

Raw-SQL tiles over our own counter-rate rollup. It works (milliseconds instead of seconds), but each panel is hand-written SQL, and alerts need the SQL path.

Anything else?

Happy to test a branch.

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