use std::sync::{Arc, LazyLock};
use arrow_schema::{DataType, Field, Schema, SchemaRef, TimeUnit};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum AttrType {
Empty = 0,
Str = 1,
Int = 2,
Double = 3,
Bool = 4,
Bytes = 5,
Slice = 6,
Map = 7,
}
fn dict_u16_utf8() -> DataType {
DataType::Dictionary(Box::new(DataType::UInt16), Box::new(DataType::Utf8))
}
fn dict_u32_utf8() -> DataType {
DataType::Dictionary(Box::new(DataType::UInt32), Box::new(DataType::Utf8))
}
pub const DICT_CAP: usize = u16::MAX as usize + 1;
fn ts() -> DataType {
DataType::Timestamp(TimeUnit::Nanosecond, None)
}
pub static ATTRS: LazyLock<SchemaRef> = LazyLock::new(|| {
Arc::new(Schema::new(vec![
Field::new("parent_id", DataType::UInt32, false),
Field::new("key", dict_u16_utf8(), false),
Field::new("type", DataType::UInt8, false),
Field::new("str", dict_u32_utf8(), true),
Field::new("int", DataType::Int64, true),
Field::new("double", DataType::Float64, true),
Field::new("bool", DataType::Boolean, true),
Field::new("bytes", DataType::Binary, true),
Field::new("ser", DataType::Binary, true),
]))
});
pub static LOGS: LazyLock<SchemaRef> = LazyLock::new(|| {
Arc::new(Schema::new(vec![
Field::new("id", DataType::UInt32, false),
Field::new("time_unix_nano", ts(), false),
Field::new("observed_time_unix_nano", ts(), true),
Field::new("severity_number", DataType::Int32, true),
Field::new("severity_text", dict_u16_utf8(), true),
Field::new("event_name", dict_u16_utf8(), true),
Field::new("body", DataType::Utf8, true),
Field::new("body_ser", DataType::Binary, true),
Field::new("trace_id", DataType::FixedSizeBinary(16), true),
Field::new("span_id", DataType::FixedSizeBinary(8), true),
Field::new("flags", DataType::UInt32, true),
Field::new("dropped_attributes_count", DataType::UInt32, false),
Field::new("resource_id", DataType::UInt16, false),
Field::new("scope_id", DataType::UInt16, false),
]))
});
pub static RESOURCES: LazyLock<SchemaRef> = LazyLock::new(|| {
Arc::new(Schema::new(vec![
Field::new("id", DataType::UInt16, false),
Field::new("key", DataType::UInt64, false),
Field::new("dropped_attributes_count", DataType::UInt32, false),
]))
});
pub static SPANS: LazyLock<SchemaRef> = LazyLock::new(|| {
Arc::new(Schema::new(vec![
Field::new("id", DataType::UInt32, false),
Field::new("trace_id", DataType::FixedSizeBinary(16), true),
Field::new("span_id", DataType::FixedSizeBinary(8), true),
Field::new("parent_span_id", DataType::FixedSizeBinary(8), true),
Field::new("trace_state", DataType::Utf8, true),
Field::new("flags", DataType::UInt32, true),
Field::new("name", dict_u16_utf8(), true),
Field::new("kind", DataType::UInt8, false),
Field::new("start_time_unix_nano", ts(), false),
Field::new("duration_nano", DataType::UInt64, false),
Field::new("status_code", DataType::UInt8, false),
Field::new("status_message", DataType::Utf8, true),
Field::new("dropped_attributes_count", DataType::UInt32, false),
Field::new("dropped_events_count", DataType::UInt32, false),
Field::new("dropped_links_count", DataType::UInt32, false),
Field::new("resource_id", DataType::UInt16, false),
Field::new("scope_id", DataType::UInt16, false),
]))
});
pub static SPAN_EVENTS: LazyLock<SchemaRef> = LazyLock::new(|| {
Arc::new(Schema::new(vec![
Field::new("id", DataType::UInt32, false),
Field::new("parent_id", DataType::UInt32, false),
Field::new("time_unix_nano", ts(), false),
Field::new("name", dict_u16_utf8(), true),
Field::new("dropped_attributes_count", DataType::UInt32, false),
]))
});
pub static SPAN_LINKS: LazyLock<SchemaRef> = LazyLock::new(|| {
Arc::new(Schema::new(vec![
Field::new("id", DataType::UInt32, false),
Field::new("parent_id", DataType::UInt32, false),
Field::new("trace_id", DataType::FixedSizeBinary(16), true),
Field::new("span_id", DataType::FixedSizeBinary(8), true),
Field::new("trace_state", DataType::Utf8, true),
Field::new("flags", DataType::UInt32, true),
Field::new("dropped_attributes_count", DataType::UInt32, false),
]))
});
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum MetricKind {
Unset = 0,
Gauge = 1,
Sum = 2,
Histogram = 3,
ExponentialHistogram = 4,
Summary = 5,
}
pub static METRICS: LazyLock<SchemaRef> = LazyLock::new(|| {
Arc::new(Schema::new(vec![
Field::new("id", DataType::UInt32, false),
Field::new("name", dict_u16_utf8(), true),
Field::new("description", DataType::Utf8, true),
Field::new("unit", dict_u16_utf8(), true),
Field::new("kind", DataType::UInt8, false),
Field::new("temporality", DataType::UInt8, false),
Field::new("is_monotonic", DataType::Boolean, false),
Field::new("resource_id", DataType::UInt16, false),
Field::new("scope_id", DataType::UInt16, false),
]))
});
fn list_of(t: DataType) -> DataType {
DataType::List(Arc::new(Field::new_list_field(t, true)))
}
fn dp_head(parent: &str) -> Vec<Field> {
vec![
Field::new("id", DataType::UInt32, false),
Field::new(parent, DataType::UInt32, false),
Field::new("start_time_unix_nano", ts(), true),
Field::new("time_unix_nano", ts(), false),
Field::new("flags", DataType::UInt32, true),
]
}
pub static NUMBER_DP: LazyLock<SchemaRef> = LazyLock::new(|| {
let mut f = dp_head("metric_id");
f.push(Field::new("int", DataType::Int64, true));
f.push(Field::new("double", DataType::Float64, true));
Arc::new(Schema::new(f))
});
pub static HIST_DP: LazyLock<SchemaRef> = LazyLock::new(|| {
let mut f = dp_head("metric_id");
f.extend([
Field::new("count", DataType::UInt64, false),
Field::new("sum", DataType::Float64, true),
Field::new("min", DataType::Float64, true),
Field::new("max", DataType::Float64, true),
Field::new("bucket_counts", list_of(DataType::UInt64), true),
Field::new("bounds_id", DataType::UInt32, true),
]);
Arc::new(Schema::new(f))
});
pub static HIST_BOUNDS: LazyLock<SchemaRef> = LazyLock::new(|| {
Arc::new(Schema::new(vec![
Field::new("id", DataType::UInt32, false),
Field::new("bounds", list_of(DataType::Float64), false),
]))
});
pub static EXP_HIST_DP: LazyLock<SchemaRef> = LazyLock::new(|| {
let mut f = dp_head("metric_id");
f.extend([
Field::new("count", DataType::UInt64, false),
Field::new("sum", DataType::Float64, true),
Field::new("min", DataType::Float64, true),
Field::new("max", DataType::Float64, true),
Field::new("scale", DataType::Int32, false),
Field::new("zero_count", DataType::UInt64, false),
Field::new("zero_threshold", DataType::Float64, true),
Field::new("positive_offset", DataType::Int32, false),
Field::new("positive_counts", list_of(DataType::UInt64), true),
Field::new("negative_offset", DataType::Int32, false),
Field::new("negative_counts", list_of(DataType::UInt64), true),
]);
Arc::new(Schema::new(f))
});
pub static SUMMARY_DP: LazyLock<SchemaRef> = LazyLock::new(|| {
let mut f = dp_head("metric_id");
f.extend([
Field::new("count", DataType::UInt64, false),
Field::new("sum", DataType::Float64, true),
Field::new("quantile", list_of(DataType::Float64), true),
Field::new("value", list_of(DataType::Float64), true),
]);
Arc::new(Schema::new(f))
});
pub static EXEMPLARS: LazyLock<SchemaRef> = LazyLock::new(|| {
Arc::new(Schema::new(vec![
Field::new("id", DataType::UInt32, false),
Field::new("parent_id", DataType::UInt32, false),
Field::new("time_unix_nano", ts(), false),
Field::new("int", DataType::Int64, true),
Field::new("double", DataType::Float64, true),
Field::new("trace_id", DataType::FixedSizeBinary(16), true),
Field::new("span_id", DataType::FixedSizeBinary(8), true),
]))
});
pub const LOGS_BLOCK_TABLES: [&str; 5] = [
"logs",
"log_attrs",
"resources",
"resource_attrs",
"scope_attrs",
];
pub const TRACES_BLOCK_TABLES: [&str; 9] = [
"spans",
"span_attrs",
"span_events",
"span_event_attrs",
"span_links",
"span_link_attrs",
"resources",
"resource_attrs",
"scope_attrs",
];
pub const METRICS_BLOCK_TABLES: [&str; 13] = [
"metrics",
"metric_attrs",
"number_dp",
"hist_dp",
"hist_bounds",
"exp_hist_dp",
"summary_dp",
"dp_attrs",
"exemplars",
"exemplar_attrs",
"resources",
"resource_attrs",
"scope_attrs",
];