micromegas_analytics/lakehouse/otel/
spans_table.rs

1//! Arrow schema for the `otel_spans` view.
2//!
3//! Per the plan, `trace_id` is `FixedSizeBinary[16]` and `span_id` / `parent_span_id`
4//! are `FixedSizeBinary[8]` — the lengths are fixed by W3C Trace Context, so the
5//! variable-`Binary` offsets array would be pure overhead.
6
7use datafusion::arrow::datatypes::{DataType, Field, Schema, TimeUnit};
8
9pub fn otel_spans_table_schema() -> Schema {
10    Schema::new(vec![
11        Field::new(
12            "process_id",
13            DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)),
14            false,
15        ),
16        Field::new(
17            "stream_id",
18            DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)),
19            false,
20        ),
21        Field::new(
22            "block_id",
23            DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)),
24            false,
25        ),
26        Field::new(
27            "insert_time",
28            DataType::Timestamp(TimeUnit::Nanosecond, Some("+00:00".into())),
29            false,
30        ),
31        Field::new("exe", DataType::Utf8, false),
32        Field::new("username", DataType::Utf8, false),
33        Field::new("computer", DataType::Utf8, false),
34        Field::new(
35            "process_properties",
36            DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Binary)),
37            false,
38        ),
39        Field::new("trace_id", DataType::FixedSizeBinary(16), false),
40        Field::new("span_id", DataType::FixedSizeBinary(8), false),
41        Field::new("parent_span_id", DataType::FixedSizeBinary(8), true),
42        Field::new(
43            "start_time",
44            DataType::Timestamp(TimeUnit::Nanosecond, Some("+00:00".into())),
45            false,
46        ),
47        Field::new(
48            "end_time",
49            DataType::Timestamp(TimeUnit::Nanosecond, Some("+00:00".into())),
50            false,
51        ),
52        Field::new("duration", DataType::Int64, false),
53        Field::new(
54            "name",
55            DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)),
56            false,
57        ),
58        Field::new(
59            "kind",
60            DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)),
61            false,
62        ),
63        Field::new(
64            "status",
65            DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)),
66            false,
67        ),
68        Field::new("status_message", DataType::Utf8, true),
69        Field::new(
70            "properties",
71            DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Binary)),
72            false,
73        ),
74        Field::new("events", DataType::Binary, false),
75        Field::new("links", DataType::Binary, false),
76    ])
77}