Data Model
How Berserk stores and organizes data within datasets
Within each dataset, Berserk organizes data into records and segments.
Records
Each record is a structured event with:
$time— the event timestamp, used for time-range filtering and ordering- Named columns — typed fields extracted from the original telemetry (e.g.,
level,service,duration) $raw— the full original record stored as a dynamic (JSON-like) value, enabling queries over fields that aren't part of a fixed schema
Segments
Under the hood, Berserk stores data in segments — immutable, event files ordered by time. You don't interact with segments directly, but they determine query performance:
- Queries with time filters (
where $time > ago(1h)) skip segments outside the range - The janitor service periodically merges small segments into larger, more efficient ones
- Each segment covers a contiguous time range within a dataset