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):
| Stage | When | Where |
|---|---|---|
| Hot | 0 – 7 days | ClickHouse — every query/chart/alert reads this; fast |
| Cold | 7 – 90 days | MinIO (S3-compatible) — still queryable, cheaper, slower |
| Deleted | after 90 days | gone |
- The hot window is also bounded by
storage.hot.retention_hoursin 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_hoursandcold_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:
gzipandzstdare accepted (and recommended — they cut egress). UnknownContent-Encodingis 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-KeyorAuthorization: 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.