Statistics

What an organization holds, how far back it goes, and why the on-disk size is always an estimate.

Statistics

Statistics (its own top-level rail item, not nested under Settings: it is a surface you come back to, not a one-time configuration screen) answers what your organization's telemetry actually amounts to: how much, of what signal, since when, and how it is changing.

Statistics are not billing

This page is a different thing from your billing usage bars in Plan and usage. Billing meters ingestion volume with an immutable, anti-double-bill ledger. Statistics are derived, freely recomputable facts about what is currently stored. They are approximate where exactness would be expensive, and never the number an invoice is built from.

Held totals

Per signal (logs, traces, metrics), two kinds of total, always all-time and independent of whatever range the page's own selectors show:

  • Event count: an exact row count.
  • Estimated disk bytes: never an exact figure. ClickHouse reports on-disk size per table and partition, and every organization shares those partitions, so there is no way to read one tenant's exact on-disk share back out. The method is to accumulate each organization's own uncompressed bytes and apply the table's overall compression ratio. That is why every surface that shows it, including this one, labels it an estimate rather than a measurement.

up0 stats shows the same two tables the console does, without needing a time range:

terminal
up0 --profile kind stats
output
                           Held totals (all-time)
┏━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ SIGNAL  ┃ METRIC               ┃ TOTAL   ┃ UNIT   ┃ ESTIMATE ┃ DATA START ┃
┡━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━┩
│ traces  │ event_count          │ no data │ events │          │ -          │
│ logs    │ event_count          │ no data │ events │          │ -          │
│ metrics │ event_count          │ no data │ events │          │ -          │
│ traces  │ uncompressed_bytes   │ no data │ bytes  │          │ -          │
│ logs    │ uncompressed_bytes   │ no data │ bytes  │          │ -          │
│ metrics │ uncompressed_bytes   │ no data │ bytes  │          │ -          │
│ traces  │ estimated_disk_bytes │ no data │ bytes  │ yes      │ -          │
│ logs    │ estimated_disk_bytes │ no data │ bytes  │ yes      │ -          │
│ metrics │ estimated_disk_bytes │ no data │ bytes  │ yes      │ -          │
└─────────┴──────────────────────┴─────────┴────────┴──────────┴────────────┘
totals above are all-time, not scoped to any --from/--to range; ESTIMATE=yes
means a compression-ratio estimate, not an exact measurement
                                            Retention
┏━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓
┃ SIGNAL  ┃ OLDEST DATAPOINT ┃ AGE ┃ CONFIGURED RETENTION ┃ DISTINCT SERIES ┃ DISTINCT ATTR KEYS ┃
┡━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩
│ traces  │ -                │ -   │ 90 d                 │ -               │ -                  │
│ logs    │ -                │ -   │ 30 d                 │ -               │ -                  │
│ metrics │ -                │ -   │ 395 d                │ -               │ -                  │
└─────────┴──────────────────┴─────┴──────────────────────┴─────────────────┴────────────────────┘

Zero and absent are different, on purpose

A total that comes back null prints as the literal no data, never as 0. A rendered 0 is always a genuine computed reading (nothing has been ingested since a real zero-row query ran). Conflating the two is exactly the mistake this milestone exists to prevent, so the CLI and the console both keep them visibly distinct.

Every row above reads no data because the org-statistics derivation runs on the same Temporal correlation harness as Services and Issues, and that harness is disabled on this kind cluster by default (its namespace quota cannot fit it). The console page shows the identical shape: the layout renders, every value area stays empty rather than showing a wrong number.

The Statistics page's Totals held, Retention and Over-time sections, all empty because the correlation harness is disabled on this cluster

Retention horizon

The real oldest datapoint per signal, next to your plan's configured retention window, so you can see how those two numbers actually compare rather than assuming your data reaches back as far as the setting claims.

Cardinality

Distinct series and distinct attribute keys per signal. Cardinality is usually the real explanation behind a slow query or a surprising storage bill: a high-cardinality signal has to scan far more distinct series than a low-cardinality one carrying the same event volume, even when the two hold the same number of rows.

Breakdown and over time

The page also breaks totals down by service and by ingestion token, and plots change over a selectable range and bucket size (hourly or daily). Both depend on the same harness as the totals above, so they were not exercised live on this walk.

--from / --to

Unlike metrics query's --since, up0 stats takes only absolute ISO 8601 timestamps for --from/--to, because the read API itself has no relative-time parameter. A bare up0 stats still sends a cheap, throwaway one-hour window under the hood to satisfy the API's required range, but only renders the range-independent totals and retention tables shown above; the per-bucket series table only appears once you pass --from, --to, or --bucket yourself.

On this page