Retention & limits

What's kept, for how long, and the hard caps you'll hit. Retention and server limits are server-managed (config file, admin-only); ingest limits are enforced on every request.

Retention — how long data is kept

Telemetry moves through storage tiers (see Core concepts):

StageWhenWhere
Hot0 – 7 daysClickHouse — every query/chart/alert reads this; fast
Cold7 – 90 daysMinIO (S3-compatible) — still queryable, cheaper, slower
Deletedafter 90 daysgone
  • The hot window is also bounded by storage.hot.retention_hours in the server config — default 72h, set to 168h (7 days) in the shipped config.
  • The hot→cold (7d) and delete (90d) boundaries are enforced by ClickHouse TTL on the data itself.
  • Per-source overrides: a source can set hot_retention_hours and cold_retention_days (each ≥ 1) to keep its data longer or shorter than the global default. Leave them unset to use the defaults.

Retention changes are applied by the server; they don't retroactively resurrect already-deleted data.

Ingest limits (OTLP)

  • Body size: each OTLP request is capped at 10 MiB (compressed *and* decompressed). Oversized batches are rejected — lower your SDK's max export batch size if you hit this.
  • Compression: gzip and zstd are accepted (and recommended — they cut egress). Unknown Content-Encoding is rejected with 400.
  • Rate limit: ingestion is capped at 600 requests/minute per source IP. Batch your exports rather than sending single events. (There's a separate limit on alert notifications — see below.)
  • Batch size: the agent log-ingest path caps a batch at 10,000 entries; larger batches are rejected.
  • Ports: OTLP/HTTP on 4318, OTLP/gRPC on 4317. Auth via X-API-Key or Authorization: Bearer.

Query limits (SQL Editor)

  • 30-second query timeout.
  • 100,000-row export cap.
  • Read-only — no INSERT/UPDATE/DELETE/DROP.

See Query reference.

Notification rate limit

Each notification channel is throttled to 10 notifications/minute by default (a server-wide setting, alerting.notifier.rate_limit.per_channel_per_min, not a per-channel-row field). This prevents an alert storm from flooding Slack/PagerDuty.

The biggest lever: filter at the agent

Retention controls how long data lives; the cheapest data is the data you never collect. Drop noisy namespaces, sidecars, and log levels at the agent — see Agent configuration. Anything filtered there never crosses the network or hits storage. Watch the effect on the Cost page.