xref: /aosp_15_r20/external/perfetto/docs/quickstart/trace-analysis.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Quickstart: SQL-based analysis and trace-based metrics
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard Worker_This quickstart explains how to use `trace_processor` as well as its Python API to
4*6dbdd20aSAndroid Build Coastguard Workerprogrammatically query the trace contents through SQL and compute trace-based metrics._
5*6dbdd20aSAndroid Build Coastguard Worker
6*6dbdd20aSAndroid Build Coastguard Worker## Trace Processor
7*6dbdd20aSAndroid Build Coastguard Worker
8*6dbdd20aSAndroid Build Coastguard WorkerTraceProcessor is a multi-format trace importing and query engine based on
9*6dbdd20aSAndroid Build Coastguard WorkerSQLite. It comes both as a C++ library and as a standalone executable:
10*6dbdd20aSAndroid Build Coastguard Worker`trace_processor_shell` (or just `trace_processor`).
11*6dbdd20aSAndroid Build Coastguard Worker
12*6dbdd20aSAndroid Build Coastguard Worker### Setup
13*6dbdd20aSAndroid Build Coastguard Worker
14*6dbdd20aSAndroid Build Coastguard Worker```bash
15*6dbdd20aSAndroid Build Coastguard Worker# Download prebuilts (Linux and Mac only)
16*6dbdd20aSAndroid Build Coastguard Workercurl -LO https://get.perfetto.dev/trace_processor
17*6dbdd20aSAndroid Build Coastguard Workerchmod +x ./trace_processor
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker# Start the interactive shell
20*6dbdd20aSAndroid Build Coastguard Worker./trace_processor trace.perfetto-trace
21*6dbdd20aSAndroid Build Coastguard Worker
22*6dbdd20aSAndroid Build Coastguard Worker# Start a local trace processor instance to replace wasm module in the UI
23*6dbdd20aSAndroid Build Coastguard Worker./trace_processor trace.perfetto-trace --httpd
24*6dbdd20aSAndroid Build Coastguard Worker```
25*6dbdd20aSAndroid Build Coastguard Worker
26*6dbdd20aSAndroid Build Coastguard WorkerNOTE: In HTTP mode the trace will be loaded into the `trace_processor` and
27*6dbdd20aSAndroid Build Coastguard Worker      the UI will connect and issue queries over TCP. This can allow
28*6dbdd20aSAndroid Build Coastguard Worker      arbitrary sized traces to be loaded since there are no memory
29*6dbdd20aSAndroid Build Coastguard Worker      constraints, unlike the WASM module. In addition, this can improve
30*6dbdd20aSAndroid Build Coastguard Worker      performance in the UI as it issues SQL queries.
31*6dbdd20aSAndroid Build Coastguard Worker
32*6dbdd20aSAndroid Build Coastguard WorkerSee [Trace Processor docs](/docs/analysis/trace-processor.md) for the full
33*6dbdd20aSAndroid Build Coastguard WorkerTraceProcessor guide.
34*6dbdd20aSAndroid Build Coastguard Worker
35*6dbdd20aSAndroid Build Coastguard Worker### Sample queries
36*6dbdd20aSAndroid Build Coastguard Worker
37*6dbdd20aSAndroid Build Coastguard WorkerFor more exhaustive examples see the _SQL_ section of the various _Data sources_
38*6dbdd20aSAndroid Build Coastguard Workerdocs.
39*6dbdd20aSAndroid Build Coastguard Worker
40*6dbdd20aSAndroid Build Coastguard Worker#### Slices
41*6dbdd20aSAndroid Build Coastguard Worker
42*6dbdd20aSAndroid Build Coastguard WorkerSlices are stackable events which have name and span some duration of time.
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/slices.png "Example of slices in the UI")
45*6dbdd20aSAndroid Build Coastguard Worker
46*6dbdd20aSAndroid Build Coastguard Worker```
47*6dbdd20aSAndroid Build Coastguard Worker> SELECT ts, dur, name FROM slice
48*6dbdd20aSAndroid Build Coastguard Workerts                   dur                  name
49*6dbdd20aSAndroid Build Coastguard Worker-------------------- -------------------- ---------------------------
50*6dbdd20aSAndroid Build Coastguard Worker     261187017446933               358594 eglSwapBuffersWithDamageKHR
51*6dbdd20aSAndroid Build Coastguard Worker     261187017518340                  357 onMessageReceived
52*6dbdd20aSAndroid Build Coastguard Worker     261187020825163                 9948 queueBuffer
53*6dbdd20aSAndroid Build Coastguard Worker     261187021345235                  642 bufferLoad
54*6dbdd20aSAndroid Build Coastguard Worker     261187121345235                  153 query
55*6dbdd20aSAndroid Build Coastguard Worker     ...
56*6dbdd20aSAndroid Build Coastguard Worker```
57*6dbdd20aSAndroid Build Coastguard Worker
58*6dbdd20aSAndroid Build Coastguard Worker#### Counters
59*6dbdd20aSAndroid Build Coastguard Worker
60*6dbdd20aSAndroid Build Coastguard WorkerCounters are events with a value which changes over time.
61*6dbdd20aSAndroid Build Coastguard Worker
62*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/counters.png "Example of counters in the UI")
63*6dbdd20aSAndroid Build Coastguard Worker
64*6dbdd20aSAndroid Build Coastguard Worker```
65*6dbdd20aSAndroid Build Coastguard Worker> SELECT ts, value FROM counter
66*6dbdd20aSAndroid Build Coastguard Workerts                   value
67*6dbdd20aSAndroid Build Coastguard Worker-------------------- --------------------
68*6dbdd20aSAndroid Build Coastguard Worker     261187012149954          1454.000000
69*6dbdd20aSAndroid Build Coastguard Worker     261187012399172          4232.000000
70*6dbdd20aSAndroid Build Coastguard Worker     261187012447402         14304.000000
71*6dbdd20aSAndroid Build Coastguard Worker     261187012535839         15490.000000
72*6dbdd20aSAndroid Build Coastguard Worker     261187012590890         17490.000000
73*6dbdd20aSAndroid Build Coastguard Worker     261187012590890         16590.000000
74*6dbdd20aSAndroid Build Coastguard Worker...
75*6dbdd20aSAndroid Build Coastguard Worker```
76*6dbdd20aSAndroid Build Coastguard Worker
77*6dbdd20aSAndroid Build Coastguard Worker#### Scheduler slices
78*6dbdd20aSAndroid Build Coastguard Worker
79*6dbdd20aSAndroid Build Coastguard WorkerScheduler slices indicate which thread was scheduled on which CPU at which time.
80*6dbdd20aSAndroid Build Coastguard Worker
81*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/sched-slices.png "Example of scheduler slices in the UI")
82*6dbdd20aSAndroid Build Coastguard Worker
83*6dbdd20aSAndroid Build Coastguard Worker```
84*6dbdd20aSAndroid Build Coastguard Worker> SELECT ts, dur, cpu, utid FROM sched
85*6dbdd20aSAndroid Build Coastguard Workerts                   dur                  cpu                  utid
86*6dbdd20aSAndroid Build Coastguard Worker-------------------- -------------------- -------------------- --------------------
87*6dbdd20aSAndroid Build Coastguard Worker     261187012170489               267188                    0                  390
88*6dbdd20aSAndroid Build Coastguard Worker     261187012170995               247153                    1                  767
89*6dbdd20aSAndroid Build Coastguard Worker     261187012418183                12812                    2                 2790
90*6dbdd20aSAndroid Build Coastguard Worker     261187012421099               220000                    6                  683
91*6dbdd20aSAndroid Build Coastguard Worker     261187012430995                72396                    7                 2791
92*6dbdd20aSAndroid Build Coastguard Worker...
93*6dbdd20aSAndroid Build Coastguard Worker```
94*6dbdd20aSAndroid Build Coastguard Worker
95*6dbdd20aSAndroid Build Coastguard Worker### Trace-based metrics
96*6dbdd20aSAndroid Build Coastguard Worker
97*6dbdd20aSAndroid Build Coastguard WorkerTrace Processor offers also a higher-level query interface that allows to run
98*6dbdd20aSAndroid Build Coastguard Workerpre-baked queries, herein called "metrics". Metrics are generally curated by
99*6dbdd20aSAndroid Build Coastguard Workerdomain experts, often the same people who add the instrumentation points in the
100*6dbdd20aSAndroid Build Coastguard Workerfirst place, and output structured JSON/Protobuf/text.
101*6dbdd20aSAndroid Build Coastguard WorkerMetrics allow to get a summarized view of the trace without having to type any
102*6dbdd20aSAndroid Build Coastguard WorkerSQL or having to load the trace in the UI.
103*6dbdd20aSAndroid Build Coastguard Worker
104*6dbdd20aSAndroid Build Coastguard WorkerThe metrics` schema files live in the
105*6dbdd20aSAndroid Build Coastguard Worker[/protos/perfetto/metrics](/protos/perfetto/metrics/) directory.
106*6dbdd20aSAndroid Build Coastguard WorkerThe corresponding SQL queries live in
107*6dbdd20aSAndroid Build Coastguard Worker[/src/trace_processor/metrics](/src/trace_processor/metrics/).
108*6dbdd20aSAndroid Build Coastguard Worker
109*6dbdd20aSAndroid Build Coastguard Worker#### Run a single metric
110*6dbdd20aSAndroid Build Coastguard Worker
111*6dbdd20aSAndroid Build Coastguard WorkerLet's run the [`android_cpu`](/protos/perfetto/metrics/android/cpu_metric.proto)
112*6dbdd20aSAndroid Build Coastguard Workermetric. This metrics computes the total CPU time and the total cycles
113*6dbdd20aSAndroid Build Coastguard Worker(CPU frequency * time spent running at that frequency) for each process in the
114*6dbdd20aSAndroid Build Coastguard Workertrace, breaking it down by CPU (_core_) number.
115*6dbdd20aSAndroid Build Coastguard Worker
116*6dbdd20aSAndroid Build Coastguard Worker```protobuf
117*6dbdd20aSAndroid Build Coastguard Worker./trace_processor --run-metrics android_cpu trace.perfetto-trace
118*6dbdd20aSAndroid Build Coastguard Worker
119*6dbdd20aSAndroid Build Coastguard Workerandroid_cpu {
120*6dbdd20aSAndroid Build Coastguard Worker  process_info {
121*6dbdd20aSAndroid Build Coastguard Worker    name: "/system/bin/init"
122*6dbdd20aSAndroid Build Coastguard Worker    threads {
123*6dbdd20aSAndroid Build Coastguard Worker      name: "init"
124*6dbdd20aSAndroid Build Coastguard Worker      core {
125*6dbdd20aSAndroid Build Coastguard Worker        id: 1
126*6dbdd20aSAndroid Build Coastguard Worker        metrics {
127*6dbdd20aSAndroid Build Coastguard Worker          mcycles: 1
128*6dbdd20aSAndroid Build Coastguard Worker          runtime_ns: 570365
129*6dbdd20aSAndroid Build Coastguard Worker          min_freq_khz: 1900800
130*6dbdd20aSAndroid Build Coastguard Worker          max_freq_khz: 1900800
131*6dbdd20aSAndroid Build Coastguard Worker          avg_freq_khz: 1902017
132*6dbdd20aSAndroid Build Coastguard Worker        }
133*6dbdd20aSAndroid Build Coastguard Worker      }
134*6dbdd20aSAndroid Build Coastguard Worker      core {
135*6dbdd20aSAndroid Build Coastguard Worker        id: 3
136*6dbdd20aSAndroid Build Coastguard Worker        metrics {
137*6dbdd20aSAndroid Build Coastguard Worker          mcycles: 0
138*6dbdd20aSAndroid Build Coastguard Worker          runtime_ns: 366406
139*6dbdd20aSAndroid Build Coastguard Worker          min_freq_khz: 1900800
140*6dbdd20aSAndroid Build Coastguard Worker          max_freq_khz: 1900800
141*6dbdd20aSAndroid Build Coastguard Worker          avg_freq_khz: 1902908
142*6dbdd20aSAndroid Build Coastguard Worker        }
143*6dbdd20aSAndroid Build Coastguard Worker      }
144*6dbdd20aSAndroid Build Coastguard Worker      ...
145*6dbdd20aSAndroid Build Coastguard Worker    }
146*6dbdd20aSAndroid Build Coastguard Worker    ...
147*6dbdd20aSAndroid Build Coastguard Worker  }
148*6dbdd20aSAndroid Build Coastguard Worker  process_info {
149*6dbdd20aSAndroid Build Coastguard Worker    name: "/system/bin/logd"
150*6dbdd20aSAndroid Build Coastguard Worker    threads {
151*6dbdd20aSAndroid Build Coastguard Worker      name: "logd.writer"
152*6dbdd20aSAndroid Build Coastguard Worker      core {
153*6dbdd20aSAndroid Build Coastguard Worker        id: 0
154*6dbdd20aSAndroid Build Coastguard Worker        metrics {
155*6dbdd20aSAndroid Build Coastguard Worker          mcycles: 8
156*6dbdd20aSAndroid Build Coastguard Worker          runtime_ns: 33842357
157*6dbdd20aSAndroid Build Coastguard Worker          min_freq_khz: 595200
158*6dbdd20aSAndroid Build Coastguard Worker          max_freq_khz: 1900800
159*6dbdd20aSAndroid Build Coastguard Worker          avg_freq_khz: 1891825
160*6dbdd20aSAndroid Build Coastguard Worker        }
161*6dbdd20aSAndroid Build Coastguard Worker      }
162*6dbdd20aSAndroid Build Coastguard Worker      core {
163*6dbdd20aSAndroid Build Coastguard Worker        id: 1
164*6dbdd20aSAndroid Build Coastguard Worker        metrics {
165*6dbdd20aSAndroid Build Coastguard Worker          mcycles: 9
166*6dbdd20aSAndroid Build Coastguard Worker          runtime_ns: 36019300
167*6dbdd20aSAndroid Build Coastguard Worker          min_freq_khz: 1171200
168*6dbdd20aSAndroid Build Coastguard Worker          max_freq_khz: 1900800
169*6dbdd20aSAndroid Build Coastguard Worker          avg_freq_khz: 1887969
170*6dbdd20aSAndroid Build Coastguard Worker        }
171*6dbdd20aSAndroid Build Coastguard Worker      }
172*6dbdd20aSAndroid Build Coastguard Worker      ...
173*6dbdd20aSAndroid Build Coastguard Worker    }
174*6dbdd20aSAndroid Build Coastguard Worker    ...
175*6dbdd20aSAndroid Build Coastguard Worker  }
176*6dbdd20aSAndroid Build Coastguard Worker  ...
177*6dbdd20aSAndroid Build Coastguard Worker}
178*6dbdd20aSAndroid Build Coastguard Worker```
179*6dbdd20aSAndroid Build Coastguard Worker
180*6dbdd20aSAndroid Build Coastguard Worker#### Running multiple metrics
181*6dbdd20aSAndroid Build Coastguard Worker
182*6dbdd20aSAndroid Build Coastguard WorkerMultiple metrics can be flagged using comma separators to the `--run-metrics`
183*6dbdd20aSAndroid Build Coastguard Workerflag. This will output a text proto with the combined result of running both
184*6dbdd20aSAndroid Build Coastguard Workermetrics.
185*6dbdd20aSAndroid Build Coastguard Worker
186*6dbdd20aSAndroid Build Coastguard Worker```protobuf
187*6dbdd20aSAndroid Build Coastguard Worker$ ./trace_processor --run-metrics android_mem,android_cpu trace.perfetto-trace
188*6dbdd20aSAndroid Build Coastguard Worker
189*6dbdd20aSAndroid Build Coastguard Workerandroid_mem {
190*6dbdd20aSAndroid Build Coastguard Worker  process_metrics {
191*6dbdd20aSAndroid Build Coastguard Worker    process_name: ".dataservices"
192*6dbdd20aSAndroid Build Coastguard Worker    total_counters {
193*6dbdd20aSAndroid Build Coastguard Worker      anon_rss {
194*6dbdd20aSAndroid Build Coastguard Worker        min: 19451904
195*6dbdd20aSAndroid Build Coastguard Worker        max: 19890176
196*6dbdd20aSAndroid Build Coastguard Worker        avg: 19837548.157829277
197*6dbdd20aSAndroid Build Coastguard Worker      }
198*6dbdd20aSAndroid Build Coastguard Worker      file_rss {
199*6dbdd20aSAndroid Build Coastguard Worker        min: 25804800
200*6dbdd20aSAndroid Build Coastguard Worker        max: 25829376
201*6dbdd20aSAndroid Build Coastguard Worker        avg: 25827909.957489081
202*6dbdd20aSAndroid Build Coastguard Worker      }
203*6dbdd20aSAndroid Build Coastguard Worker      swap {
204*6dbdd20aSAndroid Build Coastguard Worker        min: 9289728
205*6dbdd20aSAndroid Build Coastguard Worker        max: 9728000
206*6dbdd20aSAndroid Build Coastguard Worker        avg: 9342355.8421707246
207*6dbdd20aSAndroid Build Coastguard Worker      }
208*6dbdd20aSAndroid Build Coastguard Worker      anon_and_swap {
209*6dbdd20aSAndroid Build Coastguard Worker        min: 29179904
210*6dbdd20aSAndroid Build Coastguard Worker        max: 29179904
211*6dbdd20aSAndroid Build Coastguard Worker        avg: 29179904
212*6dbdd20aSAndroid Build Coastguard Worker      }
213*6dbdd20aSAndroid Build Coastguard Worker    }
214*6dbdd20aSAndroid Build Coastguard Worker    ...
215*6dbdd20aSAndroid Build Coastguard Worker  }
216*6dbdd20aSAndroid Build Coastguard Worker  ...
217*6dbdd20aSAndroid Build Coastguard Worker}
218*6dbdd20aSAndroid Build Coastguard Workerandroid_cpu {
219*6dbdd20aSAndroid Build Coastguard Worker  process_info {
220*6dbdd20aSAndroid Build Coastguard Worker    name: "/system/bin/init"
221*6dbdd20aSAndroid Build Coastguard Worker    threads {
222*6dbdd20aSAndroid Build Coastguard Worker      name: "init"
223*6dbdd20aSAndroid Build Coastguard Worker      core {
224*6dbdd20aSAndroid Build Coastguard Worker        id: 1
225*6dbdd20aSAndroid Build Coastguard Worker        metrics {
226*6dbdd20aSAndroid Build Coastguard Worker          mcycles: 1
227*6dbdd20aSAndroid Build Coastguard Worker          runtime_ns: 570365
228*6dbdd20aSAndroid Build Coastguard Worker          min_freq_khz: 1900800
229*6dbdd20aSAndroid Build Coastguard Worker          max_freq_khz: 1900800
230*6dbdd20aSAndroid Build Coastguard Worker          avg_freq_khz: 1902017
231*6dbdd20aSAndroid Build Coastguard Worker        }
232*6dbdd20aSAndroid Build Coastguard Worker      }
233*6dbdd20aSAndroid Build Coastguard Worker      ...
234*6dbdd20aSAndroid Build Coastguard Worker    }
235*6dbdd20aSAndroid Build Coastguard Worker    ...
236*6dbdd20aSAndroid Build Coastguard Worker  }
237*6dbdd20aSAndroid Build Coastguard Worker  ...
238*6dbdd20aSAndroid Build Coastguard Worker}
239*6dbdd20aSAndroid Build Coastguard Worker```
240*6dbdd20aSAndroid Build Coastguard Worker
241*6dbdd20aSAndroid Build Coastguard Worker#### JSON and binary output
242*6dbdd20aSAndroid Build Coastguard Worker
243*6dbdd20aSAndroid Build Coastguard WorkerThe trace processor also supports binary protobuf and JSON as alternative output
244*6dbdd20aSAndroid Build Coastguard Workerformats. This is useful when the intended reader is an offline tool.
245*6dbdd20aSAndroid Build Coastguard Worker
246*6dbdd20aSAndroid Build Coastguard WorkerBoth single and multiple metrics are supported as with proto text output.
247*6dbdd20aSAndroid Build Coastguard Worker
248*6dbdd20aSAndroid Build Coastguard Worker```
249*6dbdd20aSAndroid Build Coastguard Worker./trace_processor --run-metrics android_mem --metrics-output=binary trace.perfetto-trace
250*6dbdd20aSAndroid Build Coastguard Worker<binary protobuf output>
251*6dbdd20aSAndroid Build Coastguard Worker
252*6dbdd20aSAndroid Build Coastguard Worker./trace_processor --run-metrics android_mem,android_cpu --metrics-output=json trace.perfetto-trace
253*6dbdd20aSAndroid Build Coastguard Worker{
254*6dbdd20aSAndroid Build Coastguard Worker  "android_mem": {
255*6dbdd20aSAndroid Build Coastguard Worker    "process_metrics": [
256*6dbdd20aSAndroid Build Coastguard Worker      {
257*6dbdd20aSAndroid Build Coastguard Worker        "process_name": ".dataservices",
258*6dbdd20aSAndroid Build Coastguard Worker        "total_counters": {
259*6dbdd20aSAndroid Build Coastguard Worker          "anon_rss": {
260*6dbdd20aSAndroid Build Coastguard Worker            "min": 19451904.000000,
261*6dbdd20aSAndroid Build Coastguard Worker            "max": 19890176.000000,
262*6dbdd20aSAndroid Build Coastguard Worker            "avg": 19837548.157829
263*6dbdd20aSAndroid Build Coastguard Worker          },
264*6dbdd20aSAndroid Build Coastguard Worker          "file_rss": {
265*6dbdd20aSAndroid Build Coastguard Worker            "min": 25804800.000000,
266*6dbdd20aSAndroid Build Coastguard Worker            "max": 25829376.000000,
267*6dbdd20aSAndroid Build Coastguard Worker            "avg": 25827909.957489
268*6dbdd20aSAndroid Build Coastguard Worker          },
269*6dbdd20aSAndroid Build Coastguard Worker          "swap": {
270*6dbdd20aSAndroid Build Coastguard Worker            "min": 9289728.000000,
271*6dbdd20aSAndroid Build Coastguard Worker            "max": 9728000.000000,
272*6dbdd20aSAndroid Build Coastguard Worker            "avg": 9342355.842171
273*6dbdd20aSAndroid Build Coastguard Worker          },
274*6dbdd20aSAndroid Build Coastguard Worker          "anon_and_swap": {
275*6dbdd20aSAndroid Build Coastguard Worker            "min": 29179904.000000,
276*6dbdd20aSAndroid Build Coastguard Worker            "max": 29179904.000000,
277*6dbdd20aSAndroid Build Coastguard Worker            "avg": 29179904.000000
278*6dbdd20aSAndroid Build Coastguard Worker          }
279*6dbdd20aSAndroid Build Coastguard Worker        },
280*6dbdd20aSAndroid Build Coastguard Worker        ...
281*6dbdd20aSAndroid Build Coastguard Worker      },
282*6dbdd20aSAndroid Build Coastguard Worker      ...
283*6dbdd20aSAndroid Build Coastguard Worker    ]
284*6dbdd20aSAndroid Build Coastguard Worker  }
285*6dbdd20aSAndroid Build Coastguard Worker  "android_cpu": {
286*6dbdd20aSAndroid Build Coastguard Worker    "process_info": [
287*6dbdd20aSAndroid Build Coastguard Worker      {
288*6dbdd20aSAndroid Build Coastguard Worker        "name": "\/system\/bin\/init",
289*6dbdd20aSAndroid Build Coastguard Worker        "threads": [
290*6dbdd20aSAndroid Build Coastguard Worker          {
291*6dbdd20aSAndroid Build Coastguard Worker            "name": "init",
292*6dbdd20aSAndroid Build Coastguard Worker            "core": [
293*6dbdd20aSAndroid Build Coastguard Worker              {
294*6dbdd20aSAndroid Build Coastguard Worker                "id": 1,
295*6dbdd20aSAndroid Build Coastguard Worker                "metrics": {
296*6dbdd20aSAndroid Build Coastguard Worker                  "mcycles": 1,
297*6dbdd20aSAndroid Build Coastguard Worker                  "runtime_ns": 570365,
298*6dbdd20aSAndroid Build Coastguard Worker                  "min_freq_khz": 1900800,
299*6dbdd20aSAndroid Build Coastguard Worker                  "max_freq_khz": 1900800,
300*6dbdd20aSAndroid Build Coastguard Worker                  "avg_freq_khz": 1902017
301*6dbdd20aSAndroid Build Coastguard Worker                }
302*6dbdd20aSAndroid Build Coastguard Worker              },
303*6dbdd20aSAndroid Build Coastguard Worker              ...
304*6dbdd20aSAndroid Build Coastguard Worker            ]
305*6dbdd20aSAndroid Build Coastguard Worker            ...
306*6dbdd20aSAndroid Build Coastguard Worker          }
307*6dbdd20aSAndroid Build Coastguard Worker          ...
308*6dbdd20aSAndroid Build Coastguard Worker        ]
309*6dbdd20aSAndroid Build Coastguard Worker        ...
310*6dbdd20aSAndroid Build Coastguard Worker      },
311*6dbdd20aSAndroid Build Coastguard Worker      ...
312*6dbdd20aSAndroid Build Coastguard Worker    ]
313*6dbdd20aSAndroid Build Coastguard Worker    ...
314*6dbdd20aSAndroid Build Coastguard Worker  }
315*6dbdd20aSAndroid Build Coastguard Worker}
316*6dbdd20aSAndroid Build Coastguard Worker```
317*6dbdd20aSAndroid Build Coastguard Worker
318*6dbdd20aSAndroid Build Coastguard Worker## Python API
319*6dbdd20aSAndroid Build Coastguard Worker
320*6dbdd20aSAndroid Build Coastguard WorkerThe API can be run without requiring the `trace_processor` binary to be
321*6dbdd20aSAndroid Build Coastguard Workerdownloaded or installed.
322*6dbdd20aSAndroid Build Coastguard Worker
323*6dbdd20aSAndroid Build Coastguard Worker### Setup
324*6dbdd20aSAndroid Build Coastguard Worker```
325*6dbdd20aSAndroid Build Coastguard Worker$ pip install perfetto
326*6dbdd20aSAndroid Build Coastguard Worker```
327*6dbdd20aSAndroid Build Coastguard WorkerNOTE: The API is only compatible with Python3.
328*6dbdd20aSAndroid Build Coastguard Worker
329*6dbdd20aSAndroid Build Coastguard Worker### Example functions
330*6dbdd20aSAndroid Build Coastguard WorkerSee the Python API section of
331*6dbdd20aSAndroid Build Coastguard Worker[Trace Processor (SQL)](/docs/analysis/trace-processor.md) to get
332*6dbdd20aSAndroid Build Coastguard Workermore details on all available functions.
333*6dbdd20aSAndroid Build Coastguard Worker
334*6dbdd20aSAndroid Build Coastguard Worker#### Query
335*6dbdd20aSAndroid Build Coastguard Worker```python
336*6dbdd20aSAndroid Build Coastguard Workerfrom perfetto.trace_processor import TraceProcessor
337*6dbdd20aSAndroid Build Coastguard Workertp = TraceProcessor(trace='trace.perfetto-trace')
338*6dbdd20aSAndroid Build Coastguard Worker
339*6dbdd20aSAndroid Build Coastguard Workerqr_it = tp.query('SELECT name FROM slice')
340*6dbdd20aSAndroid Build Coastguard Workerfor row in qr_it:
341*6dbdd20aSAndroid Build Coastguard Worker  print(row.name)
342*6dbdd20aSAndroid Build Coastguard Worker```
343*6dbdd20aSAndroid Build Coastguard Worker**Output**
344*6dbdd20aSAndroid Build Coastguard Worker```
345*6dbdd20aSAndroid Build Coastguard WorkereglSwapBuffersWithDamageKHR
346*6dbdd20aSAndroid Build Coastguard WorkeronMessageReceived
347*6dbdd20aSAndroid Build Coastguard WorkerqueueBuffer
348*6dbdd20aSAndroid Build Coastguard WorkerbufferLoad
349*6dbdd20aSAndroid Build Coastguard Workerquery
350*6dbdd20aSAndroid Build Coastguard Worker...
351*6dbdd20aSAndroid Build Coastguard Worker```
352*6dbdd20aSAndroid Build Coastguard Worker#### Query as Pandas DataFrame
353*6dbdd20aSAndroid Build Coastguard Worker```python
354*6dbdd20aSAndroid Build Coastguard Workerfrom perfetto.trace_processor import TraceProcessor
355*6dbdd20aSAndroid Build Coastguard Workertp = TraceProcessor(trace='trace.perfetto-trace')
356*6dbdd20aSAndroid Build Coastguard Worker
357*6dbdd20aSAndroid Build Coastguard Workerqr_it = tp.query('SELECT ts, name FROM slice')
358*6dbdd20aSAndroid Build Coastguard Workerqr_df = qr_it.as_pandas_dataframe()
359*6dbdd20aSAndroid Build Coastguard Workerprint(qr_df.to_string())
360*6dbdd20aSAndroid Build Coastguard Worker```
361*6dbdd20aSAndroid Build Coastguard Worker**Output**
362*6dbdd20aSAndroid Build Coastguard Worker```
363*6dbdd20aSAndroid Build Coastguard Workerts                   name
364*6dbdd20aSAndroid Build Coastguard Worker-------------------- ---------------------------
365*6dbdd20aSAndroid Build Coastguard Worker     261187017446933 eglSwapBuffersWithDamageKHR
366*6dbdd20aSAndroid Build Coastguard Worker     261187017518340 onMessageReceived
367*6dbdd20aSAndroid Build Coastguard Worker     261187020825163 queueBuffer
368*6dbdd20aSAndroid Build Coastguard Worker     261187021345235 bufferLoad
369*6dbdd20aSAndroid Build Coastguard Worker     261187121345235 query
370*6dbdd20aSAndroid Build Coastguard Worker     ...
371*6dbdd20aSAndroid Build Coastguard Worker```
372*6dbdd20aSAndroid Build Coastguard Worker#### Metric
373*6dbdd20aSAndroid Build Coastguard Worker```python
374*6dbdd20aSAndroid Build Coastguard Workerfrom perfetto.trace_processor import TraceProcessor
375*6dbdd20aSAndroid Build Coastguard Workertp = TraceProcessor(trace='trace.perfetto-trace')
376*6dbdd20aSAndroid Build Coastguard Worker
377*6dbdd20aSAndroid Build Coastguard Workercpu_metrics = tp.metric(['android_cpu'])
378*6dbdd20aSAndroid Build Coastguard Workerprint(cpu_metrics)
379*6dbdd20aSAndroid Build Coastguard Worker```
380*6dbdd20aSAndroid Build Coastguard Worker**Output**
381*6dbdd20aSAndroid Build Coastguard Worker```
382*6dbdd20aSAndroid Build Coastguard Workermetrics {
383*6dbdd20aSAndroid Build Coastguard Worker  android_cpu {
384*6dbdd20aSAndroid Build Coastguard Worker    process_info {
385*6dbdd20aSAndroid Build Coastguard Worker      name: "/system/bin/init"
386*6dbdd20aSAndroid Build Coastguard Worker      threads {
387*6dbdd20aSAndroid Build Coastguard Worker        name: "init"
388*6dbdd20aSAndroid Build Coastguard Worker        core {
389*6dbdd20aSAndroid Build Coastguard Worker          id: 1
390*6dbdd20aSAndroid Build Coastguard Worker          metrics {
391*6dbdd20aSAndroid Build Coastguard Worker            mcycles: 1
392*6dbdd20aSAndroid Build Coastguard Worker            runtime_ns: 570365
393*6dbdd20aSAndroid Build Coastguard Worker            min_freq_khz: 1900800
394*6dbdd20aSAndroid Build Coastguard Worker            max_freq_khz: 1900800
395*6dbdd20aSAndroid Build Coastguard Worker            avg_freq_khz: 1902017
396*6dbdd20aSAndroid Build Coastguard Worker          }
397*6dbdd20aSAndroid Build Coastguard Worker        }
398*6dbdd20aSAndroid Build Coastguard Worker        core {
399*6dbdd20aSAndroid Build Coastguard Worker          id: 3
400*6dbdd20aSAndroid Build Coastguard Worker          metrics {
401*6dbdd20aSAndroid Build Coastguard Worker            mcycles: 0
402*6dbdd20aSAndroid Build Coastguard Worker            runtime_ns: 366406
403*6dbdd20aSAndroid Build Coastguard Worker            min_freq_khz: 1900800
404*6dbdd20aSAndroid Build Coastguard Worker            max_freq_khz: 1900800
405*6dbdd20aSAndroid Build Coastguard Worker            avg_freq_khz: 1902908
406*6dbdd20aSAndroid Build Coastguard Worker          }
407*6dbdd20aSAndroid Build Coastguard Worker        }
408*6dbdd20aSAndroid Build Coastguard Worker        ...
409*6dbdd20aSAndroid Build Coastguard Worker      }
410*6dbdd20aSAndroid Build Coastguard Worker      ...
411*6dbdd20aSAndroid Build Coastguard Worker    }
412*6dbdd20aSAndroid Build Coastguard Worker    ...
413*6dbdd20aSAndroid Build Coastguard Worker  }
414*6dbdd20aSAndroid Build Coastguard Worker}
415*6dbdd20aSAndroid Build Coastguard Worker```
416*6dbdd20aSAndroid Build Coastguard Worker
417*6dbdd20aSAndroid Build Coastguard Worker## Next steps
418*6dbdd20aSAndroid Build Coastguard Worker
419*6dbdd20aSAndroid Build Coastguard WorkerThere are several options for exploring more of the trace analysis features
420*6dbdd20aSAndroid Build Coastguard WorkerPerfetto provides:
421*6dbdd20aSAndroid Build Coastguard Worker
422*6dbdd20aSAndroid Build Coastguard Worker* The [trace conversion quickstart](/docs/quickstart/traceconv.md) gives an
423*6dbdd20aSAndroid Build Coastguard Worker  overview on how to convert Perfetto traces to legacy formats to integrate with
424*6dbdd20aSAndroid Build Coastguard Worker  existing tooling.
425*6dbdd20aSAndroid Build Coastguard Worker* The [Trace Processor documentation](/docs/analysis/trace-processor.md) gives
426*6dbdd20aSAndroid Build Coastguard Worker  more information about how to work with trace processor including details on
427*6dbdd20aSAndroid Build Coastguard Worker  how to write queries and how tables in trace processor are organized.
428*6dbdd20aSAndroid Build Coastguard Worker* The [metrics documentation](/docs/analysis/metrics.md) gives a more in-depth
429*6dbdd20aSAndroid Build Coastguard Worker  look into metrics including a short walkthrough on how to build an
430*6dbdd20aSAndroid Build Coastguard Worker  experimental metric from scratch.
431*6dbdd20aSAndroid Build Coastguard Worker* The [SQL table reference](/docs/analysis/sql-tables.autogen) gives a
432*6dbdd20aSAndroid Build Coastguard Worker  comprehensive guide to the all the available tables in trace processor.
433*6dbdd20aSAndroid Build Coastguard Worker* The [common tasks](/docs/contributing/common-tasks.md) page gives a list of
434*6dbdd20aSAndroid Build Coastguard Worker  steps on how new metrics can be added to the trace processor.
435