1use katra_core::{CaptureOptions, fnv1a};
4use serde::{Deserialize, Serialize};
5
6pub const TRACE_MAGIC: [u8; 8] = *b"KATRATRC";
8
9pub const FORMAT_VERSION: u32 = 1;
11
12pub const SCHEMA_STRING: &str = "\
15katra-trace-v1\n\
16header: magic[8] u32 version u32 header_len bincode(TraceHeader)\n\
17records: repeated u32 len + bincode(TraceRecord)\n\
18TraceHeader: format_version u32, schema_hash u64, tool_version string,\n\
19 capture_options CaptureOptions, start_wall_ns u64, start_mono_ns u64,\n\
20 process_id u64, workload string, host HostInfo, notes Vec<string>\n\
21TraceRecord: Event(TraceEvent) | EpochMarker{label, ts_mono_ns, ts_wall_ns}\n\
22 | Counter{name, value, ts_mono_ns} | SessionSummary(TraceSummary)\n\
23TraceEvent: seq, ts_mono_ns, ts_wall_ns, thread_id, process_id, scope, kind,\n\
24 phase, span_id, request_id, causes Vec<u64>, resource, payload,\n\
25 cost_estimate_ns, confidence\n\
26Enums serialized by variant index; append-only evolution.\n";
27
28pub const SCHEMA_HASH: u64 = fnv1a(SCHEMA_STRING.as_bytes());
30
31#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
33pub struct HostInfo {
34 pub kernel: Option<String>,
36 pub os: Option<String>,
38 pub cpu_model: Option<String>,
40 pub cpu_cores: Option<u32>,
42 pub ram_bytes: Option<u64>,
44}
45
46#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
48pub struct TraceHeader {
49 pub format_version: u32,
51 pub schema_hash: u64,
53 pub tool_version: String,
55 pub capture_options: CaptureOptions,
57 pub start_wall_ns: u64,
59 pub start_mono_ns: u64,
61 pub process_id: u64,
63 pub workload: String,
65 pub host: HostInfo,
67 pub notes: Vec<String>,
69}