blob: 5bff87b5033d4902e97a5b5cdfefe6b851ef9a06 [file] [view] [edit]
# Cookbook: Analyzing Traces from the Command Line
This page is a set of task-oriented recipes for working with traces from a
shell using `trace_processor`: running queries, iterating without
re-parsing, merging, exporting and converting. It shows the common form of
each task; the full list of subcommands and flags is in the
[Trace Processor reference](/docs/analysis/trace-processor.md).
## Get the binary
```bash
curl -LO https://get.perfetto.dev/trace_processor
chmod +x ./trace_processor
```
This is a thin Python wrapper that fetches and caches the right native
binary for your platform on first use (Windows and other options:
[reference](/docs/analysis/trace-processor.md#shell)).
## Run a query
`query` loads a trace, runs one or more `;`-separated SQL statements, and
prints each result set as CSV (blank line between result sets):
```bash
# Inline SQL.
trace_processor query trace.pftrace "SELECT ts, dur, name FROM slice LIMIT 5"
# From a file (`-f -` for stdin): the natural form for scripts.
trace_processor query -f queries.sql trace.pftrace
```
The trace argument can also be an `http(s)://` URL or a Perfetto UI share
link (`https://ui.perfetto.dev/#!/?s=<hash>`); the trace is downloaded and
cached locally under `~/.cache/perfetto/`.
## Iterate without re-parsing: sessions
Parsing the trace is the expensive part (tens of seconds for large
traces), and a plain `query` invocation pays it every time. When you'll
run more than one query against the same trace, load it once into a named
background **session** and point each invocation at it with `--remote`:
```bash
# 1. Load the trace into a background session (once per trace).
trace_processor server unix --name mysession --daemonize trace.pftrace
# 2. Query the warm session: no trace path, no reparse.
trace_processor query --remote mysession \
"SELECT ts, dur, name FROM slice LIMIT 10"
# 3. Stop the session when you're done with the trace.
trace_processor server kill mysession
```
Session state persists across `--remote` invocations: a
`CREATE PERFETTO TABLE` or `INCLUDE PERFETTO MODULE` from one call is
visible to the next, exactly as within a single interactive shell, so
materializing intermediate results pays off across calls. Idle sessions
are reaped automatically after 30 minutes.
Two things to know:
- Flags that configure trace loading (`--full-sort`,
`--add-sql-package`, ...) belong on the `server unix` invocation;
`query --remote` rejects them.
- `--remote` works with `interactive` and `summarize` too, so you can
drop into a REPL on an already-warm session, or summarize it.
Session naming, socket paths and idle-timeout tuning:
[reference](/docs/analysis/trace-processor.md#subcommand-server).
## Merge traces
To analyze several trace files as one (e.g. traces from two devices, or a
system trace plus an in-process trace), pack them into one archive. For
the common case (traces whose clocks already relate), no configuration is
needed:
```bash
trace_processor util merge -o merged.tar trace1.pftrace trace2.pftrace
trace_processor query merged.tar "SELECT count(*) FROM slice"
```
`util merge` writes a TAR that Trace Processor opens as a single merged
trace, and dry-runs the result to warn if the traces would not merge
cleanly (`--strict` makes that a hard error, handy in CI). Any ZIP or TAR
of trace files opens the same way, so without a `trace_processor`
dependency you can pack them yourself:
`tar cf merged.tar trace1.pftrace trace2.pftrace`.
Do not merge by concatenating the files with `cat`; that is not a merge,
see [Trace merging](/docs/concepts/merging-traces.md).
When you need control over how the traces combine (keeping devices' data
separate, aligning unsynchronized clocks, naming machines), pass a trace
manifest to `util merge` (`--manifest manifest.json`) or tar it into the
archive yourself. See
[Merging traces from the command line](/docs/analysis/merging-traces.md)
for the details, including how to verify a merge placed every event.
## Export trace data
`export` writes the parsed trace data to a file. The format is the first
positional argument, `-o FILE` the output path:
```bash
trace_processor export perfetto -o archive.tar trace.pftrace
trace_processor export arrow_tar -o tables.tar trace.pftrace
trace_processor export sqlite -o trace.db trace.pftrace
```
- **`perfetto`**: a version-coupled archive of the static tables. A fresh
trace processor instance from the same version can load it back as a trace;
a different version may load it, but this is not guaranteed. The only
format that can be reloaded.
- **`arrow_tar`**: one standard [Apache Arrow](https://arrow.apache.org/)
file per statically registered table, packed in a tar. Stable across trace
processor versions, for analysis with pandas, Polars or pyarrow. Cannot be
loaded back into trace processor.
- **`sqlite`**: the statically registered tables plus the trace's views, as
a SQLite database file that any SQLite tool can open.
All three formats export the statically registered tables; only `sqlite` also
includes views. Runtime tables created during the session (e.g.
`CREATE PERFETTO TABLE`) are not exported. See the
[Trace Processor reference](/docs/analysis/trace-processor.md#subcommand-export)
for the flag and format details.
## Convert to another trace format
`convert` wraps the traceconv tool to translate a Perfetto trace into
other formats, e.g. Chrome JSON (loadable in chrome://tracing or other
Catapult tooling) or pprof:
```bash
trace_processor convert json trace.pftrace trace.json
trace_processor convert text trace.pftrace trace.txt
```
Run `trace_processor convert --help` for the full format list, and see
[Converting from Perfetto](/docs/quickstart/traceconv.md) for more on the
underlying traceconv tool. `convert` translates the trace itself; to dump the
parsed tables instead, see [Export trace data](#export-trace-data) above.
## Next steps
- Writing the queries themselves:
[Getting started with PerfettoSQL](/docs/analysis/perfetto-sql-getting-started.md).
- Automating analysis across many traces from Python:
[Batch Trace Processor](/docs/analysis/batch-trace-processor.md).
- Every subcommand and flag:
[Trace Processor reference](/docs/analysis/trace-processor.md).