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 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 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 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 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