xref: /aosp_15_r20/external/perfetto/docs/concepts/config.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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![TraceConfig diagram](/docs/images/trace_config.png)
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![Buffer mapping](/docs/images/trace_config_buffer_mapping.png)
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