feat(tinybird): 15-minute status buckets for timezone-aware status bars (#2897) master
* feat(tinybird): hourly status buckets grouped into days of a requested timezone The daily status MVs fix the day boundary to UTC when they materialize. Hourly buckets keep enough detail to group into days of any whole-hour timezone at read time, without one MV per timezone. Nothing reads them yet. * fix(tinybird): reject timezones whose offset is not a whole hour in the hourly status pipes * fix(tinybird): name both requirements in the timezone validation message * fix(tinybird): return the local calendar date from the hourly status pipes - `day` is now a `YYYY-MM-DD` date re-keyed as UTC midnight, the convention the 45d pipes and every day-keyed consumer already use, instead of the epoch-ms instant of local midnight that shifted non-UTC days backwards - enforce the whole-hour timezone rule in the endpoints too (January and July offsets), not only in the TypeScript client - share `status60mParameters`/`status60mShape` across the five getters and memoize the zone check - test the schemas directly; extend the server tinybird double * feat(tinybird): bucket status at 15 minutes so every timezone regroups into days Every current IANA offset is a multiple of 15 minutes, so 15m buckets fold into local days for India, Nepal, Adelaide, Chatham and Newfoundland too. Drops the whole-hour validation on both the client and the endpoints; the pipes, datasources and getters are renamed *_status_15m. * fix(tinybird): bound the 15m status endpoints at a local midnight and validate the zone name - start the query at local midnight 45 days back so the oldest returned day is complete instead of cut at the 46-day TTL edge; the bound stays inside the TTL for every zone (at most 45d + 14h) - reject zone names ClickHouse would 400 on before the request, memoized - note why the http getter alone passes `z.string()` for monitorId * fix(tinybird): keep 47 days in the 15m status MVs and reject offset zone IDs - the endpoints return 45 local days plus today, which spans just under 46d + 1h after a DST fall-back; a 46-day TTL could cut the oldest day, so retain 47 and correct the bound comment (the old "45d + 14h" ignored the elapsed part of today) - `Intl.DateTimeFormat` accepts `+05:30`-style offsets that ClickHouse does not know; refuse them before the request --------- Co-authored-by: Maximilian Kaske <maximilian@kaske.org>