xref: /aosp_15_r20/external/perfetto/docs/instrumentation/track-events.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Track events (Tracing SDK)
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard WorkerTrack events are part of the [Perfetto Tracing SDK](tracing-sdk.md).
4*6dbdd20aSAndroid Build Coastguard Worker
5*6dbdd20aSAndroid Build Coastguard Worker*Track events* are application specific, time bounded events recorded into a
6*6dbdd20aSAndroid Build Coastguard Worker*trace* while the application is running. Track events are always associated
7*6dbdd20aSAndroid Build Coastguard Workerwith a *track*, which is a timeline of monotonically increasing time. A track
8*6dbdd20aSAndroid Build Coastguard Workercorresponds to an independent sequence of execution, such as a single thread
9*6dbdd20aSAndroid Build Coastguard Workerin a process.
10*6dbdd20aSAndroid Build Coastguard Worker
11*6dbdd20aSAndroid Build Coastguard Worker![Track events shown in the Perfetto UI](
12*6dbdd20aSAndroid Build Coastguard Worker  /docs/images/track-events.png "Track events in the Perfetto UI")
13*6dbdd20aSAndroid Build Coastguard Worker
14*6dbdd20aSAndroid Build Coastguard WorkerSee the [Getting started](/docs/instrumentation/tracing-sdk#getting-started)
15*6dbdd20aSAndroid Build Coastguard Workersection of the Tracing SDK page for instructions on how to check out and
16*6dbdd20aSAndroid Build Coastguard Workerbuild the SDK.
17*6dbdd20aSAndroid Build Coastguard Worker
18*6dbdd20aSAndroid Build Coastguard WorkerTIP: The code from these examples is also available [in the
19*6dbdd20aSAndroid Build Coastguard Workerrepository](/examples/sdk/README.md).
20*6dbdd20aSAndroid Build Coastguard Worker
21*6dbdd20aSAndroid Build Coastguard WorkerThere are a few main types of track events:
22*6dbdd20aSAndroid Build Coastguard Worker
23*6dbdd20aSAndroid Build Coastguard Worker- **Slices**, which represent nested, time bounded operations. For example,
24*6dbdd20aSAndroid Build Coastguard Worker    a slice could cover the time period from when a function begins executing
25*6dbdd20aSAndroid Build Coastguard Worker    to when it returns, the time spent loading a file from the network or the
26*6dbdd20aSAndroid Build Coastguard Worker    time to complete a user journey.
27*6dbdd20aSAndroid Build Coastguard Worker
28*6dbdd20aSAndroid Build Coastguard Worker- **Counters**, which are snapshots of time-varying numeric values. For
29*6dbdd20aSAndroid Build Coastguard Worker    example, a track event can record instantaneous the memory usage of a
30*6dbdd20aSAndroid Build Coastguard Worker    process during its execution.
31*6dbdd20aSAndroid Build Coastguard Worker
32*6dbdd20aSAndroid Build Coastguard Worker- **Flows**, which are used to connect related slices that span different
33*6dbdd20aSAndroid Build Coastguard Worker    tracks together. For example, if an image file is first loaded from
34*6dbdd20aSAndroid Build Coastguard Worker    the network and then decoded on a thread pool, a flow event can be used to
35*6dbdd20aSAndroid Build Coastguard Worker    highlight its path through the system.
36*6dbdd20aSAndroid Build Coastguard Worker
37*6dbdd20aSAndroid Build Coastguard WorkerThe [Perfetto UI](https://ui.perfetto.dev) has built in support for track
38*6dbdd20aSAndroid Build Coastguard Workerevents, which provides a useful way to quickly visualize the internal
39*6dbdd20aSAndroid Build Coastguard Workerprocessing of an app. For example, the [Chrome
40*6dbdd20aSAndroid Build Coastguard Workerbrowser](https://www.chromium.org/developers/how-tos/trace-event-profiling-tool)
41*6dbdd20aSAndroid Build Coastguard Workeris deeply instrumented with track events to assist in debugging, development
42*6dbdd20aSAndroid Build Coastguard Workerand performance analysis.
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard WorkerTo start using track events, first define the set of categories that your events
45*6dbdd20aSAndroid Build Coastguard Workerwill fall into. Each category can be separately enabled or disabled for tracing
46*6dbdd20aSAndroid Build Coastguard Worker(see [Category configuration](#category-configuration)).
47*6dbdd20aSAndroid Build Coastguard Worker
48*6dbdd20aSAndroid Build Coastguard WorkerAdd the list of categories into a header file (e.g.,
49*6dbdd20aSAndroid Build Coastguard Worker`my_app_tracing_categories.h`) like this:
50*6dbdd20aSAndroid Build Coastguard Worker
51*6dbdd20aSAndroid Build Coastguard Worker```C++
52*6dbdd20aSAndroid Build Coastguard Worker#include <perfetto.h>
53*6dbdd20aSAndroid Build Coastguard Worker
54*6dbdd20aSAndroid Build Coastguard WorkerPERFETTO_DEFINE_CATEGORIES(
55*6dbdd20aSAndroid Build Coastguard Worker    perfetto::Category("rendering")
56*6dbdd20aSAndroid Build Coastguard Worker        .SetDescription("Events from the graphics subsystem"),
57*6dbdd20aSAndroid Build Coastguard Worker    perfetto::Category("network")
58*6dbdd20aSAndroid Build Coastguard Worker        .SetDescription("Network upload and download statistics"));
59*6dbdd20aSAndroid Build Coastguard Worker```
60*6dbdd20aSAndroid Build Coastguard Worker
61*6dbdd20aSAndroid Build Coastguard WorkerThen, declare static storage for the categories in a cc file (e.g.,
62*6dbdd20aSAndroid Build Coastguard Worker`my_app_tracing_categories.cc`):
63*6dbdd20aSAndroid Build Coastguard Worker
64*6dbdd20aSAndroid Build Coastguard Worker```C++
65*6dbdd20aSAndroid Build Coastguard Worker#include "my_app_tracing_categories.h"
66*6dbdd20aSAndroid Build Coastguard Worker
67*6dbdd20aSAndroid Build Coastguard WorkerPERFETTO_TRACK_EVENT_STATIC_STORAGE();
68*6dbdd20aSAndroid Build Coastguard Worker```
69*6dbdd20aSAndroid Build Coastguard Worker
70*6dbdd20aSAndroid Build Coastguard WorkerFinally, initialize track events after the client library is brought up:
71*6dbdd20aSAndroid Build Coastguard Worker
72*6dbdd20aSAndroid Build Coastguard Worker```C++
73*6dbdd20aSAndroid Build Coastguard Workerint main(int argc, char** argv) {
74*6dbdd20aSAndroid Build Coastguard Worker  ...
75*6dbdd20aSAndroid Build Coastguard Worker  perfetto::Tracing::Initialize(args);
76*6dbdd20aSAndroid Build Coastguard Worker  perfetto::TrackEvent::Register();  // Add this.
77*6dbdd20aSAndroid Build Coastguard Worker}
78*6dbdd20aSAndroid Build Coastguard Worker```
79*6dbdd20aSAndroid Build Coastguard Worker
80*6dbdd20aSAndroid Build Coastguard WorkerNow you can add track events to existing functions like this:
81*6dbdd20aSAndroid Build Coastguard Worker
82*6dbdd20aSAndroid Build Coastguard Worker```C++
83*6dbdd20aSAndroid Build Coastguard Worker#include "my_app_tracing_categories.h"
84*6dbdd20aSAndroid Build Coastguard Worker
85*6dbdd20aSAndroid Build Coastguard Workervoid DrawPlayer() {
86*6dbdd20aSAndroid Build Coastguard Worker  TRACE_EVENT("rendering", "DrawPlayer");  // Begin "DrawPlayer" slice.
87*6dbdd20aSAndroid Build Coastguard Worker  ...
88*6dbdd20aSAndroid Build Coastguard Worker  // End "DrawPlayer" slice.
89*6dbdd20aSAndroid Build Coastguard Worker}
90*6dbdd20aSAndroid Build Coastguard Worker```
91*6dbdd20aSAndroid Build Coastguard Worker
92*6dbdd20aSAndroid Build Coastguard WorkerThis type of trace event is scoped, under the hood it uses C++ [RAII]. The
93*6dbdd20aSAndroid Build Coastguard Workerevent will cover the time from when the `TRACE_EVENT` annotation is encountered
94*6dbdd20aSAndroid Build Coastguard Workerto the end of the block (in the example above, until the function returns).
95*6dbdd20aSAndroid Build Coastguard Worker
96*6dbdd20aSAndroid Build Coastguard WorkerFor events that don't follow function scoping, use `TRACE_EVENT_BEGIN` and
97*6dbdd20aSAndroid Build Coastguard Worker`TRACE_EVENT_END`:
98*6dbdd20aSAndroid Build Coastguard Worker
99*6dbdd20aSAndroid Build Coastguard Worker```C++
100*6dbdd20aSAndroid Build Coastguard Workervoid LoadGame() {
101*6dbdd20aSAndroid Build Coastguard Worker  DisplayLoadingScreen();
102*6dbdd20aSAndroid Build Coastguard Worker
103*6dbdd20aSAndroid Build Coastguard Worker  TRACE_EVENT_BEGIN("io", "Loading");  // Begin "Loading" slice.
104*6dbdd20aSAndroid Build Coastguard Worker  LoadCollectibles();
105*6dbdd20aSAndroid Build Coastguard Worker  LoadVehicles();
106*6dbdd20aSAndroid Build Coastguard Worker  LoadPlayers();
107*6dbdd20aSAndroid Build Coastguard Worker  TRACE_EVENT_END("io");               // End "Loading" slice.
108*6dbdd20aSAndroid Build Coastguard Worker
109*6dbdd20aSAndroid Build Coastguard Worker  StartGame();
110*6dbdd20aSAndroid Build Coastguard Worker}
111*6dbdd20aSAndroid Build Coastguard Worker```
112*6dbdd20aSAndroid Build Coastguard Worker
113*6dbdd20aSAndroid Build Coastguard WorkerNote that you don't need to give a name for `TRACE_EVENT_END`, since it
114*6dbdd20aSAndroid Build Coastguard Workerautomatically closes the most recent event that began on the same thread. In
115*6dbdd20aSAndroid Build Coastguard Workerother words, all events on a given thread share the same stack. This means
116*6dbdd20aSAndroid Build Coastguard Workerthat it's not recommended to have a matching pair of `TRACE_EVENT_BEGIN` and
117*6dbdd20aSAndroid Build Coastguard Worker`TRACE_EVENT_END` markers in separate functions, since an unrelated event
118*6dbdd20aSAndroid Build Coastguard Workermight terminate the original event unexpectedly; for events that cross
119*6dbdd20aSAndroid Build Coastguard Workerfunction boundaries it's usually best to emit them on a [separate
120*6dbdd20aSAndroid Build Coastguard Workertrack](#tracks).
121*6dbdd20aSAndroid Build Coastguard Worker
122*6dbdd20aSAndroid Build Coastguard WorkerYou can also supply (up to two) debug annotations together with the event.
123*6dbdd20aSAndroid Build Coastguard Worker
124*6dbdd20aSAndroid Build Coastguard Worker```C++
125*6dbdd20aSAndroid Build Coastguard Workerint player_number = 1;
126*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT("rendering", "DrawPlayer", "player_number", player_number);
127*6dbdd20aSAndroid Build Coastguard Worker```
128*6dbdd20aSAndroid Build Coastguard Worker
129*6dbdd20aSAndroid Build Coastguard WorkerSee [below](#track-event-arguments) for the other types of supported track
130*6dbdd20aSAndroid Build Coastguard Workerevent arguments. For more complex arguments, you can define [your own
131*6dbdd20aSAndroid Build Coastguard Workerprotobuf messages](/protos/perfetto/trace/track_event/track_event.proto) and
132*6dbdd20aSAndroid Build Coastguard Workeremit them as a parameter for the event.
133*6dbdd20aSAndroid Build Coastguard Worker
134*6dbdd20aSAndroid Build Coastguard WorkerNOTE: Currently custom protobuf messages need to be added directly to the
135*6dbdd20aSAndroid Build Coastguard Worker      Perfetto repository under `protos/perfetto/trace`, and Perfetto itself
136*6dbdd20aSAndroid Build Coastguard Worker      must also be rebuilt. We are working
137*6dbdd20aSAndroid Build Coastguard Worker      [to lift this limitation](https://github.com/google/perfetto/issues/11).
138*6dbdd20aSAndroid Build Coastguard Worker
139*6dbdd20aSAndroid Build Coastguard WorkerAs an example of a custom track event argument type, save the following as
140*6dbdd20aSAndroid Build Coastguard Worker`protos/perfetto/trace/track_event/player_info.proto`:
141*6dbdd20aSAndroid Build Coastguard Worker
142*6dbdd20aSAndroid Build Coastguard Worker```protobuf
143*6dbdd20aSAndroid Build Coastguard Workermessage PlayerInfo {
144*6dbdd20aSAndroid Build Coastguard Worker  optional string name = 1;
145*6dbdd20aSAndroid Build Coastguard Worker  optional uint64 score = 2;
146*6dbdd20aSAndroid Build Coastguard Worker}
147*6dbdd20aSAndroid Build Coastguard Worker```
148*6dbdd20aSAndroid Build Coastguard Worker
149*6dbdd20aSAndroid Build Coastguard WorkerThis new file should also be added to
150*6dbdd20aSAndroid Build Coastguard Worker`protos/perfetto/trace/track_event/BUILD.gn`:
151*6dbdd20aSAndroid Build Coastguard Worker
152*6dbdd20aSAndroid Build Coastguard Worker```json
153*6dbdd20aSAndroid Build Coastguard Workersources = [
154*6dbdd20aSAndroid Build Coastguard Worker  ...
155*6dbdd20aSAndroid Build Coastguard Worker  "player_info.proto"
156*6dbdd20aSAndroid Build Coastguard Worker]
157*6dbdd20aSAndroid Build Coastguard Worker```
158*6dbdd20aSAndroid Build Coastguard Worker
159*6dbdd20aSAndroid Build Coastguard WorkerAlso, a matching argument should be added to the track event message
160*6dbdd20aSAndroid Build Coastguard Workerdefinition in
161*6dbdd20aSAndroid Build Coastguard Worker`protos/perfetto/trace/track_event/track_event.proto`:
162*6dbdd20aSAndroid Build Coastguard Worker
163*6dbdd20aSAndroid Build Coastguard Worker```protobuf
164*6dbdd20aSAndroid Build Coastguard Workerimport "protos/perfetto/trace/track_event/player_info.proto";
165*6dbdd20aSAndroid Build Coastguard Worker
166*6dbdd20aSAndroid Build Coastguard Worker...
167*6dbdd20aSAndroid Build Coastguard Worker
168*6dbdd20aSAndroid Build Coastguard Workermessage TrackEvent {
169*6dbdd20aSAndroid Build Coastguard Worker  ...
170*6dbdd20aSAndroid Build Coastguard Worker  // New argument types go here.
171*6dbdd20aSAndroid Build Coastguard Worker  optional PlayerInfo player_info = 1000;
172*6dbdd20aSAndroid Build Coastguard Worker}
173*6dbdd20aSAndroid Build Coastguard Worker```
174*6dbdd20aSAndroid Build Coastguard Worker
175*6dbdd20aSAndroid Build Coastguard WorkerThe corresponding trace point could look like this:
176*6dbdd20aSAndroid Build Coastguard Worker
177*6dbdd20aSAndroid Build Coastguard Worker```C++
178*6dbdd20aSAndroid Build Coastguard WorkerPlayer my_player;
179*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT("category", "MyEvent", [&](perfetto::EventContext ctx) {
180*6dbdd20aSAndroid Build Coastguard Worker  auto player = ctx.event()->set_player_info();
181*6dbdd20aSAndroid Build Coastguard Worker  player->set_name(my_player.name());
182*6dbdd20aSAndroid Build Coastguard Worker  player->set_player_score(my_player.score());
183*6dbdd20aSAndroid Build Coastguard Worker});
184*6dbdd20aSAndroid Build Coastguard Worker```
185*6dbdd20aSAndroid Build Coastguard Worker
186*6dbdd20aSAndroid Build Coastguard WorkerThe lambda function passed to the macro is only called if tracing is enabled for
187*6dbdd20aSAndroid Build Coastguard Workerthe given category. It is always called synchronously and possibly multiple
188*6dbdd20aSAndroid Build Coastguard Workertimes if multiple concurrent tracing sessions are active.
189*6dbdd20aSAndroid Build Coastguard Worker
190*6dbdd20aSAndroid Build Coastguard WorkerNow that you have instrumented your app with track events, you are ready to
191*6dbdd20aSAndroid Build Coastguard Workerstart [recording traces](tracing-sdk.md#recording).
192*6dbdd20aSAndroid Build Coastguard Worker
193*6dbdd20aSAndroid Build Coastguard Worker## Category configuration
194*6dbdd20aSAndroid Build Coastguard Worker
195*6dbdd20aSAndroid Build Coastguard WorkerAll track events are assigned to one more trace categories. For example:
196*6dbdd20aSAndroid Build Coastguard Worker
197*6dbdd20aSAndroid Build Coastguard Worker```C++
198*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT("rendering", ...);  // Event in the "rendering" category.
199*6dbdd20aSAndroid Build Coastguard Worker```
200*6dbdd20aSAndroid Build Coastguard Worker
201*6dbdd20aSAndroid Build Coastguard WorkerBy default, all non-debug and non-slow track event categories are enabled for
202*6dbdd20aSAndroid Build Coastguard Workertracing. *Debug* and *slow* categories are categories with special tags:
203*6dbdd20aSAndroid Build Coastguard Worker
204*6dbdd20aSAndroid Build Coastguard Worker  - `"debug"` categories can give more verbose debugging output for a particular
205*6dbdd20aSAndroid Build Coastguard Worker    subsystem.
206*6dbdd20aSAndroid Build Coastguard Worker  - `"slow"` categories record enough data that they can affect the interactive
207*6dbdd20aSAndroid Build Coastguard Worker    performance of your app.
208*6dbdd20aSAndroid Build Coastguard Worker
209*6dbdd20aSAndroid Build Coastguard WorkerCategory tags can be defined like this:
210*6dbdd20aSAndroid Build Coastguard Worker
211*6dbdd20aSAndroid Build Coastguard Worker```C++
212*6dbdd20aSAndroid Build Coastguard Workerperfetto::Category("rendering.debug")
213*6dbdd20aSAndroid Build Coastguard Worker    .SetDescription("Debug events from the graphics subsystem")
214*6dbdd20aSAndroid Build Coastguard Worker    .SetTags("debug", "my_custom_tag")
215*6dbdd20aSAndroid Build Coastguard Worker```
216*6dbdd20aSAndroid Build Coastguard Worker
217*6dbdd20aSAndroid Build Coastguard WorkerA single trace event can also belong to multiple categories:
218*6dbdd20aSAndroid Build Coastguard Worker
219*6dbdd20aSAndroid Build Coastguard Worker```C++
220*6dbdd20aSAndroid Build Coastguard Worker// Event in the "rendering" and "benchmark" categories.
221*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT("rendering,benchmark", ...);
222*6dbdd20aSAndroid Build Coastguard Worker```
223*6dbdd20aSAndroid Build Coastguard Worker
224*6dbdd20aSAndroid Build Coastguard WorkerA corresponding category group entry must be added to the category registry:
225*6dbdd20aSAndroid Build Coastguard Worker
226*6dbdd20aSAndroid Build Coastguard Worker```C++
227*6dbdd20aSAndroid Build Coastguard Workerperfetto::Category::Group("rendering,benchmark")
228*6dbdd20aSAndroid Build Coastguard Worker```
229*6dbdd20aSAndroid Build Coastguard Worker
230*6dbdd20aSAndroid Build Coastguard WorkerIt's also possible to efficiently query whether a given category is enabled
231*6dbdd20aSAndroid Build Coastguard Workerfor tracing:
232*6dbdd20aSAndroid Build Coastguard Worker
233*6dbdd20aSAndroid Build Coastguard Worker```C++
234*6dbdd20aSAndroid Build Coastguard Workerif (TRACE_EVENT_CATEGORY_ENABLED("rendering")) {
235*6dbdd20aSAndroid Build Coastguard Worker  // ...
236*6dbdd20aSAndroid Build Coastguard Worker}
237*6dbdd20aSAndroid Build Coastguard Worker```
238*6dbdd20aSAndroid Build Coastguard Worker
239*6dbdd20aSAndroid Build Coastguard WorkerThe `TrackEventConfig` field in Perfetto's `TraceConfig` can be used to
240*6dbdd20aSAndroid Build Coastguard Workerselect which categories are enabled for tracing:
241*6dbdd20aSAndroid Build Coastguard Worker
242*6dbdd20aSAndroid Build Coastguard Worker```protobuf
243*6dbdd20aSAndroid Build Coastguard Workermessage TrackEventConfig {
244*6dbdd20aSAndroid Build Coastguard Worker  // Each list item is a glob. Each category is matched against the lists
245*6dbdd20aSAndroid Build Coastguard Worker  // as explained below.
246*6dbdd20aSAndroid Build Coastguard Worker  repeated string disabled_categories = 1;  // Default: []
247*6dbdd20aSAndroid Build Coastguard Worker  repeated string enabled_categories = 2;   // Default: []
248*6dbdd20aSAndroid Build Coastguard Worker  repeated string disabled_tags = 3;        // Default: [“slow”, “debug”]
249*6dbdd20aSAndroid Build Coastguard Worker  repeated string enabled_tags = 4;         // Default: []
250*6dbdd20aSAndroid Build Coastguard Worker}
251*6dbdd20aSAndroid Build Coastguard Worker```
252*6dbdd20aSAndroid Build Coastguard Worker
253*6dbdd20aSAndroid Build Coastguard WorkerTo determine if a category is enabled, it is checked against the filters in the
254*6dbdd20aSAndroid Build Coastguard Workerfollowing order:
255*6dbdd20aSAndroid Build Coastguard Worker
256*6dbdd20aSAndroid Build Coastguard Worker1. Exact matches in enabled categories.
257*6dbdd20aSAndroid Build Coastguard Worker2. Exact matches in enabled tags.
258*6dbdd20aSAndroid Build Coastguard Worker3. Exact matches in disabled categories.
259*6dbdd20aSAndroid Build Coastguard Worker4. Exact matches in disabled tags.
260*6dbdd20aSAndroid Build Coastguard Worker5. Pattern matches in enabled categories.
261*6dbdd20aSAndroid Build Coastguard Worker6. Pattern matches in enabled tags.
262*6dbdd20aSAndroid Build Coastguard Worker7. Pattern matches in disabled categories.
263*6dbdd20aSAndroid Build Coastguard Worker8. Pattern matches in disabled tags.
264*6dbdd20aSAndroid Build Coastguard Worker
265*6dbdd20aSAndroid Build Coastguard WorkerIf none of the steps produced a match, the category:
266*6dbdd20aSAndroid Build Coastguard Worker* is enabled by default in the C++ API
267*6dbdd20aSAndroid Build Coastguard Worker* is disabled by default in the C API.
268*6dbdd20aSAndroid Build Coastguard Worker
269*6dbdd20aSAndroid Build Coastguard WorkerSpecifying an `enabled_categories: "*"` or `disabled_categories: "*"` helps
270*6dbdd20aSAndroid Build Coastguard Workerachieving a consistent behavior explicitly.
271*6dbdd20aSAndroid Build Coastguard Worker
272*6dbdd20aSAndroid Build Coastguard WorkerFor example:
273*6dbdd20aSAndroid Build Coastguard Worker
274*6dbdd20aSAndroid Build Coastguard Worker| Setting                         | Needed configuration                         |
275*6dbdd20aSAndroid Build Coastguard Worker| ------------------------------- | -------------------------------------------- |
276*6dbdd20aSAndroid Build Coastguard Worker| Enable just specific categories | `enabled_categories = ["foo", "bar", "baz"]` |
277*6dbdd20aSAndroid Build Coastguard Worker|                                 | `disabled_categories = ["*"]`                |
278*6dbdd20aSAndroid Build Coastguard Worker| Enable all non-slow categories  | `enabled_categories = ["*"] `                |
279*6dbdd20aSAndroid Build Coastguard Worker| Enable specific tags            | `disabled_tags = ["*"]`                      |
280*6dbdd20aSAndroid Build Coastguard Worker|                                 | `enabled_tags = ["foo", "bar"]`              |
281*6dbdd20aSAndroid Build Coastguard Worker
282*6dbdd20aSAndroid Build Coastguard Worker## Dynamic and test-only categories
283*6dbdd20aSAndroid Build Coastguard Worker
284*6dbdd20aSAndroid Build Coastguard WorkerIdeally all trace categories should be defined at compile time as shown
285*6dbdd20aSAndroid Build Coastguard Workerabove, as this ensures trace points will have minimal runtime and binary size
286*6dbdd20aSAndroid Build Coastguard Workeroverhead. However, in some cases trace categories can only be determined at
287*6dbdd20aSAndroid Build Coastguard Workerruntime (e.g., they come from instrumentation in a dynamically loaded JavaScript
288*6dbdd20aSAndroid Build Coastguard Workerrunning in a WebView or in a NodeJS engine). These can be used by trace points
289*6dbdd20aSAndroid Build Coastguard Workeras follows:
290*6dbdd20aSAndroid Build Coastguard Worker
291*6dbdd20aSAndroid Build Coastguard Worker```C++
292*6dbdd20aSAndroid Build Coastguard Workerperfetto::DynamicCategory dynamic_category{"nodejs.something"};
293*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT_BEGIN(dynamic_category, "SomeEvent", ...);
294*6dbdd20aSAndroid Build Coastguard Worker```
295*6dbdd20aSAndroid Build Coastguard Worker
296*6dbdd20aSAndroid Build Coastguard WorkerTIP: It's also possible to use dynamic event names by passing `nullptr` as
297*6dbdd20aSAndroid Build Coastguard Worker    the name and filling in the `TrackEvent::name` field manually.
298*6dbdd20aSAndroid Build Coastguard Worker
299*6dbdd20aSAndroid Build Coastguard WorkerSome trace categories are only useful for testing, and they should not make
300*6dbdd20aSAndroid Build Coastguard Workerit into a production binary. These types of categories can be defined with a
301*6dbdd20aSAndroid Build Coastguard Workerlist of prefix strings:
302*6dbdd20aSAndroid Build Coastguard Worker
303*6dbdd20aSAndroid Build Coastguard Worker```C++
304*6dbdd20aSAndroid Build Coastguard WorkerPERFETTO_DEFINE_TEST_CATEGORY_PREFIXES(
305*6dbdd20aSAndroid Build Coastguard Worker   "test",      // Applies to test.*
306*6dbdd20aSAndroid Build Coastguard Worker   "dontship"   // Applies to dontship.*.
307*6dbdd20aSAndroid Build Coastguard Worker);
308*6dbdd20aSAndroid Build Coastguard Worker```
309*6dbdd20aSAndroid Build Coastguard Worker
310*6dbdd20aSAndroid Build Coastguard Worker## Dynamic event names
311*6dbdd20aSAndroid Build Coastguard Worker
312*6dbdd20aSAndroid Build Coastguard WorkerIdeally all event name should be compile time string constants. For example:
313*6dbdd20aSAndroid Build Coastguard Worker
314*6dbdd20aSAndroid Build Coastguard Worker```C++
315*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT_BEGIN("rendering", "DrawGame");
316*6dbdd20aSAndroid Build Coastguard Worker```
317*6dbdd20aSAndroid Build Coastguard Worker
318*6dbdd20aSAndroid Build Coastguard WorkerHere `"DrawGame"` is a compile time string. If we pass a dynamic string here,
319*6dbdd20aSAndroid Build Coastguard Workerwe will get compile time static_assert failure. For example :
320*6dbdd20aSAndroid Build Coastguard Worker
321*6dbdd20aSAndroid Build Coastguard Worker```C++
322*6dbdd20aSAndroid Build Coastguard Workerconst char* name = "DrawGame";
323*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT_BEGIN("rendering", name);  // Error. Event name is not static.
324*6dbdd20aSAndroid Build Coastguard Worker```
325*6dbdd20aSAndroid Build Coastguard Worker
326*6dbdd20aSAndroid Build Coastguard WorkerThere are two ways to use dynamic event name:
327*6dbdd20aSAndroid Build Coastguard Worker
328*6dbdd20aSAndroid Build Coastguard Worker1) If the event name is actually dynamic (e.g., std::string), write it using
329*6dbdd20aSAndroid Build Coastguard Worker   `perfetto::DynamicString`:
330*6dbdd20aSAndroid Build Coastguard Worker
331*6dbdd20aSAndroid Build Coastguard Worker```C++
332*6dbdd20aSAndroid Build Coastguard Worker  TRACE_EVENT("category", perfetto::DynamicString{dynamic_name});
333*6dbdd20aSAndroid Build Coastguard Worker```
334*6dbdd20aSAndroid Build Coastguard Worker
335*6dbdd20aSAndroid Build Coastguard WorkerNote: Below is the old way of using dynamic event names. It's not recommended
336*6dbdd20aSAndroid Build Coastguard Worker      anymore.
337*6dbdd20aSAndroid Build Coastguard Worker
338*6dbdd20aSAndroid Build Coastguard Worker```C++
339*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT("category", nullptr, [&](perfetto::EventContext ctx) {
340*6dbdd20aSAndroid Build Coastguard Worker  ctx.event()->set_name(dynamic_name);
341*6dbdd20aSAndroid Build Coastguard Worker});
342*6dbdd20aSAndroid Build Coastguard Worker```
343*6dbdd20aSAndroid Build Coastguard Worker
344*6dbdd20aSAndroid Build Coastguard Worker2) If the name is static, but the pointer is computed at runtime, wrap it
345*6dbdd20aSAndroid Build Coastguard Worker   with perfetto::StaticString:
346*6dbdd20aSAndroid Build Coastguard Worker
347*6dbdd20aSAndroid Build Coastguard Worker```C++
348*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT("category", perfetto::StaticString{name});
349*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT("category", perfetto::StaticString{i % 2 == 0 ? "A" : "B"});
350*6dbdd20aSAndroid Build Coastguard Worker```
351*6dbdd20aSAndroid Build Coastguard Worker
352*6dbdd20aSAndroid Build Coastguard WorkerDANGER: Using perfetto::StaticString with strings whose contents change
353*6dbdd20aSAndroid Build Coastguard Worker        dynamically can cause silent trace data corruption.
354*6dbdd20aSAndroid Build Coastguard Worker
355*6dbdd20aSAndroid Build Coastguard Worker## Performance
356*6dbdd20aSAndroid Build Coastguard Worker
357*6dbdd20aSAndroid Build Coastguard WorkerPerfetto's trace points are designed to have minimal overhead when tracing is
358*6dbdd20aSAndroid Build Coastguard Workerdisabled while providing high throughput for data intensive tracing use
359*6dbdd20aSAndroid Build Coastguard Workercases. While exact timings will depend on your system, there is a
360*6dbdd20aSAndroid Build Coastguard Worker[microbenchmark](/src/tracing/api_benchmark.cc) which gives some ballpark
361*6dbdd20aSAndroid Build Coastguard Workerfigures:
362*6dbdd20aSAndroid Build Coastguard Worker
363*6dbdd20aSAndroid Build Coastguard Worker| Scenario | Runtime on Pixel 3 XL | Runtime on ThinkStation P920 |
364*6dbdd20aSAndroid Build Coastguard Worker| -------- | --------------------- | ---------------------------- |
365*6dbdd20aSAndroid Build Coastguard Worker| `TRACE_EVENT(...)` (disabled)              | 2 ns   | 1 ns   |
366*6dbdd20aSAndroid Build Coastguard Worker| `TRACE_EVENT("cat", "name")`               | 285 ns | 630 ns |
367*6dbdd20aSAndroid Build Coastguard Worker| `TRACE_EVENT("cat", "name", <lambda>)`     | 304 ns | 663 ns |
368*6dbdd20aSAndroid Build Coastguard Worker| `TRACE_EVENT("cat", "name", "key", value)` | 354 ns | 664 ns |
369*6dbdd20aSAndroid Build Coastguard Worker| `DataSource::Trace(<lambda>)` (disabled)   | 2 ns   | 1 ns   |
370*6dbdd20aSAndroid Build Coastguard Worker| `DataSource::Trace(<lambda>)`              | 133 ns | 58 ns  |
371*6dbdd20aSAndroid Build Coastguard Worker
372*6dbdd20aSAndroid Build Coastguard Worker## Advanced topics
373*6dbdd20aSAndroid Build Coastguard Worker
374*6dbdd20aSAndroid Build Coastguard Worker### Track event arguments
375*6dbdd20aSAndroid Build Coastguard Worker
376*6dbdd20aSAndroid Build Coastguard WorkerThe following optional arguments can be passed to `TRACE_EVENT` to add extra
377*6dbdd20aSAndroid Build Coastguard Workerinformation to events:
378*6dbdd20aSAndroid Build Coastguard Worker
379*6dbdd20aSAndroid Build Coastguard Worker```C++
380*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT("cat", "name"[, track][, timestamp]
381*6dbdd20aSAndroid Build Coastguard Worker    (, "debug_name", debug_value |, TrackEvent::kFieldName, value)*
382*6dbdd20aSAndroid Build Coastguard Worker    [, lambda]);
383*6dbdd20aSAndroid Build Coastguard Worker```
384*6dbdd20aSAndroid Build Coastguard Worker
385*6dbdd20aSAndroid Build Coastguard WorkerSome examples of valid combinations:
386*6dbdd20aSAndroid Build Coastguard Worker
387*6dbdd20aSAndroid Build Coastguard Worker1. A lambda for writing custom TrackEvent fields:
388*6dbdd20aSAndroid Build Coastguard Worker
389*6dbdd20aSAndroid Build Coastguard Worker   ```C++
390*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", [&](perfetto::EventContext ctx) {
391*6dbdd20aSAndroid Build Coastguard Worker       ctx.event()->set_custom_value(...);
392*6dbdd20aSAndroid Build Coastguard Worker     });
393*6dbdd20aSAndroid Build Coastguard Worker   ```
394*6dbdd20aSAndroid Build Coastguard Worker
395*6dbdd20aSAndroid Build Coastguard Worker2. A timestamp and a lambda:
396*6dbdd20aSAndroid Build Coastguard Worker
397*6dbdd20aSAndroid Build Coastguard Worker   ```C++
398*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", time_in_nanoseconds,
399*6dbdd20aSAndroid Build Coastguard Worker         [&](perfetto::EventContext ctx) {
400*6dbdd20aSAndroid Build Coastguard Worker       ctx.event()->set_custom_value(...);
401*6dbdd20aSAndroid Build Coastguard Worker     });
402*6dbdd20aSAndroid Build Coastguard Worker   ```
403*6dbdd20aSAndroid Build Coastguard Worker
404*6dbdd20aSAndroid Build Coastguard Worker   |time_in_nanoseconds| should be an uint64_t by default. To support custom
405*6dbdd20aSAndroid Build Coastguard Worker   timestamp types,
406*6dbdd20aSAndroid Build Coastguard Worker   |perfetto::TraceTimestampTraits<MyTimestamp>::ConvertTimestampToTraceTimeNs|
407*6dbdd20aSAndroid Build Coastguard Worker   should be defined. See |ConvertTimestampToTraceTimeNs| for more details.
408*6dbdd20aSAndroid Build Coastguard Worker
409*6dbdd20aSAndroid Build Coastguard Worker3. Arbitrary number of debug annotations:
410*6dbdd20aSAndroid Build Coastguard Worker
411*6dbdd20aSAndroid Build Coastguard Worker   ```C++
412*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", "arg", value);
413*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", "arg", value, "arg2", value2);
414*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", "arg", value, "arg2", value2,
415*6dbdd20aSAndroid Build Coastguard Worker                 "arg3", value3);
416*6dbdd20aSAndroid Build Coastguard Worker   ```
417*6dbdd20aSAndroid Build Coastguard Worker
418*6dbdd20aSAndroid Build Coastguard Worker   See |TracedValue| for recording custom types as debug annotations.
419*6dbdd20aSAndroid Build Coastguard Worker
420*6dbdd20aSAndroid Build Coastguard Worker4. Arbitrary number of TrackEvent fields (including extensions):
421*6dbdd20aSAndroid Build Coastguard Worker
422*6dbdd20aSAndroid Build Coastguard Worker  ```C++
423*6dbdd20aSAndroid Build Coastguard Worker    TRACE_EVENT("category", "Name",
424*6dbdd20aSAndroid Build Coastguard Worker                perfetto::protos::pbzero::TrackEvent::kFieldName, value);
425*6dbdd20aSAndroid Build Coastguard Worker  ```
426*6dbdd20aSAndroid Build Coastguard Worker
427*6dbdd20aSAndroid Build Coastguard Worker5. Arbitrary combination of debug annotations and TrackEvent fields:
428*6dbdd20aSAndroid Build Coastguard Worker
429*6dbdd20aSAndroid Build Coastguard Worker  ```C++
430*6dbdd20aSAndroid Build Coastguard Worker    TRACE_EVENT("category", "Name",
431*6dbdd20aSAndroid Build Coastguard Worker                perfetto::protos::pbzero::TrackEvent::kFieldName, value1,
432*6dbdd20aSAndroid Build Coastguard Worker                "arg", value2);
433*6dbdd20aSAndroid Build Coastguard Worker  ```
434*6dbdd20aSAndroid Build Coastguard Worker
435*6dbdd20aSAndroid Build Coastguard Worker6. Arbitrary combination of debug annotations / TrackEvent fields and a lambda:
436*6dbdd20aSAndroid Build Coastguard Worker
437*6dbdd20aSAndroid Build Coastguard Worker   ```C++
438*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", "arg", value1,
439*6dbdd20aSAndroid Build Coastguard Worker                 pbzero::TrackEvent::kFieldName, value2,
440*6dbdd20aSAndroid Build Coastguard Worker                 [&](perfetto::EventContext ctx) {
441*6dbdd20aSAndroid Build Coastguard Worker                     ctx.event()->set_custom_value(...);
442*6dbdd20aSAndroid Build Coastguard Worker                 });
443*6dbdd20aSAndroid Build Coastguard Worker   ```
444*6dbdd20aSAndroid Build Coastguard Worker
445*6dbdd20aSAndroid Build Coastguard Worker7. An overridden track:
446*6dbdd20aSAndroid Build Coastguard Worker
447*6dbdd20aSAndroid Build Coastguard Worker   ```C++
448*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", perfetto::Track(1234));
449*6dbdd20aSAndroid Build Coastguard Worker   ```
450*6dbdd20aSAndroid Build Coastguard Worker
451*6dbdd20aSAndroid Build Coastguard Worker   See |Track| for other types of tracks which may be used.
452*6dbdd20aSAndroid Build Coastguard Worker
453*6dbdd20aSAndroid Build Coastguard Worker8. A track and a lambda:
454*6dbdd20aSAndroid Build Coastguard Worker
455*6dbdd20aSAndroid Build Coastguard Worker   ```C++
456*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", perfetto::Track(1234),
457*6dbdd20aSAndroid Build Coastguard Worker                 [&](perfetto::EventContext ctx) {
458*6dbdd20aSAndroid Build Coastguard Worker                     ctx.event()->set_custom_value(...);
459*6dbdd20aSAndroid Build Coastguard Worker                 });
460*6dbdd20aSAndroid Build Coastguard Worker   ```
461*6dbdd20aSAndroid Build Coastguard Worker
462*6dbdd20aSAndroid Build Coastguard Worker9. A track and a timestamp:
463*6dbdd20aSAndroid Build Coastguard Worker
464*6dbdd20aSAndroid Build Coastguard Worker   ```C++
465*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", perfetto::Track(1234),
466*6dbdd20aSAndroid Build Coastguard Worker                 time_in_nanoseconds);
467*6dbdd20aSAndroid Build Coastguard Worker   ```
468*6dbdd20aSAndroid Build Coastguard Worker
469*6dbdd20aSAndroid Build Coastguard Worker10. A track, a timestamp and a lambda:
470*6dbdd20aSAndroid Build Coastguard Worker
471*6dbdd20aSAndroid Build Coastguard Worker   ```C++
472*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", perfetto::Track(1234),
473*6dbdd20aSAndroid Build Coastguard Worker                 time_in_nanoseconds, [&](perfetto::EventContext ctx) {
474*6dbdd20aSAndroid Build Coastguard Worker                     ctx.event()->set_custom_value(...);
475*6dbdd20aSAndroid Build Coastguard Worker                 });
476*6dbdd20aSAndroid Build Coastguard Worker   ```
477*6dbdd20aSAndroid Build Coastguard Worker
478*6dbdd20aSAndroid Build Coastguard Worker11. A track and any combination of debug annotions and TrackEvent fields:
479*6dbdd20aSAndroid Build Coastguard Worker
480*6dbdd20aSAndroid Build Coastguard Worker   ```C++
481*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", perfetto::Track(1234),
482*6dbdd20aSAndroid Build Coastguard Worker                 "arg", value);
483*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", perfetto::Track(1234),
484*6dbdd20aSAndroid Build Coastguard Worker                 "arg", value, "arg2", value2);
485*6dbdd20aSAndroid Build Coastguard Worker     TRACE_EVENT("category", "Name", perfetto::Track(1234),
486*6dbdd20aSAndroid Build Coastguard Worker                 "arg", value, "arg2", value2,
487*6dbdd20aSAndroid Build Coastguard Worker                 pbzero::TrackEvent::kFieldName, value3);
488*6dbdd20aSAndroid Build Coastguard Worker   ```
489*6dbdd20aSAndroid Build Coastguard Worker
490*6dbdd20aSAndroid Build Coastguard Worker### Tracks
491*6dbdd20aSAndroid Build Coastguard Worker
492*6dbdd20aSAndroid Build Coastguard WorkerEvery track event is associated with a track, which specifies the timeline
493*6dbdd20aSAndroid Build Coastguard Workerthe event belongs to. In most cases, a track corresponds to a visual
494*6dbdd20aSAndroid Build Coastguard Workerhorizontal track in the Perfetto UI like this:
495*6dbdd20aSAndroid Build Coastguard Worker
496*6dbdd20aSAndroid Build Coastguard Worker![Track timelines shown in the Perfetto UI](
497*6dbdd20aSAndroid Build Coastguard Worker  /docs/images/track-timeline.png "Track timelines in the Perfetto UI")
498*6dbdd20aSAndroid Build Coastguard Worker
499*6dbdd20aSAndroid Build Coastguard WorkerEvents that describe parallel sequences (e.g., separate
500*6dbdd20aSAndroid Build Coastguard Workerthreads) should use separate tracks, while sequential events (e.g., nested
501*6dbdd20aSAndroid Build Coastguard Workerfunction calls) generally belong on the same track.
502*6dbdd20aSAndroid Build Coastguard Worker
503*6dbdd20aSAndroid Build Coastguard WorkerPerfetto supports three kinds of tracks:
504*6dbdd20aSAndroid Build Coastguard Worker
505*6dbdd20aSAndroid Build Coastguard Worker- `Track` – a basic timeline.
506*6dbdd20aSAndroid Build Coastguard Worker
507*6dbdd20aSAndroid Build Coastguard Worker- `ProcessTrack` – a timeline that represents a single process in the system.
508*6dbdd20aSAndroid Build Coastguard Worker
509*6dbdd20aSAndroid Build Coastguard Worker- `ThreadTrack` – a timeline that represents a single thread in the system.
510*6dbdd20aSAndroid Build Coastguard Worker
511*6dbdd20aSAndroid Build Coastguard WorkerTracks can have a parent track, which is used to group related tracks
512*6dbdd20aSAndroid Build Coastguard Workertogether. For example, the parent of a `ThreadTrack` is the `ProcessTrack` of
513*6dbdd20aSAndroid Build Coastguard Workerthe process the thread belongs to. By default, tracks are grouped under the
514*6dbdd20aSAndroid Build Coastguard Workercurrent process's `ProcessTrack`.
515*6dbdd20aSAndroid Build Coastguard Worker
516*6dbdd20aSAndroid Build Coastguard WorkerA track is identified by a uuid, which must be unique across the entire
517*6dbdd20aSAndroid Build Coastguard Workerrecorded trace. To minimize the chances of accidental collisions, the uuids
518*6dbdd20aSAndroid Build Coastguard Workerof child tracks are combined with those of their parents, with each
519*6dbdd20aSAndroid Build Coastguard Worker`ProcessTrack` having a random, per-process uuid.
520*6dbdd20aSAndroid Build Coastguard Worker
521*6dbdd20aSAndroid Build Coastguard WorkerBy default, track events (e.g., `TRACE_EVENT`) use the `ThreadTrack` for the
522*6dbdd20aSAndroid Build Coastguard Workercalling thread. This can be overridden, for example, to mark events that
523*6dbdd20aSAndroid Build Coastguard Workerbegin and end on a different thread:
524*6dbdd20aSAndroid Build Coastguard Worker
525*6dbdd20aSAndroid Build Coastguard Worker```C++
526*6dbdd20aSAndroid Build Coastguard Workervoid OnNewRequest(size_t request_id) {
527*6dbdd20aSAndroid Build Coastguard Worker  // Open a slice when the request came in.
528*6dbdd20aSAndroid Build Coastguard Worker  TRACE_EVENT_BEGIN("category", "HandleRequest", perfetto::Track(request_id));
529*6dbdd20aSAndroid Build Coastguard Worker
530*6dbdd20aSAndroid Build Coastguard Worker  // Start a thread to handle the request.
531*6dbdd20aSAndroid Build Coastguard Worker  std::thread worker_thread([=] {
532*6dbdd20aSAndroid Build Coastguard Worker    // ... produce response ...
533*6dbdd20aSAndroid Build Coastguard Worker
534*6dbdd20aSAndroid Build Coastguard Worker    // Close the slice for the request now that we finished handling it.
535*6dbdd20aSAndroid Build Coastguard Worker    TRACE_EVENT_END("category", perfetto::Track(request_id));
536*6dbdd20aSAndroid Build Coastguard Worker  });
537*6dbdd20aSAndroid Build Coastguard Worker```
538*6dbdd20aSAndroid Build Coastguard WorkerTracks can also optionally be annotated with metadata:
539*6dbdd20aSAndroid Build Coastguard Worker
540*6dbdd20aSAndroid Build Coastguard Worker```C++
541*6dbdd20aSAndroid Build Coastguard Workerauto desc = track.Serialize();
542*6dbdd20aSAndroid Build Coastguard Workerdesc.set_name("MyTrack");
543*6dbdd20aSAndroid Build Coastguard Workerperfetto::TrackEvent::SetTrackDescriptor(track, desc);
544*6dbdd20aSAndroid Build Coastguard Worker```
545*6dbdd20aSAndroid Build Coastguard Worker
546*6dbdd20aSAndroid Build Coastguard WorkerThreads and processes can also be named in a similar way, e.g.:
547*6dbdd20aSAndroid Build Coastguard Worker
548*6dbdd20aSAndroid Build Coastguard Worker```C++
549*6dbdd20aSAndroid Build Coastguard Workerauto desc = perfetto::ProcessTrack::Current().Serialize();
550*6dbdd20aSAndroid Build Coastguard Workerdesc.mutable_process()->set_process_name("MyProcess");
551*6dbdd20aSAndroid Build Coastguard Workerperfetto::TrackEvent::SetTrackDescriptor(
552*6dbdd20aSAndroid Build Coastguard Worker    perfetto::ProcessTrack::Current(), desc);
553*6dbdd20aSAndroid Build Coastguard Worker```
554*6dbdd20aSAndroid Build Coastguard Worker
555*6dbdd20aSAndroid Build Coastguard WorkerThe metadata remains valid between tracing sessions. To free up data for a
556*6dbdd20aSAndroid Build Coastguard Workertrack, call EraseTrackDescriptor:
557*6dbdd20aSAndroid Build Coastguard Worker
558*6dbdd20aSAndroid Build Coastguard Worker```C++
559*6dbdd20aSAndroid Build Coastguard Workerperfetto::TrackEvent::EraseTrackDescriptor(track);
560*6dbdd20aSAndroid Build Coastguard Worker```
561*6dbdd20aSAndroid Build Coastguard Worker
562*6dbdd20aSAndroid Build Coastguard Worker### Flows
563*6dbdd20aSAndroid Build Coastguard Worker
564*6dbdd20aSAndroid Build Coastguard WorkerFlows can be used to link two (or more) events (slices or instants), to mark
565*6dbdd20aSAndroid Build Coastguard Workerthem as related.
566*6dbdd20aSAndroid Build Coastguard Worker
567*6dbdd20aSAndroid Build Coastguard WorkerThe link is displayed as an arrow in the UI, when one of the events is selected:
568*6dbdd20aSAndroid Build Coastguard Worker
569*6dbdd20aSAndroid Build Coastguard Worker![A flow between two slices in the Perfetto UI](
570*6dbdd20aSAndroid Build Coastguard Worker  /docs/images/flows.png "A flow between two slices in the Perfetto UI")
571*6dbdd20aSAndroid Build Coastguard Worker
572*6dbdd20aSAndroid Build Coastguard Worker```C++
573*6dbdd20aSAndroid Build Coastguard Worker// The same identifier is used in both the related slices.
574*6dbdd20aSAndroid Build Coastguard Workeruint64_t request_id = GetRequestId();
575*6dbdd20aSAndroid Build Coastguard Worker
576*6dbdd20aSAndroid Build Coastguard Worker{
577*6dbdd20aSAndroid Build Coastguard Worker  TRACE_EVENT("rendering", "HandleRequestPhase1",
578*6dbdd20aSAndroid Build Coastguard Worker              perfetto::Flow::ProcessScoped(request_id));
579*6dbdd20aSAndroid Build Coastguard Worker  //...
580*6dbdd20aSAndroid Build Coastguard Worker}
581*6dbdd20aSAndroid Build Coastguard Worker
582*6dbdd20aSAndroid Build Coastguard Workerstd::thread t1([&] {
583*6dbdd20aSAndroid Build Coastguard Worker  TRACE_EVENT("rendering", "HandleRequestPhase2",
584*6dbdd20aSAndroid Build Coastguard Worker              perfetto::TerminatingFlow::ProcessScoped(request_id));
585*6dbdd20aSAndroid Build Coastguard Worker  //...
586*6dbdd20aSAndroid Build Coastguard Worker});
587*6dbdd20aSAndroid Build Coastguard Worker```
588*6dbdd20aSAndroid Build Coastguard Worker
589*6dbdd20aSAndroid Build Coastguard Worker### Counters
590*6dbdd20aSAndroid Build Coastguard Worker
591*6dbdd20aSAndroid Build Coastguard WorkerTime-varying numeric data can be recorded with the `TRACE_COUNTER` macro:
592*6dbdd20aSAndroid Build Coastguard Worker
593*6dbdd20aSAndroid Build Coastguard Worker```C++
594*6dbdd20aSAndroid Build Coastguard WorkerTRACE_COUNTER("category", "MyCounter", 1234.5);
595*6dbdd20aSAndroid Build Coastguard Worker```
596*6dbdd20aSAndroid Build Coastguard Worker
597*6dbdd20aSAndroid Build Coastguard WorkerThis data is displayed as a counter track in the Perfetto UI:
598*6dbdd20aSAndroid Build Coastguard Worker
599*6dbdd20aSAndroid Build Coastguard Worker![A counter track shown in the Perfetto UI](
600*6dbdd20aSAndroid Build Coastguard Worker  /docs/images/counter-events.png "A counter track shown in the Perfetto UI")
601*6dbdd20aSAndroid Build Coastguard Worker
602*6dbdd20aSAndroid Build Coastguard WorkerBoth integer and floating point counter values are supported. Counters can
603*6dbdd20aSAndroid Build Coastguard Workeralso be annotated with additional information such as units, for example, for
604*6dbdd20aSAndroid Build Coastguard Workertracking the rendering framerate in terms of frames per second or "fps":
605*6dbdd20aSAndroid Build Coastguard Worker
606*6dbdd20aSAndroid Build Coastguard Worker```C++
607*6dbdd20aSAndroid Build Coastguard WorkerTRACE_COUNTER("category", perfetto::CounterTrack("Framerate", "fps"), 120);
608*6dbdd20aSAndroid Build Coastguard Worker```
609*6dbdd20aSAndroid Build Coastguard Worker
610*6dbdd20aSAndroid Build Coastguard WorkerAs another example, a memory counter that records bytes but accepts samples
611*6dbdd20aSAndroid Build Coastguard Workeras kilobytes (to reduce trace binary size) can be defined like this:
612*6dbdd20aSAndroid Build Coastguard Worker
613*6dbdd20aSAndroid Build Coastguard Worker```C++
614*6dbdd20aSAndroid Build Coastguard Workerperfetto::CounterTrack memory_track = perfetto::CounterTrack("Memory")
615*6dbdd20aSAndroid Build Coastguard Worker    .set_unit("bytes")
616*6dbdd20aSAndroid Build Coastguard Worker    .set_multiplier(1024);
617*6dbdd20aSAndroid Build Coastguard WorkerTRACE_COUNTER("category", memory_track, 4 /* = 4096 bytes */);
618*6dbdd20aSAndroid Build Coastguard Worker```
619*6dbdd20aSAndroid Build Coastguard Worker
620*6dbdd20aSAndroid Build Coastguard WorkerSee
621*6dbdd20aSAndroid Build Coastguard Worker[counter_descriptor.proto](
622*6dbdd20aSAndroid Build Coastguard Worker/protos/perfetto/trace/track_event/counter_descriptor.proto) for the full set
623*6dbdd20aSAndroid Build Coastguard Workerof attributes for a counter track.
624*6dbdd20aSAndroid Build Coastguard Worker
625*6dbdd20aSAndroid Build Coastguard WorkerTo record a counter value at a specific point in time (instead of the current
626*6dbdd20aSAndroid Build Coastguard Workertime), you can pass in a custom timestamp:
627*6dbdd20aSAndroid Build Coastguard Worker
628*6dbdd20aSAndroid Build Coastguard Worker```C++
629*6dbdd20aSAndroid Build Coastguard Worker// First record the current time and counter value.
630*6dbdd20aSAndroid Build Coastguard Workeruint64_t timestamp = perfetto::TrackEvent::GetTraceTimeNs();
631*6dbdd20aSAndroid Build Coastguard Workerint64_t value = 1234;
632*6dbdd20aSAndroid Build Coastguard Worker
633*6dbdd20aSAndroid Build Coastguard Worker// Later, emit a sample at that point in time.
634*6dbdd20aSAndroid Build Coastguard WorkerTRACE_COUNTER("category", "MyCounter", timestamp, value);
635*6dbdd20aSAndroid Build Coastguard Worker```
636*6dbdd20aSAndroid Build Coastguard Worker
637*6dbdd20aSAndroid Build Coastguard Worker### Interning
638*6dbdd20aSAndroid Build Coastguard Worker
639*6dbdd20aSAndroid Build Coastguard WorkerInterning can be used to avoid repeating the same constant data (e.g., event
640*6dbdd20aSAndroid Build Coastguard Workernames) throughout the trace. Perfetto automatically performs interning for
641*6dbdd20aSAndroid Build Coastguard Workermost strings passed to `TRACE_EVENT`, but it's also possible to also define
642*6dbdd20aSAndroid Build Coastguard Workeryour own types of interned data.
643*6dbdd20aSAndroid Build Coastguard Worker
644*6dbdd20aSAndroid Build Coastguard WorkerFirst, define an interning index for your type. It should map to a specific
645*6dbdd20aSAndroid Build Coastguard Workerfield of
646*6dbdd20aSAndroid Build Coastguard Worker[interned_data.proto](/protos/perfetto/trace/interned_data/interned_data.proto)
647*6dbdd20aSAndroid Build Coastguard Workerand specify how the interned data is written into that message when seen for
648*6dbdd20aSAndroid Build Coastguard Workerthe first time.
649*6dbdd20aSAndroid Build Coastguard Worker
650*6dbdd20aSAndroid Build Coastguard Worker```C++
651*6dbdd20aSAndroid Build Coastguard Workerstruct MyInternedData
652*6dbdd20aSAndroid Build Coastguard Worker    : public perfetto::TrackEventInternedDataIndex<
653*6dbdd20aSAndroid Build Coastguard Worker        MyInternedData,
654*6dbdd20aSAndroid Build Coastguard Worker        perfetto::protos::pbzero::InternedData::kMyInternedDataFieldNumber,
655*6dbdd20aSAndroid Build Coastguard Worker        const char*> {
656*6dbdd20aSAndroid Build Coastguard Worker  static void Add(perfetto::protos::pbzero::InternedData* interned_data,
657*6dbdd20aSAndroid Build Coastguard Worker                   size_t iid,
658*6dbdd20aSAndroid Build Coastguard Worker                   const char* value) {
659*6dbdd20aSAndroid Build Coastguard Worker    auto my_data = interned_data->add_my_interned_data();
660*6dbdd20aSAndroid Build Coastguard Worker    my_data->set_iid(iid);
661*6dbdd20aSAndroid Build Coastguard Worker    my_data->set_value(value);
662*6dbdd20aSAndroid Build Coastguard Worker  }
663*6dbdd20aSAndroid Build Coastguard Worker};
664*6dbdd20aSAndroid Build Coastguard Worker```
665*6dbdd20aSAndroid Build Coastguard Worker
666*6dbdd20aSAndroid Build Coastguard WorkerNext, use your interned data in a trace point as shown below. The interned
667*6dbdd20aSAndroid Build Coastguard Workerstring will only be emitted the first time the trace point is hit (unless the
668*6dbdd20aSAndroid Build Coastguard Workertrace buffer has wrapped around).
669*6dbdd20aSAndroid Build Coastguard Worker
670*6dbdd20aSAndroid Build Coastguard Worker```C++
671*6dbdd20aSAndroid Build Coastguard WorkerTRACE_EVENT(
672*6dbdd20aSAndroid Build Coastguard Worker   "category", "Event", [&](perfetto::EventContext ctx) {
673*6dbdd20aSAndroid Build Coastguard Worker     auto my_message = ctx.event()->set_my_message();
674*6dbdd20aSAndroid Build Coastguard Worker     size_t iid = MyInternedData::Get(&ctx, "Repeated data to be interned");
675*6dbdd20aSAndroid Build Coastguard Worker     my_message->set_iid(iid);
676*6dbdd20aSAndroid Build Coastguard Worker   });
677*6dbdd20aSAndroid Build Coastguard Worker```
678*6dbdd20aSAndroid Build Coastguard Worker
679*6dbdd20aSAndroid Build Coastguard WorkerNote that interned data is strongly typed, i.e., each class of interned data
680*6dbdd20aSAndroid Build Coastguard Workeruses a separate namespace for identifiers.
681*6dbdd20aSAndroid Build Coastguard Worker
682*6dbdd20aSAndroid Build Coastguard Worker### Tracing session observers
683*6dbdd20aSAndroid Build Coastguard Worker
684*6dbdd20aSAndroid Build Coastguard WorkerThe session observer interface allows applications to be notified when track
685*6dbdd20aSAndroid Build Coastguard Workerevent tracing starts and stops:
686*6dbdd20aSAndroid Build Coastguard Worker
687*6dbdd20aSAndroid Build Coastguard Worker```C++
688*6dbdd20aSAndroid Build Coastguard Workerclass Observer : public perfetto::TrackEventSessionObserver {
689*6dbdd20aSAndroid Build Coastguard Worker  public:
690*6dbdd20aSAndroid Build Coastguard Worker  ~Observer() override = default;
691*6dbdd20aSAndroid Build Coastguard Worker
692*6dbdd20aSAndroid Build Coastguard Worker  void OnSetup(const perfetto::DataSourceBase::SetupArgs&) override {
693*6dbdd20aSAndroid Build Coastguard Worker    // Called when tracing session is configured. Note tracing isn't active yet,
694*6dbdd20aSAndroid Build Coastguard Worker    // so track events emitted here won't be recorded.
695*6dbdd20aSAndroid Build Coastguard Worker  }
696*6dbdd20aSAndroid Build Coastguard Worker
697*6dbdd20aSAndroid Build Coastguard Worker  void OnStart(const perfetto::DataSourceBase::StartArgs&) override {
698*6dbdd20aSAndroid Build Coastguard Worker    // Called when a tracing session is started. It is possible to emit track
699*6dbdd20aSAndroid Build Coastguard Worker    // events from this callback.
700*6dbdd20aSAndroid Build Coastguard Worker  }
701*6dbdd20aSAndroid Build Coastguard Worker
702*6dbdd20aSAndroid Build Coastguard Worker  void OnStop(const perfetto::DataSourceBase::StopArgs&) override {
703*6dbdd20aSAndroid Build Coastguard Worker    // Called when a tracing session is stopped. It is still possible to emit
704*6dbdd20aSAndroid Build Coastguard Worker    // track events from this callback.
705*6dbdd20aSAndroid Build Coastguard Worker  }
706*6dbdd20aSAndroid Build Coastguard Worker};
707*6dbdd20aSAndroid Build Coastguard Worker```
708*6dbdd20aSAndroid Build Coastguard Worker
709*6dbdd20aSAndroid Build Coastguard WorkerNote that all methods of the interface are called on an internal Perfetto
710*6dbdd20aSAndroid Build Coastguard Workerthread.
711*6dbdd20aSAndroid Build Coastguard Worker
712*6dbdd20aSAndroid Build Coastguard WorkerFor example, here's how to wait for any tracing session to start:
713*6dbdd20aSAndroid Build Coastguard Worker
714*6dbdd20aSAndroid Build Coastguard Worker```C++
715*6dbdd20aSAndroid Build Coastguard Workerclass Observer : public perfetto::TrackEventSessionObserver {
716*6dbdd20aSAndroid Build Coastguard Worker public:
717*6dbdd20aSAndroid Build Coastguard Worker  Observer() { perfetto::TrackEvent::AddSessionObserver(this); }
718*6dbdd20aSAndroid Build Coastguard Worker  ~Observer() { perfetto::TrackEvent::RemoveSessionObserver(this); }
719*6dbdd20aSAndroid Build Coastguard Worker
720*6dbdd20aSAndroid Build Coastguard Worker  void OnStart(const perfetto::DataSourceBase::StartArgs&) override {
721*6dbdd20aSAndroid Build Coastguard Worker    std::unique_lock<std::mutex> lock(mutex);
722*6dbdd20aSAndroid Build Coastguard Worker    cv.notify_one();
723*6dbdd20aSAndroid Build Coastguard Worker  }
724*6dbdd20aSAndroid Build Coastguard Worker
725*6dbdd20aSAndroid Build Coastguard Worker  void WaitForTracingStart() {
726*6dbdd20aSAndroid Build Coastguard Worker    printf("Waiting for tracing to start...\n");
727*6dbdd20aSAndroid Build Coastguard Worker    std::unique_lock<std::mutex> lock(mutex);
728*6dbdd20aSAndroid Build Coastguard Worker    cv.wait(lock, [] { return perfetto::TrackEvent::IsEnabled(); });
729*6dbdd20aSAndroid Build Coastguard Worker    printf("Tracing started\n");
730*6dbdd20aSAndroid Build Coastguard Worker  }
731*6dbdd20aSAndroid Build Coastguard Worker
732*6dbdd20aSAndroid Build Coastguard Worker  std::mutex mutex;
733*6dbdd20aSAndroid Build Coastguard Worker  std::condition_variable cv;
734*6dbdd20aSAndroid Build Coastguard Worker};
735*6dbdd20aSAndroid Build Coastguard Worker
736*6dbdd20aSAndroid Build Coastguard WorkerObserver observer;
737*6dbdd20aSAndroid Build Coastguard Workerobserver.WaitForTracingToStart();
738*6dbdd20aSAndroid Build Coastguard Worker```
739*6dbdd20aSAndroid Build Coastguard Worker
740*6dbdd20aSAndroid Build Coastguard Worker[RAII]: https://en.cppreference.com/w/cpp/language/raii
741