0.2 record under results/<domain>/<platform>/. The
analytics layer flattens those records at read time into four SQL-queryable
views, so measurements, findings, cost and time series from any cloud or
product are queried the same way — domain and platform are just columns.
csbench query (SQL) and any parquet/series read need the [store] extra:
csbench export to CSV/JSONL (for records / measurements / findings)
works without it.
The four views
Only records whoserecord_digest verifies are included (tamper-evident); run
plan aggregates are skipped. All four share run_id / domain / task_id / platform, so any join works.
records — one row per run:
execution is simulated (a simulated runtime — mock cloud / local-sim /
local-process) or live (real cloud), or unknown (migrated records).
Simulated and live records are fingerprint-isolated — they get different
environment fingerprints and are never pooled/compared. Filter real-cloud data
with WHERE execution = 'live'.
Cost comes from the pricing enricher (extensions["pricing"], NULL when the run
was not priced). It is reported across three dimensions: list_cost_usd (vendor
list price), discount_usd (what your discount layer saved), and cost_usd —
the net, what finance actually pays.
Pricing: list / discount / net
The pricing enricher is the single cost authority. It multiplies a run’s usage by two independent, pluggable layers:CLOUSIGHT_PRICING_DATA→ the public list-price feed (vendor list prices; a small seed ships in the core).CLOUSIGHT_PRICING_DISCOUNTS→ your private discount layer (per-provider, optionally per-provider+service,pct, plus adefault_pct).net = list × (1 − discount); absent →net == list.
measurements — one row per scored measurement:
value_num; label/text values (e.g.
recovery_mode = "auto-retry") go to value_str.
findings — one row per finding:
series — the high-frequency time series (from each run’s
series.parquet):
Examples
Compare a dimension across clouds:cost as an alias — it is a DuckDB
keyword):