You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Materialized views for cumulative metrics (counter increase/rate, histograms) #3483
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.
Activity