Expand description
OTLP traces -> Arrow, following the same shape as crate::logs.
Nine tables, because a span is not flat. spans is the root; span_events
and span_links are child tables carrying their own dense block-local id
so that span_event_attrs and span_link_attrs can key on them the same way
span_attrs keys on a span. The alternative — List<Struct> columns for
events and links — would need a second, different mechanism to attach
attributes to list elements, and the whole point of the EAV table is that
there is only one.
The id story, which is the part that is easy to get wrong: id and
parent_id are rebased to be dense within this block, because they name rows
in these files. trace_id, span_id and a link’s target ids are not
rebased, because they name things outside it — usually on another node
entirely. That distinction is what makes a join inside a block
unconditionally correct without a partition discriminant.
Structs§
Functions§
- opt_str 🔒
- proto3 gives an unset string and an empty one the same representation, and for every one of these columns the distinction does not exist. Null costs a validity bit; an empty string costs an offset entry too.