xref: /aosp_15_r20/external/perfetto/docs/reference/synthetic-track-event.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Writing TrackEvent Protos Synthetically
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard WorkerThis page acts as a reference guide to synthetically generate TrackEvent,
4*6dbdd20aSAndroid Build Coastguard WorkerPerfetto's native protobuf based tracing format. This allows using Perfetto's
5*6dbdd20aSAndroid Build Coastguard Workeranalysis and visualzation without using collecting traces using the Perfetto
6*6dbdd20aSAndroid Build Coastguard WorkerSDK.
7*6dbdd20aSAndroid Build Coastguard Worker
8*6dbdd20aSAndroid Build Coastguard WorkerTrackEvent protos can be manually written using the
9*6dbdd20aSAndroid Build Coastguard Worker[official protobuf library](https://protobuf.dev/reference/) or any other
10*6dbdd20aSAndroid Build Coastguard Workerprotobuf-compatible library. To be language-agnostic, the rest of this page will
11*6dbdd20aSAndroid Build Coastguard Workershow examples using the
12*6dbdd20aSAndroid Build Coastguard Worker[text format](https://protobuf.dev/reference/protobuf/textformat-spec/)
13*6dbdd20aSAndroid Build Coastguard Workerrepresentation of protobufs.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard WorkerThe root container of the protobuf-based traces is the
16*6dbdd20aSAndroid Build Coastguard Worker[Trace](https://cs.android.com/android/platform/superproject/main/+/main:external/perfetto/protos/perfetto/trace/trace.proto)
17*6dbdd20aSAndroid Build Coastguard Workermessage which itself is simply a repeated field of
18*6dbdd20aSAndroid Build Coastguard Worker[TracePacket](https://cs.android.com/android/platform/superproject/main/+/main:external/perfetto/protos/perfetto/trace/trace_packet.proto)
19*6dbdd20aSAndroid Build Coastguard Workermessages.
20*6dbdd20aSAndroid Build Coastguard Worker
21*6dbdd20aSAndroid Build Coastguard Worker## Thread-scoped (sync) slices
22*6dbdd20aSAndroid Build Coastguard Worker
23*6dbdd20aSAndroid Build Coastguard WorkerNOTE: in the legacy JSON tracing format, this section correspond to B/E/I/X
24*6dbdd20aSAndroid Build Coastguard Workerevents with the associated M (metadata) events.
25*6dbdd20aSAndroid Build Coastguard Worker
26*6dbdd20aSAndroid Build Coastguard WorkerThread scoped slices are used to trace execution of functions on a single
27*6dbdd20aSAndroid Build Coastguard Workerthread. As only one function runs on a single thread over time, this requires
28*6dbdd20aSAndroid Build Coastguard Workerthat child slices nest perfectly inside parent slices and do not partially
29*6dbdd20aSAndroid Build Coastguard Workeroverlap.
30*6dbdd20aSAndroid Build Coastguard Worker
31*6dbdd20aSAndroid Build Coastguard Worker![Thread track event in UI](/docs/images/synthetic-track-event-thread.png)
32*6dbdd20aSAndroid Build Coastguard Worker
33*6dbdd20aSAndroid Build Coastguard WorkerThis is corresponds to the following protos:
34*6dbdd20aSAndroid Build Coastguard Worker
35*6dbdd20aSAndroid Build Coastguard Worker```
36*6dbdd20aSAndroid Build Coastguard Worker# Emit this packet once *before* you emit the first event for this process.
37*6dbdd20aSAndroid Build Coastguard Workerpacket {
38*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor: {
39*6dbdd20aSAndroid Build Coastguard Worker    uuid: 894893984                     # 64-bit random number.
40*6dbdd20aSAndroid Build Coastguard Worker    process: {
41*6dbdd20aSAndroid Build Coastguard Worker      pid: 1234                         # PID for your process.
42*6dbdd20aSAndroid Build Coastguard Worker      process_name: "My process name"
43*6dbdd20aSAndroid Build Coastguard Worker    }
44*6dbdd20aSAndroid Build Coastguard Worker  }
45*6dbdd20aSAndroid Build Coastguard Worker}
46*6dbdd20aSAndroid Build Coastguard Worker
47*6dbdd20aSAndroid Build Coastguard Worker# Emit this packet once *before* you emit the first event for this thread.
48*6dbdd20aSAndroid Build Coastguard Workerpacket {
49*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor: {
50*6dbdd20aSAndroid Build Coastguard Worker    uuid: 49083589894                   # 64-bit random number.
51*6dbdd20aSAndroid Build Coastguard Worker    thread: {
52*6dbdd20aSAndroid Build Coastguard Worker      pid: 1234                         # PID for your process.
53*6dbdd20aSAndroid Build Coastguard Worker      tid: 5678                         # TID for your thread.
54*6dbdd20aSAndroid Build Coastguard Worker      thread_name: "My thread name"
55*6dbdd20aSAndroid Build Coastguard Worker    }
56*6dbdd20aSAndroid Build Coastguard Worker  }
57*6dbdd20aSAndroid Build Coastguard Worker}
58*6dbdd20aSAndroid Build Coastguard Worker
59*6dbdd20aSAndroid Build Coastguard Worker# The events for this thread.
60*6dbdd20aSAndroid Build Coastguard Workerpacket {
61*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 200
62*6dbdd20aSAndroid Build Coastguard Worker  track_event: {
63*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
64*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 49083589894             # Same random number from above.
65*6dbdd20aSAndroid Build Coastguard Worker    name: "My special parent"
66*6dbdd20aSAndroid Build Coastguard Worker  }
67*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809   # Generate *once*, use throughout.
68*6dbdd20aSAndroid Build Coastguard Worker}
69*6dbdd20aSAndroid Build Coastguard Workerpacket {
70*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 250
71*6dbdd20aSAndroid Build Coastguard Worker  track_event: {
72*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
73*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 49083589894
74*6dbdd20aSAndroid Build Coastguard Worker    name: "My special child"
75*6dbdd20aSAndroid Build Coastguard Worker  }
76*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
77*6dbdd20aSAndroid Build Coastguard Worker}
78*6dbdd20aSAndroid Build Coastguard Workerpacket {
79*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 285
80*6dbdd20aSAndroid Build Coastguard Worker  track_event {
81*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_INSTANT
82*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 49083589894
83*6dbdd20aSAndroid Build Coastguard Worker  }
84*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
85*6dbdd20aSAndroid Build Coastguard Worker}
86*6dbdd20aSAndroid Build Coastguard Workerpacket {
87*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 290
88*6dbdd20aSAndroid Build Coastguard Worker  track_event: {
89*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
90*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 49083589894
91*6dbdd20aSAndroid Build Coastguard Worker  }
92*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
93*6dbdd20aSAndroid Build Coastguard Worker}
94*6dbdd20aSAndroid Build Coastguard Workerpacket {
95*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 300
96*6dbdd20aSAndroid Build Coastguard Worker  track_event: {
97*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
98*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 49083589894
99*6dbdd20aSAndroid Build Coastguard Worker  }
100*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
101*6dbdd20aSAndroid Build Coastguard Worker}
102*6dbdd20aSAndroid Build Coastguard Worker```
103*6dbdd20aSAndroid Build Coastguard Worker
104*6dbdd20aSAndroid Build Coastguard Worker## Process-scoped (async) slices
105*6dbdd20aSAndroid Build Coastguard Worker
106*6dbdd20aSAndroid Build Coastguard WorkerNOTE: in the legacy JSON tracing format, this section corresponds to b/e/n
107*6dbdd20aSAndroid Build Coastguard Workerevents with the associated M (metadata) events.
108*6dbdd20aSAndroid Build Coastguard Worker
109*6dbdd20aSAndroid Build Coastguard WorkerProcess-scoped slices are useful to trace execution of a "piece of work" across
110*6dbdd20aSAndroid Build Coastguard Workermultiple threads of a process. A process-scoped slice can start on a thread A
111*6dbdd20aSAndroid Build Coastguard Workerand end on a thread B. Examples include work submitted to thread pools and
112*6dbdd20aSAndroid Build Coastguard Workercoroutines.
113*6dbdd20aSAndroid Build Coastguard Worker
114*6dbdd20aSAndroid Build Coastguard WorkerProcess tracks can be named corresponding to the executor and can also have
115*6dbdd20aSAndroid Build Coastguard Workerchild slices in an identical way to thread-scoped slices. Importantly, this
116*6dbdd20aSAndroid Build Coastguard Workermeans slices on a single track must **strictly nest** inside each other without
117*6dbdd20aSAndroid Build Coastguard Workeroverlapping.
118*6dbdd20aSAndroid Build Coastguard Worker
119*6dbdd20aSAndroid Build Coastguard WorkerAs separating each track in the UI can cause a lot of clutter, the UI visually
120*6dbdd20aSAndroid Build Coastguard Workermerges process tracks with the same name in each process. Note that this **does
121*6dbdd20aSAndroid Build Coastguard Workernot** change the data model (e.g. in trace processor tracks remain separated) as
122*6dbdd20aSAndroid Build Coastguard Workerthis is simply a visual grouping.
123*6dbdd20aSAndroid Build Coastguard Worker
124*6dbdd20aSAndroid Build Coastguard Worker![Process track event in UI](/docs/images/synthetic-track-event-process.png)
125*6dbdd20aSAndroid Build Coastguard Worker
126*6dbdd20aSAndroid Build Coastguard WorkerThis is corresponds to the following protos:
127*6dbdd20aSAndroid Build Coastguard Worker
128*6dbdd20aSAndroid Build Coastguard Worker```
129*6dbdd20aSAndroid Build Coastguard Worker# The first track associated with this process.
130*6dbdd20aSAndroid Build Coastguard Workerpacket {
131*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
132*6dbdd20aSAndroid Build Coastguard Worker    uuid: 48948                         # 64-bit random number.
133*6dbdd20aSAndroid Build Coastguard Worker    name: "My special track"
134*6dbdd20aSAndroid Build Coastguard Worker    process {
135*6dbdd20aSAndroid Build Coastguard Worker      pid: 1234                         # PID for your process
136*6dbdd20aSAndroid Build Coastguard Worker      process_name: "My process name"
137*6dbdd20aSAndroid Build Coastguard Worker    }
138*6dbdd20aSAndroid Build Coastguard Worker  }
139*6dbdd20aSAndroid Build Coastguard Worker}
140*6dbdd20aSAndroid Build Coastguard Worker# The events for the first track.
141*6dbdd20aSAndroid Build Coastguard Workerpacket {
142*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 200
143*6dbdd20aSAndroid Build Coastguard Worker  track_event {
144*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
145*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 48948                   # Same random number from above.
146*6dbdd20aSAndroid Build Coastguard Worker    name: "My special parent A"
147*6dbdd20aSAndroid Build Coastguard Worker  }
148*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809   # Generate *once*, use throughout.
149*6dbdd20aSAndroid Build Coastguard Worker}
150*6dbdd20aSAndroid Build Coastguard Workerpacket {
151*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 250
152*6dbdd20aSAndroid Build Coastguard Worker  track_event {
153*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
154*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 48948
155*6dbdd20aSAndroid Build Coastguard Worker    name: "My special child"
156*6dbdd20aSAndroid Build Coastguard Worker  }
157*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
158*6dbdd20aSAndroid Build Coastguard Worker}
159*6dbdd20aSAndroid Build Coastguard Workerpacket {
160*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 290
161*6dbdd20aSAndroid Build Coastguard Worker  track_event {
162*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
163*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 48948
164*6dbdd20aSAndroid Build Coastguard Worker  }
165*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
166*6dbdd20aSAndroid Build Coastguard Worker}
167*6dbdd20aSAndroid Build Coastguard Workerpacket {
168*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 300
169*6dbdd20aSAndroid Build Coastguard Worker  track_event {
170*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
171*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 48948
172*6dbdd20aSAndroid Build Coastguard Worker  }
173*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
174*6dbdd20aSAndroid Build Coastguard Worker}
175*6dbdd20aSAndroid Build Coastguard Worker
176*6dbdd20aSAndroid Build Coastguard Worker# The second track associated with this process. Note how we make the above
177*6dbdd20aSAndroid Build Coastguard Worker# track the "parent" of this track: this means that this track also is
178*6dbdd20aSAndroid Build Coastguard Worker# associated to the same process. Note further this shows as the same visual
179*6dbdd20aSAndroid Build Coastguard Worker# track in the UI but remains separate in the trace and data model. Emitting
180*6dbdd20aSAndroid Build Coastguard Worker# these events on a separate track is necessary because these events overlap
181*6dbdd20aSAndroid Build Coastguard Worker# *without* nesting with the above events.
182*6dbdd20aSAndroid Build Coastguard Workerpacket {
183*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
184*6dbdd20aSAndroid Build Coastguard Worker      uuid: 2390190934                  # 64-bit random number.
185*6dbdd20aSAndroid Build Coastguard Worker      name: "My special track"
186*6dbdd20aSAndroid Build Coastguard Worker      parent_uuid: 48948
187*6dbdd20aSAndroid Build Coastguard Worker  }
188*6dbdd20aSAndroid Build Coastguard Worker}
189*6dbdd20aSAndroid Build Coastguard Worker# The events for the second track.
190*6dbdd20aSAndroid Build Coastguard Workerpacket {
191*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 230
192*6dbdd20aSAndroid Build Coastguard Worker  track_event {
193*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
194*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 2390190934              # Same random number from above.
195*6dbdd20aSAndroid Build Coastguard Worker    name: "My special parent A"
196*6dbdd20aSAndroid Build Coastguard Worker  }
197*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
198*6dbdd20aSAndroid Build Coastguard Worker}
199*6dbdd20aSAndroid Build Coastguard Workerpacket {
200*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 260
201*6dbdd20aSAndroid Build Coastguard Worker  track_event {
202*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
203*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 2390190934
204*6dbdd20aSAndroid Build Coastguard Worker    name: "My special child"
205*6dbdd20aSAndroid Build Coastguard Worker  }
206*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
207*6dbdd20aSAndroid Build Coastguard Worker}
208*6dbdd20aSAndroid Build Coastguard Workerpacket {
209*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 270
210*6dbdd20aSAndroid Build Coastguard Worker  track_event {
211*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
212*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 2390190934
213*6dbdd20aSAndroid Build Coastguard Worker  }
214*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
215*6dbdd20aSAndroid Build Coastguard Worker}
216*6dbdd20aSAndroid Build Coastguard Workerpacket {
217*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 295
218*6dbdd20aSAndroid Build Coastguard Worker  track_event {
219*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
220*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 2390190934
221*6dbdd20aSAndroid Build Coastguard Worker  }
222*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
223*6dbdd20aSAndroid Build Coastguard Worker}
224*6dbdd20aSAndroid Build Coastguard Worker```
225*6dbdd20aSAndroid Build Coastguard Worker
226*6dbdd20aSAndroid Build Coastguard Worker## Custom-scoped slices
227*6dbdd20aSAndroid Build Coastguard Worker
228*6dbdd20aSAndroid Build Coastguard WorkerNOTE: there is no equivalent in the JSON tracing format.
229*6dbdd20aSAndroid Build Coastguard Worker
230*6dbdd20aSAndroid Build Coastguard WorkerAs well as thread-scoped and process-scoped slices, Perfetto supports creating
231*6dbdd20aSAndroid Build Coastguard Workertracks which are not scoped to any OS-level concept. Moreover, these tracks can
232*6dbdd20aSAndroid Build Coastguard Workerbe recursively nested in a tree structure. This is useful to model the timeline
233*6dbdd20aSAndroid Build Coastguard Workerof execution of GPUs, network traffic, IRQs etc.
234*6dbdd20aSAndroid Build Coastguard Worker
235*6dbdd20aSAndroid Build Coastguard WorkerNote: in the past, modelling such slices may have been done by abusing
236*6dbdd20aSAndroid Build Coastguard Workerprocesses/threads slices, due to limitations with the data model and the
237*6dbdd20aSAndroid Build Coastguard WorkerPerfetto UI. This is no longer necessary and we _strongly_ discourage continued
238*6dbdd20aSAndroid Build Coastguard Workeruse of this hack.
239*6dbdd20aSAndroid Build Coastguard Worker
240*6dbdd20aSAndroid Build Coastguard Worker![Process track event in UI](/docs/images/synthetic-track-event-custom-tree.png)
241*6dbdd20aSAndroid Build Coastguard Worker
242*6dbdd20aSAndroid Build Coastguard WorkerThis is corresponds to the following protos:
243*6dbdd20aSAndroid Build Coastguard Worker
244*6dbdd20aSAndroid Build Coastguard Worker```
245*6dbdd20aSAndroid Build Coastguard Workerpacket {
246*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
247*6dbdd20aSAndroid Build Coastguard Worker    uuid: 48948                         # 64-bit random number.
248*6dbdd20aSAndroid Build Coastguard Worker    name: "Root"
249*6dbdd20aSAndroid Build Coastguard Worker  }
250*6dbdd20aSAndroid Build Coastguard Worker}
251*6dbdd20aSAndroid Build Coastguard Workerpacket {
252*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
253*6dbdd20aSAndroid Build Coastguard Worker    uuid: 50001                         # 64-bit random number.
254*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 48948                  # UUID of root track.
255*6dbdd20aSAndroid Build Coastguard Worker    name: "Parent B"
256*6dbdd20aSAndroid Build Coastguard Worker  }
257*6dbdd20aSAndroid Build Coastguard Worker}
258*6dbdd20aSAndroid Build Coastguard Workerpacket {
259*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
260*6dbdd20aSAndroid Build Coastguard Worker    uuid: 50000                         # 64-bit random number.
261*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 48948                  # UUID of root track.
262*6dbdd20aSAndroid Build Coastguard Worker    name: "Parent A"
263*6dbdd20aSAndroid Build Coastguard Worker  }
264*6dbdd20aSAndroid Build Coastguard Worker}
265*6dbdd20aSAndroid Build Coastguard Workerpacket {
266*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
267*6dbdd20aSAndroid Build Coastguard Worker    uuid: 60000                         # 64-bit random number.
268*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 50000                  # UUID of Parent A track.
269*6dbdd20aSAndroid Build Coastguard Worker    name: "Child A1"
270*6dbdd20aSAndroid Build Coastguard Worker  }
271*6dbdd20aSAndroid Build Coastguard Worker}
272*6dbdd20aSAndroid Build Coastguard Workerpacket {
273*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
274*6dbdd20aSAndroid Build Coastguard Worker    uuid: 60001                         # 64-bit random number.
275*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 50000                  # UUID of Parent A track.
276*6dbdd20aSAndroid Build Coastguard Worker    name: "Child A2"
277*6dbdd20aSAndroid Build Coastguard Worker  }
278*6dbdd20aSAndroid Build Coastguard Worker}
279*6dbdd20aSAndroid Build Coastguard Workerpacket {
280*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
281*6dbdd20aSAndroid Build Coastguard Worker    uuid: 70000                         # 64-bit random number.
282*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 50001                  # UUID of Parent B track.
283*6dbdd20aSAndroid Build Coastguard Worker    name: "Child B1"
284*6dbdd20aSAndroid Build Coastguard Worker  }
285*6dbdd20aSAndroid Build Coastguard Worker}
286*6dbdd20aSAndroid Build Coastguard Worker
287*6dbdd20aSAndroid Build Coastguard Worker# The events for the Child A1 track.
288*6dbdd20aSAndroid Build Coastguard Workerpacket {
289*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 200
290*6dbdd20aSAndroid Build Coastguard Worker  track_event {
291*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
292*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 60000                   # Same random number from above.
293*6dbdd20aSAndroid Build Coastguard Worker    name: "A1"
294*6dbdd20aSAndroid Build Coastguard Worker  }
295*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809   # Generate *once*, use throughout.
296*6dbdd20aSAndroid Build Coastguard Worker}
297*6dbdd20aSAndroid Build Coastguard Workerpacket {
298*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 250
299*6dbdd20aSAndroid Build Coastguard Worker  track_event {
300*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
301*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 60000
302*6dbdd20aSAndroid Build Coastguard Worker  }
303*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
304*6dbdd20aSAndroid Build Coastguard Worker}
305*6dbdd20aSAndroid Build Coastguard Worker
306*6dbdd20aSAndroid Build Coastguard Worker# The events for the Child A2 track.
307*6dbdd20aSAndroid Build Coastguard Workerpacket {
308*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 220
309*6dbdd20aSAndroid Build Coastguard Worker  track_event {
310*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
311*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 60001                   # Same random number from above.
312*6dbdd20aSAndroid Build Coastguard Worker    name: "A2"
313*6dbdd20aSAndroid Build Coastguard Worker  }
314*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809   # Generate *once*, use throughout.
315*6dbdd20aSAndroid Build Coastguard Worker}
316*6dbdd20aSAndroid Build Coastguard Workerpacket {
317*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 240
318*6dbdd20aSAndroid Build Coastguard Worker  track_event {
319*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
320*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 60001
321*6dbdd20aSAndroid Build Coastguard Worker  }
322*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
323*6dbdd20aSAndroid Build Coastguard Worker}
324*6dbdd20aSAndroid Build Coastguard Worker
325*6dbdd20aSAndroid Build Coastguard Worker# The events for the Child B1 track.
326*6dbdd20aSAndroid Build Coastguard Workerpacket {
327*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 210
328*6dbdd20aSAndroid Build Coastguard Worker  track_event {
329*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
330*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 70000                   # Same random number from above.
331*6dbdd20aSAndroid Build Coastguard Worker    name: "B1"
332*6dbdd20aSAndroid Build Coastguard Worker  }
333*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809   # Generate *once*, use throughout.
334*6dbdd20aSAndroid Build Coastguard Worker}
335*6dbdd20aSAndroid Build Coastguard Workerpacket {
336*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 230
337*6dbdd20aSAndroid Build Coastguard Worker  track_event {
338*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
339*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 70000
340*6dbdd20aSAndroid Build Coastguard Worker  }
341*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
342*6dbdd20aSAndroid Build Coastguard Worker}
343*6dbdd20aSAndroid Build Coastguard Worker```
344*6dbdd20aSAndroid Build Coastguard Worker
345*6dbdd20aSAndroid Build Coastguard Worker## Track sorting order
346*6dbdd20aSAndroid Build Coastguard Worker
347*6dbdd20aSAndroid Build Coastguard WorkerNOTE: the closest equivalent to this in the JSON format is `process_sort_index`
348*6dbdd20aSAndroid Build Coastguard Workerbut the Perfetto approach is significantly more flexible.
349*6dbdd20aSAndroid Build Coastguard Worker
350*6dbdd20aSAndroid Build Coastguard WorkerPerfetto also supports specifying of how the tracks should be visualized in the
351*6dbdd20aSAndroid Build Coastguard WorkerUI by default. This is done via the use of the `child_ordering` field which can
352*6dbdd20aSAndroid Build Coastguard Workerbe set on `TrackDescriptor`.
353*6dbdd20aSAndroid Build Coastguard Worker
354*6dbdd20aSAndroid Build Coastguard WorkerFor example, to sort the tracks lexicographically (i.e. in alphabetical order):
355*6dbdd20aSAndroid Build Coastguard Worker
356*6dbdd20aSAndroid Build Coastguard Worker```
357*6dbdd20aSAndroid Build Coastguard Workerpacket {
358*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
359*6dbdd20aSAndroid Build Coastguard Worker    uuid: 10
360*6dbdd20aSAndroid Build Coastguard Worker    name: "Root"
361*6dbdd20aSAndroid Build Coastguard Worker    # Any children of the `Root` track will appear in alphabetical order. This
362*6dbdd20aSAndroid Build Coastguard Worker    # does *not* propogate to any indirect descendants, just the direct
363*6dbdd20aSAndroid Build Coastguard Worker    # children.
364*6dbdd20aSAndroid Build Coastguard Worker    child_ordering: LEXICOGRAPHIC
365*6dbdd20aSAndroid Build Coastguard Worker  }
366*6dbdd20aSAndroid Build Coastguard Worker}
367*6dbdd20aSAndroid Build Coastguard Worker# B will appear nested under `Root` but *after* `A` in the UI, even though it
368*6dbdd20aSAndroid Build Coastguard Worker# appears first in the trace and has a smaller UUID.
369*6dbdd20aSAndroid Build Coastguard Workerpacket {
370*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
371*6dbdd20aSAndroid Build Coastguard Worker    uuid: 11
372*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 10
373*6dbdd20aSAndroid Build Coastguard Worker    name: "B"
374*6dbdd20aSAndroid Build Coastguard Worker  }
375*6dbdd20aSAndroid Build Coastguard Worker}
376*6dbdd20aSAndroid Build Coastguard Workerpacket {
377*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
378*6dbdd20aSAndroid Build Coastguard Worker    uuid: 12
379*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 10
380*6dbdd20aSAndroid Build Coastguard Worker    name: "A"
381*6dbdd20aSAndroid Build Coastguard Worker  }
382*6dbdd20aSAndroid Build Coastguard Worker}
383*6dbdd20aSAndroid Build Coastguard Worker```
384*6dbdd20aSAndroid Build Coastguard Worker
385*6dbdd20aSAndroid Build Coastguard WorkerChronological order is also supported, this sorts the tracks with the earliest
386*6dbdd20aSAndroid Build Coastguard Workerevent first:
387*6dbdd20aSAndroid Build Coastguard Worker
388*6dbdd20aSAndroid Build Coastguard Worker```
389*6dbdd20aSAndroid Build Coastguard Workerpacket {
390*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
391*6dbdd20aSAndroid Build Coastguard Worker    uuid: 10
392*6dbdd20aSAndroid Build Coastguard Worker    name: "Root"
393*6dbdd20aSAndroid Build Coastguard Worker    # Any children of the `Root` track will appear in the order based on the
394*6dbdd20aSAndroid Build Coastguard Worker    # timestamp of the first event on the trace: earlier timestamps will appear
395*6dbdd20aSAndroid Build Coastguard Worker    # higher in the trace. This does *not* propogate to any indirect
396*6dbdd20aSAndroid Build Coastguard Worker    # descendants, just the direct children.
397*6dbdd20aSAndroid Build Coastguard Worker    child_ordering: CHRONOLOGICAL
398*6dbdd20aSAndroid Build Coastguard Worker  }
399*6dbdd20aSAndroid Build Coastguard Worker}
400*6dbdd20aSAndroid Build Coastguard Worker
401*6dbdd20aSAndroid Build Coastguard Worker# B will appear before A because B's first slice starts earlier than A's first
402*6dbdd20aSAndroid Build Coastguard Worker# slice.
403*6dbdd20aSAndroid Build Coastguard Workerpacket {
404*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
405*6dbdd20aSAndroid Build Coastguard Worker    uuid: 11
406*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 10
407*6dbdd20aSAndroid Build Coastguard Worker    name: "A"
408*6dbdd20aSAndroid Build Coastguard Worker  }
409*6dbdd20aSAndroid Build Coastguard Worker}
410*6dbdd20aSAndroid Build Coastguard Workerpacket {
411*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 220
412*6dbdd20aSAndroid Build Coastguard Worker  track_event {
413*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
414*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 11
415*6dbdd20aSAndroid Build Coastguard Worker    name: "A1"
416*6dbdd20aSAndroid Build Coastguard Worker  }
417*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
418*6dbdd20aSAndroid Build Coastguard Worker}
419*6dbdd20aSAndroid Build Coastguard Workerpacket {
420*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 230
421*6dbdd20aSAndroid Build Coastguard Worker  track_event {
422*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
423*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 60000
424*6dbdd20aSAndroid Build Coastguard Worker  }
425*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
426*6dbdd20aSAndroid Build Coastguard Worker}
427*6dbdd20aSAndroid Build Coastguard Worker
428*6dbdd20aSAndroid Build Coastguard Workerpacket {
429*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
430*6dbdd20aSAndroid Build Coastguard Worker    uuid: 12
431*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 10
432*6dbdd20aSAndroid Build Coastguard Worker    name: "B"
433*6dbdd20aSAndroid Build Coastguard Worker  }
434*6dbdd20aSAndroid Build Coastguard Worker}
435*6dbdd20aSAndroid Build Coastguard Workerpacket {
436*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 210
437*6dbdd20aSAndroid Build Coastguard Worker  track_event {
438*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
439*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 12
440*6dbdd20aSAndroid Build Coastguard Worker    name: "B1"
441*6dbdd20aSAndroid Build Coastguard Worker  }
442*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
443*6dbdd20aSAndroid Build Coastguard Worker}
444*6dbdd20aSAndroid Build Coastguard Workerpacket {
445*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 240
446*6dbdd20aSAndroid Build Coastguard Worker  track_event {
447*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
448*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 12
449*6dbdd20aSAndroid Build Coastguard Worker  }
450*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
451*6dbdd20aSAndroid Build Coastguard Worker}
452*6dbdd20aSAndroid Build Coastguard Worker```
453*6dbdd20aSAndroid Build Coastguard Worker
454*6dbdd20aSAndroid Build Coastguard WorkerFinally, for exact control, you can use the `EXPLICIT` ordering and specify
455*6dbdd20aSAndroid Build Coastguard Worker`sibling_order_rank` on each child track:
456*6dbdd20aSAndroid Build Coastguard Worker
457*6dbdd20aSAndroid Build Coastguard Worker```
458*6dbdd20aSAndroid Build Coastguard Workerpacket {
459*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
460*6dbdd20aSAndroid Build Coastguard Worker    uuid: 10
461*6dbdd20aSAndroid Build Coastguard Worker    name: "Root"
462*6dbdd20aSAndroid Build Coastguard Worker    # Any children of the `Root` track will appear in order specified by
463*6dbdd20aSAndroid Build Coastguard Worker    # `sibling_order_rank` exactly: any unspecified rank is treated as 0
464*6dbdd20aSAndroid Build Coastguard Worker    # implicitly.
465*6dbdd20aSAndroid Build Coastguard Worker    child_ordering: EXPLICIT
466*6dbdd20aSAndroid Build Coastguard Worker  }
467*6dbdd20aSAndroid Build Coastguard Worker}
468*6dbdd20aSAndroid Build Coastguard Worker# C will appear first, then B then A following the order specified by
469*6dbdd20aSAndroid Build Coastguard Worker# `sibling_order_rank`.
470*6dbdd20aSAndroid Build Coastguard Workerpacket {
471*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
472*6dbdd20aSAndroid Build Coastguard Worker    uuid: 11
473*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 10
474*6dbdd20aSAndroid Build Coastguard Worker    name: "B"
475*6dbdd20aSAndroid Build Coastguard Worker    sibling_order_rank: 1
476*6dbdd20aSAndroid Build Coastguard Worker  }
477*6dbdd20aSAndroid Build Coastguard Worker}
478*6dbdd20aSAndroid Build Coastguard Workerpacket {
479*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
480*6dbdd20aSAndroid Build Coastguard Worker    uuid: 12
481*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 10
482*6dbdd20aSAndroid Build Coastguard Worker    name: "A"
483*6dbdd20aSAndroid Build Coastguard Worker    sibling_order_rank: 100
484*6dbdd20aSAndroid Build Coastguard Worker  }
485*6dbdd20aSAndroid Build Coastguard Worker}
486*6dbdd20aSAndroid Build Coastguard Workerpacket {
487*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
488*6dbdd20aSAndroid Build Coastguard Worker    uuid: 13
489*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 10
490*6dbdd20aSAndroid Build Coastguard Worker    name: "C"
491*6dbdd20aSAndroid Build Coastguard Worker    sibling_order_rank: -100
492*6dbdd20aSAndroid Build Coastguard Worker  }
493*6dbdd20aSAndroid Build Coastguard Worker}
494*6dbdd20aSAndroid Build Coastguard Worker```
495*6dbdd20aSAndroid Build Coastguard Worker
496*6dbdd20aSAndroid Build Coastguard WorkerNOTE: using `EXPLICIT` is strongly discouraged where there is another option.
497*6dbdd20aSAndroid Build Coastguard WorkerOther orders are significantly more efficient and also allows for trace
498*6dbdd20aSAndroid Build Coastguard Workerprocessor and the UI to better understand what you want to do with those tracks.
499*6dbdd20aSAndroid Build Coastguard WorkerMoreover, it gives the flexibility for having custom visualization (e.g. Gannt
500*6dbdd20aSAndroid Build Coastguard Workercharts for CHRONOLOGICAL view) based on the type specified.
501*6dbdd20aSAndroid Build Coastguard Worker
502*6dbdd20aSAndroid Build Coastguard WorkerFurther documentation about the sorting order is available on the protos for
503*6dbdd20aSAndroid Build Coastguard Worker[TrackDescriptor](/docs/reference/trace-packet-proto.autogen#TrackDescriptor)
504*6dbdd20aSAndroid Build Coastguard Workerand
505*6dbdd20aSAndroid Build Coastguard Worker[ChildTracksOrdering](/docs/reference/trace-packet-proto.autogen#TrackDescriptor.ChildTracksOrdering).
506*6dbdd20aSAndroid Build Coastguard Worker
507*6dbdd20aSAndroid Build Coastguard WorkerNOTE: the order specified in the trace is a treated as a hint in the UI not a
508*6dbdd20aSAndroid Build Coastguard Workergurantee. The UI reserves the right to change the ordering as it sees fit.
509*6dbdd20aSAndroid Build Coastguard Worker
510*6dbdd20aSAndroid Build Coastguard Worker## Flows
511*6dbdd20aSAndroid Build Coastguard Worker
512*6dbdd20aSAndroid Build Coastguard WorkerNOTE: in the legacy JSON tracing format, this section correspond to s/t/f
513*6dbdd20aSAndroid Build Coastguard Workerevents.
514*6dbdd20aSAndroid Build Coastguard Worker
515*6dbdd20aSAndroid Build Coastguard WorkerFlows allow connecting any number of slices with arrows. The semantic meaning of
516*6dbdd20aSAndroid Build Coastguard Workerthe arrow varies across different applications but most commonly it is used to
517*6dbdd20aSAndroid Build Coastguard Workertrack work passing between threads or processes: e.g. the UI thread asks a
518*6dbdd20aSAndroid Build Coastguard Workerbackground thread to do some work and notify when the result is available.
519*6dbdd20aSAndroid Build Coastguard Worker
520*6dbdd20aSAndroid Build Coastguard WorkerNOTE: a single flow _cannot_ fork ands imply represents a single stream of
521*6dbdd20aSAndroid Build Coastguard Workerarrows from one slice to the next. See
522*6dbdd20aSAndroid Build Coastguard Worker[this](https://source.chromium.org/chromium/chromium/src/+/main:third_party/perfetto/protos/perfetto/trace/perfetto_trace.proto;drc=ba05b783d9c29fe334a02913cf157ea1d415d37c;l=9604)
523*6dbdd20aSAndroid Build Coastguard Workercomment for information.
524*6dbdd20aSAndroid Build Coastguard Worker
525*6dbdd20aSAndroid Build Coastguard Worker![TrackEvent flows in UI](/docs/images/synthetic-track-event-flow.png)
526*6dbdd20aSAndroid Build Coastguard Worker
527*6dbdd20aSAndroid Build Coastguard Worker```
528*6dbdd20aSAndroid Build Coastguard Worker# The main thread of the process.
529*6dbdd20aSAndroid Build Coastguard Workerpacket {
530*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
531*6dbdd20aSAndroid Build Coastguard Worker    uuid: 93094
532*6dbdd20aSAndroid Build Coastguard Worker    thread {
533*6dbdd20aSAndroid Build Coastguard Worker        pid: 100
534*6dbdd20aSAndroid Build Coastguard Worker        tid: 100
535*6dbdd20aSAndroid Build Coastguard Worker        thread_name: "Main thread"
536*6dbdd20aSAndroid Build Coastguard Worker    }
537*6dbdd20aSAndroid Build Coastguard Worker  }
538*6dbdd20aSAndroid Build Coastguard Worker}
539*6dbdd20aSAndroid Build Coastguard Workerpacket {
540*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 200
541*6dbdd20aSAndroid Build Coastguard Worker  track_event {
542*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
543*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 93094
544*6dbdd20aSAndroid Build Coastguard Worker    name: "Request generation"
545*6dbdd20aSAndroid Build Coastguard Worker    flow_ids: 1055895987                  # Random number used to track work
546*6dbdd20aSAndroid Build Coastguard Worker                                          # across threads/processes.
547*6dbdd20aSAndroid Build Coastguard Worker  }
548*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
549*6dbdd20aSAndroid Build Coastguard Worker}
550*6dbdd20aSAndroid Build Coastguard Workerpacket {
551*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 300
552*6dbdd20aSAndroid Build Coastguard Worker  track_event {
553*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
554*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 93094
555*6dbdd20aSAndroid Build Coastguard Worker  }
556*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
557*6dbdd20aSAndroid Build Coastguard Worker}
558*6dbdd20aSAndroid Build Coastguard Workerpacket {
559*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 400
560*6dbdd20aSAndroid Build Coastguard Worker  track_event {
561*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
562*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 93094
563*6dbdd20aSAndroid Build Coastguard Worker    name: "Process background result"
564*6dbdd20aSAndroid Build Coastguard Worker    flow_ids: 1055895987                  # Same as above.
565*6dbdd20aSAndroid Build Coastguard Worker  }
566*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
567*6dbdd20aSAndroid Build Coastguard Worker}
568*6dbdd20aSAndroid Build Coastguard Workerpacket {
569*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 500
570*6dbdd20aSAndroid Build Coastguard Worker  track_event {
571*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
572*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 93094
573*6dbdd20aSAndroid Build Coastguard Worker  }
574*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
575*6dbdd20aSAndroid Build Coastguard Worker}
576*6dbdd20aSAndroid Build Coastguard Worker
577*6dbdd20aSAndroid Build Coastguard Worker# The background thread of the process.
578*6dbdd20aSAndroid Build Coastguard Workerpacket {
579*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
580*6dbdd20aSAndroid Build Coastguard Worker    uuid: 40489498
581*6dbdd20aSAndroid Build Coastguard Worker    thread {
582*6dbdd20aSAndroid Build Coastguard Worker      pid: 100
583*6dbdd20aSAndroid Build Coastguard Worker      tid: 101
584*6dbdd20aSAndroid Build Coastguard Worker      thread_name: "Background thread"
585*6dbdd20aSAndroid Build Coastguard Worker    }
586*6dbdd20aSAndroid Build Coastguard Worker  }
587*6dbdd20aSAndroid Build Coastguard Worker}
588*6dbdd20aSAndroid Build Coastguard Workerpacket {
589*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 310
590*6dbdd20aSAndroid Build Coastguard Worker  track_event {
591*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
592*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 40489498
593*6dbdd20aSAndroid Build Coastguard Worker    name: "Background work"
594*6dbdd20aSAndroid Build Coastguard Worker    flow_ids: 1055895987                  # Same as above.
595*6dbdd20aSAndroid Build Coastguard Worker  }
596*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
597*6dbdd20aSAndroid Build Coastguard Worker}
598*6dbdd20aSAndroid Build Coastguard Workerpacket {
599*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 385
600*6dbdd20aSAndroid Build Coastguard Worker  track_event {
601*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
602*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 40489498
603*6dbdd20aSAndroid Build Coastguard Worker  }
604*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
605*6dbdd20aSAndroid Build Coastguard Worker}
606*6dbdd20aSAndroid Build Coastguard Worker```
607*6dbdd20aSAndroid Build Coastguard Worker
608*6dbdd20aSAndroid Build Coastguard Worker## Counters
609*6dbdd20aSAndroid Build Coastguard Worker
610*6dbdd20aSAndroid Build Coastguard WorkerNOTE: in the legacy JSON tracing format, this section correspond to C events.
611*6dbdd20aSAndroid Build Coastguard Worker
612*6dbdd20aSAndroid Build Coastguard WorkerCounters are useful to represent continuous values which change with time.
613*6dbdd20aSAndroid Build Coastguard WorkerCommon examples include CPU frequency, memory usage, battery charge etc.
614*6dbdd20aSAndroid Build Coastguard Worker
615*6dbdd20aSAndroid Build Coastguard Worker![TrackEvent counter in UI](/docs/images/synthetic-track-event-counter.png)
616*6dbdd20aSAndroid Build Coastguard Worker
617*6dbdd20aSAndroid Build Coastguard WorkerThis corresponds to the following protos:
618*6dbdd20aSAndroid Build Coastguard Worker
619*6dbdd20aSAndroid Build Coastguard Worker```
620*6dbdd20aSAndroid Build Coastguard Worker# Counter track scoped to a process.
621*6dbdd20aSAndroid Build Coastguard Workerpacket {
622*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
623*6dbdd20aSAndroid Build Coastguard Worker    uuid: 1388
624*6dbdd20aSAndroid Build Coastguard Worker    process {
625*6dbdd20aSAndroid Build Coastguard Worker      pid: 1024
626*6dbdd20aSAndroid Build Coastguard Worker      process_name: "MySpecialProcess"
627*6dbdd20aSAndroid Build Coastguard Worker    }
628*6dbdd20aSAndroid Build Coastguard Worker  }
629*6dbdd20aSAndroid Build Coastguard Worker}
630*6dbdd20aSAndroid Build Coastguard Workerpacket {
631*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
632*6dbdd20aSAndroid Build Coastguard Worker    uuid: 4489498
633*6dbdd20aSAndroid Build Coastguard Worker    parent_uuid: 1388
634*6dbdd20aSAndroid Build Coastguard Worker    name: "My special counter"
635*6dbdd20aSAndroid Build Coastguard Worker    counter {}
636*6dbdd20aSAndroid Build Coastguard Worker  }
637*6dbdd20aSAndroid Build Coastguard Worker}
638*6dbdd20aSAndroid Build Coastguard Workerpacket {
639*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 200
640*6dbdd20aSAndroid Build Coastguard Worker  track_event {
641*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_COUNTER
642*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 4489498
643*6dbdd20aSAndroid Build Coastguard Worker    counter_value: 34567    # Value at start
644*6dbdd20aSAndroid Build Coastguard Worker  }
645*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
646*6dbdd20aSAndroid Build Coastguard Worker}
647*6dbdd20aSAndroid Build Coastguard Workerpacket {
648*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 250
649*6dbdd20aSAndroid Build Coastguard Worker  track_event {
650*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_COUNTER
651*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 4489498
652*6dbdd20aSAndroid Build Coastguard Worker    counter_value: 67890    # Value goes up
653*6dbdd20aSAndroid Build Coastguard Worker  }
654*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
655*6dbdd20aSAndroid Build Coastguard Worker}
656*6dbdd20aSAndroid Build Coastguard Workerpacket {
657*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 300
658*6dbdd20aSAndroid Build Coastguard Worker  track_event {
659*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_COUNTER
660*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 4489498
661*6dbdd20aSAndroid Build Coastguard Worker    counter_value: 12345   # Value goes down
662*6dbdd20aSAndroid Build Coastguard Worker  }
663*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
664*6dbdd20aSAndroid Build Coastguard Worker}
665*6dbdd20aSAndroid Build Coastguard Workerpacket {
666*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 400
667*6dbdd20aSAndroid Build Coastguard Worker  track_event {
668*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_COUNTER
669*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 4489498
670*6dbdd20aSAndroid Build Coastguard Worker    counter_value: 12345   # Final value
671*6dbdd20aSAndroid Build Coastguard Worker  }
672*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
673*6dbdd20aSAndroid Build Coastguard Worker}
674*6dbdd20aSAndroid Build Coastguard Worker```
675*6dbdd20aSAndroid Build Coastguard Worker
676*6dbdd20aSAndroid Build Coastguard Worker## Interning
677*6dbdd20aSAndroid Build Coastguard Worker
678*6dbdd20aSAndroid Build Coastguard WorkerNOTE: there is no equivalent to interning in the JSON tracing format.
679*6dbdd20aSAndroid Build Coastguard Worker
680*6dbdd20aSAndroid Build Coastguard WorkerInterning is an advanced but powerful feature of the protobuf tracing format
681*6dbdd20aSAndroid Build Coastguard Workerwhich allows allows for reducing the number of times long strings are emitted in
682*6dbdd20aSAndroid Build Coastguard Workerthe trace.
683*6dbdd20aSAndroid Build Coastguard Worker
684*6dbdd20aSAndroid Build Coastguard WorkerSpecifically, certain fields in the protobuf format allow associating an "iid"
685*6dbdd20aSAndroid Build Coastguard Worker(interned id) to a string and using the iid to reference the string in all
686*6dbdd20aSAndroid Build Coastguard Workerfuture packets. The most commonly used cases are slice names and category names
687*6dbdd20aSAndroid Build Coastguard Worker
688*6dbdd20aSAndroid Build Coastguard WorkerHere is an example of a trace which makes use of interning to reduce the number
689*6dbdd20aSAndroid Build Coastguard Workerof times a very long slice name is emitted:
690*6dbdd20aSAndroid Build Coastguard Worker![TrackEvent interning](/docs/images/synthetic-track-event-interned.png)
691*6dbdd20aSAndroid Build Coastguard Worker
692*6dbdd20aSAndroid Build Coastguard WorkerThis corresponds to the following protos:
693*6dbdd20aSAndroid Build Coastguard Worker
694*6dbdd20aSAndroid Build Coastguard Worker```
695*6dbdd20aSAndroid Build Coastguard Workerpacket {
696*6dbdd20aSAndroid Build Coastguard Worker  track_descriptor {
697*6dbdd20aSAndroid Build Coastguard Worker    uuid: 48948                         # 64-bit random number.
698*6dbdd20aSAndroid Build Coastguard Worker    name: "My special track"
699*6dbdd20aSAndroid Build Coastguard Worker    process {
700*6dbdd20aSAndroid Build Coastguard Worker      pid: 1234                         # PID for your process
701*6dbdd20aSAndroid Build Coastguard Worker      process_name: "My process name"
702*6dbdd20aSAndroid Build Coastguard Worker    }
703*6dbdd20aSAndroid Build Coastguard Worker  }
704*6dbdd20aSAndroid Build Coastguard Worker}
705*6dbdd20aSAndroid Build Coastguard Workerpacket {
706*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 200
707*6dbdd20aSAndroid Build Coastguard Worker  track_event {
708*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
709*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 48948                   # Same random number from above.
710*6dbdd20aSAndroid Build Coastguard Worker    name_iid: 1                         # References the string in interned_data
711*6dbdd20aSAndroid Build Coastguard Worker                                        # (see below)
712*6dbdd20aSAndroid Build Coastguard Worker  }
713*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809   # Generate *once*, use throughout.
714*6dbdd20aSAndroid Build Coastguard Worker
715*6dbdd20aSAndroid Build Coastguard Worker  interned_data {
716*6dbdd20aSAndroid Build Coastguard Worker    # Creates a mapping from the iid "1" to the string name: any |name_iid| field
717*6dbdd20aSAndroid Build Coastguard Worker    # in this packet onwards will transparently be remapped to this string by trace
718*6dbdd20aSAndroid Build Coastguard Worker    # processor.
719*6dbdd20aSAndroid Build Coastguard Worker    # Note: iid 0 is *not* a valid IID and should not be used.
720*6dbdd20aSAndroid Build Coastguard Worker    event_names {
721*6dbdd20aSAndroid Build Coastguard Worker      iid: 1
722*6dbdd20aSAndroid Build Coastguard Worker      name: "A very very very long slice name which we don't want to repeat"
723*6dbdd20aSAndroid Build Coastguard Worker    }
724*6dbdd20aSAndroid Build Coastguard Worker  }
725*6dbdd20aSAndroid Build Coastguard Worker
726*6dbdd20aSAndroid Build Coastguard Worker  first_packet_on_sequence: true        # Indicates to trace processor that
727*6dbdd20aSAndroid Build Coastguard Worker                                        # this is the first packet on the
728*6dbdd20aSAndroid Build Coastguard Worker                                        # sequence.
729*6dbdd20aSAndroid Build Coastguard Worker  previous_packet_dropped: true         # Same as |first_packet_on_sequence|.
730*6dbdd20aSAndroid Build Coastguard Worker
731*6dbdd20aSAndroid Build Coastguard Worker  # Indicates to trace processor that this sequence resets the incremental state but
732*6dbdd20aSAndroid Build Coastguard Worker  # also depends on incrtemental state state.
733*6dbdd20aSAndroid Build Coastguard Worker  # 3 = SEQ_INCREMENTAL_STATE_CLEARED | SEQ_NEEDS_INCREMENTAL_STATE
734*6dbdd20aSAndroid Build Coastguard Worker  sequence_flags: 3
735*6dbdd20aSAndroid Build Coastguard Worker}
736*6dbdd20aSAndroid Build Coastguard Workerpacket {
737*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 201
738*6dbdd20aSAndroid Build Coastguard Worker  track_event {
739*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
740*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 48948
741*6dbdd20aSAndroid Build Coastguard Worker  }
742*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
743*6dbdd20aSAndroid Build Coastguard Worker}
744*6dbdd20aSAndroid Build Coastguard Workerpacket {
745*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 202
746*6dbdd20aSAndroid Build Coastguard Worker  track_event {
747*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_BEGIN
748*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 48948                   # Same random number from above.
749*6dbdd20aSAndroid Build Coastguard Worker    name_iid: 1                         # References the string in interned_data
750*6dbdd20aSAndroid Build Coastguard Worker                                        # above.
751*6dbdd20aSAndroid Build Coastguard Worker  }
752*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809   # Generate *once*, use throughout.
753*6dbdd20aSAndroid Build Coastguard Worker  # 2 = SEQ_NEEDS_INCREMENTAL_STATE
754*6dbdd20aSAndroid Build Coastguard Worker  sequence_flags: 2
755*6dbdd20aSAndroid Build Coastguard Worker}
756*6dbdd20aSAndroid Build Coastguard Workerpacket {
757*6dbdd20aSAndroid Build Coastguard Worker  timestamp: 203
758*6dbdd20aSAndroid Build Coastguard Worker  track_event {
759*6dbdd20aSAndroid Build Coastguard Worker    type: TYPE_SLICE_END
760*6dbdd20aSAndroid Build Coastguard Worker    track_uuid: 48948
761*6dbdd20aSAndroid Build Coastguard Worker  }
762*6dbdd20aSAndroid Build Coastguard Worker  trusted_packet_sequence_id: 3903809
763*6dbdd20aSAndroid Build Coastguard Worker}
764*6dbdd20aSAndroid Build Coastguard Worker```
765