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_VERSIONGenerally 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.protoTRACE_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.