Skip to main content

katra_core/
event.rs

1//! The trace event — one correlated observation in a Katra trace.
2
3use serde::{Deserialize, Serialize};
4
5use crate::ResourceRef;
6use crate::ids::{RequestId, Seq, SpanId};
7use crate::kind::{EventKind, Phase};
8use crate::payload::Payload;
9use crate::scope::Scope;
10
11/// A single captured event.
12///
13/// Events are correlated through:
14/// * `seq` — global monotonic order;
15/// * `span_id` — pairs a `Begin` with its `End`;
16/// * `request_id` — groups events belonging to one logical request
17///   (an asset load, a frame, a scene transition);
18/// * `causes` — explicit causal links to earlier event seqs (the semantic
19///   causal graph, KatraProfiler §6).
20#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
21pub struct TraceEvent {
22    /// Global monotonic sequence number.
23    pub seq: Seq,
24    /// Monotonic timestamp in ns (relative to profiler start).
25    pub ts_mono_ns: u64,
26    /// Wall-clock timestamp in ns since the Unix epoch.
27    pub ts_wall_ns: u64,
28    /// Kernel thread id.
29    pub thread_id: u64,
30    /// Process id.
31    pub process_id: u64,
32    /// Producing layer.
33    pub scope: Scope,
34    /// Event kind.
35    pub kind: EventKind,
36    /// Phase.
37    pub phase: Phase,
38    /// Span id (for Begin/End pairing); `None` for standalone events.
39    pub span_id: Option<SpanId>,
40    /// Correlated request id; `None` if not part of a request.
41    pub request_id: Option<RequestId>,
42    /// Explicit causal links to earlier event seqs.
43    pub causes: Vec<u64>,
44    /// Optional resource reference `(domain, id)`.
45    pub resource: Option<ResourceRef>,
46    /// Structured payload.
47    pub payload: Payload,
48    /// Estimated/measured cost in ns (for aggregation).
49    pub cost_estimate_ns: Option<u64>,
50    /// Prediction confidence 0..1, when the event is a prediction.
51    pub confidence: Option<f32>,
52}
53
54impl TraceEvent {
55    /// A convenience constructor for a minimal `Instant` event.
56    #[allow(clippy::too_many_arguments)]
57    pub fn instant(
58        seq: Seq,
59        ts_mono_ns: u64,
60        ts_wall_ns: u64,
61        thread_id: u64,
62        process_id: u64,
63        scope: Scope,
64        kind: EventKind,
65        payload: Payload,
66    ) -> Self {
67        TraceEvent {
68            seq,
69            ts_mono_ns,
70            ts_wall_ns,
71            thread_id,
72            process_id,
73            scope,
74            kind,
75            phase: Phase::Instant,
76            span_id: None,
77            request_id: None,
78            causes: Vec::new(),
79            resource: None,
80            payload,
81            cost_estimate_ns: None,
82            confidence: None,
83        }
84    }
85}
86
87/// Options that enrich an emitted event.
88#[derive(Clone, Debug, Default)]
89pub struct EmitOpts {
90    /// Correlated request id.
91    pub request_id: Option<RequestId>,
92    /// Causal links to earlier event seqs (max 2 on the hot path).
93    pub causes: Vec<u64>,
94    /// Span id (for Begin/End pairing).
95    pub span_id: Option<SpanId>,
96    /// Resource reference.
97    pub resource: Option<ResourceRef>,
98    /// Estimated/measured cost in ns.
99    pub cost_estimate_ns: Option<u64>,
100    /// Prediction confidence 0..1.
101    pub confidence: Option<f32>,
102}