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
Compose: HardRowCap truncation on time series silently keeps the OLDEST slice and says nothing #1687
Found while building the #1606 reporting-layer demo view, live on DARLING01. Pre-existing v2 behavior, not introduced by #1683.
Problem
A grouped time-series panel whose (buckets × groups) product exceeds ComposeLimits.HardRowCap (10,000) gets ORDER BY bucket + LIMIT 10000 — which keeps the earliest rows and drops the rest. The chart then renders a fraction of the requested window as if it were everything: a 24-hour wait_stats panel grouped by wait_type at minute grain (~100 types × 1440 buckets ≈ 144k rows) displayed exactly 7/25 11:57 AM → 1:24 PM — the first ~87 minutes — with no cap indicator anywhere. The x-axis even omits dates (the truncated domain doesn't cross midnight), so nothing looks wrong.
Same silent-truncation class as the retention-routing gaps (#1661/#1664/#1665): the numbers aren't wrong, the window is, and a monitoring product must say so.
Repro
{"source":"wait_stats","measure":"wait_time_ms","aggregate":"sum","timeBucket":"minute","groupBy":["wait_type"],"viz":"stacked"} over 24h on a fleet store with a normal wait-type population.
Fix directions (pick at review)
Keep the NEWEST slice: the cap query becomes ORDER BY bucket DESC LIMIT n in a subquery re-ordered ascending — recent data is what a monitoring chart is for; still truncated, but the honest end.
Optionally: the write-time bucket ceiling only bounds buckets, not buckets×groups — a validation hint when a grouped minute-grain panel is likely to cap would prevent authoring the trap at all.
Found while building the #1606 reporting-layer demo view, live on DARLING01. Pre-existing v2 behavior, not introduced by #1683.
Problem
A grouped time-series panel whose (buckets × groups) product exceeds
ComposeLimits.HardRowCap(10,000) getsORDER BY bucket+LIMIT 10000— which keeps the earliest rows and drops the rest. The chart then renders a fraction of the requested window as if it were everything: a 24-hour wait_stats panel grouped bywait_typeat minute grain (~100 types × 1440 buckets ≈ 144k rows) displayed exactly 7/25 11:57 AM → 1:24 PM — the first ~87 minutes — with no cap indicator anywhere. The x-axis even omits dates (the truncated domain doesn't cross midnight), so nothing looks wrong.Same silent-truncation class as the retention-routing gaps (#1661/#1664/#1665): the numbers aren't wrong, the window is, and a monitoring product must say so.
Repro
{"source":"wait_stats","measure":"wait_time_ms","aggregate":"sum","timeBucket":"minute","groupBy":["wait_type"],"viz":"stacked"}over 24h on a fleet store with a normal wait-type population.Fix directions (pick at review)
ORDER BY bucket DESC LIMIT nin a subquery re-ordered ascending — recent data is what a monitoring chart is for; still truncated, but the honest end.rows == HardRowCapexactly, attach the existingnoticemechanism ("row cap reached — showing the most recent N of the window; coarsen the bucket or narrow the group-by"). The Darling compose: CAGG routing has no rollup-availability gate — old-window custom-view panels throw 42P01 on plain-PostgreSQL stores #1665 notice plumbing (payloadnotice+noticeStrip) makes this a few lines.(1)+(2) together are the honest minimum.
🤖 Generated with Claude Code