Most contributions to Perfetto falls into one of below categories.
With the pluginization of the UI most of the contributions to the UI should be related to creating/modifying plugins. Go to UI plugins page to learn how to do it.
perfetto/src/trace_processor/stdlib/
. This SQL file will be a new standard library module.BUILD.gn
./stdlib/
), the package name (directory name) has to be added to the list in /stdlib/BUILD.gn
.Files inside the standard library have to be formatted in a very specific way, as its structure is used to generate documentation. There are presubmit checks, but they are not infallible.
CREATE PERFETTO {FUNCTION|TABLE|VIEW|MACRO}
statements inside.{module_name}_
or be prefixed with an underscore(_
) for internal objects. The names must only contain lower and upper case letters and underscores. When a module is included (using the INCLUDE PERFETTO MODULE
) the internal objects should not be treated as an API.CREATE PERFETTO {TABLE,VIEW}
statement.CREATE PERFETTO FUNCTION
statement.RETURNS
.CREATE PERFETTO FUNCTION
statement.NOTE: Break lines outside of import description will be ignored.
Example of properly formatted view in module android
:
-- Count Binder transactions per process. CREATE PERFETTO VIEW android_binder_metrics_by_process( -- Name of the process that started the binder transaction. process_name STRING, -- PID of the process that started the binder transaction. pid INT, -- Name of the slice with binder transaction. slice_name STRING, -- Number of binder transactions in process in slice. event_count INT ) AS SELECT process.name AS process_name, process.pid AS pid, slice.name AS slice_name, COUNT(*) AS event_count FROM slice JOIN thread_track ON slice.track_id = thread_track.id JOIN thread ON thread.utid = thread_track.utid JOIN process ON thread.upid = process.upid WHERE slice.name GLOB 'binder*' GROUP BY process_name, slice_name;
Example of table function in module android
:
-- Given a launch id and GLOB for a slice name, returns columns for matching slices. CREATE PERFETTO FUNCTION ANDROID_SLICES_FOR_LAUNCH_AND_SLICE_NAME( -- Id of launch. launch_id INT, -- Name of slice with launch. slice_name STRING ) RETURNS TABLE( -- Name of slice with launch. slice_name STRING, -- Timestamp of slice start. slice_ts TIMESTAMP, -- Duration of slice. slice_dur DURATION, -- Name of thread with slice. thread_name STRING, -- Arg set id. arg_set_id ARGSETID ) AS SELECT slice_name, slice_ts, slice_dur, thread_name, arg_set_id FROM thread_slices_for_all_launches WHERE launch_id = $launch_id AND slice_name GLOB $slice_name;
tools/diff_test_trace_processor.py <path to trace processor shell binary>
.TRACE_PROCESSOR_CURRENT_API_VERSION
Generally you do not have to worry about version skew between the UI and the trace_processor
since they are built together at the same commit. However version skew can occur when using the --httpd
mode which allows a native trace_processor
instance to be used with the UI.
A common case is when the UI is more recent than trace_processor
and depends on a new table definition. With older versions of trace_processor
in --httpd
mode the UI crashes attempting to query a non-existant table. To avoid this we use a version number. If the version number trace_processor
reports is older than the one the UI was built with we prompt the user to update.
protos/perfetto/trace_processor/trace_processor.proto
TRACE_PROCESSOR_CURRENT_API_VERSION
BUILD.gn
file should be updated as well.tools/gen_all out/YOUR_BUILD_DIRECTORY
. This will update the generated headers containing the descriptors for the proto.out/
directory you might have to rerun tools/setup_all_configs.py
.BUILD.gn
file should be updated as well.tools/ninja -C out/YOUR_BUILD_DIRECTORY
.tests_*.py
files in a proper test/trace_processor subfolder.tools/diff_test_trace_processor.py <path to trace processor binary>
.format
file for your event. The location of the file depends where tracefs
is mounted but can often be found at /sys/kernel/debug/tracing/events/EVENT_GROUP/EVENT_NAME/format
.src/traced/probes/ftrace/test/data/synthetic/events/EVENT_GROUP/EVENT_NAME/format
.tools/run_ftrace_proto_gen
. This will update protos/perfetto/trace/ftrace/ftrace_event.proto
and protos/perfetto/trace/ftrace/GROUP_NAME.proto
.tools/gen_all out/YOUR_BUILD_DIRECTORY
. This will update src/traced/probes/ftrace/event_info.cc
and protos/perfetto/trace/perfetto_trace.proto
.trace_processor
is desired update src/trace_processor/importers/ftrace/ftrace_parser.cc to parse the event.Here is an example change which added the ion/ion_stat
event.
Perfetto has limited support for statsd atoms it does not know about.
raw_atom_id
in the config.atom_xxx.field_yyy
in trace processor.To update Perfetto's descriptor and handle new atoms from AOSP without these limitations:
tools/update-statsd-descriptor
.