typescript_tsbuildinfo/
trace_json.rs

1// https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview#heading=h.yr4qxyxotyw
2
3use rustc_hash::FxHashMap;
4use serde::Deserialize;
5use std::ops::Deref;
6
7#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
8#[cfg_attr(feature = "serialize", derive(serde::Serialize))]
9pub enum TraceEventType {
10    #[serde(rename = "B")]
11    DurationBegin,
12    #[serde(rename = "E")]
13    DurationEnd,
14    #[serde(rename = "X")]
15    Complete,
16    #[default]
17    #[serde(rename = "i", alias = "I")]
18    Instant,
19    #[serde(rename = "C")]
20    Counter,
21    #[serde(rename = "b")]
22    AsyncStart,
23    #[serde(rename = "n")]
24    AsyncInstant,
25    #[serde(rename = "e")]
26    AsyncEnd,
27    #[serde(rename = "s")]
28    FlowStart,
29    #[serde(rename = "t")]
30    FlowStep,
31    #[serde(rename = "f")]
32    FlowEnd,
33    #[serde(rename = "P")]
34    Sample,
35    #[serde(rename = "N")]
36    ObjectCreated,
37    #[serde(rename = "O")]
38    ObjectSnapshot,
39    #[serde(rename = "D")]
40    ObjectDestroyed,
41    #[serde(rename = "M")]
42    Metadata,
43    #[serde(rename = "V")]
44    MemoryDumpGlobal,
45    #[serde(rename = "v")]
46    MemoryDumpProcess,
47    #[serde(rename = "R")]
48    Mark,
49    #[serde(rename = "c")]
50    ClockSync,
51    #[serde(rename = "(")]
52    ContextBegin,
53    #[serde(rename = ")")]
54    ContextEnd,
55}
56
57#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
58#[cfg_attr(feature = "serialize", derive(serde::Serialize))]
59#[serde(default, rename_all = "camelCase")]
60pub struct TraceEvent {
61    pub args: FxHashMap<String, serde_json::Value>,
62
63    pub cat: String,
64
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub cname: Option<String>,
67
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub dur: Option<f64>, // Microseconds
70
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub id: Option<String>,
73
74    pub name: String,
75
76    pub ph: TraceEventType,
77
78    pub pid: u64,
79
80    pub tid: u64,
81
82    pub ts: f64, // Microseconds
83
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub tts: Option<f64>, // Microseconds
86}
87
88impl TraceEvent {
89    pub fn new(name: impl AsRef<String>, ph: TraceEventType) -> Self {
90        Self {
91            args: FxHashMap::default(),
92            cat: String::new(),
93            name: name.as_ref().to_owned(),
94            ph,
95            pid: std::process::id().into(),
96            tid: 0, // TODO
97            ts: std::time::SystemTime::now().elapsed().unwrap().as_nanos() as f64 / 1000.0,
98            ..Default::default()
99        }
100    }
101}
102
103#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
104#[cfg_attr(feature = "serialize", derive(serde::Serialize))]
105pub struct TraceJson(pub Vec<TraceEvent>);
106
107impl Deref for TraceJson {
108    type Target = Vec<TraceEvent>;
109
110    fn deref(&self) -> &Self::Target {
111        &self.0
112    }
113}