1*6dbdd20aSAndroid Build Coastguard Worker# Trace configuration 2*6dbdd20aSAndroid Build Coastguard Worker 3*6dbdd20aSAndroid Build Coastguard WorkerUnlike many always-on logging systems (e.g. Linux's rsyslog, Android's logcat), 4*6dbdd20aSAndroid Build Coastguard Workerin Perfetto all tracing data sources are idle by default and record data only 5*6dbdd20aSAndroid Build Coastguard Workerwhen instructed to do so. 6*6dbdd20aSAndroid Build Coastguard Worker 7*6dbdd20aSAndroid Build Coastguard WorkerData sources record data only when one (or more) tracing sessions are active. A 8*6dbdd20aSAndroid Build Coastguard Workertracing session is started by invoking the `perfetto` cmdline client and passing 9*6dbdd20aSAndroid Build Coastguard Workera config (see QuickStart guide for 10*6dbdd20aSAndroid Build Coastguard Worker[Android](/docs/quickstart/android-tracing.md), 11*6dbdd20aSAndroid Build Coastguard Worker[Linux](/docs/quickstart/linux-tracing.md), or 12*6dbdd20aSAndroid Build Coastguard Worker[Chrome on desktop](/docs/quickstart/chrome-tracing.md)). 13*6dbdd20aSAndroid Build Coastguard Worker 14*6dbdd20aSAndroid Build Coastguard WorkerA simple trace config looks like this: 15*6dbdd20aSAndroid Build Coastguard Worker 16*6dbdd20aSAndroid Build Coastguard Worker```protobuf 17*6dbdd20aSAndroid Build Coastguard Workerduration_ms: 10000 18*6dbdd20aSAndroid Build Coastguard Worker 19*6dbdd20aSAndroid Build Coastguard Workerbuffers { 20*6dbdd20aSAndroid Build Coastguard Worker size_kb: 65536 21*6dbdd20aSAndroid Build Coastguard Worker fill_policy: RING_BUFFER 22*6dbdd20aSAndroid Build Coastguard Worker} 23*6dbdd20aSAndroid Build Coastguard Worker 24*6dbdd20aSAndroid Build Coastguard Workerdata_sources { 25*6dbdd20aSAndroid Build Coastguard Worker config { 26*6dbdd20aSAndroid Build Coastguard Worker name: "linux.ftrace" 27*6dbdd20aSAndroid Build Coastguard Worker target_buffer: 0 28*6dbdd20aSAndroid Build Coastguard Worker ftrace_config { 29*6dbdd20aSAndroid Build Coastguard Worker ftrace_events: "sched_switch" 30*6dbdd20aSAndroid Build Coastguard Worker ftrace_events: "sched_wakeup" 31*6dbdd20aSAndroid Build Coastguard Worker } 32*6dbdd20aSAndroid Build Coastguard Worker } 33*6dbdd20aSAndroid Build Coastguard Worker} 34*6dbdd20aSAndroid Build Coastguard Worker 35*6dbdd20aSAndroid Build Coastguard Worker``` 36*6dbdd20aSAndroid Build Coastguard Worker 37*6dbdd20aSAndroid Build Coastguard WorkerAnd is used as follows: 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard Worker```bash 40*6dbdd20aSAndroid Build Coastguard Workerperfetto --txt -c config.pbtx -o trace_file.perfetto-trace 41*6dbdd20aSAndroid Build Coastguard Worker``` 42*6dbdd20aSAndroid Build Coastguard Worker 43*6dbdd20aSAndroid Build Coastguard WorkerTIP: Some more complete examples of trace configs can be found in the repo in 44*6dbdd20aSAndroid Build Coastguard Worker[`/test/configs/`](/test/configs/). 45*6dbdd20aSAndroid Build Coastguard Worker 46*6dbdd20aSAndroid Build Coastguard WorkerNOTE: If you are tracing on Android using adb and experiencing problems, see 47*6dbdd20aSAndroid Build Coastguard Worker[the Android section](#android) below. 48*6dbdd20aSAndroid Build Coastguard Worker 49*6dbdd20aSAndroid Build Coastguard Worker## TraceConfig 50*6dbdd20aSAndroid Build Coastguard Worker 51*6dbdd20aSAndroid Build Coastguard WorkerThe TraceConfig is a protobuf message 52*6dbdd20aSAndroid Build Coastguard Worker([reference docs](/docs/reference/trace-config-proto.autogen)) that defines: 53*6dbdd20aSAndroid Build Coastguard Worker 54*6dbdd20aSAndroid Build Coastguard Worker1. The general behavior of the whole tracing system, e.g.: 55*6dbdd20aSAndroid Build Coastguard Worker 56*6dbdd20aSAndroid Build Coastguard Worker - The max duration of the trace. 57*6dbdd20aSAndroid Build Coastguard Worker - The number of in-memory buffers and their size. 58*6dbdd20aSAndroid Build Coastguard Worker - The max size of the output trace file. 59*6dbdd20aSAndroid Build Coastguard Worker 60*6dbdd20aSAndroid Build Coastguard Worker2. Which data sources to enable and their configuration, e.g.: 61*6dbdd20aSAndroid Build Coastguard Worker 62*6dbdd20aSAndroid Build Coastguard Worker - For the [kernel tracing data source](/docs/data-sources/cpu-scheduling.md) 63*6dbdd20aSAndroid Build Coastguard Worker , which ftrace events to enable. 64*6dbdd20aSAndroid Build Coastguard Worker - For the [heap profiler](/docs/data-sources/native-heap-profiler.md), the 65*6dbdd20aSAndroid Build Coastguard Worker target process name and sampling rate. 66*6dbdd20aSAndroid Build Coastguard Worker 67*6dbdd20aSAndroid Build Coastguard Worker See the _data sources_ section of the docs for details on how to configure 68*6dbdd20aSAndroid Build Coastguard Worker the data sources bundled with Perfetto. 69*6dbdd20aSAndroid Build Coastguard Worker 70*6dbdd20aSAndroid Build Coastguard Worker3. The `{data source} x {buffer}` mappings: which buffer each data source should 71*6dbdd20aSAndroid Build Coastguard Worker write into (see [buffers section](#buffers) below). 72*6dbdd20aSAndroid Build Coastguard Worker 73*6dbdd20aSAndroid Build Coastguard WorkerThe tracing service (`traced`) acts as a configuration dispatcher: it receives a 74*6dbdd20aSAndroid Build Coastguard Workerconfig from the `perfetto` cmdline client (or any other 75*6dbdd20aSAndroid Build Coastguard Worker[Consumer](/docs/concepts/service-model.md#consumer)) and forwards parts of the 76*6dbdd20aSAndroid Build Coastguard Workerconfig to the various [Producers](/docs/concepts/service-model.md#producer) 77*6dbdd20aSAndroid Build Coastguard Workerconnected. 78*6dbdd20aSAndroid Build Coastguard Worker 79*6dbdd20aSAndroid Build Coastguard WorkerWhen a tracing session is started by a consumer, the tracing service will: 80*6dbdd20aSAndroid Build Coastguard Worker 81*6dbdd20aSAndroid Build Coastguard Worker- Read the outer section of the TraceConfig (e.g. `duration_ms`, `buffers`) and 82*6dbdd20aSAndroid Build Coastguard Worker use that to determine its own behavior. 83*6dbdd20aSAndroid Build Coastguard Worker- Read the list of data sources in the `data_sources` section. For each data 84*6dbdd20aSAndroid Build Coastguard Worker source listed in the config, if a corresponding name (`"linux.ftrace"` in the 85*6dbdd20aSAndroid Build Coastguard Worker example below) was registered, the service will ask the producer process to 86*6dbdd20aSAndroid Build Coastguard Worker start that data source, passing it the raw bytes of the [`DataSourceConfig` 87*6dbdd20aSAndroid Build Coastguard Worker subsection][dss] verbatim to the data source (See backward/forward compat 88*6dbdd20aSAndroid Build Coastguard Worker section below). 89*6dbdd20aSAndroid Build Coastguard Worker 90*6dbdd20aSAndroid Build Coastguard Worker 91*6dbdd20aSAndroid Build Coastguard Worker 92*6dbdd20aSAndroid Build Coastguard Worker[dss]: /docs/reference/trace-config-proto.autogen#DataSourceConfig 93*6dbdd20aSAndroid Build Coastguard Worker 94*6dbdd20aSAndroid Build Coastguard Worker## Buffers 95*6dbdd20aSAndroid Build Coastguard Worker 96*6dbdd20aSAndroid Build Coastguard WorkerThe buffer sections define the number, size and policy of the in-memory buffers 97*6dbdd20aSAndroid Build Coastguard Workerowned by the tracing service. It looks as follows: 98*6dbdd20aSAndroid Build Coastguard Worker 99*6dbdd20aSAndroid Build Coastguard Worker```protobuf 100*6dbdd20aSAndroid Build Coastguard Worker# Buffer #0 101*6dbdd20aSAndroid Build Coastguard Workerbuffers { 102*6dbdd20aSAndroid Build Coastguard Worker size_kb: 4096 103*6dbdd20aSAndroid Build Coastguard Worker fill_policy: RING_BUFFER 104*6dbdd20aSAndroid Build Coastguard Worker} 105*6dbdd20aSAndroid Build Coastguard Worker 106*6dbdd20aSAndroid Build Coastguard Worker# Buffer #1 107*6dbdd20aSAndroid Build Coastguard Workerbuffers { 108*6dbdd20aSAndroid Build Coastguard Worker size_kb: 8192 109*6dbdd20aSAndroid Build Coastguard Worker fill_policy: DISCARD 110*6dbdd20aSAndroid Build Coastguard Worker} 111*6dbdd20aSAndroid Build Coastguard Worker``` 112*6dbdd20aSAndroid Build Coastguard Worker 113*6dbdd20aSAndroid Build Coastguard WorkerEach buffer has a fill policy which is either: 114*6dbdd20aSAndroid Build Coastguard Worker 115*6dbdd20aSAndroid Build Coastguard Worker- RING_BUFFER (default): the buffer behaves like a ring buffer and writes when 116*6dbdd20aSAndroid Build Coastguard Worker full will wrap over and replace the oldest trace data in the buffer. 117*6dbdd20aSAndroid Build Coastguard Worker 118*6dbdd20aSAndroid Build Coastguard Worker- DISCARD: the buffer stops accepting data once full. Further write attempts are 119*6dbdd20aSAndroid Build Coastguard Worker dropped. 120*6dbdd20aSAndroid Build Coastguard Worker 121*6dbdd20aSAndroid Build Coastguard WorkerWARNING: DISCARD can have unexpected side-effect with data sources that commit 122*6dbdd20aSAndroid Build Coastguard Workerdata at the end of the trace. 123*6dbdd20aSAndroid Build Coastguard Worker 124*6dbdd20aSAndroid Build Coastguard WorkerA trace config must define at least one buffer to be valid. In the simplest case 125*6dbdd20aSAndroid Build Coastguard Workerall data sources will write their trace data into the same buffer. 126*6dbdd20aSAndroid Build Coastguard Worker 127*6dbdd20aSAndroid Build Coastguard WorkerWhile this is fine for most basic cases, it can be problematic in cases where 128*6dbdd20aSAndroid Build Coastguard Workerdifferent data sources write at significantly different rates. 129*6dbdd20aSAndroid Build Coastguard Worker 130*6dbdd20aSAndroid Build Coastguard WorkerFor instance, imagine a trace config that enables both: 131*6dbdd20aSAndroid Build Coastguard Worker 132*6dbdd20aSAndroid Build Coastguard Worker1. The kernel scheduler tracer. On a typical Android phone this records ~10000 133*6dbdd20aSAndroid Build Coastguard Worker events/second, writing ~1 MB/s of trace data into the buffer. 134*6dbdd20aSAndroid Build Coastguard Worker 135*6dbdd20aSAndroid Build Coastguard Worker2. Memory stat polling. This data source writes the contents of /proc/meminfo 136*6dbdd20aSAndroid Build Coastguard Worker into the trace buffer and is configured to poll every 5 seconds, writing ~100 137*6dbdd20aSAndroid Build Coastguard Worker KB per poll interval. 138*6dbdd20aSAndroid Build Coastguard Worker 139*6dbdd20aSAndroid Build Coastguard WorkerIf both data sources are configured to write into the same buffer and such 140*6dbdd20aSAndroid Build Coastguard Workerbuffer is set to 4MB, most traces will contain only one memory snapshot. There 141*6dbdd20aSAndroid Build Coastguard Workerare very good chances that most traces won't contain any memory snapshot at all, 142*6dbdd20aSAndroid Build Coastguard Workereven if the 2nd data sources was working perfectly. This is because during the 5 143*6dbdd20aSAndroid Build Coastguard Workers. polling interval, the scheduler data source can end up filling the whole 144*6dbdd20aSAndroid Build Coastguard Workerbuffer, pushing the memory snapshot data out of the buffer. 145*6dbdd20aSAndroid Build Coastguard Worker 146*6dbdd20aSAndroid Build Coastguard Worker## Dynamic buffer mapping 147*6dbdd20aSAndroid Build Coastguard Worker 148*6dbdd20aSAndroid Build Coastguard WorkerData-source <> buffer mappings are dynamic in Perfetto. In the simplest case a 149*6dbdd20aSAndroid Build Coastguard Workertracing session can define only one buffer. By default, all data sources will 150*6dbdd20aSAndroid Build Coastguard Workerrecord data into that one buffer. 151*6dbdd20aSAndroid Build Coastguard Worker 152*6dbdd20aSAndroid Build Coastguard WorkerIn cases like the example above, it might be preferable separating these data 153*6dbdd20aSAndroid Build Coastguard Workersources into different buffers. This can be achieved with the `target_buffer` 154*6dbdd20aSAndroid Build Coastguard Workerfield of the TraceConfig. 155*6dbdd20aSAndroid Build Coastguard Worker 156*6dbdd20aSAndroid Build Coastguard Worker 157*6dbdd20aSAndroid Build Coastguard Worker 158*6dbdd20aSAndroid Build Coastguard WorkerCan be achieved with: 159*6dbdd20aSAndroid Build Coastguard Worker 160*6dbdd20aSAndroid Build Coastguard Worker```protobuf 161*6dbdd20aSAndroid Build Coastguard Workerdata_sources { 162*6dbdd20aSAndroid Build Coastguard Worker config { 163*6dbdd20aSAndroid Build Coastguard Worker name: "linux.ftrace" 164*6dbdd20aSAndroid Build Coastguard Worker target_buffer: 0 # <-- This goes into buffer 0. 165*6dbdd20aSAndroid Build Coastguard Worker ftrace_config { ... } 166*6dbdd20aSAndroid Build Coastguard Worker } 167*6dbdd20aSAndroid Build Coastguard Worker} 168*6dbdd20aSAndroid Build Coastguard Worker 169*6dbdd20aSAndroid Build Coastguard Workerdata_sources: { 170*6dbdd20aSAndroid Build Coastguard Worker config { 171*6dbdd20aSAndroid Build Coastguard Worker name: "linux.sys_stats" 172*6dbdd20aSAndroid Build Coastguard Worker target_buffer: 1 # <-- This goes into buffer 1. 173*6dbdd20aSAndroid Build Coastguard Worker sys_stats_config { ... } 174*6dbdd20aSAndroid Build Coastguard Worker } 175*6dbdd20aSAndroid Build Coastguard Worker} 176*6dbdd20aSAndroid Build Coastguard Worker 177*6dbdd20aSAndroid Build Coastguard Workerdata_sources: { 178*6dbdd20aSAndroid Build Coastguard Worker config { 179*6dbdd20aSAndroid Build Coastguard Worker name: "android.heapprofd" 180*6dbdd20aSAndroid Build Coastguard Worker target_buffer: 1 # <-- This goes into buffer 1 as well. 181*6dbdd20aSAndroid Build Coastguard Worker heapprofd_config { ... } 182*6dbdd20aSAndroid Build Coastguard Worker } 183*6dbdd20aSAndroid Build Coastguard Worker} 184*6dbdd20aSAndroid Build Coastguard Worker``` 185*6dbdd20aSAndroid Build Coastguard Worker 186*6dbdd20aSAndroid Build Coastguard Worker## PBTX vs binary format 187*6dbdd20aSAndroid Build Coastguard Worker 188*6dbdd20aSAndroid Build Coastguard WorkerThere are two ways to pass the trace config when using the `perfetto` cmdline 189*6dbdd20aSAndroid Build Coastguard Workerclient format: 190*6dbdd20aSAndroid Build Coastguard Worker 191*6dbdd20aSAndroid Build Coastguard Worker#### Text format 192*6dbdd20aSAndroid Build Coastguard Worker 193*6dbdd20aSAndroid Build Coastguard WorkerIt is the preferred format for human-driven workflows and exploration. It allows 194*6dbdd20aSAndroid Build Coastguard Workerto pass directly the text file in the PBTX (ProtoBuf TeXtual representation) 195*6dbdd20aSAndroid Build Coastguard Workersyntax, for the schema defined in the 196*6dbdd20aSAndroid Build Coastguard Worker[trace_config.proto](/protos/perfetto/config/trace_config.proto) (see 197*6dbdd20aSAndroid Build Coastguard Worker[reference docs](/docs/reference/trace-config-proto.autogen)) 198*6dbdd20aSAndroid Build Coastguard Worker 199*6dbdd20aSAndroid Build Coastguard WorkerWhen using this mode pass the `--txt` flag to `perfetto` to indicate the config 200*6dbdd20aSAndroid Build Coastguard Workershould be interpreted as a PBTX file: 201*6dbdd20aSAndroid Build Coastguard Worker 202*6dbdd20aSAndroid Build Coastguard Worker```bash 203*6dbdd20aSAndroid Build Coastguard Workerperfetto -c /path/to/config.pbtx --txt -o trace_file.perfetto-trace 204*6dbdd20aSAndroid Build Coastguard Worker``` 205*6dbdd20aSAndroid Build Coastguard Worker 206*6dbdd20aSAndroid Build Coastguard WorkerNOTE: The `--txt` option has been introduced only in Android 10 (Q). Older 207*6dbdd20aSAndroid Build Coastguard Workerversions support only the binary format. 208*6dbdd20aSAndroid Build Coastguard Worker 209*6dbdd20aSAndroid Build Coastguard WorkerWARNING: Do not use the text format for machine-to-machine interaction 210*6dbdd20aSAndroid Build Coastguard Workerbenchmark, scripts and tools) as it's more prone to breakages (e.g. if a field 211*6dbdd20aSAndroid Build Coastguard Workeris renamed or an enum is turned into an integer) 212*6dbdd20aSAndroid Build Coastguard Worker 213*6dbdd20aSAndroid Build Coastguard Worker#### Binary format 214*6dbdd20aSAndroid Build Coastguard Worker 215*6dbdd20aSAndroid Build Coastguard WorkerIt is the preferred format for machine-to-machine (M2M) interaction. It involves 216*6dbdd20aSAndroid Build Coastguard Workerpassing the protobuf-encoded binary of the TraceConfig message. This can be 217*6dbdd20aSAndroid Build Coastguard Workerobtained passing the PBTX in input to the protobuf's `protoc` compiler (which 218*6dbdd20aSAndroid Build Coastguard Workercan be downloaded [here](https://github.com/protocolbuffers/protobuf/releases)). 219*6dbdd20aSAndroid Build Coastguard Worker 220*6dbdd20aSAndroid Build Coastguard Worker```bash 221*6dbdd20aSAndroid Build Coastguard Workercd ~/code/perfetto # external/perfetto in the Android tree. 222*6dbdd20aSAndroid Build Coastguard Worker 223*6dbdd20aSAndroid Build Coastguard Workerprotoc --encode=perfetto.protos.TraceConfig \ 224*6dbdd20aSAndroid Build Coastguard Worker -I. protos/perfetto/config/perfetto_config.proto \ 225*6dbdd20aSAndroid Build Coastguard Worker < config.txpb \ 226*6dbdd20aSAndroid Build Coastguard Worker > config.bin 227*6dbdd20aSAndroid Build Coastguard Worker``` 228*6dbdd20aSAndroid Build Coastguard Worker 229*6dbdd20aSAndroid Build Coastguard Workerand then passing it to perfetto as follows, without the `--txt` argument: 230*6dbdd20aSAndroid Build Coastguard Worker 231*6dbdd20aSAndroid Build Coastguard Worker```bash 232*6dbdd20aSAndroid Build Coastguard Workerperfetto -c config.bin -o trace_file.perfetto-trace 233*6dbdd20aSAndroid Build Coastguard Worker``` 234*6dbdd20aSAndroid Build Coastguard Worker 235*6dbdd20aSAndroid Build Coastguard Worker## {#long-traces} Streaming long traces 236*6dbdd20aSAndroid Build Coastguard Worker 237*6dbdd20aSAndroid Build Coastguard WorkerBy default Perfetto keeps the full trace buffer(s) in memory and writes it into 238*6dbdd20aSAndroid Build Coastguard Workerthe destination file (the `-o` cmdline argument) only at the end of the tracing 239*6dbdd20aSAndroid Build Coastguard Workersession. This is to reduce the perf-intrusiveness of the tracing system. This, 240*6dbdd20aSAndroid Build Coastguard Workerhowever, limits the max size of the trace to the physical memory size of the 241*6dbdd20aSAndroid Build Coastguard Workerdevice, which is often too limiting. 242*6dbdd20aSAndroid Build Coastguard Worker 243*6dbdd20aSAndroid Build Coastguard WorkerIn some cases (e.g., benchmarks, hard to repro cases) it is desirable to capture 244*6dbdd20aSAndroid Build Coastguard Workertraces that are way larger than that, at the cost of extra I/O overhead. 245*6dbdd20aSAndroid Build Coastguard Worker 246*6dbdd20aSAndroid Build Coastguard WorkerTo achieve that, Perfetto allows to periodically write the trace buffers into 247*6dbdd20aSAndroid Build Coastguard Workerthe target file (or stdout) using the following TraceConfig fields: 248*6dbdd20aSAndroid Build Coastguard Worker 249*6dbdd20aSAndroid Build Coastguard Worker- `write_into_file (bool)`: When true periodically drains the trace buffers into 250*6dbdd20aSAndroid Build Coastguard Worker the output file. When this option is enabled, the userspace buffers need to be 251*6dbdd20aSAndroid Build Coastguard Worker just big enough to hold tracing data between two write periods. The buffer 252*6dbdd20aSAndroid Build Coastguard Worker sizing depends on the activity of the device. The data rate of a typical trace 253*6dbdd20aSAndroid Build Coastguard Worker is ~1-4 MB/s. So a 16MB in-memory buffer can hold for up write periods of ~4 254*6dbdd20aSAndroid Build Coastguard Worker seconds before starting to lose data. 255*6dbdd20aSAndroid Build Coastguard Worker 256*6dbdd20aSAndroid Build Coastguard Worker- `file_write_period_ms (uint32)`: Overrides the default drain period (5s). 257*6dbdd20aSAndroid Build Coastguard Worker Shorter periods require a smaller userspace buffer but increase the 258*6dbdd20aSAndroid Build Coastguard Worker performance intrusiveness of tracing. If the period given is less than 100ms, 259*6dbdd20aSAndroid Build Coastguard Worker the tracing service will use a period of 100ms. 260*6dbdd20aSAndroid Build Coastguard Worker 261*6dbdd20aSAndroid Build Coastguard Worker- `max_file_size_bytes (uint64)`: If set, stops the tracing session after N 262*6dbdd20aSAndroid Build Coastguard Worker bytes have been written. Used to cap the size of the trace. 263*6dbdd20aSAndroid Build Coastguard Worker 264*6dbdd20aSAndroid Build Coastguard WorkerFor a complete example of a working trace config in long-tracing mode see 265*6dbdd20aSAndroid Build Coastguard Worker[`/test/configs/long_trace.cfg`](/test/configs/long_trace.cfg). 266*6dbdd20aSAndroid Build Coastguard Worker 267*6dbdd20aSAndroid Build Coastguard WorkerSummary: to capture a long trace just set `write_into_file:true`, set a long 268*6dbdd20aSAndroid Build Coastguard Worker`duration_ms` and use an in-memory buffer size of 32MB or more. 269*6dbdd20aSAndroid Build Coastguard Worker 270*6dbdd20aSAndroid Build Coastguard Worker## Data-source specific config 271*6dbdd20aSAndroid Build Coastguard Worker 272*6dbdd20aSAndroid Build Coastguard WorkerAlongside the trace-wide configuration parameters, the trace config also defines 273*6dbdd20aSAndroid Build Coastguard Workerdata-source-specific behaviors. At the proto schema level, this is defined in 274*6dbdd20aSAndroid Build Coastguard Workerthe `DataSourceConfig` section of `TraceConfig`: 275*6dbdd20aSAndroid Build Coastguard Worker 276*6dbdd20aSAndroid Build Coastguard WorkerFrom 277*6dbdd20aSAndroid Build Coastguard Worker[data_source_config.proto](/protos/perfetto/config/data_source_config.proto): 278*6dbdd20aSAndroid Build Coastguard Worker 279*6dbdd20aSAndroid Build Coastguard Worker```protobuf 280*6dbdd20aSAndroid Build Coastguard Workermessage TraceConfig { 281*6dbdd20aSAndroid Build Coastguard Worker ... 282*6dbdd20aSAndroid Build Coastguard Worker repeated DataSource data_sources = 2; // See below. 283*6dbdd20aSAndroid Build Coastguard Worker} 284*6dbdd20aSAndroid Build Coastguard Worker 285*6dbdd20aSAndroid Build Coastguard Workermessage DataSource { 286*6dbdd20aSAndroid Build Coastguard Worker optional protos.DataSourceConfig config = 1; // See below. 287*6dbdd20aSAndroid Build Coastguard Worker ... 288*6dbdd20aSAndroid Build Coastguard Worker} 289*6dbdd20aSAndroid Build Coastguard Worker 290*6dbdd20aSAndroid Build Coastguard Workermessage DataSourceConfig { 291*6dbdd20aSAndroid Build Coastguard Worker optional string name = 1; 292*6dbdd20aSAndroid Build Coastguard Worker ... 293*6dbdd20aSAndroid Build Coastguard Worker optional FtraceConfig ftrace_config = 100 [lazy = true]; 294*6dbdd20aSAndroid Build Coastguard Worker ... 295*6dbdd20aSAndroid Build Coastguard Worker optional AndroidPowerConfig android_power_config = 106 [lazy = true]; 296*6dbdd20aSAndroid Build Coastguard Worker} 297*6dbdd20aSAndroid Build Coastguard Worker``` 298*6dbdd20aSAndroid Build Coastguard Worker 299*6dbdd20aSAndroid Build Coastguard WorkerFields like `ftrace_config`, `android_power_config` are examples of data-source 300*6dbdd20aSAndroid Build Coastguard Workerspecific configs. The tracing service will completely ignore the contents of 301*6dbdd20aSAndroid Build Coastguard Workerthose fields and route the whole DataSourceConfig object to any data source 302*6dbdd20aSAndroid Build Coastguard Workerregistered with the same name. 303*6dbdd20aSAndroid Build Coastguard Worker 304*6dbdd20aSAndroid Build Coastguard WorkerThe `[lazy=true]` marker has a special implication in the 305*6dbdd20aSAndroid Build Coastguard Worker[protozero](/docs/design-docs/protozero.md) code generator. Unlike standard 306*6dbdd20aSAndroid Build Coastguard Workernested messages, it generates raw accessors (e.g., 307*6dbdd20aSAndroid Build Coastguard Worker`const std::string& ftrace_config_raw()` instead of 308*6dbdd20aSAndroid Build Coastguard Worker`const protos::FtraceConfig& ftrace_config()`). This is to avoid injecting too 309*6dbdd20aSAndroid Build Coastguard Workermany `#include` dependencies and avoiding binary size bloat in the code that 310*6dbdd20aSAndroid Build Coastguard Workerimplements data sources. 311*6dbdd20aSAndroid Build Coastguard Worker 312*6dbdd20aSAndroid Build Coastguard Worker#### A note on backwards/forward compatibility 313*6dbdd20aSAndroid Build Coastguard Worker 314*6dbdd20aSAndroid Build Coastguard WorkerThe tracing service will route the raw binary blob of the `DataSourceConfig` 315*6dbdd20aSAndroid Build Coastguard Workermessage to the data sources with a matching name, without attempting to decode 316*6dbdd20aSAndroid Build Coastguard Workerand re-encode it. If the `DataSourceConfig` section of the trace config contains 317*6dbdd20aSAndroid Build Coastguard Workera new field that didn't exist at the time when the service was built, the 318*6dbdd20aSAndroid Build Coastguard Workerservice will still pass the `DataSourceConfig` through to the data source. This 319*6dbdd20aSAndroid Build Coastguard Workerallows to introduced new data sources without needing the service to know 320*6dbdd20aSAndroid Build Coastguard Workeranything about them upfront. 321*6dbdd20aSAndroid Build Coastguard Worker 322*6dbdd20aSAndroid Build Coastguard WorkerTODO: we are aware of the fact that today extending the `DataSourceConfig` with 323*6dbdd20aSAndroid Build Coastguard Workera custom proto requires changing the `data_source_config.proto` in the Perfetto 324*6dbdd20aSAndroid Build Coastguard Workerrepo, which is unideal for external projects. The long-term plan is to reserve a 325*6dbdd20aSAndroid Build Coastguard Workerrange of fields for non-upstream extensions and provide generic templated 326*6dbdd20aSAndroid Build Coastguard Workeraccessors for client code. Until then, we accept patches upstream to introduce 327*6dbdd20aSAndroid Build Coastguard Workerad-hoc configurations for your own data sources. 328*6dbdd20aSAndroid Build Coastguard Worker 329*6dbdd20aSAndroid Build Coastguard Worker## Multi-process data sources 330*6dbdd20aSAndroid Build Coastguard Worker 331*6dbdd20aSAndroid Build Coastguard WorkerSome data sources are singletons. E.g., in the case of scheduler tracing that 332*6dbdd20aSAndroid Build Coastguard WorkerPerfetto ships on Android, there is only data source for the whole system, owned 333*6dbdd20aSAndroid Build Coastguard Workerby the `traced_probes` service. 334*6dbdd20aSAndroid Build Coastguard Worker 335*6dbdd20aSAndroid Build Coastguard WorkerHowever, in the general case multiple processes can advertise the same data 336*6dbdd20aSAndroid Build Coastguard Workersource. This is the case, for instance, when using the 337*6dbdd20aSAndroid Build Coastguard Worker[Perfetto SDK](/docs/instrumentation/tracing-sdk.md) for userspace 338*6dbdd20aSAndroid Build Coastguard Workerinstrumentation. 339*6dbdd20aSAndroid Build Coastguard Worker 340*6dbdd20aSAndroid Build Coastguard WorkerIf this happens, when starting a tracing session that specifies that data source 341*6dbdd20aSAndroid Build Coastguard Workerin the trace config, Perfetto by default will ask all processes that advertise 342*6dbdd20aSAndroid Build Coastguard Workerthat data source to start it. 343*6dbdd20aSAndroid Build Coastguard Worker 344*6dbdd20aSAndroid Build Coastguard WorkerIn some cases it might be desirable to further limit the enabling of the data 345*6dbdd20aSAndroid Build Coastguard Workersource to a specific process (or set of processes). That is possible through the 346*6dbdd20aSAndroid Build Coastguard Worker`producer_name_filter` and `producer_name_regex_filter`. 347*6dbdd20aSAndroid Build Coastguard Worker 348*6dbdd20aSAndroid Build Coastguard WorkerNOTE: the typical Perfetto run-time model is: one process == one Perfetto 349*6dbdd20aSAndroid Build Coastguard WorkerProducer; one Producer typically hosts multiple data sources. 350*6dbdd20aSAndroid Build Coastguard Worker 351*6dbdd20aSAndroid Build Coastguard WorkerWhen those filters are set, the Perfetto tracing service will activate the data 352*6dbdd20aSAndroid Build Coastguard Workersource only in the subset of producers matching the filter. 353*6dbdd20aSAndroid Build Coastguard Worker 354*6dbdd20aSAndroid Build Coastguard WorkerExample: 355*6dbdd20aSAndroid Build Coastguard Worker 356*6dbdd20aSAndroid Build Coastguard Worker```protobuf 357*6dbdd20aSAndroid Build Coastguard Workerbuffers { 358*6dbdd20aSAndroid Build Coastguard Worker size_kb: 4096 359*6dbdd20aSAndroid Build Coastguard Worker} 360*6dbdd20aSAndroid Build Coastguard Worker 361*6dbdd20aSAndroid Build Coastguard Workerdata_sources { 362*6dbdd20aSAndroid Build Coastguard Worker config { 363*6dbdd20aSAndroid Build Coastguard Worker name: "track_event" 364*6dbdd20aSAndroid Build Coastguard Worker } 365*6dbdd20aSAndroid Build Coastguard Worker # Enable the data source only on Chrome and Chrome canary. 366*6dbdd20aSAndroid Build Coastguard Worker producer_name_filter: "com.android.chrome" 367*6dbdd20aSAndroid Build Coastguard Worker producer_name_filter: "com.google.chrome.canary" 368*6dbdd20aSAndroid Build Coastguard Worker} 369*6dbdd20aSAndroid Build Coastguard Worker``` 370*6dbdd20aSAndroid Build Coastguard Worker 371*6dbdd20aSAndroid Build Coastguard Worker## Triggers 372*6dbdd20aSAndroid Build Coastguard Worker 373*6dbdd20aSAndroid Build Coastguard WorkerIn nominal conditions, a tracing session has a lifecycle that simply matches the 374*6dbdd20aSAndroid Build Coastguard Workerinvocation of the `perfetto` cmdline client: trace data recording starts when 375*6dbdd20aSAndroid Build Coastguard Workerthe TraceConfig is passed to `perfetto` and ends when either the 376*6dbdd20aSAndroid Build Coastguard Worker`TraceConfig.duration_ms` has elapsed, or when the cmdline client terminates. 377*6dbdd20aSAndroid Build Coastguard Worker 378*6dbdd20aSAndroid Build Coastguard WorkerPerfetto supports an alternative mode of either starting or stopping the trace 379*6dbdd20aSAndroid Build Coastguard Workerwhich is based on triggers. The overall idea is to declare in the trace config 380*6dbdd20aSAndroid Build Coastguard Workeritself: 381*6dbdd20aSAndroid Build Coastguard Worker 382*6dbdd20aSAndroid Build Coastguard Worker- A set of triggers, which are just free-form strings. 383*6dbdd20aSAndroid Build Coastguard Worker- Whether a given trigger should cause the trace to be started or stopped, and 384*6dbdd20aSAndroid Build Coastguard Worker the start/stop delay. 385*6dbdd20aSAndroid Build Coastguard Worker 386*6dbdd20aSAndroid Build Coastguard WorkerWhy using triggers? Why can't one just start perfetto or kill(SIGTERM) it when 387*6dbdd20aSAndroid Build Coastguard Workerneeded? The rationale of all this is the security model: in most Perfetto 388*6dbdd20aSAndroid Build Coastguard Workerdeployments (e.g., on Android) only privileged entities (e.g., adb shell) can 389*6dbdd20aSAndroid Build Coastguard Workerconfigure/start/stop tracing. Apps are unprivileged in this sense and they 390*6dbdd20aSAndroid Build Coastguard Workercannot control tracing. 391*6dbdd20aSAndroid Build Coastguard Worker 392*6dbdd20aSAndroid Build Coastguard WorkerTriggers offer a way to unprivileged apps to control, in a limited fashion, the 393*6dbdd20aSAndroid Build Coastguard Workerlifecycle of a tracing session. The conceptual model is: 394*6dbdd20aSAndroid Build Coastguard Worker 395*6dbdd20aSAndroid Build Coastguard Worker- The privileged Consumer (see 396*6dbdd20aSAndroid Build Coastguard Worker [_Service model_](/docs/concepts/service-model.md)), i.e. the entity that is 397*6dbdd20aSAndroid Build Coastguard Worker normally authorized to start tracing (e.g., adb shell in Android), declares 398*6dbdd20aSAndroid Build Coastguard Worker upfront what are the possible trigger names for the trace and what they will 399*6dbdd20aSAndroid Build Coastguard Worker do. 400*6dbdd20aSAndroid Build Coastguard Worker- Unprivileged entities (any random app process) can activate those triggers. 401*6dbdd20aSAndroid Build Coastguard Worker Unprivileged entities don't get a say on what the triggers will do, they only 402*6dbdd20aSAndroid Build Coastguard Worker communicate that an event happened. 403*6dbdd20aSAndroid Build Coastguard Worker 404*6dbdd20aSAndroid Build Coastguard WorkerTriggers can be signaled via the cmdline util 405*6dbdd20aSAndroid Build Coastguard Worker 406*6dbdd20aSAndroid Build Coastguard Worker```bash 407*6dbdd20aSAndroid Build Coastguard Worker/system/bin/trigger_perfetto "trigger_name" 408*6dbdd20aSAndroid Build Coastguard Worker``` 409*6dbdd20aSAndroid Build Coastguard Worker 410*6dbdd20aSAndroid Build Coastguard Worker(or also by starting an independent trace session which uses only the 411*6dbdd20aSAndroid Build Coastguard Worker`activate_triggers: "trigger_name"` field in the config) 412*6dbdd20aSAndroid Build Coastguard Worker 413*6dbdd20aSAndroid Build Coastguard WorkerThere are two types of triggers: 414*6dbdd20aSAndroid Build Coastguard Worker 415*6dbdd20aSAndroid Build Coastguard Worker#### Start triggers 416*6dbdd20aSAndroid Build Coastguard Worker 417*6dbdd20aSAndroid Build Coastguard WorkerStart triggers allow activating a tracing session only after some significant 418*6dbdd20aSAndroid Build Coastguard Workerevent has happened. Passing a trace config that has `START_TRACING` trigger 419*6dbdd20aSAndroid Build Coastguard Workercauses the tracing session to stay idle (i.e. not recording any data) until 420*6dbdd20aSAndroid Build Coastguard Workereither the trigger is hit or the `trigger_timeout_ms` timeout is hit. 421*6dbdd20aSAndroid Build Coastguard Worker 422*6dbdd20aSAndroid Build Coastguard Worker`trace_duration_ms` and triggered traces can not be used at the same time. 423*6dbdd20aSAndroid Build Coastguard Worker 424*6dbdd20aSAndroid Build Coastguard WorkerExample config: 425*6dbdd20aSAndroid Build Coastguard Worker 426*6dbdd20aSAndroid Build Coastguard Worker```protobuf 427*6dbdd20aSAndroid Build Coastguard Worker# If the "myapp_is_slow" is hit, the trace starts recording data and will be 428*6dbdd20aSAndroid Build Coastguard Worker# stopped after 5s. 429*6dbdd20aSAndroid Build Coastguard Workertrigger_config { 430*6dbdd20aSAndroid Build Coastguard Worker trigger_mode: START_TRACING 431*6dbdd20aSAndroid Build Coastguard Worker triggers { 432*6dbdd20aSAndroid Build Coastguard Worker name: "myapp_is_slow" 433*6dbdd20aSAndroid Build Coastguard Worker stop_delay_ms: 5000 434*6dbdd20aSAndroid Build Coastguard Worker } 435*6dbdd20aSAndroid Build Coastguard Worker # If no trigger is hit, the trace will end without having recorded any data 436*6dbdd20aSAndroid Build Coastguard Worker # after 30s. 437*6dbdd20aSAndroid Build Coastguard Worker trigger_timeout_ms: 30000 438*6dbdd20aSAndroid Build Coastguard Worker} 439*6dbdd20aSAndroid Build Coastguard Worker 440*6dbdd20aSAndroid Build Coastguard Worker# The rest of the config is as usual. 441*6dbdd20aSAndroid Build Coastguard Workerbuffers { ... } 442*6dbdd20aSAndroid Build Coastguard Workerdata_sources { ... } 443*6dbdd20aSAndroid Build Coastguard Worker``` 444*6dbdd20aSAndroid Build Coastguard Worker 445*6dbdd20aSAndroid Build Coastguard Worker#### Stop triggers 446*6dbdd20aSAndroid Build Coastguard Worker 447*6dbdd20aSAndroid Build Coastguard WorkerSTOP_TRACING triggers allow to prematurely finalize a trace when the trigger is 448*6dbdd20aSAndroid Build Coastguard Workerhit. In this mode the trace starts immediately when the `perfetto` client is 449*6dbdd20aSAndroid Build Coastguard Workerinvoked (like in nominal cases). The trigger acts as a premature finalization 450*6dbdd20aSAndroid Build Coastguard Workersignal. 451*6dbdd20aSAndroid Build Coastguard Worker 452*6dbdd20aSAndroid Build Coastguard WorkerThis can be used to use perfetto in flight-recorder mode. By starting a trace 453*6dbdd20aSAndroid Build Coastguard Workerwith buffers configured in `RING_BUFFER` mode and `STOP_TRACING` triggers, the 454*6dbdd20aSAndroid Build Coastguard Workertrace will be recorded in a loop and finalized when the culprit event is 455*6dbdd20aSAndroid Build Coastguard Workerdetected. This is key for events where the root cause is in the recent past 456*6dbdd20aSAndroid Build Coastguard Worker(e.g., the app detects a slow scroll or a missing frame). 457*6dbdd20aSAndroid Build Coastguard Worker 458*6dbdd20aSAndroid Build Coastguard WorkerExample config: 459*6dbdd20aSAndroid Build Coastguard Worker 460*6dbdd20aSAndroid Build Coastguard Worker```protobuf 461*6dbdd20aSAndroid Build Coastguard Worker# If no trigger is hit, the trace will end after 30s. 462*6dbdd20aSAndroid Build Coastguard Workertrigger_timeout_ms: 30000 463*6dbdd20aSAndroid Build Coastguard Worker 464*6dbdd20aSAndroid Build Coastguard Worker# If the "missed_frame" is hit, the trace is stopped after 1s. 465*6dbdd20aSAndroid Build Coastguard Workertrigger_config { 466*6dbdd20aSAndroid Build Coastguard Worker trigger_mode: STOP_TRACING 467*6dbdd20aSAndroid Build Coastguard Worker triggers { 468*6dbdd20aSAndroid Build Coastguard Worker name: "missed_frame" 469*6dbdd20aSAndroid Build Coastguard Worker stop_delay_ms: 1000 470*6dbdd20aSAndroid Build Coastguard Worker } 471*6dbdd20aSAndroid Build Coastguard Worker} 472*6dbdd20aSAndroid Build Coastguard Worker 473*6dbdd20aSAndroid Build Coastguard Worker# The rest of the config is as usual. 474*6dbdd20aSAndroid Build Coastguard Workerbuffers { ... } 475*6dbdd20aSAndroid Build Coastguard Workerdata_sources { ... } 476*6dbdd20aSAndroid Build Coastguard Worker``` 477*6dbdd20aSAndroid Build Coastguard Worker 478*6dbdd20aSAndroid Build Coastguard Worker## Android 479*6dbdd20aSAndroid Build Coastguard Worker 480*6dbdd20aSAndroid Build Coastguard WorkerOn Android, there are some caveats around using `adb shell` 481*6dbdd20aSAndroid Build Coastguard Worker 482*6dbdd20aSAndroid Build Coastguard Worker- Ctrl+C, which normally causes a graceful termination of the trace, is not 483*6dbdd20aSAndroid Build Coastguard Worker propagated by ADB when using `adb shell perfetto` but only when using an 484*6dbdd20aSAndroid Build Coastguard Worker interactive PTY-based session via `adb shell`. 485*6dbdd20aSAndroid Build Coastguard Worker- On non-rooted devices before Android 12, the config can only be passed as 486*6dbdd20aSAndroid Build Coastguard Worker `cat config | adb shell perfetto -c -` (-: stdin) because of over-restrictive 487*6dbdd20aSAndroid Build Coastguard Worker SELinux rules. Since Android 12 `/data/misc/perfetto-configs` can be used for 488*6dbdd20aSAndroid Build Coastguard Worker storing configs. 489*6dbdd20aSAndroid Build Coastguard Worker- On devices before Android 10, adb cannot directly pull 490*6dbdd20aSAndroid Build Coastguard Worker `/data/misc/perfetto-traces`. Use 491*6dbdd20aSAndroid Build Coastguard Worker `adb shell cat /data/misc/perfetto-traces/trace > trace` to work around. 492*6dbdd20aSAndroid Build Coastguard Worker- When capturing longer traces, e.g. in the context of benchmarks or CI, use 493*6dbdd20aSAndroid Build Coastguard Worker `PID=$(perfetto --background)` and then `kill $PID` to stop. 494*6dbdd20aSAndroid Build Coastguard Worker 495*6dbdd20aSAndroid Build Coastguard Worker## Other resources 496*6dbdd20aSAndroid Build Coastguard Worker 497*6dbdd20aSAndroid Build Coastguard Worker- [TraceConfig Reference](/docs/reference/trace-config-proto.autogen) 498*6dbdd20aSAndroid Build Coastguard Worker- [Buffers and dataflow](/docs/concepts/buffers.md) 499