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