SimpleTelemetry

Charts

You write the aggregate; the card adds the time axis. A card's SQL never mentions time. When it runs, the card injects the dashboard's time window and the bucketing:

you write:   SELECT COUNT(*) FROM http_request

card sends:  SELECT time / 60 , COUNT(*) FROM http_request
             WHERE time >= 1786250180 AND time < 1786253780
             GROUP BY time / 60

One bucket per minute here. The bucket size is picked automatically, from 1 second up to 1 day, to fit the card's width at the current time range. Zoom in and the buckets get finer; widen the card and you get more of them. Your WHERE clause is kept and combined with the window.

Card types

Graph over timeone line per series, bucketed as above.
Bar over timesame, drawn as grouped bars.
Statone number for the whole visible window. No buckets, just the window filter.
Sectiona titled wrapper for grouping cards; no query.

Multiple series

Two ways, and they combine:

SELECT status , COUNT(*) FROM http_request GROUP BY status

One series per status value. High-cardinality columns are capped at the 16 biggest series so a runaway label can't paint hundreds of lines.

SELECT AVG(ms) , PERCENTILE(ms, 95) FROM http_request

One series per aggregate. Series colours and labels are editable in the card's gear panel.

RATE()

Wrap an additive aggregate in RATE() and the card converts each bucket to a per-second rate, so the line's shape stops depending on bucket size:

SELECT RATE(COUNT(*)) FROM http_request

reads as requests per second at every zoom level. On a Stat card, RATE() gives the average rate over the visible window. Rate series get a /s label suffix.

Gaps and zeroes

Buckets with no events are gaps: lines bridge across them, bars leave space. If the whole window has no matching rows the chart draws flat zero. RATE() series treat empty buckets as true zero: no events genuinely means a rate of 0/s.

Rules

Chart queries need an aggregate (COUNT(*), AVG(ms), …), a GROUP BY column pivots into series as above, and ORDER BY / LIMIT don't apply inside cards; the time handling owns the shape of the result. Everything else from the SQL page works as written.