blob: 2c09723b17b2c60d39a977c3415465c8a935736f [file] [log] [blame]
// AUTOGENERATED - DO NOT EDIT
// ---------------------------
// This file has been generated by
// AOSP://external/perfetto/tools/gen_merged_protos
// merging the perfetto config protos.
// This fused proto is intended to be copied in:
// - Android tree, for statsd.
// - Google internal repos.
syntax = "proto2";
package perfetto.protos;
option go_package = "github.com/google/perfetto/perfetto_proto";
// Begin of protos/perfetto/common/ftrace_descriptor.proto
message FtraceDescriptor {
message AtraceCategory {
optional string name = 1;
optional string description = 2;
}
// Report the available atrace categories.
//
// Used by Traceur via `perfetto --query`.
repeated AtraceCategory atrace_categories = 1;
}
// End of protos/perfetto/common/ftrace_descriptor.proto
// Begin of protos/perfetto/common/gpu_counter_descriptor.proto
// Description of GPU counters.
// This message is sent by a GPU counter producer to specify the counters
// available in the hardware.
message GpuCounterDescriptor {
// Logical groups for a counter. This is used in the UI to present the
// related counters together.
enum GpuCounterGroup {
UNCLASSIFIED = 0;
SYSTEM = 1;
VERTICES = 2;
FRAGMENTS = 3;
PRIMITIVES = 4;
// Includes counters relating to caching and bandwidth.
MEMORY = 5;
COMPUTE = 6;
}
message GpuCounterSpec {
optional uint32 counter_id = 1;
optional string name = 2;
optional string description = 3;
// MeasureUnit unit (deprecated)
reserved 4;
oneof peak_value {
int64 int_peak_value = 5;
double double_peak_value = 6;
}
repeated MeasureUnit numerator_units = 7;
repeated MeasureUnit denominator_units = 8;
optional bool select_by_default = 9;
repeated GpuCounterGroup groups = 10;
}
repeated GpuCounterSpec specs = 1;
// Allow producer to group counters into block to represent counter islands.
// A capacity may be specified to indicate the number of counters that can be
// enable simultaneously in that block.
message GpuCounterBlock {
// required. Unique ID for the counter group.
optional uint32 block_id = 1;
// optional. Number of counters supported by the block. No limit if unset.
optional uint32 block_capacity = 2;
// optional. Name of block.
optional string name = 3;
// optional. Description for the block.
optional string description = 4;
// list of counters that are part of the block.
repeated uint32 counter_ids = 5;
}
repeated GpuCounterBlock blocks = 2;
// optional. Minimum sampling period supported by the producer in
// nanoseconds.
optional uint64 min_sampling_period_ns = 3;
// optional. Maximum sampling period supported by the producer in
// nanoseconds.
optional uint64 max_sampling_period_ns = 4;
// optional. The producer supports counter sampling by instrumenting the
// command buffer.
optional bool supports_instrumented_sampling = 5;
// next id: 41
enum MeasureUnit {
NONE = 0;
BIT = 1;
KILOBIT = 2;
MEGABIT = 3;
GIGABIT = 4;
TERABIT = 5;
PETABIT = 6;
BYTE = 7;
KILOBYTE = 8;
MEGABYTE = 9;
GIGABYTE = 10;
TERABYTE = 11;
PETABYTE = 12;
HERTZ = 13;
KILOHERTZ = 14;
MEGAHERTZ = 15;
GIGAHERTZ = 16;
TERAHERTZ = 17;
PETAHERTZ = 18;
NANOSECOND = 19;
MICROSECOND = 20;
MILLISECOND = 21;
SECOND = 22;
MINUTE = 23;
HOUR = 24;
VERTEX = 25;
PIXEL = 26;
TRIANGLE = 27;
PRIMITIVE = 38;
FRAGMENT = 39;
MILLIWATT = 28;
WATT = 29;
KILOWATT = 30;
JOULE = 31;
VOLT = 32;
AMPERE = 33;
CELSIUS = 34;
FAHRENHEIT = 35;
KELVIN = 36;
// Values should be out of 100.
PERCENT = 37;
INSTRUCTION = 40;
}
}
// End of protos/perfetto/common/gpu_counter_descriptor.proto
// Begin of protos/perfetto/common/track_event_descriptor.proto
message TrackEventCategory {
optional string name = 1;
optional string description = 2;
repeated string tags = 3;
}
message TrackEventDescriptor {
repeated TrackEventCategory available_categories = 1;
}
// End of protos/perfetto/common/track_event_descriptor.proto
// Begin of protos/perfetto/common/data_source_descriptor.proto
// This message is sent from Producer(s) to the tracing Service when registering
// to advertise their capabilities. It describes the structure of tracing
// protos that will be produced by the data source and the supported filters.
message DataSourceDescriptor {
// e.g., "linux.ftrace", "chromium.tracing"
optional string name = 1;
// When non-zero, this is a unique ID within the scope of the Producer for
// this data source (it is NOT globally unique). This is useful to
// differentiate between data sources with matching names when calling
// UpdateDataSource(). This field has been introduced in November 2021
// (v22, Android T) and is not supported on older versions.
optional uint64 id = 7;
// When true the data source is expected to ack the stop request through the
// NotifyDataSourceStopped() IPC. This field has been introduced after
// Android P in Jul 2018 and is not supported on older versions.
optional bool will_notify_on_stop = 2;
// When true the data source is expected to ack the start request through the
// NotifyDataSourceStarted() IPC. This field has been introduced after
// Android P in March 2019 and is not supported on older versions.
optional bool will_notify_on_start = 3;
// If true, opt into receiving the ClearIncrementalState() IPC. This should be
// set if the data source writes packets that refer to previous trace
// contents, and knows how to stop referring to the already-emitted data.
optional bool handles_incremental_state_clear = 4;
// If true, indicates that the data source does nothing upon Flush. This
// allows the service to reduce the flush-related IPC traffic and better deal
// with frozen producers (see go/perfetto-frozen). This is usually the case
// for data sources like 'track_event' that don't have access to the various
// thread task runners to post a flush task and rely purely on server-side
// scraping.
// Introduced in v39 / Android V.
optional bool no_flush = 9;
// Optional specification about available GPU counters.
optional GpuCounterDescriptor gpu_counter_descriptor = 5 [lazy = true];
optional TrackEventDescriptor track_event_descriptor = 6 [lazy = true];
optional FtraceDescriptor ftrace_descriptor = 8 [lazy = true];
}
// End of protos/perfetto/common/data_source_descriptor.proto
// Begin of protos/perfetto/common/tracing_service_state.proto
// Reports the state of the tracing service. Used to gather details about the
// data sources connected.
// See ConsumerPort::QueryServiceState().
message TracingServiceState {
// Describes a producer process.
message Producer {
// Unique ID of the producer (monotonic counter).
optional int32 id = 1;
// Typically matches the process name.
optional string name = 2;
// Unix pid of the remote process. Supported only on Linux-based systems.
// Introduced in v24 / Android T.
optional int32 pid = 5;
// Unix uid of the remote process.
optional int32 uid = 3;
// The version of the client library used by the producer.
// This is a human readable string with and its format varies depending on
// the build system and the repo (standalone vs AOSP).
// This is intended for human debugging only.
optional string sdk_version = 4;
}
// Describes a data source registered by a producer. Data sources are listed
// regardless of the fact that they are being used or not.
message DataSource {
// Descriptor passed by the data source when calling RegisterDataSource().
optional DataSourceDescriptor ds_descriptor = 1;
// ID of the producer, as per Producer.id.
optional int32 producer_id = 2;
}
message TracingSession {
// The TracingSessionID.
optional uint64 id = 1;
// The Unix uid of the consumer that started the session.
// This is meaningful only if the caller is root. In all other cases only
// tracing sessions that match the caller UID will be displayed.
optional int32 consumer_uid = 2;
// Internal state of the tracing session.
// These strings are FYI only and subjected to change.
optional string state = 3;
// The unique_session_name as set in the trace config (might be empty).
optional string unique_session_name = 4;
// The number and size of each buffer.
repeated uint32 buffer_size_kb = 5;
// Duration, as specified in the TraceConfig.duration_ms.
optional uint32 duration_ms = 6;
// Number of data sources involved in the session.
optional uint32 num_data_sources = 7;
// Time when the session was started, in the CLOCK_REALTIME domain.
// Available only on Linux-based systems.
optional int64 start_realtime_ns = 8;
}
// Lists all the producers connected.
repeated Producer producers = 1;
// Lists the data sources available.
repeated DataSource data_sources = 2;
// Lists the tracing sessions active AND owned by a consumer that has the same
// UID of the caller (or all of them if the caller is root).
// Introduced in v24 / Android T.
repeated TracingSession tracing_sessions = 6;
// This is always set to true from v24 and beyond. This flag is only used to
// tell the difference between: (1) talking to a recent service which happens
// to have no tracing session active; (2) talking to an older version of the
// service which will never report any tracing session.
optional bool supports_tracing_sessions = 7;
// Total number of tracing sessions.
optional int32 num_sessions = 3;
// Number of tracing sessions in the started state. Always <= num_sessions.
optional int32 num_sessions_started = 4;
// The version of traced (the same returned by `traced --version`).
// This is a human readable string with and its format varies depending on
// the build system and the repo (standalone vs AOSP).
// This is intended for human debugging only.
optional string tracing_service_version = 5;
}
// End of protos/perfetto/common/tracing_service_state.proto
// Begin of protos/perfetto/common/builtin_clock.proto
enum BuiltinClock {
BUILTIN_CLOCK_UNKNOWN = 0;
BUILTIN_CLOCK_REALTIME = 1;
BUILTIN_CLOCK_REALTIME_COARSE = 2;
BUILTIN_CLOCK_MONOTONIC = 3;
BUILTIN_CLOCK_MONOTONIC_COARSE = 4;
BUILTIN_CLOCK_MONOTONIC_RAW = 5;
BUILTIN_CLOCK_BOOTTIME = 6;
BUILTIN_CLOCK_MAX_ID = 63;
reserved 7, 8;
// An internal CL (ag/16521245) has taken this for BUILTIN_CLOCK_TSC.
// That might get upstreamed later on. Avoid diverging on this ID in future.
reserved 9;
}
// End of protos/perfetto/common/builtin_clock.proto
// Begin of protos/perfetto/config/android/android_game_intervention_list_config.proto
// Data source that lists game modes and game interventions of games
// on an Android device.
message AndroidGameInterventionListConfig {
// If not empty, emit info about only the following list of package names
// (exact match, no regex). Otherwise, emit info about all packages.
repeated string package_name_filter = 1;
}
// End of protos/perfetto/config/android/android_game_intervention_list_config.proto
// Begin of protos/perfetto/common/android_log_constants.proto
// Values from NDK's android/log.h.
enum AndroidLogId {
// MAIN.
LID_DEFAULT = 0;
LID_RADIO = 1;
LID_EVENTS = 2;
LID_SYSTEM = 3;
LID_CRASH = 4;
LID_STATS = 5;
LID_SECURITY = 6;
LID_KERNEL = 7;
}
enum AndroidLogPriority {
PRIO_UNSPECIFIED = 0;
// _DEFAULT, but should never be seen in logs.
PRIO_UNUSED = 1;
PRIO_VERBOSE = 2;
PRIO_DEBUG = 3;
PRIO_INFO = 4;
PRIO_WARN = 5;
PRIO_ERROR = 6;
PRIO_FATAL = 7;
}
// End of protos/perfetto/common/android_log_constants.proto
// Begin of protos/perfetto/config/android/android_log_config.proto
message AndroidLogConfig {
repeated AndroidLogId log_ids = 1;
// Was |poll_ms|, deprecated.
reserved 2;
// If set ignores all log messages whose prio is < the given value.
optional AndroidLogPriority min_prio = 3;
// If non-empty ignores all log messages whose tag doesn't match one of the
// specified values.
repeated string filter_tags = 4;
}
// End of protos/perfetto/config/android/android_log_config.proto
// Begin of protos/perfetto/config/android/android_polled_state_config.proto
// Data source that polls for display state. This should only be used for
// backward-compatibility; AndroidSystemPropertyConfig should be preferred.
message AndroidPolledStateConfig {
// Frequency of polling. If absent the state will be recorded once, at the
// start of the trace.
// This is required to be > 100ms to avoid excessive CPU usage.
optional uint32 poll_ms = 1;
}
// End of protos/perfetto/config/android/android_polled_state_config.proto
// Begin of protos/perfetto/config/android/android_sdk_sysprop_guard_config.proto
// Data source that controls the system properties used to guard initialization
// of track_event producers (i.e. Skia) in apps using HWUI, and certain
// processes like SurfaceFlinger.
//
// This data source only tells Skia to initialized the Perfetto SDK and start
// routing data to the Track Event system instead of ATrace. For those events
// to actually show up in a trace, the track_event data source must be used as
// well. The Perfetto SDK cannot be de-initialized, so some long-lived apps and
// processes may need to be restarted for Skia to revert to using ATrace if
// Track Events are no longer desired.
//
// In addition to switching Skia to use Perfetto's track_event data source,
// this "guard" also controls Skia's "broad tracing", which removes Skia's
// internal tracing constraints and allows the track_event config to specify
// which categories should be traced. Filtering to the "skia.always" category
// *tag* in a track_event config can be used to re-enable the standard
// constraints typically used with ATrace.
//
// Data source name: android.sdk_sysprop_guard
// Introduced in Android 14 (U) QPR1.
// Next id: 4
message AndroidSdkSyspropGuardConfig {
// If true, configures SurfaceFlinger to initialize Skia's Perfetto
// integration with the track_event data source in RenderEngine.
// If false or omitted, the simpler ATrace fallback is used.
//
// NOTE: once enabled, Skia will only revert to ATrace if SurfaceFlinger is
// restarted.
//
// Specifically this sets the following system properties:
// - debug.tracing.ctl.renderengine.skia_tracing_enabled
// - debug.tracing.ctl.renderengine.skia_use_perfetto_track_events
//
// Does not affect actual track_event data *collection*, which must be
// configured seperately.
optional bool surfaceflinger_skia_track_events = 1;
// If true, configures HWUI apps to initialize Skia's Perfetto integration
// with the track_event data source. hwui_package_name_filter
// can be used to control which apps are affected.
// If false or omitted, the simpler ATrace fallback is used.
//
// NOTE: once enabled, Skia will only revert to ATrace if the app is
// restarted.
//
// ATTENTION: affects ALL HWUI APPS if hwui_package_name_filter is not set!
// If filtering is NOT set, this controls these GLOBAL system properties:
// - debug.tracing.ctl.hwui.skia_tracing_enabled
// - debug.tracing.ctl.hwui.skia_use_perfetto_track_events
// If filtering IS set, this controls these APP-SPECIFIC system properties,
// for each package listed in the filter:
// - debug.tracing.ctl.hwui.skia_tracing_enabled.<package.name>
// - debug.tracing.ctl.hwui.skia_use_perfetto_track_events.<package.name>
//
// Does not affect actual track_event data *collection*, which must be
// configured seperately.
optional bool hwui_skia_track_events = 2;
// If non-empty, hwui_skia_track_events applies to only the packages listed.
// Otherwise, hwui_skia_track_events applies globally to all HWUI apps.
repeated string hwui_package_name_filter = 3;
}
// End of protos/perfetto/config/android/android_sdk_sysprop_guard_config.proto
// Begin of protos/perfetto/config/android/android_system_property_config.proto
// Data source that polls for system properties.
message AndroidSystemPropertyConfig {
// Frequency of polling. If absent the state will be recorded once, at the
// start of the trace.
// This is required to be > 100ms to avoid excessive CPU usage.
optional uint32 poll_ms = 1;
// Properties to poll. All property names must start with "debug.tracing.".
repeated string property_name = 2;
}
// End of protos/perfetto/config/android/android_system_property_config.proto
// Begin of protos/perfetto/config/android/network_trace_config.proto
// Network tracing data source that records details on all packets sent or
// received by the network.
message NetworkPacketTraceConfig {
// Polling frequency in milliseconds. Network tracing writes to a fixed size
// ring buffer. The polling interval should be such that the ring buffer is
// unlikely to fill in that interval (or that filling is an acceptable risk).
// The minimum polling rate is 100ms (values below this are ignored).
// Introduced in Android 14 (U).
optional uint32 poll_ms = 1;
// The aggregation_threshold is the number of packets at which an event will
// switch from per-packet details to aggregate details. For example, a value
// of 50 means that if a particular event (grouped by the unique combinations
// of metadata fields: {interface, direction, uid, etc}) has fewer than 50
// packets, the exact timestamp and length are recorded for each packet. If
// there were 50 or more packets in an event, it would only record the total
// duration, packets, and length. A value of zero or unspecified will always
/// record per-packet details. A value of 1 always records aggregate details.
optional uint32 aggregation_threshold = 2;
// Specifies the maximum number of packet contexts to intern at a time. This
// prevents the interning table from growing too large and controls whether
// interning is enabled or disabled (a value of zero disables interning and
// is the default). When a data sources interning table reaches this amount,
// packet contexts will be inlined into NetworkPacketEvents.
optional uint32 intern_limit = 3;
// The following fields specify whether certain fields should be dropped from
// the output. Dropping fields improves normalization results, reduces the
// size of the interning table, and slightly reduces event size.
optional bool drop_local_port = 4;
optional bool drop_remote_port = 5;
optional bool drop_tcp_flags = 6;
}
// End of protos/perfetto/config/android/network_trace_config.proto
// Begin of protos/perfetto/config/android/packages_list_config.proto
// Data source that lists details (such as version code) about packages on an
// Android device.
message PackagesListConfig {
// If not empty, emit info about only the following list of package names
// (exact match, no regex). Otherwise, emit info about all packages.
repeated string package_name_filter = 1;
}
// End of protos/perfetto/config/android/packages_list_config.proto
// Begin of protos/perfetto/config/android/surfaceflinger_layers_config.proto
// Custom configuration for the "android.surfaceflinger.layers" data source.
message SurfaceFlingerLayersConfig {
enum Mode {
MODE_UNSPECIFIED = 0;
// Trace layers snapshots. A snapshot is taken every time a layers change
// occurs.
MODE_ACTIVE = 1;
// Generate layers snapshots from the transactions kept in the
// SurfaceFlinger's internal ring buffer.
// The layers snapshots generation occurs when this data source is flushed.
MODE_GENERATED = 2;
// Trace a single layers snapshot.
MODE_DUMP = 3;
// Default mode (applied by SurfaceFlinger if no mode is specified).
// Same as MODE_GENERATED, but triggers the layers snapshots generation only when a bugreport
// is taken.
MODE_GENERATED_BUGREPORT_ONLY = 4;
}
optional Mode mode = 1;
enum TraceFlag {
TRACE_FLAG_UNSPECIFIED = 0;
TRACE_FLAG_INPUT = 0x02;
TRACE_FLAG_COMPOSITION = 0x04;
TRACE_FLAG_EXTRA = 0x08;
TRACE_FLAG_HWC = 0x10;
TRACE_FLAG_BUFFERS = 0x20;
TRACE_FLAG_VIRTUAL_DISPLAYS = 0x40;
// INPUT | COMPOSITION | EXTRA
TRACE_FLAG_ALL = 0x0e;
}
repeated TraceFlag trace_flags = 2;
}
// End of protos/perfetto/config/android/surfaceflinger_layers_config.proto
// Begin of protos/perfetto/config/android/surfaceflinger_transactions_config.proto
// Custom configuration for the "android.surfaceflinger.transactions" data
// source.
message SurfaceFlingerTransactionsConfig {
enum Mode {
MODE_UNSPECIFIED = 0;
// Default mode (applied by SurfaceFlinger if no mode is specified).
// SurfaceFlinger writes its internal ring buffer of transactions every time
// the data source is flushed. The ring buffer contains the SurfaceFlinger's
// initial state and the latest transactions.
MODE_CONTINUOUS = 1;
// SurfaceFlinger writes the initial state and then each incoming
// transaction until the data source is stopped.
MODE_ACTIVE = 2;
}
optional Mode mode = 1;
}
// End of protos/perfetto/config/android/surfaceflinger_transactions_config.proto
// Begin of protos/perfetto/config/chrome/chrome_config.proto
message ChromeConfig {
optional string trace_config = 1;
// When enabled, the data source should only fill in fields in the output that
// are not potentially privacy sensitive.
optional bool privacy_filtering_enabled = 2;
// Instead of emitting binary protobuf, convert the trace data to the legacy
// JSON format. Note that the trace data will still be returned as a series of
// TracePackets, but the embedded data will be JSON instead of serialized
// protobuf.
optional bool convert_to_legacy_json = 3;
// Priority of the tracing session client. A higher priority session may
// preempt a lower priority one in configurations where concurrent sessions
// aren't supported.
enum ClientPriority {
UNKNOWN = 0;
BACKGROUND = 1;
USER_INITIATED = 2;
}
optional ClientPriority client_priority = 4;
// Applicable only when using legacy JSON format.
// If |json_agent_label_filter| is not empty, only data pertaining to
// the specified tracing agent label (e.g. "traceEvents") will be returned.
optional string json_agent_label_filter = 5;
}
// End of protos/perfetto/config/chrome/chrome_config.proto
// Begin of protos/perfetto/config/ftrace/ftrace_config.proto
// Next id: 26.
message FtraceConfig {
repeated string ftrace_events = 1;
repeated string atrace_categories = 2;
repeated string atrace_apps = 3;
// *Per-CPU* buffer size.
optional uint32 buffer_size_kb = 10;
optional uint32 drain_period_ms = 11;
// Configuration for compact encoding of scheduler events. When enabled (and
// recording the relevant ftrace events), specific high-volume events are
// encoded in a denser format than normal.
message CompactSchedConfig {
// If true, and sched_switch or sched_waking ftrace events are enabled,
// record those events in the compact format.
optional bool enabled = 1;
}
optional CompactSchedConfig compact_sched = 12;
// Optional filter for "ftrace/print" events.
//
// The filter consists of multiple rules. As soon as a rule matches (the rules
// are processed in order), its `allow` field will be used as the outcome: if
// `allow` is true, the event will be included in the trace, otherwise it will
// be discarded. If an event does not match any rule, it will be allowed by
// default (a rule with an empty prefix and allow=false, disallows everything
// by default).
message PrintFilter {
message Rule {
// Matches an atrace message of the form:
// <type>|pid|<prefix>...
message AtraceMessage {
optional string type = 1;
optional string prefix = 2;
}
oneof match {
// This rule matches if `prefix` matches exactly with the beginning of
// the "ftrace/print" "buf" field.
string prefix = 1;
// This rule matches if the "buf" field contains an atrace-style print
// message as specified in `atrace_msg`.
AtraceMessage atrace_msg = 3;
}
optional bool allow = 2;
}
repeated Rule rules = 1;
}
optional PrintFilter print_filter = 22;
// Enables symbol name resolution against /proc/kallsyms.
// It requires that either traced_probes is running as root or that
// kptr_restrict has been manually lowered.
// It does not disclose KASLR, symbol addresses are mangled.
optional bool symbolize_ksyms = 13;
// When symbolize_ksyms=true, determines whether the traced_probes daemon
// should keep the symbol map in memory (and reuse it for future tracing
// sessions) or clear it (saving memory) and re-create it on each tracing
// session (wasting cpu and wall time).
// The tradeoff is roughly:
// KSYMS_RETAIN: pay a fixed ~1.2 MB cost after the first trace.
// KSYMS_CLEANUP_ON_STOP: pay a ~300-500ms cost when starting each trace.
// Default behavior: KSYMS_CLEANUP_ON_STOP.
enum KsymsMemPolicy {
KSYMS_UNSPECIFIED = 0;
KSYMS_CLEANUP_ON_STOP = 1;
KSYMS_RETAIN = 2;
}
optional KsymsMemPolicy ksyms_mem_policy = 17;
// By default the kernel symbolizer is lazily initialized on a deferred task
// to reduce ftrace's time-to-start-recording. Unfortunately that makes
// ksyms integration tests hard. This flag forces the kernel symbolizer to be
// initialized synchronously on the data source start and hence avoiding
// timing races in tests.
// DEPRECATED in v28 / Android U. This is now the default behavior, setting it
// to true is a no-op.
optional bool initialize_ksyms_synchronously_for_testing = 14
[deprecated = true];
// When this boolean is true AND the ftrace_events contains "kmem/rss_stat",
// this option causes traced_probes to enable the "kmem/rss_stat_throttled"
// event instead if present, and fall back to "kmem/rss_stat" if not present.
// The historical context for this is the following:
// - Up to Android S (12), the rss_stat was internally throttled in its
// kernel implementation.
// - A change introduced in the kernels after S has introduced a new
// "rss_stat_throttled" making the original "rss_stat" event unthrottled
// (hence very spammy).
// - Not all Android T/13 devices will receive a new kernel though, hence we
// need to deal with both cases.
// For more context: go/rss-stat-throttled.
optional bool throttle_rss_stat = 15;
// If true, avoid enabling events that aren't statically known by
// traced_probes. Otherwise, the default is to emit such events as
// GenericFtraceEvent protos.
// Prefer to keep this flag at its default. This was added for Android
// tracing, where atrace categories and/or atrace HAL requested events can
// expand to events that aren't of interest to the tracing user.
// Introduced in: Android T.
optional bool disable_generic_events = 16;
// The list of syscalls that should be recorded by sys_{enter,exit} ftrace
// events. When empty, all syscalls are recorded. If neither sys_{enter,exit}
// are enabled, this setting has no effect. Example: ["sys_read", "sys_open"].
// Introduced in: Android U.
repeated string syscall_events = 18;
// If true, enable the "function_graph" kernel tracer that emits events
// whenever a kernel function is entered and exited
// (funcgraph_entry/funcgraph_exit).
// Notes on use:
// * Requires |symbolize_ksyms| for function name resolution.
// * Use |function_filters| or |function_graph_roots| to constrain the traced
// set of functions, otherwise the event bandwidth will be too high for
// practical use.
// * The data source might be rejected if there is already a concurrent
// ftrace data source that does not use function graph itself, as we do not
// support switching kernel tracers mid-trace.
// * Requires a kernel compiled with CONFIG_FUNCTION_GRAPH_TRACER. This is
// enabled if "cat /sys/kernel/tracing/available_tracers" includes
// "function_graph".
// Android:
// * Available only on debuggable builds.
// * Introduced in: Android U.
optional bool enable_function_graph = 19;
// Constrains the set of functions traced when |enable_function_graph| is
// true. Supports globs, e.g. "sched*". You can specify multiple filters,
// in which case all matching functions will be traced. See kernel
// documentation on ftrace "set_ftrace_filter" file for more details.
// Android:
// * Available only on debuggable builds.
// * Introduced in: Android U.
repeated string function_filters = 20;
// If |enable_function_graph| is true, trace this set of functions *and* all
// of its callees. Supports globs. Can be set together with
// |function_filters|, in which case only callees matching the filter will be
// traced. If setting both, you most likely want all roots to also be
// included in |function_filters|.
// Android:
// * Available only on debuggable builds.
// * Introduced in: Android U.
repeated string function_graph_roots = 21;
// If true, does not clear ftrace buffers before the start of the program.
// This makes sense only if this is the first ftrace data source instance
// created after the daemon has been started. Can be useful for gathering boot
// traces, if ftrace has been separately configured (e.g. via kernel
// commandline).
optional bool preserve_ftrace_buffer = 23;
// If true, overrides the default timestamp clock and uses a raw hardware
// based monotonic clock for getting timestamps.
// * Introduced in: Android U.
optional bool use_monotonic_raw_clock = 24;
// Caution: under development as of 2023/03/01.
// If |instance_name| is not empty, then attempt to use that tracefs instance
// for event recording. Normally, this means
// `/sys/kernel/tracing/instances/$instance_name`.
//
// The name "hyp" is reserved.
//
// The instance must already exist, the tracing daemon *will not* create it
// for you as it typically doesn't have such permissions.
// Only a subset of features is guaranteed to work with non-default instances,
// at the time of writing:
// * ftrace_events
// * buffer_size_kb
// TODO(b/249050813): reword comment once instance support is stable.
optional string instance_name = 25;
}
// End of protos/perfetto/config/ftrace/ftrace_config.proto
// Begin of protos/perfetto/config/gpu/gpu_counter_config.proto
message GpuCounterConfig {
// Desired sampling interval for counters.
optional uint64 counter_period_ns = 1;
// List of counters to be sampled. Counter IDs correspond to the ones
// described in GpuCounterSpec in the data source descriptor.
repeated uint32 counter_ids = 2;
// Sample counters by instrumenting command buffers.
optional bool instrumented_sampling = 3;
// Fix gpu clock rate during trace session.
optional bool fix_gpu_clock = 4;
}
// End of protos/perfetto/config/gpu/gpu_counter_config.proto
// Begin of protos/perfetto/config/gpu/vulkan_memory_config.proto
message VulkanMemoryConfig {
// Tracking driver memory usage events
optional bool track_driver_memory_usage = 1;
// Tracking device memory usage events
optional bool track_device_memory_usage = 2;
}
// End of protos/perfetto/config/gpu/vulkan_memory_config.proto
// Begin of protos/perfetto/config/inode_file/inode_file_config.proto
message InodeFileConfig {
message MountPointMappingEntry {
optional string mountpoint = 1;
repeated string scan_roots = 2;
}
// How long to pause between batches.
optional uint32 scan_interval_ms = 1;
// How long to wait before the first scan in order to accumulate inodes.
optional uint32 scan_delay_ms = 2;
// How many inodes to scan in one batch.
optional uint32 scan_batch_size = 3;
// Do not scan for inodes not found in the static map.
optional bool do_not_scan = 4;
// If non-empty, only scan inodes corresponding to block devices named in
// this list.
repeated string scan_mount_points = 5;
// When encountering an inode belonging to a block device corresponding
// to one of the mount points in this map, scan its scan_roots instead.
repeated MountPointMappingEntry mount_point_mapping = 6;
}
// End of protos/perfetto/config/inode_file/inode_file_config.proto
// Begin of protos/perfetto/config/interceptors/console_config.proto
message ConsoleConfig {
enum Output {
OUTPUT_UNSPECIFIED = 0;
OUTPUT_STDOUT = 1;
OUTPUT_STDERR = 2;
}
optional Output output = 1;
optional bool enable_colors = 2;
}
// End of protos/perfetto/config/interceptors/console_config.proto
// Begin of protos/perfetto/config/interceptor_config.proto
// Configuration for trace packet interception. Used for diverting trace data to
// non-Perfetto sources (e.g., logging to the console, ETW) when using the
// Perfetto SDK.
message InterceptorConfig {
// Matches the name given to RegisterInterceptor().
optional string name = 1;
optional ConsoleConfig console_config = 100;
}
// End of protos/perfetto/config/interceptor_config.proto
// Begin of protos/perfetto/config/power/android_power_config.proto
message AndroidPowerConfig {
enum BatteryCounters {
BATTERY_COUNTER_UNSPECIFIED = 0;
// Coulomb counter.
BATTERY_COUNTER_CHARGE = 1;
// Charge (%).
BATTERY_COUNTER_CAPACITY_PERCENT = 2;
// Instantaneous current.
BATTERY_COUNTER_CURRENT = 3;
// Avg current.
BATTERY_COUNTER_CURRENT_AVG = 4;
// Instantaneous voltage.
BATTERY_COUNTER_VOLTAGE = 5;
}
optional uint32 battery_poll_ms = 1;
repeated BatteryCounters battery_counters = 2;
// Where available enables per-power-rail measurements.
optional bool collect_power_rails = 3;
// Provides a breakdown of energy estimation for various subsystem (e.g. GPU).
// Available from Android S.
optional bool collect_energy_estimation_breakdown = 4;
// Provides a breakdown of time in state for various subsystems.
// Available from Android U.
optional bool collect_entity_state_residency = 5;
}
// End of protos/perfetto/config/power/android_power_config.proto
// Begin of protos/perfetto/config/process_stats/process_stats_config.proto
message ProcessStatsConfig {
enum Quirks {
QUIRKS_UNSPECIFIED = 0;
// This has been deprecated and ignored as per 2018-05-01. Full scan at
// startup is now disabled by default and can be re-enabled using the
// |scan_all_processes_on_start| arg.
DISABLE_INITIAL_DUMP = 1 [deprecated = true];
DISABLE_ON_DEMAND = 2;
}
repeated Quirks quirks = 1;
// If enabled all processes will be scanned and dumped when the trace starts.
optional bool scan_all_processes_on_start = 2;
// If enabled thread names are also recoded (this is redundant if sched_switch
// is enabled).
optional bool record_thread_names = 3;
// If > 0 samples counters (see process_stats.proto) from
// /proc/pid/status and oom_score_adj every X ms.
// It will also sample /proc/pid/smaps_rollup if scan_smaps_rollup = true.
// This is required to be > 100ms to avoid excessive CPU usage.
// TODO(primiano): add CPU cost for change this value.
optional uint32 proc_stats_poll_ms = 4;
// If empty samples stats for all processes. If non empty samples stats only
// for processes matching the given string in their argv0 (i.e. the first
// entry of /proc/pid/cmdline).
// TODO(primiano): implement this feature.
// repeated string proc_stats_filter = 5;
// This is required to be either = 0 or a multiple of |proc_stats_poll_ms|
// (default: |proc_stats_poll_ms|). If = 0, will be set to
// |proc_stats_poll_ms|. Non-multiples will be rounded down to the nearest
// multiple.
optional uint32 proc_stats_cache_ttl_ms = 6;
// DEPRECATED record_thread_time_in_state
reserved 7;
// DEPRECATED thread_time_in_state_cache_size
reserved 8;
// If true this will resolve filedescriptors for each process so these
// can be mapped to their actual device or file.
// Requires raw_syscalls/sys_exit ftrace events to be enabled or
// new fds opened after initially scanning a process will not be
// recognized.
optional bool resolve_process_fds = 9;
// If enabled memory stats from /proc/pid/smaps_rollup will be included
// in process stats.
optional bool scan_smaps_rollup = 10;
}
// End of protos/perfetto/config/process_stats/process_stats_config.proto
// Begin of protos/perfetto/config/profiling/heapprofd_config.proto
// Configuration for go/heapprofd.
// Next id: 28
message HeapprofdConfig {
message ContinuousDumpConfig {
// ms to wait before first dump.
optional uint32 dump_phase_ms = 5;
// ms to wait between following dumps.
optional uint32 dump_interval_ms = 6;
}
// Sampling rate for all heaps not specified via heap_sampling_intervals.
//
// These are:
// * All heaps if heap_sampling_intervals is empty.
// * Those profiled due to all_heaps and not named in heaps if
// heap_sampling_intervals is not empty.
// * The implicit libc.malloc heap if heaps is empty.
//
// Set to 1 for perfect accuracy.
// Otherwise, sample every sample_interval_bytes on average.
//
// See
// https://perfetto.dev/docs/data-sources/native-heap-profiler#sampling-interval
// for more details.
//
// BUGS
// Before Android 12, setting this to 0 would crash the target process.
//
// N.B. This must be explicitly set to a non-zero value for all heaps (with
// this field or with heap_sampling_intervals), otherwise the producer will
// not start.
optional uint64 sampling_interval_bytes = 1;
// If less than the given numbers of bytes are left free in the shared
// memory buffer, increase sampling interval by a factor of two.
// Adaptive sampling is disabled when set to 0.
optional uint64 adaptive_sampling_shmem_threshold = 24;
// Stop doubling the sampling_interval once the sampling interval has reached
// this value.
optional uint64 adaptive_sampling_max_sampling_interval_bytes = 25;
// E.g. surfaceflinger, com.android.phone
// This input is normalized in the following way: if it contains slashes,
// everything up to the last slash is discarded. If it contains "@",
// everything after the first @ is discared.
// E.g. /system/bin/surfaceflinger@1.0 normalizes to surfaceflinger.
// This transformation is also applied to the processes' command lines when
// matching.
repeated string process_cmdline = 2;
// For watermark based triggering or local debugging.
repeated uint64 pid = 4;
// Only profile target if it was installed by one of the packages given.
// Special values are:
// * @system: installed on the system partition
// * @product: installed on the product partition
// * @null: sideloaded
// Supported on Android 12+.
repeated string target_installed_by = 26;
// Which heaps to sample, e.g. "libc.malloc". If left empty, only samples
// "malloc".
//
// Introduced in Android 12.
repeated string heaps = 20;
// Which heaps not to sample, e.g. "libc.malloc". This is useful when used in
// combination with all_heaps;
//
// Introduced in Android 12.
repeated string exclude_heaps = 27;
optional bool stream_allocations = 23;
// If given, needs to be the same length as heaps and gives the sampling
// interval for the respective entry in heaps.
//
// Otherwise, sampling_interval_bytes is used.
//
// It is recommended to set sampling_interval_bytes to a reasonable default
// value when using this, as a value of 0 for sampling_interval_bytes will
// crash the target process before Android 12.
//
// Introduced in Android 12.
//
// All values must be non-zero or the producer will not start.
repeated uint64 heap_sampling_intervals = 22;
// Sample all heaps registered by target process. Introduced in Android 12.
optional bool all_heaps = 21;
// Profile all processes eligible for profiling on the system.
// See
// https://perfetto.dev/docs/data-sources/native-heap-profiler#heapprofd-targets
// for which processes are eligible.
//
// On unmodified userdebug builds, this will lead to system crashes. Zygote
// will crash when trying to launch a new process as it will have an
// unexpected open socket to heapprofd.
//
// heapprofd will likely be overloaded by the amount of data for low
// sampling intervals.
optional bool all = 5;
// Do not profile processes whose anon RSS + swap < given value.
// Introduced in Android 11.
optional uint32 min_anonymous_memory_kb = 15;
// Stop profile if heapprofd memory usage goes beyond the given value.
// Introduced in Android 11.
optional uint32 max_heapprofd_memory_kb = 16;
// Stop profile if heapprofd CPU time since start of this data-source
// goes beyond given value.
// Introduced in Android 11.
optional uint64 max_heapprofd_cpu_secs = 17;
// Do not emit function names for mappings starting with this prefix.
// E.g. /system to not emit symbols for any system libraries.
repeated string skip_symbol_prefix = 7;
// Dump at a predefined interval.
optional ContinuousDumpConfig continuous_dump_config = 6;
// Size of the shared memory buffer between the profiled processes and
// heapprofd. Defaults to 8 MiB. If larger than 500 MiB, truncated to 500
// MiB.
//
// Needs to be:
// * at least 8192,
// * a power of two,
// * a multiple of 4096.
optional uint64 shmem_size_bytes = 8;
// When the shmem buffer is full, block the client instead of ending the
// trace. Use with caution as this will significantly slow down the target
// process.
optional bool block_client = 9;
// If set, stop the trace session after blocking the client for this
// timeout. Needs to be larger than 100 us, otherwise no retries are done.
// Introduced in Android 11.
optional uint32 block_client_timeout_us = 14;
// Do not profile processes from startup, only match already running
// processes.
//
// Can not be set at the same time as no_running.
// Introduced in Android 11.
optional bool no_startup = 10;
// Do not profile running processes. Only match processes on startup.
//
// Can not be set at the same time as no_startup.
// Introduced in Android 11.
optional bool no_running = 11;
// deprecated idle_allocations.
reserved 12;
// Cause heapprofd to emit a single dump at the end, showing the memory usage
// at the point in time when the sampled heap usage of the process was at its
// maximum. This causes ProfilePacket.HeapSample.self_max to be set, and
// self_allocated and self_freed to not be set.
// Introduced in Android 11.
optional bool dump_at_max = 13;
// FEATURE FLAGS. THERE BE DRAGONS.
// Escape hatch if the session is being torn down because of a forked child
// that shares memory space, but is not correctly identified as a vforked
// child.
// Introduced in Android 11.
optional bool disable_fork_teardown = 18;
// We try to automatically detect when a target applicatation vforks but then
// does a memory allocation (or free). This auto-detection can be disabled
// with this.
// Introduced in Android 11.
optional bool disable_vfork_detection = 19;
}
// End of protos/perfetto/config/profiling/heapprofd_config.proto
// Begin of protos/perfetto/config/profiling/java_hprof_config.proto
// Configuration for managed app heap graph snapshots.
message JavaHprofConfig {
// If dump_interval_ms != 0, the following configuration is used.
message ContinuousDumpConfig {
// ms to wait before first continuous dump.
// A dump is always created at the beginning of the trace.
optional uint32 dump_phase_ms = 1;
// ms to wait between following dumps.
optional uint32 dump_interval_ms = 2;
// If true, scans all the processes to find `process_cmdline` and filter by
// `min_anonymous_memory_kb` only at data source start. Default on Android
// S-.
//
// If false, rescans all the processes to find on every dump. Default on
// Android T+.
optional bool scan_pids_only_on_start = 3;
}
// Command line allowlist, matched against the /proc/<pid>/cmdline (not the
// comm string). The semantics of this field were changed since its original
// introduction.
//
// On Android T+ (13+), this field can specify a single wildcard (*), and
// the profiler will attempt to match it in two possible ways:
// * if the pattern starts with a '/', then it is matched against the first
// segment of the cmdline (i.e. argv0). For example "/bin/e*" would match
// "/bin/echo".
// * otherwise the pattern is matched against the part of argv0
// corresponding to the binary name (this is unrelated to /proc/pid/exe).
// For example "echo" would match "/bin/echo".
//
// On Android S (12) and below, both this pattern and /proc/pid/cmdline get
// normalized prior to an exact string comparison. Normalization is as
// follows: (1) trim everything beyond the first null or "@" byte; (2) if
// the string contains forward slashes, trim everything up to and including
// the last one.
//
// Implementation note: in either case, at most 511 characters of cmdline
// are considered.
repeated string process_cmdline = 1;
// For watermark based triggering or local debugging.
repeated uint64 pid = 2;
// Only profile target if it was installed by one of the packages given.
// Special values are:
// * @system: installed on the system partition
// * @product: installed on the product partition
// * @null: sideloaded
// Supported on Android 12+.
repeated string target_installed_by = 7;
// Dump at a predefined interval.
optional ContinuousDumpConfig continuous_dump_config = 3;
// Do not profile processes whose anon RSS + swap < given value.
optional uint32 min_anonymous_memory_kb = 4;
// Include the process' /proc/self/smaps.
// This only shows maps that:
// * start with /system
// * start with /vendor
// * start with /data/app
// * contain "extracted in memory from Y", where Y matches any of the above
optional bool dump_smaps = 5;
// Exclude objects of the following types from the profile. This can be
// useful if lots of uninteresting objects, e.g. "sun.misc.Cleaner".
repeated string ignored_types = 6;
}
// End of protos/perfetto/config/profiling/java_hprof_config.proto
// Begin of protos/perfetto/common/perf_events.proto
// Next id: 12
message PerfEvents {
// What event to sample on, and how often. Commented from the perspective of
// its use in |PerfEventConfig|.
message Timebase {
// How often the per-cpu sampling will occur. Not guaranteed to be honored
// as the kernel can throttle the sampling rate if it's too high.
// If unset, an implementation-defined default is used.
oneof interval {
// Per-cpu sampling frequency in Hz, as requested from the kernel. Not the
// same as 1/period.
// Details: the actual sampling will still be based on a period, but the
// kernel will dynamically adjust it based on the observed event rate, to
// approximate this frequency. Works best with steady-rate events like
// timers.
uint64 frequency = 2;
// Per-cpu sampling will occur every |period| counts of |event|.
// Prefer |frequency| by default, as it's easier to oversample with a
// fixed period.
uint64 period = 1;
}
// Counting event to use as a timebase for the sampling.
// If unset, implies the CPU timer (SW_CPU_CLOCK) as the event,
// which is what you usually want.
// See common/perf_events.proto for the definitions.
oneof event {
Counter counter = 4;
Tracepoint tracepoint = 3;
RawEvent raw_event = 5;
}
// If set, samples will be timestamped with the given clock.
// If unset, the clock is chosen by the implementation.
// For software events, prefer PERF_CLOCK_BOOTTIME. However it cannot be
// used for hardware events (due to interrupt safety), for which the
// recommendation is to use one of the monotonic clocks.
optional PerfClock timestamp_clock = 11;
// Optional arbitrary name for the event, to identify it in the parsed
// trace. Does *not* affect the profiling itself. If unset, the trace
// parser will choose a suitable name.
optional string name = 10;
}
// Builtin counter names from the uapi header. Commented with their perf tool
// aliases.
// TODO(rsavitski): consider generating enums for cache events (should be
// finite), and generally make this list as extensive as possible. Excluding
// things like dynamic PMUs since those don't fit into a static enum.
// Next id: 21
enum Counter {
UNKNOWN_COUNTER = 0;
// cpu-clock
SW_CPU_CLOCK = 1;
// page-faults, faults
SW_PAGE_FAULTS = 2;
// task-clock
SW_TASK_CLOCK = 3;
// context-switches, cs
SW_CONTEXT_SWITCHES = 4;
// cpu-migrations, migrations
SW_CPU_MIGRATIONS = 5;
// minor-faults
SW_PAGE_FAULTS_MIN = 6;
// major-faults
SW_PAGE_FAULTS_MAJ = 7;
// alignment-faults
SW_ALIGNMENT_FAULTS = 8;
// emulation-faults
SW_EMULATION_FAULTS = 9;
// dummy
SW_DUMMY = 20;
// cpu-cycles, cycles
HW_CPU_CYCLES = 10;
// instructions
HW_INSTRUCTIONS = 11;
// cache-references
HW_CACHE_REFERENCES = 12;
// cache-misses
HW_CACHE_MISSES = 13;
// branch-instructions, branches
HW_BRANCH_INSTRUCTIONS = 14;
// branch-misses
HW_BRANCH_MISSES = 15;
// bus-cycles
HW_BUS_CYCLES = 16;
// stalled-cycles-frontend, idle-cycles-frontend
HW_STALLED_CYCLES_FRONTEND = 17;
// stalled-cycles-backend, idle-cycles-backend
HW_STALLED_CYCLES_BACKEND = 18;
// ref-cycles
HW_REF_CPU_CYCLES = 19;
}
message Tracepoint {
// Group and name for the tracepoint, acceptable forms:
// * "sched/sched_switch"
// * "sched:sched_switch"
optional string name = 1;
// Optional field-level filter for the tracepoint. Only events matching this
// filter will be counted (and therefore contribute to the sampling period).
// Example: "prev_pid >= 42 && next_pid == 0".
// For full syntax, see kernel documentation on "Event filtering":
// https://www.kernel.org/doc/Documentation/trace/events.txt
optional string filter = 2;
}
// Syscall-level description of the event, propagated to the perf_event_attr
// struct. Primarily for local use-cases, since the event availability and
// encoding is hardware-specific.
message RawEvent {
optional uint32 type = 1;
optional uint64 config = 2;
optional uint64 config1 = 3;
optional uint64 config2 = 4;
}
// Subset of clocks that is supported by perf timestamping.
// CLOCK_TAI is excluded since it's not expected to be used in practice, but
// would require additions to the trace clock synchronisation logic.
enum PerfClock {
UNKNOWN_PERF_CLOCK = 0;
PERF_CLOCK_REALTIME = 1;
PERF_CLOCK_MONOTONIC = 2;
PERF_CLOCK_MONOTONIC_RAW = 3;
PERF_CLOCK_BOOTTIME = 4;
}
}
// End of protos/perfetto/common/perf_events.proto
// Begin of protos/perfetto/config/profiling/perf_event_config.proto
// Configuration for the traced_perf profiler.
//
// Example config for basic cpu profiling:
// perf_event_config {
// timebase {
// frequency: 80
// }
// callstack_sampling {
// scope {
// target_cmdline: "surfaceflinger"
// target_cmdline: "system_server"
// }
// kernel_frames: true
// }
// }
//
// Next id: 19
message PerfEventConfig {
// What event to sample on, and how often.
// Defined in common/perf_events.proto.
optional PerfEvents.Timebase timebase = 15;
// If set, the profiler will sample userspace processes' callstacks at the
// interval specified by the |timebase|.
// If unset, the profiler will record only the event counts.
optional CallstackSampling callstack_sampling = 16;
//
// Kernel <-> userspace ring buffer options:
//
// How often the per-cpu ring buffers are read by the producer.
// If unset, an implementation-defined default is used.
optional uint32 ring_buffer_read_period_ms = 8;
// Size (in 4k pages) of each per-cpu ring buffer that is filled by the
// kernel. If set, must be a power of two.
// If unset, an implementation-defined default is used.
optional uint32 ring_buffer_pages = 3;
//
// Daemon's resource usage limits:
//
// Drop samples if the heap memory held by the samples in the unwinder queue
// is above the given limit. This counts the memory across all concurrent data
// sources (not just this one's), and there is no fairness guarantee - the
// whole quota might be used up by a concurrent source.
optional uint64 max_enqueued_footprint_kb = 17;
// Stop the data source if traced_perf's combined {RssAnon + Swap} memory
// footprint exceeds this value.
optional uint32 max_daemon_memory_kb = 13;
//
// Uncommon options:
//
// Timeout for the remote /proc/<pid>/{maps,mem} file descriptors for a
// sampled process. This is primarily for Android, where this lookup is
// asynchronous. As long as the producer is waiting, the associated samples
// will be kept enqueued (putting pressure on the capacity of the shared
// unwinding queue). Once a lookup for a process expires, all associated
// samples are discarded. However, if the lookup still succeeds after the
// timeout, future samples will be handled normally.
// If unset, an implementation-defined default is used.
optional uint32 remote_descriptor_timeout_ms = 9;
// Optional period for clearing state cached by the unwinder. This is a heavy
// operation that is only necessary for traces that target a wide set of
// processes, and require the memory footprint to be reset periodically.
// If unset, the cached state will not be cleared.
optional uint32 unwind_state_clear_period_ms = 10;
// If set, only profile target if it was installed by a package with one of
// these names. Special values:
// * "@system": installed on the system partition
// * "@product": installed on the product partition
// * "@null": sideloaded
// Supported on Android 12+.
repeated string target_installed_by = 18;
//
// Deprecated (superseded by options above):
//
// Do not set *any* of these fields in new configs.
//
// Note: legacy configs had to set |all_cpus| to true to pass parsing.
// We rely on this to detect such configs.
optional bool all_cpus = 1;
optional uint32 sampling_frequency = 2;
optional bool kernel_frames = 12;
repeated int32 target_pid = 4;
repeated string target_cmdline = 5;
repeated int32 exclude_pid = 6;
repeated string exclude_cmdline = 7;
optional uint32 additional_cmdline_count = 11;
// previously |tracepoint|
reserved 14;
//
// Sub-messages (nested for generated code namespacing).
//
message CallstackSampling {
// Defines a set of processes for which samples are retained/skipped. If
// unset, all samples are kept, but beware that it will be very heavy on the
// stack unwinder, which might start dropping samples due to overload.
optional Scope scope = 1;
// If true, callstacks will include the kernel-space frames. Such frames can
// be identified by a magical "kernel" string as their mapping name.
// Requires traced_perf to be running as root, or kptr_restrict to have been
// manually unrestricted. On Android, the platform should do the right thing
// on debug builds.
// This does *not* disclose KASLR, as only the function names are emitted.
optional bool kernel_frames = 2;
// Whether to record and unwind userspace callstacks. If unset, defaults to
// including userspace (UNWIND_DWARF) both for backwards compatibility and
// as the most common default (this defaulting is only applicable if the
// outer CallstackSampling message is explicitly set).
optional UnwindMode user_frames = 3;
}
message Scope {
// Process ID (TGID) allowlist. If this list is not empty, only matching
// samples will be retained. If multiple allow/deny-lists are
// specified by the config, then all of them are evaluated for each sampled
// process.
repeated int32 target_pid = 1;
// Command line allowlist, matched against the /proc/<pid>/cmdline (not the
// comm string). The semantics of this field were changed since its original
// introduction.
//
// On Android T+ (13+), this field can specify a single wildcard (*), and
// the profiler will attempt to match it in two possible ways:
// * if the pattern starts with a '/', then it is matched against the first
// segment of the cmdline (i.e. argv0). For example "/bin/e*" would match
// "/bin/echo".
// * otherwise the pattern is matched against the part of argv0
// corresponding to the binary name (this is unrelated to /proc/pid/exe).
// For example "echo" would match "/bin/echo".
//
// On Android S (12) and below, both this pattern and /proc/pid/cmdline get
// normalized prior to an exact string comparison. Normalization is as
// follows: (1) trim everything beyond the first null or "@" byte; (2) if
// the string contains forward slashes, trim everything up to and including
// the last one.
//
// Implementation note: in either case, at most 511 characters of cmdline
// are considered.
repeated string target_cmdline = 2;
// List of excluded pids.
repeated int32 exclude_pid = 3;
// List of excluded cmdlines. See description of |target_cmdline| for how
// this is handled.
repeated string exclude_cmdline = 4;
// Niche features for systemwide callstacks:
// Number of additional command lines to sample. Only those which are
// neither explicitly included nor excluded will be considered. Processes
// are accepted on a first come, first served basis.
optional uint32 additional_cmdline_count = 5;
// If set to N, all encountered processes will be put into one of the N
// possible bins, and only one randomly-chosen bin will be selected for
// unwinding. The binning is simply "pid % N", under the assumption that
// low-order bits of pids are roughly uniformly distributed. Other explicit
// inclusions/exclusions in this |Scope| message are still respected.
//
// The profiler will report the chosen shard in PerfSampleDefaults, and the
// values will be queryable in trace processor under the "stats" table as
// "perf_process_shard_count" and "perf_chosen_process_shard".
//
// NB: all data sources in a config that set |process_shard_count| must set
// it to the same value. The profiler will choose one bin for all those data
// sources.
optional uint32 process_shard_count = 6;
}
// Userspace unwinding mode. A possible future addition is kernel-unwound
// callchains for frame pointer based systems.
enum UnwindMode {
UNWIND_UNKNOWN = 0;
// Do not unwind userspace:
UNWIND_SKIP = 1;
// Use libunwindstack (default):
UNWIND_DWARF = 2;
}
}
// End of protos/perfetto/config/profiling/perf_event_config.proto
// Begin of protos/perfetto/config/statsd/atom_ids.proto
// This enum is obtained by post-processing
// AOSP/frameworks/proto_logging/stats/atoms.proto through
// AOSP/external/perfetto/tools/update-statsd-descriptor, which extracts one
// enum value for each proto field defined in the upstream atoms.proto.
enum AtomId {
ATOM_UNSPECIFIED = 0;
ATOM_BLE_SCAN_STATE_CHANGED = 2;
ATOM_PROCESS_STATE_CHANGED = 3;
ATOM_BLE_SCAN_RESULT_RECEIVED = 4;
ATOM_SENSOR_STATE_CHANGED = 5;
ATOM_GPS_SCAN_STATE_CHANGED = 6;
ATOM_SYNC_STATE_CHANGED = 7;
ATOM_SCHEDULED_JOB_STATE_CHANGED = 8;
ATOM_SCREEN_BRIGHTNESS_CHANGED = 9;
ATOM_WAKELOCK_STATE_CHANGED = 10;
ATOM_LONG_PARTIAL_WAKELOCK_STATE_CHANGED = 11;
ATOM_MOBILE_RADIO_POWER_STATE_CHANGED = 12;
ATOM_WIFI_RADIO_POWER_STATE_CHANGED = 13;
ATOM_ACTIVITY_MANAGER_SLEEP_STATE_CHANGED = 14;
ATOM_MEMORY_FACTOR_STATE_CHANGED = 15;
ATOM_EXCESSIVE_CPU_USAGE_REPORTED = 16;
ATOM_CACHED_KILL_REPORTED = 17;
ATOM_PROCESS_MEMORY_STAT_REPORTED = 18;
ATOM_LAUNCHER_EVENT = 19;
ATOM_BATTERY_SAVER_MODE_STATE_CHANGED = 20;
ATOM_DEVICE_IDLE_MODE_STATE_CHANGED = 21;
ATOM_DEVICE_IDLING_MODE_STATE_CHANGED = 22;
ATOM_AUDIO_STATE_CHANGED = 23;
ATOM_MEDIA_CODEC_STATE_CHANGED = 24;
ATOM_CAMERA_STATE_CHANGED = 25;
ATOM_FLASHLIGHT_STATE_CHANGED = 26;
ATOM_UID_PROCESS_STATE_CHANGED = 27;
ATOM_PROCESS_LIFE_CYCLE_STATE_CHANGED = 28;
ATOM_SCREEN_STATE_CHANGED = 29;
ATOM_BATTERY_LEVEL_CHANGED = 30;
ATOM_CHARGING_STATE_CHANGED = 31;
ATOM_PLUGGED_STATE_CHANGED = 32;
ATOM_INTERACTIVE_STATE_CHANGED = 33;
ATOM_TOUCH_EVENT_REPORTED = 34;
ATOM_WAKEUP_ALARM_OCCURRED = 35;
ATOM_KERNEL_WAKEUP_REPORTED = 36;
ATOM_WIFI_LOCK_STATE_CHANGED = 37;
ATOM_WIFI_SIGNAL_STRENGTH_CHANGED = 38;
ATOM_WIFI_SCAN_STATE_CHANGED = 39;
ATOM_PHONE_SIGNAL_STRENGTH_CHANGED = 40;
ATOM_SETTING_CHANGED = 41;
ATOM_ACTIVITY_FOREGROUND_STATE_CHANGED = 42;
ATOM_ISOLATED_UID_CHANGED = 43;
ATOM_PACKET_WAKEUP_OCCURRED = 44;
ATOM_WALL_CLOCK_TIME_SHIFTED = 45;
ATOM_ANOMALY_DETECTED = 46;
ATOM_APP_BREADCRUMB_REPORTED = 47;
ATOM_APP_START_OCCURRED = 48;
ATOM_APP_START_CANCELED = 49;
ATOM_APP_START_FULLY_DRAWN = 50;
ATOM_LMK_KILL_OCCURRED = 51;
ATOM_PICTURE_IN_PICTURE_STATE_CHANGED = 52;
ATOM_WIFI_MULTICAST_LOCK_STATE_CHANGED = 53;
ATOM_LMK_STATE_CHANGED = 54;
ATOM_APP_START_MEMORY_STATE_CAPTURED = 55;
ATOM_SHUTDOWN_SEQUENCE_REPORTED = 56;
ATOM_BOOT_SEQUENCE_REPORTED = 57;
ATOM_DAVEY_OCCURRED = 58;
ATOM_OVERLAY_STATE_CHANGED = 59;
ATOM_FOREGROUND_SERVICE_STATE_CHANGED = 60;
ATOM_CALL_STATE_CHANGED = 61;
ATOM_KEYGUARD_STATE_CHANGED = 62;
ATOM_KEYGUARD_BOUNCER_STATE_CHANGED = 63;
ATOM_KEYGUARD_BOUNCER_PASSWORD_ENTERED = 64;
ATOM_APP_DIED = 65;
ATOM_RESOURCE_CONFIGURATION_CHANGED = 66;
ATOM_BLUETOOTH_ENABLED_STATE_CHANGED = 67;
ATOM_BLUETOOTH_CONNECTION_STATE_CHANGED = 68;
ATOM_GPS_SIGNAL_QUALITY_CHANGED = 69;
ATOM_USB_CONNECTOR_STATE_CHANGED = 70;
ATOM_SPEAKER_IMPEDANCE_REPORTED = 71;
ATOM_HARDWARE_FAILED = 72;
ATOM_PHYSICAL_DROP_DETECTED = 73;
ATOM_CHARGE_CYCLES_REPORTED = 74;
ATOM_MOBILE_CONNECTION_STATE_CHANGED = 75;
ATOM_MOBILE_RADIO_TECHNOLOGY_CHANGED = 76;
ATOM_USB_DEVICE_ATTACHED = 77;
ATOM_APP_CRASH_OCCURRED = 78;
ATOM_ANR_OCCURRED = 79;
ATOM_WTF_OCCURRED = 80;
ATOM_LOW_MEM_REPORTED = 81;
ATOM_GENERIC_ATOM = 82;
ATOM_VIBRATOR_STATE_CHANGED = 84;
ATOM_DEFERRED_JOB_STATS_REPORTED = 85;
ATOM_THERMAL_THROTTLING = 86;
ATOM_BIOMETRIC_ACQUIRED = 87;
ATOM_BIOMETRIC_AUTHENTICATED = 88;
ATOM_BIOMETRIC_ERROR_OCCURRED = 89;
ATOM_UI_EVENT_REPORTED = 90;
ATOM_BATTERY_HEALTH_SNAPSHOT = 91;
ATOM_SLOW_IO = 92;
ATOM_BATTERY_CAUSED_SHUTDOWN = 93;
ATOM_PHONE_SERVICE_STATE_CHANGED = 94;
ATOM_PHONE_STATE_CHANGED = 95;
ATOM_USER_RESTRICTION_CHANGED = 96;
ATOM_SETTINGS_UI_CHANGED = 97;
ATOM_CONNECTIVITY_STATE_CHANGED = 98;
ATOM_SERVICE_STATE_CHANGED = 99;
ATOM_SERVICE_LAUNCH_REPORTED = 100;
ATOM_FLAG_FLIP_UPDATE_OCCURRED = 101;
ATOM_BINARY_PUSH_STATE_CHANGED = 102;
ATOM_DEVICE_POLICY_EVENT = 103;
ATOM_DOCS_UI_FILE_OP_CANCELED = 104;
ATOM_DOCS_UI_FILE_OP_COPY_MOVE_MODE_REPORTED = 105;
ATOM_DOCS_UI_FILE_OP_FAILURE = 106;
ATOM_DOCS_UI_PROVIDER_FILE_OP = 107;
ATOM_DOCS_UI_INVALID_SCOPED_ACCESS_REQUEST = 108;
ATOM_DOCS_UI_LAUNCH_REPORTED = 109;
ATOM_DOCS_UI_ROOT_VISITED = 110;
ATOM_DOCS_UI_STARTUP_MS = 111;
ATOM_DOCS_UI_USER_ACTION_REPORTED = 112;
ATOM_WIFI_ENABLED_STATE_CHANGED = 113;
ATOM_WIFI_RUNNING_STATE_CHANGED = 114;
ATOM_APP_COMPACTED = 115;
ATOM_NETWORK_DNS_EVENT_REPORTED = 116;
ATOM_DOCS_UI_PICKER_LAUNCHED_FROM_REPORTED = 117;
ATOM_DOCS_UI_PICK_RESULT_REPORTED = 118;
ATOM_DOCS_UI_SEARCH_MODE_REPORTED = 119;
ATOM_DOCS_UI_SEARCH_TYPE_REPORTED = 120;
ATOM_DATA_STALL_EVENT = 121;
ATOM_RESCUE_PARTY_RESET_REPORTED = 122;
ATOM_SIGNED_CONFIG_REPORTED = 123;
ATOM_GNSS_NI_EVENT_REPORTED = 124;
ATOM_BLUETOOTH_LINK_LAYER_CONNECTION_EVENT = 125;
ATOM_BLUETOOTH_ACL_CONNECTION_STATE_CHANGED = 126;
ATOM_BLUETOOTH_SCO_CONNECTION_STATE_CHANGED = 127;
ATOM_APP_DOWNGRADED = 128;
ATOM_APP_OPTIMIZED_AFTER_DOWNGRADED = 129;
ATOM_LOW_STORAGE_STATE_CHANGED = 130;
ATOM_GNSS_NFW_NOTIFICATION_REPORTED = 131;
ATOM_GNSS_CONFIGURATION_REPORTED = 132;
ATOM_USB_PORT_OVERHEAT_EVENT_REPORTED = 133;
ATOM_NFC_ERROR_OCCURRED = 134;
ATOM_NFC_STATE_CHANGED = 135;
ATOM_NFC_BEAM_OCCURRED = 136;
ATOM_NFC_CARDEMULATION_OCCURRED = 137;
ATOM_NFC_TAG_OCCURRED = 138;
ATOM_NFC_HCE_TRANSACTION_OCCURRED = 139;
ATOM_SE_STATE_CHANGED = 140;
ATOM_SE_OMAPI_REPORTED = 141;
ATOM_BROADCAST_DISPATCH_LATENCY_REPORTED = 142;
ATOM_ATTENTION_MANAGER_SERVICE_RESULT_REPORTED = 143;
ATOM_ADB_CONNECTION_CHANGED = 144;
ATOM_SPEECH_DSP_STAT_REPORTED = 145;
ATOM_USB_CONTAMINANT_REPORTED = 146;
ATOM_WATCHDOG_ROLLBACK_OCCURRED = 147;
ATOM_BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED = 148;
ATOM_BUBBLE_UI_CHANGED = 149;
ATOM_SCHEDULED_JOB_CONSTRAINT_CHANGED = 150;
ATOM_BLUETOOTH_ACTIVE_DEVICE_CHANGED = 151;
ATOM_BLUETOOTH_A2DP_PLAYBACK_STATE_CHANGED = 152;
ATOM_BLUETOOTH_A2DP_CODEC_CONFIG_CHANGED = 153;
ATOM_BLUETOOTH_A2DP_CODEC_CAPABILITY_CHANGED = 154;
ATOM_BLUETOOTH_A2DP_AUDIO_UNDERRUN_REPORTED = 155;
ATOM_BLUETOOTH_A2DP_AUDIO_OVERRUN_REPORTED = 156;
ATOM_BLUETOOTH_DEVICE_RSSI_REPORTED = 157;
ATOM_BLUETOOTH_DEVICE_FAILED_CONTACT_COUNTER_REPORTED = 158;
ATOM_BLUETOOTH_DEVICE_TX_POWER_LEVEL_REPORTED = 159;
ATOM_BLUETOOTH_HCI_TIMEOUT_REPORTED = 160;
ATOM_BLUETOOTH_QUALITY_REPORT_REPORTED = 161;
ATOM_BLUETOOTH_DEVICE_INFO_REPORTED = 162;
ATOM_BLUETOOTH_REMOTE_VERSION_INFO_REPORTED = 163;
ATOM_BLUETOOTH_SDP_ATTRIBUTE_REPORTED = 164;
ATOM_BLUETOOTH_BOND_STATE_CHANGED = 165;
ATOM_BLUETOOTH_CLASSIC_PAIRING_EVENT_REPORTED = 166;
ATOM_BLUETOOTH_SMP_PAIRING_EVENT_REPORTED = 167;
ATOM_SCREEN_TIMEOUT_EXTENSION_REPORTED = 168;
ATOM_PROCESS_START_TIME = 169;
ATOM_PERMISSION_GRANT_REQUEST_RESULT_REPORTED = 170;
ATOM_BLUETOOTH_SOCKET_CONNECTION_STATE_CHANGED = 171;
ATOM_DEVICE_IDENTIFIER_ACCESS_DENIED = 172;
ATOM_BUBBLE_DEVELOPER_ERROR_REPORTED = 173;
ATOM_ASSIST_GESTURE_STAGE_REPORTED = 174;
ATOM_ASSIST_GESTURE_FEEDBACK_REPORTED = 175;
ATOM_ASSIST_GESTURE_PROGRESS_REPORTED = 176;
ATOM_TOUCH_GESTURE_CLASSIFIED = 177;
ATOM_HIDDEN_API_USED = 178;
ATOM_STYLE_UI_CHANGED = 179;
ATOM_PRIVACY_INDICATORS_INTERACTED = 180;
ATOM_APP_INSTALL_ON_EXTERNAL_STORAGE_REPORTED = 181;
ATOM_NETWORK_STACK_REPORTED = 182;
ATOM_APP_MOVED_STORAGE_REPORTED = 183;
ATOM_BIOMETRIC_ENROLLED = 184;
ATOM_SYSTEM_SERVER_WATCHDOG_OCCURRED = 185;
ATOM_TOMB_STONE_OCCURRED = 186;
ATOM_BLUETOOTH_CLASS_OF_DEVICE_REPORTED = 187;
ATOM_INTELLIGENCE_EVENT_REPORTED = 188;
ATOM_THERMAL_THROTTLING_SEVERITY_STATE_CHANGED = 189;
ATOM_ROLE_REQUEST_RESULT_REPORTED = 190;
ATOM_MEDIAMETRICS_AUDIOPOLICY_REPORTED = 191;
ATOM_MEDIAMETRICS_AUDIORECORD_REPORTED = 192;
ATOM_MEDIAMETRICS_AUDIOTHREAD_REPORTED = 193;
ATOM_MEDIAMETRICS_AUDIOTRACK_REPORTED = 194;
ATOM_MEDIAMETRICS_CODEC_REPORTED = 195;
ATOM_MEDIAMETRICS_DRM_WIDEVINE_REPORTED = 196;
ATOM_MEDIAMETRICS_EXTRACTOR_REPORTED = 197;
ATOM_MEDIAMETRICS_MEDIADRM_REPORTED = 198;
ATOM_MEDIAMETRICS_NUPLAYER_REPORTED = 199;
ATOM_MEDIAMETRICS_RECORDER_REPORTED = 200;
ATOM_MEDIAMETRICS_DRMMANAGER_REPORTED = 201;
ATOM_CAR_POWER_STATE_CHANGED = 203;
ATOM_GARAGE_MODE_INFO = 204;
ATOM_TEST_ATOM_REPORTED = 205;
ATOM_CONTENT_CAPTURE_CALLER_MISMATCH_REPORTED = 206;
ATOM_CONTENT_CAPTURE_SERVICE_EVENTS = 207;
ATOM_CONTENT_CAPTURE_SESSION_EVENTS = 208;
ATOM_CONTENT_CAPTURE_FLUSHED = 209;
ATOM_LOCATION_MANAGER_API_USAGE_REPORTED = 210;
ATOM_REVIEW_PERMISSIONS_FRAGMENT_RESULT_REPORTED = 211;
ATOM_RUNTIME_PERMISSIONS_UPGRADE_RESULT = 212;
ATOM_GRANT_PERMISSIONS_ACTIVITY_BUTTON_ACTIONS = 213;
ATOM_LOCATION_ACCESS_CHECK_NOTIFICATION_ACTION = 214;
ATOM_APP_PERMISSION_FRAGMENT_ACTION_REPORTED = 215;
ATOM_APP_PERMISSION_FRAGMENT_VIEWED = 216;
ATOM_APP_PERMISSIONS_FRAGMENT_VIEWED = 217;
ATOM_PERMISSION_APPS_FRAGMENT_VIEWED = 218;
ATOM_TEXT_SELECTION_EVENT = 219;
ATOM_TEXT_LINKIFY_EVENT = 220;
ATOM_CONVERSATION_ACTIONS_EVENT = 221;
ATOM_LANGUAGE_DETECTION_EVENT = 222;
ATOM_EXCLUSION_RECT_STATE_CHANGED = 223;
ATOM_BACK_GESTURE_REPORTED_REPORTED = 224;
ATOM_UPDATE_ENGINE_UPDATE_ATTEMPT_REPORTED = 225;
ATOM_UPDATE_ENGINE_SUCCESSFUL_UPDATE_REPORTED = 226;
ATOM_CAMERA_ACTION_EVENT = 227;
ATOM_APP_COMPATIBILITY_CHANGE_REPORTED = 228;
ATOM_PERFETTO_UPLOADED = 229;
ATOM_VMS_CLIENT_CONNECTION_STATE_CHANGED = 230;
ATOM_MEDIA_PROVIDER_SCAN_OCCURRED = 233;
ATOM_MEDIA_CONTENT_DELETED = 234;
ATOM_MEDIA_PROVIDER_PERMISSION_REQUESTED = 235;
ATOM_MEDIA_PROVIDER_SCHEMA_CHANGED = 236;
ATOM_MEDIA_PROVIDER_IDLE_MAINTENANCE_FINISHED = 237;
ATOM_REBOOT_ESCROW_RECOVERY_REPORTED = 238;
ATOM_BOOT_TIME_EVENT_DURATION_REPORTED = 239;
ATOM_BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED = 240;
ATOM_BOOT_TIME_EVENT_UTC_TIME_REPORTED = 241;
ATOM_BOOT_TIME_EVENT_ERROR_CODE_REPORTED = 242;
ATOM_USERSPACE_REBOOT_REPORTED = 243;
ATOM_NOTIFICATION_REPORTED = 244;
ATOM_NOTIFICATION_PANEL_REPORTED = 245;
ATOM_NOTIFICATION_CHANNEL_MODIFIED = 246;
ATOM_INTEGRITY_CHECK_RESULT_REPORTED = 247;
ATOM_INTEGRITY_RULES_PUSHED = 248;
ATOM_CB_MESSAGE_REPORTED = 249;
ATOM_CB_MESSAGE_ERROR = 250;
ATOM_WIFI_HEALTH_STAT_REPORTED = 251;
ATOM_WIFI_FAILURE_STAT_REPORTED = 252;
ATOM_WIFI_CONNECTION_RESULT_REPORTED = 253;
ATOM_APP_FREEZE_CHANGED = 254;
ATOM_SNAPSHOT_MERGE_REPORTED = 255;
ATOM_FOREGROUND_SERVICE_APP_OP_SESSION_ENDED = 256;
ATOM_DISPLAY_JANK_REPORTED = 257;
ATOM_APP_STANDBY_BUCKET_CHANGED = 258;
ATOM_SHARESHEET_STARTED = 259;
ATOM_RANKING_SELECTED = 260;
ATOM_TVSETTINGS_UI_INTERACTED = 261;
ATOM_LAUNCHER_SNAPSHOT = 262;
ATOM_PACKAGE_INSTALLER_V2_REPORTED = 263;
ATOM_USER_LIFECYCLE_JOURNEY_REPORTED = 264;
ATOM_USER_LIFECYCLE_EVENT_OCCURRED = 265;
ATOM_ACCESSIBILITY_SHORTCUT_REPORTED = 266;
ATOM_ACCESSIBILITY_SERVICE_REPORTED = 267;
ATOM_DOCS_UI_DRAG_AND_DROP_REPORTED = 268;
ATOM_APP_USAGE_EVENT_OCCURRED = 269;
ATOM_AUTO_REVOKE_NOTIFICATION_CLICKED = 270;
ATOM_AUTO_REVOKE_FRAGMENT_APP_VIEWED = 271;
ATOM_AUTO_REVOKED_APP_INTERACTION = 272;
ATOM_APP_PERMISSION_GROUPS_FRAGMENT_AUTO_REVOKE_ACTION = 273;
ATOM_EVS_USAGE_STATS_REPORTED = 274;
ATOM_AUDIO_POWER_USAGE_DATA_REPORTED = 275;
ATOM_TV_TUNER_STATE_CHANGED = 276;
ATOM_MEDIAOUTPUT_OP_SWITCH_REPORTED = 277;
ATOM_CB_MESSAGE_FILTERED = 278;
ATOM_TV_TUNER_DVR_STATUS = 279;
ATOM_TV_CAS_SESSION_OPEN_STATUS = 280;
ATOM_ASSISTANT_INVOCATION_REPORTED = 281;
ATOM_DISPLAY_WAKE_REPORTED = 282;
ATOM_CAR_USER_HAL_MODIFY_USER_REQUEST_REPORTED = 283;
ATOM_CAR_USER_HAL_MODIFY_USER_RESPONSE_REPORTED = 284;
ATOM_CAR_USER_HAL_POST_SWITCH_RESPONSE_REPORTED = 285;
ATOM_CAR_USER_HAL_INITIAL_USER_INFO_REQUEST_REPORTED = 286;
ATOM_CAR_USER_HAL_INITIAL_USER_INFO_RESPONSE_REPORTED = 287;
ATOM_CAR_USER_HAL_USER_ASSOCIATION_REQUEST_REPORTED = 288;
ATOM_CAR_USER_HAL_SET_USER_ASSOCIATION_RESPONSE_REPORTED = 289;
ATOM_NETWORK_IP_PROVISIONING_REPORTED = 290;
ATOM_NETWORK_DHCP_RENEW_REPORTED = 291;
ATOM_NETWORK_VALIDATION_REPORTED = 292;
ATOM_NETWORK_STACK_QUIRK_REPORTED = 293;
ATOM_MEDIAMETRICS_AUDIORECORDDEVICEUSAGE_REPORTED = 294;
ATOM_MEDIAMETRICS_AUDIOTHREADDEVICEUSAGE_REPORTED = 295;
ATOM_MEDIAMETRICS_AUDIOTRACKDEVICEUSAGE_REPORTED = 296;
ATOM_MEDIAMETRICS_AUDIODEVICECONNECTION_REPORTED = 297;
ATOM_BLOB_COMMITTED = 298;
ATOM_BLOB_LEASED = 299;
ATOM_BLOB_OPENED = 300;
ATOM_CONTACTS_PROVIDER_STATUS_REPORTED = 301;
ATOM_KEYSTORE_KEY_EVENT_REPORTED = 302;
ATOM_NETWORK_TETHERING_REPORTED = 303;
ATOM_IME_TOUCH_REPORTED = 304;
ATOM_UI_INTERACTION_FRAME_INFO_REPORTED = 305;
ATOM_UI_ACTION_LATENCY_REPORTED = 306;
ATOM_WIFI_DISCONNECT_REPORTED = 307;
ATOM_WIFI_CONNECTION_STATE_CHANGED = 308;
ATOM_HDMI_CEC_ACTIVE_SOURCE_CHANGED = 309;
ATOM_HDMI_CEC_MESSAGE_REPORTED = 310;
ATOM_AIRPLANE_MODE = 311;
ATOM_MODEM_RESTART = 312;
ATOM_CARRIER_ID_MISMATCH_REPORTED = 313;
ATOM_CARRIER_ID_TABLE_UPDATED = 314;
ATOM_DATA_STALL_RECOVERY_REPORTED = 315;
ATOM_MEDIAMETRICS_MEDIAPARSER_REPORTED = 316;
ATOM_TLS_HANDSHAKE_REPORTED = 317;
ATOM_TEXT_CLASSIFIER_API_USAGE_REPORTED = 318;
ATOM_CAR_WATCHDOG_KILL_STATS_REPORTED = 319;
ATOM_MEDIAMETRICS_PLAYBACK_REPORTED = 320;
ATOM_MEDIA_NETWORK_INFO_CHANGED = 321;
ATOM_MEDIA_PLAYBACK_STATE_CHANGED = 322;
ATOM_MEDIA_PLAYBACK_ERROR_REPORTED = 323;
ATOM_MEDIA_PLAYBACK_TRACK_CHANGED = 324;
ATOM_WIFI_SCAN_REPORTED = 325;
ATOM_WIFI_PNO_SCAN_REPORTED = 326;
ATOM_TIF_TUNE_CHANGED = 327;
ATOM_AUTO_ROTATE_REPORTED = 328;
ATOM_PERFETTO_TRIGGER = 329;
ATOM_TRANSCODING_DATA = 330;
ATOM_IMS_SERVICE_ENTITLEMENT_UPDATED = 331;
ATOM_ART_DATUM_REPORTED = 332;
ATOM_DEVICE_ROTATED = 333;
ATOM_SIM_SPECIFIC_SETTINGS_RESTORED = 334;
ATOM_TEXT_CLASSIFIER_DOWNLOAD_REPORTED = 335;
ATOM_PIN_STORAGE_EVENT = 336;
ATOM_FACE_DOWN_REPORTED = 337;
ATOM_BLUETOOTH_HAL_CRASH_REASON_REPORTED = 338;
ATOM_REBOOT_ESCROW_PREPARATION_REPORTED = 339;
ATOM_REBOOT_ESCROW_LSKF_CAPTURE_REPORTED = 340;
ATOM_REBOOT_ESCROW_REBOOT_REPORTED = 341;
ATOM_BINDER_LATENCY_REPORTED = 342;
ATOM_MEDIAMETRICS_AAUDIOSTREAM_REPORTED = 343;
ATOM_MEDIA_TRANSCODING_SESSION_ENDED = 344;
ATOM_MAGNIFICATION_USAGE_REPORTED = 345;
ATOM_MAGNIFICATION_MODE_WITH_IME_ON_REPORTED = 346;
ATOM_APP_SEARCH_CALL_STATS_REPORTED = 347;
ATOM_APP_SEARCH_PUT_DOCUMENT_STATS_REPORTED = 348;
ATOM_DEVICE_CONTROL_CHANGED = 349;
ATOM_DEVICE_STATE_CHANGED = 350;
ATOM_INPUTDEVICE_REGISTERED = 351;
ATOM_SMARTSPACE_CARD_REPORTED = 352;
ATOM_AUTH_PROMPT_AUTHENTICATE_INVOKED = 353;
ATOM_AUTH_MANAGER_CAN_AUTHENTICATE_INVOKED = 354;
ATOM_AUTH_ENROLL_ACTION_INVOKED = 355;
ATOM_AUTH_DEPRECATED_API_USED = 356;
ATOM_UNATTENDED_REBOOT_OCCURRED = 357;
ATOM_LONG_REBOOT_BLOCKING_REPORTED = 358;
ATOM_LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED = 359;
ATOM_FDTRACK_EVENT_OCCURRED = 364;
ATOM_TIMEOUT_AUTO_EXTENDED_REPORTED = 365;
ATOM_ODREFRESH_REPORTED = 366;
ATOM_ALARM_BATCH_DELIVERED = 367;
ATOM_ALARM_SCHEDULED = 368;
ATOM_CAR_WATCHDOG_IO_OVERUSE_STATS_REPORTED = 369;
ATOM_USER_LEVEL_HIBERNATION_STATE_CHANGED = 370;
ATOM_APP_SEARCH_INITIALIZE_STATS_REPORTED = 371;
ATOM_APP_SEARCH_QUERY_STATS_REPORTED = 372;
ATOM_APP_PROCESS_DIED = 373;
ATOM_NETWORK_IP_REACHABILITY_MONITOR_REPORTED = 374;
ATOM_SLOW_INPUT_EVENT_REPORTED = 375;
ATOM_ANR_OCCURRED_PROCESSING_STARTED = 376;
ATOM_APP_SEARCH_REMOVE_STATS_REPORTED = 377;
ATOM_MEDIA_CODEC_REPORTED = 378;
ATOM_PERMISSION_USAGE_FRAGMENT_INTERACTION = 379;
ATOM_PERMISSION_DETAILS_INTERACTION = 380;
ATOM_PRIVACY_SENSOR_TOGGLE_INTERACTION = 381;
ATOM_PRIVACY_TOGGLE_DIALOG_INTERACTION = 382;
ATOM_APP_SEARCH_OPTIMIZE_STATS_REPORTED = 383;
ATOM_NON_A11Y_TOOL_SERVICE_WARNING_REPORT = 384;
ATOM_APP_SEARCH_SET_SCHEMA_STATS_REPORTED = 385;
ATOM_APP_COMPAT_STATE_CHANGED = 386;
ATOM_SIZE_COMPAT_RESTART_BUTTON_EVENT_REPORTED = 387;
ATOM_SPLITSCREEN_UI_CHANGED = 388;
ATOM_NETWORK_DNS_HANDSHAKE_REPORTED = 389;
ATOM_BLUETOOTH_CODE_PATH_COUNTER = 390;
ATOM_BLUETOOTH_LE_BATCH_SCAN_REPORT_DELAY = 392;
ATOM_ACCESSIBILITY_FLOATING_MENU_UI_CHANGED = 393;
ATOM_NEURALNETWORKS_COMPILATION_COMPLETED = 394;
ATOM_NEURALNETWORKS_EXECUTION_COMPLETED = 395;
ATOM_NEURALNETWORKS_COMPILATION_FAILED = 396;
ATOM_NEURALNETWORKS_EXECUTION_FAILED = 397;
ATOM_CONTEXT_HUB_BOOTED = 398;
ATOM_CONTEXT_HUB_RESTARTED = 399;
ATOM_CONTEXT_HUB_LOADED_NANOAPP_SNAPSHOT_REPORTED = 400;
ATOM_CHRE_CODE_DOWNLOAD_TRANSACTED = 401;
ATOM_UWB_SESSION_INITED = 402;
ATOM_UWB_SESSION_CLOSED = 403;
ATOM_UWB_FIRST_RANGING_RECEIVED = 404;
ATOM_UWB_RANGING_MEASUREMENT_RECEIVED = 405;
ATOM_TEXT_CLASSIFIER_DOWNLOAD_WORK_SCHEDULED = 406;
ATOM_TEXT_CLASSIFIER_DOWNLOAD_WORK_COMPLETED = 407;
ATOM_CLIPBOARD_CLEARED = 408;
ATOM_VM_CREATION_REQUESTED = 409;
ATOM_NEARBY_DEVICE_SCAN_STATE_CHANGED = 410;
ATOM_CAMERA_COMPAT_CONTROL_EVENT_REPORTED = 411;
ATOM_APPLICATION_LOCALES_CHANGED = 412;
ATOM_MEDIAMETRICS_AUDIOTRACKSTATUS_REPORTED = 413;
ATOM_FOLD_STATE_DURATION_REPORTED = 414;
ATOM_LOCATION_TIME_ZONE_PROVIDER_CONTROLLER_STATE_CHANGED = 415;
ATOM_DISPLAY_HBM_STATE_CHANGED = 416;
ATOM_DISPLAY_HBM_BRIGHTNESS_CHANGED = 417;
ATOM_PERSISTENT_URI_PERMISSIONS_FLUSHED = 418;
ATOM_EARLY_BOOT_COMP_OS_ARTIFACTS_CHECK_REPORTED = 419;
ATOM_VBMETA_DIGEST_REPORTED = 420;
ATOM_APEX_INFO_GATHERED = 421;
ATOM_PVM_INFO_GATHERED = 422;
ATOM_WEAR_SETTINGS_UI_INTERACTED = 423;
ATOM_TRACING_SERVICE_REPORT_EVENT = 424;
ATOM_MEDIAMETRICS_AUDIORECORDSTATUS_REPORTED = 425;
ATOM_LAUNCHER_LATENCY = 426;
ATOM_DROPBOX_ENTRY_DROPPED = 427;
ATOM_WIFI_P2P_CONNECTION_REPORTED = 428;
ATOM_GAME_STATE_CHANGED = 429;
ATOM_HOTWORD_DETECTOR_CREATE_REQUESTED = 430;
ATOM_HOTWORD_DETECTION_SERVICE_INIT_RESULT_REPORTED = 431;
ATOM_HOTWORD_DETECTION_SERVICE_RESTARTED = 432;
ATOM_HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED = 433;
ATOM_HOTWORD_DETECTOR_EVENTS = 434;
ATOM_BOOT_COMPLETED_BROADCAST_COMPLETION_LATENCY_REPORTED = 437;
ATOM_CONTACTS_INDEXER_UPDATE_STATS_REPORTED = 440;
ATOM_APP_BACKGROUND_RESTRICTIONS_INFO = 441;
ATOM_MMS_SMS_PROVIDER_GET_THREAD_ID_FAILED = 442;
ATOM_MMS_SMS_DATABASE_HELPER_ON_UPGRADE_FAILED = 443;
ATOM_PERMISSION_REMINDER_NOTIFICATION_INTERACTED = 444;
ATOM_RECENT_PERMISSION_DECISIONS_INTERACTED = 445;
ATOM_GNSS_PSDS_DOWNLOAD_REPORTED = 446;
ATOM_LE_AUDIO_CONNECTION_SESSION_REPORTED = 447;
ATOM_LE_AUDIO_BROADCAST_SESSION_REPORTED = 448;
ATOM_DREAM_UI_EVENT_REPORTED = 449;
ATOM_TASK_MANAGER_EVENT_REPORTED = 450;
ATOM_CDM_ASSOCIATION_ACTION = 451;
ATOM_MAGNIFICATION_TRIPLE_TAP_AND_HOLD_ACTIVATED_SESSION_REPORTED = 452;
ATOM_MAGNIFICATION_FOLLOW_TYPING_FOCUS_ACTIVATED_SESSION_REPORTED = 453;
ATOM_ACCESSIBILITY_TEXT_READING_OPTIONS_CHANGED = 454;
ATOM_WIFI_SETUP_FAILURE_CRASH_REPORTED = 455;
ATOM_UWB_DEVICE_ERROR_REPORTED = 456;
ATOM_ISOLATED_COMPILATION_SCHEDULED = 457;
ATOM_ISOLATED_COMPILATION_ENDED = 458;
ATOM_ONS_OPPORTUNISTIC_ESIM_PROVISIONING_COMPLETE = 459;
ATOM_TELEPHONY_ANOMALY_DETECTED = 461;
ATOM_LETTERBOX_POSITION_CHANGED = 462;
ATOM_REMOTE_KEY_PROVISIONING_ATTEMPT = 463;
ATOM_REMOTE_KEY_PROVISIONING_NETWORK_INFO = 464;
ATOM_REMOTE_KEY_PROVISIONING_TIMING = 465;
ATOM_MEDIAOUTPUT_OP_INTERACTION_REPORT = 466;
ATOM_BACKGROUND_DEXOPT_JOB_ENDED = 467;
ATOM_SYNC_EXEMPTION_OCCURRED = 468;
ATOM_AUTOFILL_PRESENTATION_EVENT_REPORTED = 469;
ATOM_DOCK_STATE_CHANGED = 470;
ATOM_BROADCAST_DELIVERY_EVENT_REPORTED = 475;
ATOM_SERVICE_REQUEST_EVENT_REPORTED = 476;
ATOM_PROVIDER_ACQUISITION_EVENT_REPORTED = 477;
ATOM_BLUETOOTH_DEVICE_NAME_REPORTED = 478;
ATOM_VIBRATION_REPORTED = 487;
ATOM_UWB_RANGING_START = 489;
ATOM_DISPLAY_BRIGHTNESS_CHANGED = 494;
ATOM_ACTIVITY_ACTION_BLOCKED = 495;
ATOM_NETWORK_DNS_SERVER_SUPPORT_REPORTED = 504;
ATOM_VM_BOOTED = 505;
ATOM_VM_EXITED = 506;
ATOM_AMBIENT_BRIGHTNESS_STATS_REPORTED = 507;
ATOM_MEDIAMETRICS_SPATIALIZERCAPABILITIES_REPORTED = 508;
ATOM_MEDIAMETRICS_SPATIALIZERDEVICEENABLED_REPORTED = 509;
ATOM_MEDIAMETRICS_HEADTRACKERDEVICEENABLED_REPORTED = 510;
ATOM_MEDIAMETRICS_HEADTRACKERDEVICESUPPORTED_REPORTED = 511;
ATOM_HEARING_AID_INFO_REPORTED = 513;
ATOM_DEVICE_WIDE_JOB_CONSTRAINT_CHANGED = 514;
ATOM_IWLAN_SETUP_DATA_CALL_RESULT_REPORTED = 519;
ATOM_IWLAN_PDN_DISCONNECTED_REASON_REPORTED = 520;
ATOM_AIRPLANE_MODE_SESSION_REPORTED = 521;
ATOM_VM_CPU_STATUS_REPORTED = 522;
ATOM_VM_MEM_STATUS_REPORTED = 523;
ATOM_DEFAULT_NETWORK_REMATCH_INFO = 525;
ATOM_NETWORK_SELECTION_PERFORMANCE = 526;
ATOM_NETWORK_NSD_REPORTED = 527;
ATOM_BLUETOOTH_DISCONNECTION_REASON_REPORTED = 529;
ATOM_BLUETOOTH_LOCAL_VERSIONS_REPORTED = 530;
ATOM_BLUETOOTH_REMOTE_SUPPORTED_FEATURES_REPORTED = 531;
ATOM_BLUETOOTH_LOCAL_SUPPORTED_FEATURES_REPORTED = 532;
ATOM_BLUETOOTH_GATT_APP_INFO = 533;
ATOM_BRIGHTNESS_CONFIGURATION_UPDATED = 534;
ATOM_LAUNCHER_IMPRESSION_EVENT = 547;
ATOM_ODSIGN_REPORTED = 548;
ATOM_ART_DEVICE_DATUM_REPORTED = 550;
ATOM_NETWORK_SLICE_SESSION_ENDED = 558;
ATOM_NETWORK_SLICE_DAILY_DATA_USAGE_REPORTED = 559;
ATOM_NFC_TAG_TYPE_OCCURRED = 560;
ATOM_NFC_AID_CONFLICT_OCCURRED = 561;
ATOM_NFC_READER_CONFLICT_OCCURRED = 562;
ATOM_ART_DATUM_DELTA_REPORTED = 565;
ATOM_MEDIA_DRM_CREATED = 568;
ATOM_MEDIA_DRM_ERRORED = 569;
ATOM_MEDIA_DRM_SESSION_OPENED = 570;
ATOM_MEDIA_DRM_SESSION_CLOSED = 571;
ATOM_PERFORMANCE_HINT_SESSION_REPORTED = 574;
ATOM_HOTWORD_AUDIO_EGRESS_EVENT_REPORTED = 578;
ATOM_NETWORK_VALIDATION_FAILURE_STATS_DAILY_REPORTED = 601;
ATOM_WIFI_BYTES_TRANSFER = 10000;
ATOM_WIFI_BYTES_TRANSFER_BY_FG_BG = 10001;
ATOM_MOBILE_BYTES_TRANSFER = 10002;
ATOM_MOBILE_BYTES_TRANSFER_BY_FG_BG = 10003;
ATOM_BLUETOOTH_BYTES_TRANSFER = 10006;
ATOM_KERNEL_WAKELOCK = 10004;
ATOM_SUBSYSTEM_SLEEP_STATE = 10005;
ATOM_CPU_TIME_PER_UID = 10009;
ATOM_CPU_TIME_PER_UID_FREQ = 10010;
ATOM_WIFI_ACTIVITY_INFO = 10011;
ATOM_MODEM_ACTIVITY_INFO = 10012;
ATOM_BLUETOOTH_ACTIVITY_INFO = 10007;
ATOM_PROCESS_MEMORY_STATE = 10013;
ATOM_SYSTEM_ELAPSED_REALTIME = 10014;
ATOM_SYSTEM_UPTIME = 10015;
ATOM_CPU_ACTIVE_TIME = 10016;
ATOM_CPU_CLUSTER_TIME = 10017;
ATOM_DISK_SPACE = 10018;
ATOM_REMAINING_BATTERY_CAPACITY = 10019;
ATOM_FULL_BATTERY_CAPACITY = 10020;
ATOM_TEMPERATURE = 10021;
ATOM_BINDER_CALLS = 10022;
ATOM_BINDER_CALLS_EXCEPTIONS = 10023;
ATOM_LOOPER_STATS = 10024;
ATOM_DISK_STATS = 10025;
ATOM_DIRECTORY_USAGE = 10026;
ATOM_APP_SIZE = 10027;
ATOM_CATEGORY_SIZE = 10028;
ATOM_PROC_STATS = 10029;
ATOM_BATTERY_VOLTAGE = 10030;
ATOM_NUM_FINGERPRINTS_ENROLLED = 10031;
ATOM_DISK_IO = 10032;
ATOM_POWER_PROFILE = 10033;
ATOM_PROC_STATS_PKG_PROC = 10034;
ATOM_PROCESS_CPU_TIME = 10035;
ATOM_CPU_TIME_PER_THREAD_FREQ = 10037;
ATOM_ON_DEVICE_POWER_MEASUREMENT = 10038;
ATOM_DEVICE_CALCULATED_POWER_USE = 10039;
ATOM_PROCESS_MEMORY_HIGH_WATER_MARK = 10042;
ATOM_BATTERY_LEVEL = 10043;
ATOM_BUILD_INFORMATION = 10044;
ATOM_BATTERY_CYCLE_COUNT = 10045;
ATOM_DEBUG_ELAPSED_CLOCK = 10046;
ATOM_DEBUG_FAILING_ELAPSED_CLOCK = 10047;
ATOM_NUM_FACES_ENROLLED = 10048;
ATOM_ROLE_HOLDER = 10049;
ATOM_DANGEROUS_PERMISSION_STATE = 10050;
ATOM_TRAIN_INFO = 10051;
ATOM_TIME_ZONE_DATA_INFO = 10052;
ATOM_EXTERNAL_STORAGE_INFO = 10053;
ATOM_GPU_STATS_GLOBAL_INFO = 10054;
ATOM_GPU_STATS_APP_INFO = 10055;
ATOM_SYSTEM_ION_HEAP_SIZE = 10056;
ATOM_APPS_ON_EXTERNAL_STORAGE_INFO = 10057;
ATOM_FACE_SETTINGS = 10058;
ATOM_COOLING_DEVICE = 10059;
ATOM_APP_OPS = 10060;
ATOM_PROCESS_SYSTEM_ION_HEAP_SIZE = 10061;
ATOM_SURFACEFLINGER_STATS_GLOBAL_INFO = 10062;
ATOM_SURFACEFLINGER_STATS_LAYER_INFO = 10063;
ATOM_PROCESS_MEMORY_SNAPSHOT = 10064;
ATOM_VMS_CLIENT_STATS = 10065;
ATOM_NOTIFICATION_REMOTE_VIEWS = 10066;
ATOM_DANGEROUS_PERMISSION_STATE_SAMPLED = 10067;
ATOM_GRAPHICS_STATS = 10068;
ATOM_RUNTIME_APP_OP_ACCESS = 10069;
ATOM_ION_HEAP_SIZE = 10070;
ATOM_PACKAGE_NOTIFICATION_PREFERENCES = 10071;
ATOM_PACKAGE_NOTIFICATION_CHANNEL_PREFERENCES = 10072;
ATOM_PACKAGE_NOTIFICATION_CHANNEL_GROUP_PREFERENCES = 10073;
ATOM_GNSS_STATS = 10074;
ATOM_ATTRIBUTED_APP_OPS = 10075;
ATOM_VOICE_CALL_SESSION = 10076;
ATOM_VOICE_CALL_RAT_USAGE = 10077;
ATOM_SIM_SLOT_STATE = 10078;
ATOM_SUPPORTED_RADIO_ACCESS_FAMILY = 10079;
ATOM_SETTING_SNAPSHOT = 10080;
ATOM_BLOB_INFO = 10081;
ATOM_DATA_USAGE_BYTES_TRANSFER = 10082;
ATOM_BYTES_TRANSFER_BY_TAG_AND_METERED = 10083;
ATOM_DND_MODE_RULE = 10084;
ATOM_GENERAL_EXTERNAL_STORAGE_ACCESS_STATS = 10085;
ATOM_INCOMING_SMS = 10086;
ATOM_OUTGOING_SMS = 10087;
ATOM_CARRIER_ID_TABLE_VERSION = 10088;
ATOM_DATA_CALL_SESSION = 10089;
ATOM_CELLULAR_SERVICE_STATE = 10090;
ATOM_CELLULAR_DATA_SERVICE_SWITCH = 10091;
ATOM_SYSTEM_MEMORY = 10092;
ATOM_IMS_REGISTRATION_TERMINATION = 10093;
ATOM_IMS_REGISTRATION_STATS = 10094;
ATOM_CPU_TIME_PER_CLUSTER_FREQ = 10095;
ATOM_CPU_CYCLES_PER_UID_CLUSTER = 10096;
ATOM_DEVICE_ROTATED_DATA = 10097;
ATOM_CPU_CYCLES_PER_THREAD_GROUP_CLUSTER = 10098;
ATOM_MEDIA_DRM_ACTIVITY_INFO = 10099;
ATOM_OEM_MANAGED_BYTES_TRANSFER = 10100;
ATOM_GNSS_POWER_STATS = 10101;
ATOM_TIME_ZONE_DETECTOR_STATE = 10102;
ATOM_KEYSTORE2_STORAGE_STATS = 10103;
ATOM_RKP_POOL_STATS = 10104;
ATOM_PROCESS_DMABUF_MEMORY = 10105;
ATOM_PENDING_ALARM_INFO = 10106;
ATOM_USER_LEVEL_HIBERNATED_APPS = 10107;
ATOM_LAUNCHER_LAYOUT_SNAPSHOT = 10108;
ATOM_GLOBAL_HIBERNATED_APPS = 10109;
ATOM_INPUT_EVENT_LATENCY_SKETCH = 10110;
ATOM_BATTERY_USAGE_STATS_BEFORE_RESET = 10111;
ATOM_BATTERY_USAGE_STATS_SINCE_RESET = 10112;
ATOM_BATTERY_USAGE_STATS_SINCE_RESET_USING_POWER_PROFILE_MODEL = 10113;
ATOM_INSTALLED_INCREMENTAL_PACKAGE = 10114;
ATOM_TELEPHONY_NETWORK_REQUESTS = 10115;
ATOM_APP_SEARCH_STORAGE_INFO = 10116;
ATOM_VMSTAT = 10117;
ATOM_KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO = 10118;
ATOM_KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO = 10119;
ATOM_KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO = 10120;
ATOM_KEYSTORE2_ATOM_WITH_OVERFLOW = 10121;
ATOM_KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO = 10122;
ATOM_KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO = 10123;
ATOM_RKP_ERROR_STATS = 10124;
ATOM_KEYSTORE2_CRASH_STATS = 10125;
ATOM_VENDOR_APEX_INFO = 10126;
ATOM_ACCESSIBILITY_SHORTCUT_STATS = 10127;
ATOM_ACCESSIBILITY_FLOATING_MENU_STATS = 10128;
ATOM_DATA_USAGE_BYTES_TRANSFER_V2 = 10129;
ATOM_MEDIA_CAPABILITIES = 10130;
ATOM_CAR_WATCHDOG_SYSTEM_IO_USAGE_SUMMARY = 10131;
ATOM_CAR_WATCHDOG_UID_IO_USAGE_SUMMARY = 10132;
ATOM_IMS_REGISTRATION_FEATURE_TAG_STATS = 10133;
ATOM_RCS_CLIENT_PROVISIONING_STATS = 10134;
ATOM_RCS_ACS_PROVISIONING_STATS = 10135;
ATOM_SIP_DELEGATE_STATS = 10136;
ATOM_SIP_TRANSPORT_FEATURE_TAG_STATS = 10137;
ATOM_SIP_MESSAGE_RESPONSE = 10138;
ATOM_SIP_TRANSPORT_SESSION = 10139;
ATOM_IMS_DEDICATED_BEARER_LISTENER_EVENT = 10140;
ATOM_IMS_DEDICATED_BEARER_EVENT = 10141;
ATOM_IMS_REGISTRATION_SERVICE_DESC_STATS = 10142;
ATOM_UCE_EVENT_STATS = 10143;
ATOM_PRESENCE_NOTIFY_EVENT = 10144;
ATOM_GBA_EVENT = 10145;
ATOM_PER_SIM_STATUS = 10146;
ATOM_GPU_WORK_PER_UID = 10147;
ATOM_PERSISTENT_URI_PERMISSIONS_AMOUNT_PER_PACKAGE = 10148;
ATOM_SIGNED_PARTITION_INFO = 10149;
ATOM_PINNED_FILE_SIZES_PER_PACKAGE = 10150;
ATOM_PENDING_INTENTS_PER_PACKAGE = 10151;
ATOM_USER_INFO = 10152;
ATOM_TELEPHONY_NETWORK_REQUESTS_V2 = 10153;
ATOM_DEVICE_TELEPHONY_PROPERTIES = 10154;
ATOM_REMOTE_KEY_PROVISIONING_ERROR_COUNTS = 10155;
ATOM_INCOMING_MMS = 10157;
ATOM_OUTGOING_MMS = 10158;
ATOM_MULTI_USER_INFO = 10160;
ATOM_NETWORK_BPF_MAP_INFO = 10161;
ATOM_CONNECTIVITY_STATE_SAMPLE = 10163;
ATOM_NETWORK_SELECTION_REMATCH_REASONS_INFO = 10164;
ATOM_NETWORK_SLICE_REQUEST_COUNT = 10168;
ATOM_ADPF_SYSTEM_COMPONENT_INFO = 10173;
ATOM_NOTIFICATION_MEMORY_USE = 10174;
}
// End of protos/perfetto/config/statsd/atom_ids.proto
// Begin of protos/perfetto/config/statsd/statsd_tracing_config.proto
// This file is named 'statsd_tracing_config.proto' rather than
// 'statsd_config.proto' (which would be more consistent with the other
// config protos) so it doesn't show up and confuse folks looking for
// the existing statsd_config.proto for configuring statsd itself.
// Same for the config proto itself.
message StatsdTracingConfig {
// This is for the common case of the atom id being known in the enum AtomId.
repeated AtomId push_atom_id = 1;
// Escape hatch for Atom IDs that are not yet in the AtomId enum
// (e.g. non-upstream atoms that don't exist in AOSP).
repeated int32 raw_push_atom_id = 2;
repeated StatsdPullAtomConfig pull_config = 3;
}
message StatsdPullAtomConfig {
repeated AtomId pull_atom_id = 1;
repeated int32 raw_pull_atom_id = 2;
optional int32 pull_frequency_ms = 3;
repeated string packages = 4;
}
// End of protos/perfetto/config/statsd/statsd_tracing_config.proto
// Begin of protos/perfetto/common/sys_stats_counters.proto
// When editing entries here remember also to update "sys_stats_counters.h" with
// the corresponding string definitions for the actual /proc files parser.
// Counter definitions for Linux's /proc/meminfo.
enum MeminfoCounters {
MEMINFO_UNSPECIFIED = 0;
MEMINFO_MEM_TOTAL = 1;
MEMINFO_MEM_FREE = 2;
MEMINFO_MEM_AVAILABLE = 3;
MEMINFO_BUFFERS = 4;
MEMINFO_CACHED = 5;
MEMINFO_SWAP_CACHED = 6;
MEMINFO_ACTIVE = 7;
MEMINFO_INACTIVE = 8;
MEMINFO_ACTIVE_ANON = 9;
MEMINFO_INACTIVE_ANON = 10;
MEMINFO_ACTIVE_FILE = 11;
MEMINFO_INACTIVE_FILE = 12;
MEMINFO_UNEVICTABLE = 13;
MEMINFO_MLOCKED = 14;
MEMINFO_SWAP_TOTAL = 15;
MEMINFO_SWAP_FREE = 16;
MEMINFO_DIRTY = 17;
MEMINFO_WRITEBACK = 18;
MEMINFO_ANON_PAGES = 19;
MEMINFO_MAPPED = 20;
MEMINFO_SHMEM = 21;
MEMINFO_SLAB = 22;
MEMINFO_SLAB_RECLAIMABLE = 23;
MEMINFO_SLAB_UNRECLAIMABLE = 24;
MEMINFO_KERNEL_STACK = 25;
MEMINFO_PAGE_TABLES = 26;
MEMINFO_COMMIT_LIMIT = 27;
MEMINFO_COMMITED_AS = 28;
MEMINFO_VMALLOC_TOTAL = 29;
MEMINFO_VMALLOC_USED = 30;
MEMINFO_VMALLOC_CHUNK = 31;
MEMINFO_CMA_TOTAL = 32;
MEMINFO_CMA_FREE = 33;
}
// Counter definitions for Linux's /proc/vmstat.
enum VmstatCounters {
VMSTAT_UNSPECIFIED = 0;
VMSTAT_NR_FREE_PAGES = 1;
VMSTAT_NR_ALLOC_BATCH = 2;
VMSTAT_NR_INACTIVE_ANON = 3;
VMSTAT_NR_ACTIVE_ANON = 4;
VMSTAT_NR_INACTIVE_FILE = 5;
VMSTAT_NR_ACTIVE_FILE = 6;
VMSTAT_NR_UNEVICTABLE = 7;
VMSTAT_NR_MLOCK = 8;
VMSTAT_NR_ANON_PAGES = 9;
VMSTAT_NR_MAPPED = 10;
VMSTAT_NR_FILE_PAGES = 11;
VMSTAT_NR_DIRTY = 12;
VMSTAT_NR_WRITEBACK = 13;
VMSTAT_NR_SLAB_RECLAIMABLE = 14;
VMSTAT_NR_SLAB_UNRECLAIMABLE = 15;
VMSTAT_NR_PAGE_TABLE_PAGES = 16;
VMSTAT_NR_KERNEL_STACK = 17;
VMSTAT_NR_OVERHEAD = 18;
VMSTAT_NR_UNSTABLE = 19;
VMSTAT_NR_BOUNCE = 20;
VMSTAT_NR_VMSCAN_WRITE = 21;
VMSTAT_NR_VMSCAN_IMMEDIATE_RECLAIM = 22;
VMSTAT_NR_WRITEBACK_TEMP = 23;
VMSTAT_NR_ISOLATED_ANON = 24;
VMSTAT_NR_ISOLATED_FILE = 25;
VMSTAT_NR_SHMEM = 26;
VMSTAT_NR_DIRTIED = 27;
VMSTAT_NR_WRITTEN = 28;
VMSTAT_NR_PAGES_SCANNED = 29;
VMSTAT_WORKINGSET_REFAULT = 30;
VMSTAT_WORKINGSET_ACTIVATE = 31;
VMSTAT_WORKINGSET_NODERECLAIM = 32;
VMSTAT_NR_ANON_TRANSPARENT_HUGEPAGES = 33;
VMSTAT_NR_FREE_CMA = 34;
VMSTAT_NR_SWAPCACHE = 35;
VMSTAT_NR_DIRTY_THRESHOLD = 36;
VMSTAT_NR_DIRTY_BACKGROUND_THRESHOLD = 37;
VMSTAT_PGPGIN = 38;
VMSTAT_PGPGOUT = 39;
VMSTAT_PGPGOUTCLEAN = 40;
VMSTAT_PSWPIN = 41;
VMSTAT_PSWPOUT = 42;
VMSTAT_PGALLOC_DMA = 43;
VMSTAT_PGALLOC_NORMAL = 44;
VMSTAT_PGALLOC_MOVABLE = 45;
VMSTAT_PGFREE = 46;
VMSTAT_PGACTIVATE = 47;
VMSTAT_PGDEACTIVATE = 48;
VMSTAT_PGFAULT = 49;
VMSTAT_PGMAJFAULT = 50;
VMSTAT_PGREFILL_DMA = 51;
VMSTAT_PGREFILL_NORMAL = 52;
VMSTAT_PGREFILL_MOVABLE = 53;
VMSTAT_PGSTEAL_KSWAPD_DMA = 54;
VMSTAT_PGSTEAL_KSWAPD_NORMAL = 55;
VMSTAT_PGSTEAL_KSWAPD_MOVABLE = 56;
VMSTAT_PGSTEAL_DIRECT_DMA = 57;
VMSTAT_PGSTEAL_DIRECT_NORMAL = 58;
VMSTAT_PGSTEAL_DIRECT_MOVABLE = 59;
VMSTAT_PGSCAN_KSWAPD_DMA = 60;
VMSTAT_PGSCAN_KSWAPD_NORMAL = 61;
VMSTAT_PGSCAN_KSWAPD_MOVABLE = 62;
VMSTAT_PGSCAN_DIRECT_DMA = 63;
VMSTAT_PGSCAN_DIRECT_NORMAL = 64;
VMSTAT_PGSCAN_DIRECT_MOVABLE = 65;
VMSTAT_PGSCAN_DIRECT_THROTTLE = 66;
VMSTAT_PGINODESTEAL = 67;
VMSTAT_SLABS_SCANNED = 68;
VMSTAT_KSWAPD_INODESTEAL = 69;
VMSTAT_KSWAPD_LOW_WMARK_HIT_QUICKLY = 70;
VMSTAT_KSWAPD_HIGH_WMARK_HIT_QUICKLY = 71;
VMSTAT_PAGEOUTRUN = 72;
VMSTAT_ALLOCSTALL = 73;
VMSTAT_PGROTATED = 74;
VMSTAT_DROP_PAGECACHE = 75;
VMSTAT_DROP_SLAB = 76;
VMSTAT_PGMIGRATE_SUCCESS = 77;
VMSTAT_PGMIGRATE_FAIL = 78;
VMSTAT_COMPACT_MIGRATE_SCANNED = 79;
VMSTAT_COMPACT_FREE_SCANNED = 80;
VMSTAT_COMPACT_ISOLATED = 81;
VMSTAT_COMPACT_STALL = 82;
VMSTAT_COMPACT_FAIL = 83;
VMSTAT_COMPACT_SUCCESS = 84;
VMSTAT_COMPACT_DAEMON_WAKE = 85;
VMSTAT_UNEVICTABLE_PGS_CULLED = 86;
VMSTAT_UNEVICTABLE_PGS_SCANNED = 87;
VMSTAT_UNEVICTABLE_PGS_RESCUED = 88;
VMSTAT_UNEVICTABLE_PGS_MLOCKED = 89;
VMSTAT_UNEVICTABLE_PGS_MUNLOCKED = 90;
VMSTAT_UNEVICTABLE_PGS_CLEARED = 91;
VMSTAT_UNEVICTABLE_PGS_STRANDED = 92;
VMSTAT_NR_ZSPAGES = 93;
VMSTAT_NR_ION_HEAP = 94;
VMSTAT_NR_GPU_HEAP = 95;
VMSTAT_ALLOCSTALL_DMA = 96;
VMSTAT_ALLOCSTALL_MOVABLE = 97;
VMSTAT_ALLOCSTALL_NORMAL = 98;
VMSTAT_COMPACT_DAEMON_FREE_SCANNED = 99;
VMSTAT_COMPACT_DAEMON_MIGRATE_SCANNED = 100;
VMSTAT_NR_FASTRPC = 101;
VMSTAT_NR_INDIRECTLY_RECLAIMABLE = 102;
VMSTAT_NR_ION_HEAP_POOL = 103;
VMSTAT_NR_KERNEL_MISC_RECLAIMABLE = 104;
VMSTAT_NR_SHADOW_CALL_STACK_BYTES = 105;
VMSTAT_NR_SHMEM_HUGEPAGES = 106;
VMSTAT_NR_SHMEM_PMDMAPPED = 107;
VMSTAT_NR_UNRECLAIMABLE_PAGES = 108;
VMSTAT_NR_ZONE_ACTIVE_ANON = 109;
VMSTAT_NR_ZONE_ACTIVE_FILE = 110;
VMSTAT_NR_ZONE_INACTIVE_ANON = 111;
VMSTAT_NR_ZONE_INACTIVE_FILE = 112;
VMSTAT_NR_ZONE_UNEVICTABLE = 113;
VMSTAT_NR_ZONE_WRITE_PENDING = 114;
VMSTAT_OOM_KILL = 115;
VMSTAT_PGLAZYFREE = 116;
VMSTAT_PGLAZYFREED = 117;
VMSTAT_PGREFILL = 118;
VMSTAT_PGSCAN_DIRECT = 119;
VMSTAT_PGSCAN_KSWAPD = 120;
VMSTAT_PGSKIP_DMA = 121;
VMSTAT_PGSKIP_MOVABLE = 122;
VMSTAT_PGSKIP_NORMAL = 123;
VMSTAT_PGSTEAL_DIRECT = 124;
VMSTAT_PGSTEAL_KSWAPD = 125;
VMSTAT_SWAP_RA = 126;
VMSTAT_SWAP_RA_HIT = 127;
VMSTAT_WORKINGSET_RESTORE = 128;
}
// End of protos/perfetto/common/sys_stats_counters.proto
// Begin of protos/perfetto/config/sys_stats/sys_stats_config.proto
// This file defines the configuration for the Linux /proc poller data source,
// which injects counters in the trace.
// Counters that are needed in the trace must be explicitly listed in the
// *_counters fields. This is to avoid spamming the trace with all counters
// at all times.
// The sampling rate is configurable. All polling rates (*_period_ms) need
// to be integer multiples of each other.
// OK: [10ms, 10ms, 10ms], [10ms, 20ms, 10ms], [10ms, 20ms, 60ms]
// Not OK: [10ms, 10ms, 11ms], [10ms, 15ms, 20ms]
message SysStatsConfig {
// Polls /proc/meminfo every X ms, if non-zero.
// This is required to be > 10ms to avoid excessive CPU usage.
// Cost: 0.3 ms [read] + 0.07 ms [parse + trace injection]
optional uint32 meminfo_period_ms = 1;
// If empty all known counters are reported. Otherwise, only the counters
// specified below are reported.
repeated MeminfoCounters meminfo_counters = 2;
// Polls /proc/vmstat every X ms, if non-zero.
// This is required to be > 10ms to avoid excessive CPU usage.
// Cost: 0.2 ms [read] + 0.3 ms [parse + trace injection]
optional uint32 vmstat_period_ms = 3;
repeated VmstatCounters vmstat_counters = 4;
// Pols /proc/stat every X ms, if non-zero.
// This is required to be > 10ms to avoid excessive CPU usage.
// Cost: 4.1 ms [read] + 1.9 ms [parse + trace injection]
optional uint32 stat_period_ms = 5;
enum StatCounters {
STAT_UNSPECIFIED = 0;
STAT_CPU_TIMES = 1;
STAT_IRQ_COUNTS = 2;
STAT_SOFTIRQ_COUNTS = 3;
STAT_FORK_COUNT = 4;
}
repeated StatCounters stat_counters = 6;
// Polls /sys/devfreq/*/curfreq every X ms, if non-zero.
// This is required to be > 10ms to avoid excessive CPU usage.
// This option can be used to record unchanging values.
// Updates from frequency changes can come from ftrace/set_clock_rate.
optional uint32 devfreq_period_ms = 7;
// Polls /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq every X ms.
// This is required to be > 10ms to avoid excessive CPU usage.
optional uint32 cpufreq_period_ms = 8;
// Polls /proc/buddyinfo every X ms, if non-zero.
// This is required to be > 10ms to avoid excessive CPU usage.
optional uint32 buddyinfo_period_ms = 9;
// Polls /proc/diskstats every X ms, if non-zero.
// This is required to be > 10ms to avoid excessive CPU usage.
optional uint32 diskstat_period_ms = 10;
}
// End of protos/perfetto/config/sys_stats/sys_stats_config.proto
// Begin of protos/perfetto/config/system_info/system_info.proto
// This data-source does a one-off recording of system information when
// the trace starts.
// Currently this includes:
// - Values of
// /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies This
// datasource has no configuration options at present.
message SystemInfoConfig {}
// End of protos/perfetto/config/system_info/system_info.proto
// Begin of protos/perfetto/config/test_config.proto
// The configuration for a fake producer used in tests.
message TestConfig {
message DummyFields {
optional uint32 field_uint32 = 1;
optional int32 field_int32 = 2;
optional uint64 field_uint64 = 3;
optional int64 field_int64 = 4;
optional fixed64 field_fixed64 = 5;
optional sfixed64 field_sfixed64 = 6;
optional fixed32 field_fixed32 = 7;
optional sfixed32 field_sfixed32 = 8;
optional double field_double = 9;
optional float field_float = 10;
optional sint64 field_sint64 = 11;
optional sint32 field_sint32 = 12;
optional string field_string = 13;
optional bytes field_bytes = 14;
}
// The number of messages the fake producer should send.
optional uint32 message_count = 1;
// The maximum number of messages which should be sent each second.
// The actual obserced speed may be lower if the producer is unable to
// work fast enough.
// If this is zero or unset, the producer will send as fast as possible.
optional uint32 max_messages_per_second = 2;
// The seed value for a simple multiplicative congruential pseudo-random
// number sequence.
optional uint32 seed = 3;
// The size of each message in bytes. Should be greater than or equal 5 to
// account for the number of bytes needed to encode the random number and a
// null byte for the string.
optional uint32 message_size = 4;
// Whether the producer should send a event batch when the data source is
// is initially registered.
optional bool send_batch_on_register = 5;
optional DummyFields dummy_fields = 6;
}
// End of protos/perfetto/config/test_config.proto
// Begin of protos/perfetto/config/track_event/track_event_config.proto
message TrackEventConfig {
// The following fields define the set of enabled trace categories. Each list
// item is a glob.
//
// To determine if category is enabled, it is checked against the filters in
// the following order:
//
// 1. Exact matches in enabled categories.
// 2. Exact matches in enabled tags.
// 3. Exact matches in disabled categories.
// 4. Exact matches in disabled tags.
// 5. Pattern matches in enabled categories.
// 6. Pattern matches in enabled tags.
// 7. Pattern matches in disabled categories.
// 8. Pattern matches in disabled tags.
//
// If none of the steps produced a match, the category is enabled by default.
//
// Examples:
//
// - To enable all non-slow/debug categories:
//
// No configuration needed, happens by default.
//
// - To enable a specific category:
//
// disabled_categories = ["*"]
// enabled_categories = ["my_category"]
//
// - To enable only categories with a specific tag:
//
// disabled_tags = ["*"]
// enabled_tags = ["my_tag"]
//
// Default: []
repeated string disabled_categories = 1;
// Default: []
repeated string enabled_categories = 2;
// Default: ["slow", "debug"]
repeated string disabled_tags = 3;
// Default: []
repeated string enabled_tags = 4;
// Default: false (i.e. enabled by default)
optional bool disable_incremental_timestamps = 5;
// Allows to specify a custom unit different than the default (ns).
// Also affects thread timestamps if enable_thread_time_sampling = true.
// A multiplier of 1000 means that a timestamp = 3 should be interpreted as
// 3000 ns = 3 us.
// Default: 1 (if unset, it should be read as 1).
optional uint64 timestamp_unit_multiplier = 6;
// Default: false (i.e. debug_annotations is NOT filtered out by default)
// When true, any debug annotations provided as arguments to the
// TRACE_EVENT macros are not written into the trace. Typed arguments will
// still be emitted even if set to true.
optional bool filter_debug_annotations = 7;
// Default : false (i.e. disabled)
// When true, the SDK samples and emits the current thread time counter value
// for each event on the current thread's track. This value represents the
// total CPU time consumed by that thread since its creation. Note that if a
// thread is not scheduled by OS for some duration, that time won't be
// included in thread_time.
// Learn more : "CLOCK_THREAD_CPUTIME_ID" flag at
// https://linux.die.net/man/3/clock_gettime
optional bool enable_thread_time_sampling = 8;
// Default: false (i.e. dynamic event names are NOT filtered out by default)
// When true, event_names wrapped in perfetto::DynamicString will be filtered
// out.
optional bool filter_dynamic_event_names = 9;
}
// End of protos/perfetto/config/track_event/track_event_config.proto
// Begin of protos/perfetto/config/data_source_config.proto
// The configuration that is passed to each data source when starting tracing.
// Next id: 125
message DataSourceConfig {
enum SessionInitiator {
SESSION_INITIATOR_UNSPECIFIED = 0;
// This trace was initiated from a trusted system app has DUMP and
// USAGE_STATS permission. This system app is expected to not expose the
// trace to the user of the device.
// This is determined by checking the UID initiating the trace.
SESSION_INITIATOR_TRUSTED_SYSTEM = 1;
};
// Data source unique name, e.g., "linux.ftrace". This must match
// the name passed by the data source when it registers (see
// RegisterDataSource()).
optional string name = 1;
// The index of the logging buffer where TracePacket(s) will be stored.
// This field doesn't make a major difference for the Producer(s). The final
// logging buffers, in fact, are completely owned by the Service. We just ask
// the Producer to copy this number into the chunk headers it emits, so that
// the Service can quickly identify the buffer where to move the chunks into
// without expensive lookups on its fastpath.
optional uint32 target_buffer = 2;
// Set by the service to indicate the duration of the trace.
// DO NOT SET in consumer as this will be overridden by the service.
optional uint32 trace_duration_ms = 3;
// If true, |trace_duration_ms| should count also time in suspend. This
// is propagated from TraceConfig.prefer_suspend_clock_for_duration.
optional bool prefer_suspend_clock_for_duration = 122;
// Set by the service to indicate how long it waits after StopDataSource.
// DO NOT SET in consumer as this will be overridden by the service.
optional uint32 stop_timeout_ms = 7;
// Set by the service to indicate whether this tracing session has extra
// guardrails.
// DO NOT SET in consumer as this will be overridden by the service.
optional bool enable_extra_guardrails = 6;
// Set by the service to indicate which user initiated this trace.
// DO NOT SET in consumer as this will be overridden by the service.
optional SessionInitiator session_initiator = 8;
// Set by the service to indicate which tracing session the data source
// belongs to. The intended use case for this is checking if two data sources,
// one of which produces metadata for the other one, belong to the same trace
// session and hence should be linked together.
// This field was introduced in Aug 2018 after Android P.
// DO NOT SET in consumer as this will be overridden by the service.
optional uint64 tracing_session_id = 4;
// Keeep the lower IDs (up to 99) for fields that are *not* specific to
// data-sources and needs to be processed by the traced daemon.
// All data source config fields must be marked as [lazy=true]. This prevents
// the proto-to-cpp generator from recursing into those when generating the
// cpp classes and polluting tracing/core with data-source-specific classes.
// Instead they are treated as opaque strings containing raw proto bytes.
// Data source name: linux.ftrace
optional FtraceConfig ftrace_config = 100 [lazy = true];
// Data source name: linux.inode_file_map
optional InodeFileConfig inode_file_config = 102 [lazy = true];
// Data source name: linux.process_stats
optional ProcessStatsConfig process_stats_config = 103 [lazy = true];
// Data source name: linux.sys_stats
optional SysStatsConfig sys_stats_config = 104 [lazy = true];
// Data source name: android.heapprofd
// Introduced in Android 10.
optional HeapprofdConfig heapprofd_config = 105 [lazy = true];
// Data source name: android.java_hprof
// Introduced in Android 11.
optional JavaHprofConfig java_hprof_config = 110 [lazy = true];
// Data source name: android.power
optional AndroidPowerConfig android_power_config = 106 [lazy = true];
// Data source name: android.log
optional AndroidLogConfig android_log_config = 107 [lazy = true];
// TODO(fmayer): Add data source name for this.
optional GpuCounterConfig gpu_counter_config = 108 [lazy = true];
// Data source name: android.game_interventions
optional AndroidGameInterventionListConfig
android_game_intervention_list_config = 116 [lazy = true];
// Data source name: android.packages_list
optional PackagesListConfig packages_list_config = 109 [lazy = true];
// Data source name: linux.perf
optional PerfEventConfig perf_event_config = 111 [lazy = true];
// Data source name: vulkan.memory_tracker
optional VulkanMemoryConfig vulkan_memory_config = 112 [lazy = true];
// Data source name: track_event
optional TrackEventConfig track_event_config = 113 [lazy = true];
// Data source name: android.polled_state
optional AndroidPolledStateConfig android_polled_state_config = 114
[lazy = true];
// Data source name: android.system_property
optional AndroidSystemPropertyConfig android_system_property_config = 118
[lazy = true];
// Data source name: android.statsd
optional StatsdTracingConfig statsd_tracing_config = 117 [lazy = true];
// Data source name: linux.system_info
optional SystemInfoConfig system_info_config = 119;
// Chrome is special as it doesn't use the perfetto IPC layer. We want to
// avoid proto serialization and de-serialization there because that would
// just add extra hops on top of the Mojo ser/des. Instead we auto-generate a
// C++ class for it so it can pass around plain C++ objets.
optional ChromeConfig chrome_config = 101;
// If an interceptor is specified here, packets for this data source will be
// rerouted to the interceptor instead of the main trace buffer. This can be
// used, for example, to write trace data into ETW or for logging trace points
// to the console.
//
// Note that interceptors are only supported by data sources registered
// through the Perfetto SDK API. Data sources that don't use that API (e.g.,
// traced_probes) may not support interception.
optional InterceptorConfig interceptor_config = 115;
// Data source name: android.network_packets.
// Introduced in Android 14 (U).
optional NetworkPacketTraceConfig network_packet_trace_config = 120
[lazy = true];
// Data source name: android.surfaceflinger.layers
optional SurfaceFlingerLayersConfig surfaceflinger_layers_config = 121
[lazy = true];
// Data source name: android.surfaceflinger.transactions
optional SurfaceFlingerTransactionsConfig surfaceflinger_transactions_config =
123 [lazy = true];
// Data source name: android.sdk_sysprop_guard
// Introduced in Android 14 (U) QPR1.
optional AndroidSdkSyspropGuardConfig android_sdk_sysprop_guard_config = 124
[lazy = true];
// This is a fallback mechanism to send a free-form text config to the
// producer. In theory this should never be needed. All the code that
// is part of the platform (i.e. traced service) is supposed to *not* truncate
// the trace config proto and propagate unknown fields. However, if anything
// in the pipeline (client or backend) ends up breaking this forward compat
// plan, this field will become the escape hatch to allow future data sources
// to get some meaningful configuration.
optional string legacy_config = 1000;
// This field is only used for testing.
optional TestConfig for_testing = 1001;
// Was |for_testing|. Caused more problems then found.
reserved 268435455;
}
// End of protos/perfetto/config/data_source_config.proto
// Begin of protos/perfetto/config/trace_config.proto
// The overall config that is used when starting a new tracing session through
// ProducerPort::StartTracing().
// It contains the general config for the logging buffer(s) and the configs for
// all the data source being enabled.
//
// Next id: 38.
message TraceConfig {
message BufferConfig {
optional uint32 size_kb = 1;
// |page_size|, now deprecated.
reserved 2;
// |optimize_for|, now deprecated.
reserved 3;
enum FillPolicy {
UNSPECIFIED = 0;
// Default behavior. The buffer operates as a conventional ring buffer.
// If the writer is faster than the reader (or if the reader reads only
// after tracing is stopped) newly written packets will overwrite old
// packets.
RING_BUFFER = 1;
// Behaves like RING_BUFFER as long as there is space in the buffer or
// the reader catches up with the writer. As soon as the writer hits
// an unread chunk, it stops accepting new data in the buffer.
DISCARD = 2;
}
optional FillPolicy fill_policy = 4;
// When true the buffer is moved (rather than copied) onto the cloned
// session, and an empty buffer of the same size is allocated in the source
// tracing session. This feature will likely get deprecated in the future.
// It been introduced mainly to support the surfaceflinger snapshot dump
// for bugreports, where SF can dumps O(400MB) into the bugreport trace. In
// that case we don't want to retain another in-memory copy of the buffer.
optional bool transfer_on_clone = 5;
// Used in conjuction with transfer_on_clone. When true the buffer is
// cleared before issuing the Flush(reason=kTraceClone). This is to ensure
// that if the data source took too long to write the data in a previous
// clone-related flush, we don't end up with a mixture of leftovers from
// the previous write and new data.
optional bool clear_before_clone = 6;
}
repeated BufferConfig buffers = 1;
message DataSource {
// Filters and data-source specific config. It contains also the unique name
// of the data source, the one passed in the DataSourceDescriptor when they
// register on the service.
optional protos.DataSourceConfig config = 1;
// Optional. If multiple producers (~processes) expose the same data source
// and either |producer_name_filter| or |producer_name_regex_filter| is set,
// the data source is enabled only for producers whose names match any of
// the filters.
// |producer_name_filter| has to be an exact match, while
// |producer_name_regex_filter| is a regular expression.
// This allows to enable a data source only for specific processes.
// The "repeated" fields have OR semantics: specifying a filter ["foo",
// "bar"] will enable data sources on both "foo" and "bar" (if they exist).
repeated string producer_name_filter = 2;
repeated string producer_name_regex_filter = 3;
}
repeated DataSource data_sources = 2;
// Config for disabling builtin data sources in the tracing service.
message BuiltinDataSource {
// Disable emitting clock timestamps into the trace.
optional bool disable_clock_snapshotting = 1;
// Disable echoing the original trace config in the trace.
optional bool disable_trace_config = 2;
// Disable emitting system info (build fingerprint, cpuinfo, etc).
optional bool disable_system_info = 3;
// Disable emitting events for data-source state changes (e.g. the marker
// for all data sources having ACKed the start of the trace).
optional bool disable_service_events = 4;
// The authoritative clock domain for the trace. Defaults to BOOTTIME. See
// also ClockSnapshot's primary_trace_clock. The configured value is written
// into the trace as part of the ClockSnapshots emitted by the service.
// Trace processor will attempt to translate packet/event timestamps from
// various data sources (and their chosen clock domains) to this domain
// during import. Added in Android R.
optional BuiltinClock primary_trace_clock = 5;
// Time interval in between snapshotting of sync markers, clock snapshots,
// stats, and other periodic service-emitted events. Note that the service
// only keeps track of the first and the most recent snapshot until
// ReadBuffers() is called.
optional uint32 snapshot_interval_ms = 6;
// Hints to the service that a suspend-aware (i.e. counting time in suspend)
// clock should be used for periodic snapshots of service-emitted events.
// This means, if a snapshot *should* have happened during suspend, it will
// happen immediately after the device resumes.
//
// Choosing a clock like this is done on best-effort basis; not all
// platforms (e.g. Windows) expose a clock which can be used for periodic
// tasks counting suspend. If such a clock is not available, the service
// falls back to the best-available alternative.
//
// Introduced in Android S.
// TODO(lalitm): deprecate this in T and make this the default if nothing
// crashes in S.
optional bool prefer_suspend_clock_for_snapshot = 7;
// Disables the reporting of per-trace-writer histograms in TraceStats.
optional bool disable_chunk_usage_histograms = 8;
}
optional BuiltinDataSource builtin_data_sources = 20;
// If specified, the trace will be stopped |duration_ms| after starting.
// This does *not* count the time the system is suspended, so we will run
// for duration_ms of system activity, not wall time.
//
// However in case of traces with triggers, see
// TriggerConfig.trigger_timeout_ms instead.
optional uint32 duration_ms = 3;
// If true, tries to use CLOCK_BOOTTIME for duration_ms rather than
// CLOCK_MONOTONIC (which doesn't count time in suspend). Supported only on
// Linux/Android, no-op on other platforms. This is used when dealing with
// long (e.g. 24h) traces, where suspend can inflate them to weeks of
// wall-time, making them more likely to hit device reboots (and hence loss).
// This option also changes consistently the semantic of
// TriggerConfig.stop_delay_ms.
optional bool prefer_suspend_clock_for_duration = 36;
// This is set when --dropbox is passed to the Perfetto command line client
// and enables guardrails that limit resource usage for traces requested
// by statsd.
optional bool enable_extra_guardrails = 4;
enum LockdownModeOperation {
LOCKDOWN_UNCHANGED = 0;
LOCKDOWN_CLEAR = 1;
LOCKDOWN_SET = 2;
}
// Reject producers that are not running under the same UID as the tracing
// service.
optional LockdownModeOperation lockdown_mode = 5;
message ProducerConfig {
// Identifies the producer for which this config is for.
optional string producer_name = 1;
// Specifies the preferred size of the shared memory buffer. If the size is
// larger than the max size, the max will be used. If it is smaller than
// the page size or doesn't fit pages evenly into it, it will fall back to
// the size specified by the producer or finally the default shared memory
// size.
optional uint32 shm_size_kb = 2;
// Specifies the preferred size of each page in the shared memory buffer.
// Must be an integer multiple of 4K.
optional uint32 page_size_kb = 3;
}
repeated ProducerConfig producers = 6;
// Contains statsd-specific metadata about an alert associated with the trace.
message StatsdMetadata {
// The identifier of the alert which triggered this trace.
optional int64 triggering_alert_id = 1;
// The uid which registered the triggering configuration with statsd.
optional int32 triggering_config_uid = 2;
// The identifier of the config which triggered the alert.
optional int64 triggering_config_id = 3;
// The identifier of the subscription which triggered this trace.
optional int64 triggering_subscription_id = 4;
}
// Statsd-specific metadata.
optional StatsdMetadata statsd_metadata = 7;
// When true && |output_path| is empty, the EnableTracing() request must
// provide a file descriptor. The service will then periodically read packets
// out of the trace buffer and store it into the passed file.
// If |output_path| is not empty no fd should be passed, the service
// will create a new file and write into that (see comment below).
optional bool write_into_file = 8;
// This must point to a non-existing file. If the file exists the service
// will NOT overwrite and will fail instead as a security precaution.
// On Android, when this is used with the system traced, the path must be
// within /data/misc/perfetto-traces/ or the trace will fail.
// This option has been introduced in Android R. Before R write_into_file
// can be used only with the "pass a file descriptor over IPC" mode.
optional string output_path = 29;
// Optional. If non-zero tunes the write period. A min value of 100ms is
// enforced (i.e. smaller values are ignored).
optional uint32 file_write_period_ms = 9;
// Optional. When non zero the periodic write stops once at most X bytes
// have been written into the file. Tracing is disabled when this limit is
// reached, even if |duration_ms| has not been reached yet.
optional uint64 max_file_size_bytes = 10;
// Contains flags which override the default values of the guardrails inside
// Perfetto.
message GuardrailOverrides {
// Override the default limit (in bytes) for uploading data to server within
// a 24 hour period.
// On R-, this override only affected userdebug builds. Since S, it also
// affects user builds.
optional uint64 max_upload_per_day_bytes = 1;
// Overrides the guardrail for maximum trace buffer size.
// Available on U+
optional uint32 max_tracing_buffer_size_kb = 2;
}
optional GuardrailOverrides guardrail_overrides = 11;
// When true, data sources are not started until an explicit call to
// StartTracing() on the consumer port. This is to support early
// initialization and fast trace triggering. This can be used only when the
// Consumer explicitly triggers the StartTracing() method.
// This should not be used in a remote trace config via statsd, doing so will
// result in a hung trace session.
optional bool deferred_start = 12;
// When set, it periodically issues a Flush() to all data source, forcing them
// to commit their data into the tracing service. This can be used for
// quasi-real-time streaming mode and to guarantee some partial ordering of
// events in the trace in windows of X ms.
optional uint32 flush_period_ms = 13;
// Wait for this long for producers to acknowledge flush requests.
// Default 5s.
optional uint32 flush_timeout_ms = 14;
// Wait for this long for producers to acknowledge stop requests.
// Default 5s.
optional uint32 data_source_stop_timeout_ms = 23;
// |disable_clock_snapshotting| moved.
reserved 15;
// Android-only. If set, sends an intent to the Traceur system app when the
// trace ends to notify it about the trace readiness.
optional bool notify_traceur = 16;
// This field was introduced in Android S.
// Android-only. If set to a value > 0, marks the trace session as a candidate
// for being attached to a bugreport. This field effectively acts as a z-index
// for bugreports. When Android's dumpstate runs perfetto
// --save-for-bugreport, traced will pick the tracing session with the highest
// score (score <= 0 is ignored) and:
// On Android S, T: will steal its contents, save the trace into
// a known path and stop prematurely.
// On Android U+: will create a read-only snapshot and save that into a known
// path, without stoppin the original tracing session.
// When this field is set the tracing session becomes eligible to be cloned
// by other UIDs.
optional int32 bugreport_score = 30;
// Triggers allow producers to start or stop the tracing session when an event
// occurs.
//
// For example if we are tracing probabilistically, most traces will be
// uninteresting. Triggers allow us to keep only the interesting ones such as
// those traces during which the device temperature reached a certain
// threshold. In this case the producer can activate a trigger to keep
// (STOP_TRACING) the trace, otherwise it can also begin a trace
// (START_TRACING) because it knows something is about to happen.
message TriggerConfig {
enum TriggerMode {
UNSPECIFIED = 0;
// When this mode is chosen, data sources are not started until one of the
// |triggers| are received. This supports early initialization and fast
// starting of the tracing system. On triggering, the session will then
// record for |stop_delay_ms|. However if no trigger is seen
// after |trigger_timeout_ms| the session will be stopped and no data will
// be returned.
START_TRACING = 1;
// When this mode is chosen, the session will be started via the normal
// EnableTracing() & StartTracing(). If no trigger is ever seen
// the session will be stopped after |trigger_timeout_ms| and no data will
// be returned. However if triggered the trace will stop after
// |stop_delay_ms| and any data in the buffer will be returned to the
// consumer.
STOP_TRACING = 2;
// 3 was taken by CLONE_SNAPSHOT but that has been moved to 4.
// The early implementation of CLONE_SNAPSHOT had various bugs
// (b/290798988, b/290799105) and made it into Android U. The number
// change is to make sure nobody rolls out a config that hits the broken
// behaviour.
reserved 3;
// When this mode is chosen, this causes a snapshot of the current tracing
// session to be created after |stop_delay_ms| while the current tracing
// session continues undisturbed (% an extra flush). This mode can be
// used only when the tracing session is handled by the "perfetto" cmdline
// client (which is true in 90% of cases). Part of the business logic
// necessary for this behavior, and ensuing file handling, lives in
// perfetto_cmd.cc . On other consumers, this causes only a notification
// of the trigger through a CloneTriggerHit ObservableEvent. The custom
// consumer is supposed to call CloneSession() itself after the event.
// Use use_clone_snapshot_if_available=true when targeting older versions
// of perfetto.
CLONE_SNAPSHOT = 4;
// NOTE: CLONE_SNAPSHOT should be used only when we targeting Android V+
// (15+) / Perfetto v38+. A bug in older versions of the tracing service
// might cause indefinitely long tracing sessions (see b/274931668).
}
optional TriggerMode trigger_mode = 1;
// This flag is really a workaround for b/274931668. This is needed only
// when deploying configs to different versions of the tracing service.
// When this is set to true this has the same effect of setting trigger_mode
// to CLONE_SNAPSHOT on newer versions of the service. This boolean has been
// introduced to allow to have configs that use CLONE_SNAPSHOT on newer
// versions of Android and fall back to STOP_TRACING on older versions where
// CLONE_SNAPSHOT did not exist.
// When using this flag, trigger_mode must be set to STOP_TRACING.
optional bool use_clone_snapshot_if_available = 5;
// DEPRECATED, was use_clone_snapshot_if_available in U. See the comment
// around CLONE_SNAPSHOT.
reserved 4;
message Trigger {
// The producer must specify this name to activate the trigger.
optional string name = 1;
// An std::regex that will match the producer that can activate this
// trigger. This is optional. If unset any producers can activate this
// trigger.
optional string producer_name_regex = 2;
// After a trigger is received either in START_TRACING or STOP_TRACING
// mode then the trace will end |stop_delay_ms| after triggering.
// In CLONE_SNAPSHOT mode, this is the delay between the trigger and the
// snapshot.
// If |prefer_suspend_clock_for_duration| is set, the duration will be
// based on wall-clock, counting also time in suspend.
optional uint32 stop_delay_ms = 3;
// Limits the number of traces this trigger can start/stop in a rolling
// 24 hour window. If this field is unset or zero, no limit is applied and
// activiation of this trigger *always* starts/stops the trace.
optional uint32 max_per_24_h = 4;
// A value between 0 and 1 which encodes the probability of skipping a
// trigger with this name. This is useful for reducing the probability
// of high-frequency triggers from dominating trace finaization. If this
// field is unset or zero, the trigger will *never* be skipped. If this
// field is greater than or equal to 1, this trigger will *always* be
// skipped i.e. it will be as if this trigger was never included in the
// first place.
// This probability check is applied *before* any other limits. For
// example, if |max_per_24_h| is also set, first we will check if the
// probability bar is met and only then will we check the |max_per_24_h|
// limit.
optional double skip_probability = 5;
}
// A list of triggers which are related to this configuration. If ANY
// trigger is seen then an action will be performed based on |trigger_mode|.
repeated Trigger triggers = 2;
// Required and must be positive if a TriggerConfig is specified. This is
// how long this TraceConfig should wait for a trigger to arrive. After this
// period of time if no trigger is seen the TracingSession will be cleaned
// up.
optional uint32 trigger_timeout_ms = 3;
}
optional TriggerConfig trigger_config = 17;
// When this is non-empty the perfetto command line tool will ignore the rest
// of this TraceConfig and instead connect to the perfetto service as a
// producer and send these triggers, potentially stopping or starting traces
// that were previous configured to use a TriggerConfig.
repeated string activate_triggers = 18;
// Configuration for trace contents that reference earlier trace data. For
// example, a data source might intern strings, and emit packets containing
// {interned id : string} pairs. Future packets from that data source can then
// use the interned ids instead of duplicating the raw string contents. The
// trace parser will then need to use that interning table to fully interpret
// the rest of the trace.
message IncrementalStateConfig {
// If nonzero, notify eligible data sources to clear their incremental state
// periodically, with the given period. The notification is sent only to
// data sources that have |handles_incremental_state_clear| set in their
// DataSourceDescriptor. The notification requests that the data source
// stops referring to past trace contents. This is particularly useful when
// tracing in ring buffer mode, where it is not exceptional to overwrite old
// trace data.
//
// Warning: this time-based global clearing is likely to be removed in the
// future, to be replaced with a smarter way of sending the notifications
// only when necessary.
optional uint32 clear_period_ms = 1;
}
optional IncrementalStateConfig incremental_state_config = 21;
// Additional guardrail used by the Perfetto command line client.
// On user builds when --dropbox is set perfetto will refuse to trace unless
// this is also set.
// Added in Q.
optional bool allow_user_build_tracing = 19;
// If set the tracing service will ensure there is at most one tracing session
// with this key.
optional string unique_session_name = 22;
// Compress trace with the given method. Best effort.
enum CompressionType {
COMPRESSION_TYPE_UNSPECIFIED = 0;
COMPRESSION_TYPE_DEFLATE = 1;
}
optional CompressionType compression_type = 24;
// Use the legacy codepath that compresses from perfetto_cmd.cc instead of
// using the new codepath that compresses from tracing_service_impl.cc. This
// will be removed in the future.
optional bool compress_from_cli = 37;
// Android-only. Not for general use. If set, saves the trace into an
// incident. This field is read by perfetto_cmd, rather than the tracing
// service. This field must be set when passing the --upload flag to
// perfetto_cmd.
message IncidentReportConfig {
// In this message, either:
// * all of |destination_package|, |destination_class| and |privacy_level|
// must be set.
// * |skip_incidentd| must be explicitly set to true.
optional string destination_package = 1;
optional string destination_class = 2;
// Level of filtering in the requested incident. See |Destination| in
// frameworks/base/core/proto/android/privacy.proto.
optional int32 privacy_level = 3;
// If true, then skips saving the trace to incidentd.
//
// This flag is useful in testing (e.g. Perfetto-statsd integration tests)
// or when we explicitly don't want traces to go to incidentd even when they
// usually would (e.g. configs deployed using statsd but only used for
// inclusion in bugreports using |bugreport_score|).
//
// The motivation for having this flag, instead of just not setting
// |incident_report_config|, is prevent accidents where
// |incident_report_config| is omitted by mistake.
optional bool skip_incidentd = 5;
// If true, do not write the trace into dropbox (i.e. incident only).
// Otherwise, write to both dropbox and incident.
// TODO(lalitm): remove this field as we no longer use Dropbox.
optional bool skip_dropbox = 4 [deprecated = true];
}
optional IncidentReportConfig incident_report_config = 25;
enum StatsdLogging {
STATSD_LOGGING_UNSPECIFIED = 0;
STATSD_LOGGING_ENABLED = 1;
STATSD_LOGGING_DISABLED = 2;
}
// Android-only. Not for general use. If specified, sets the logging to statsd
// of guardrails and checkpoints in the tracing service. perfetto_cmd sets
// this to enabled (if not explicitly set in the config) when specifying
// --upload.
optional StatsdLogging statsd_logging = 31;
// DEPRECATED. Was trace_uuid, use trace_uuid_msb and trace_uuid_lsb instead.
reserved 26;
// An identifier clients can use to tie this trace to other logging.
// DEPRECATED as per v32. See TracePacket.trace_uuid for the authoritative
// Trace UUID. If this field is set, the tracing service will respect the
// requested UUID (i.e. TracePacket.trace_uuid == this field) but only if
// gap-less snapshotting is not used.
optional int64 trace_uuid_msb = 27 [deprecated = true];
optional int64 trace_uuid_lsb = 28 [deprecated = true];
// When set applies a post-filter to the trace contents using the filter
// provided. The filter is applied at ReadBuffers() time and works both in the
// case of IPC readback and write_into_file. This filter can be generated
// using `tools/proto_filter -s schema.proto -F filter_out.bytes` or
// `-T filter_out.escaped_string` (for .pbtx). See go/trace-filtering for
// design.
//
// Introduced in Android S, but it was broken (b/195065199). Reintroduced in
// Android T with a different field number. Updated in Android U with a new
// bytecode version which supports string filtering.
message TraceFilter {
// =========================
// Filter bytecode.
// =========================
// The bytecode as implemented in Android T.
optional bytes bytecode = 1;
// The bytecode as implemented in Android U. Adds support for string
// filtering.
optional bytes bytecode_v2 = 2;
// =========================
// String filtering
// =========================
// The principles and terminology of string filtering is heavily inspired by
// iptables. A "rule" decide how strings should be filtered. Each rule
// contains a "policy" which indicates the algorithm to use for filtering.
// A "chain" is a list of rules which will be sequentially checked against
// each string.
//
// The first rule which applies to the string terminates filtering for that
// string. If no rules apply, the string is left unchanged.
// A policy specifies which algorithm should be used for filtering the
// string.
enum StringFilterPolicy {
SFP_UNSPECIFIED = 0;
// Tries to match the string field against |regex_pattern|. If it
// matches, all matching groups are "redacted" (i.e. replaced with a
// constant string) and filtering is terminated (i.e. no further rules are
// checked). If it doesn't match, the string is left unchanged and the
// next rule in chain is considered.
SFP_MATCH_REDACT_GROUPS = 1;
// Like |SFP_MATCH_REDACT_GROUPS| but tries to do some pre-work before
// checking the regex. Specifically, it tries to parse the string field as
// an atrace tracepoint and checks if the post-tgid field starts with
// |atrace_post_tgid_starts_with|. The regex matching is only performed if
// this check succeeds.
SFP_ATRACE_MATCH_REDACT_GROUPS = 2;
// Tries to match the string field against |regex_pattern|. If it
// matches, filtering is terminated (i.e. no further rules are checked).
// If it doesn't match, the string is left unchanged and the next rule in
// chain is considered.
SFP_MATCH_BREAK = 3;
// Like |SFP_MATCH_BREAK| but tries to do some pre-work before checking
// the regex. Specifically, it tries to parse the string field as an
// atrace tracepoint and checks if the post-tgid field starts with
// |atrace_post_tgid_starts_with|. The regex matching is only performed if
// this check succeeds.
SFP_ATRACE_MATCH_BREAK = 4;
}
// A rule specifies how strings should be filtered.
message StringFilterRule {
// The policy (i.e. algorithm) dictating how strings matching this rule
// should be handled.
optional StringFilterPolicy policy = 1;
// The regex pattern used to match against each string.
optional string regex_pattern = 2;
// The string which should appear after the tgid in atrace tracepoint
// strings.
optional string atrace_payload_starts_with = 3;
}
// A chain is a list of rules which string will be sequentially checked
// against.
message StringFilterChain {
repeated StringFilterRule rules = 1;
}
optional StringFilterChain string_filter_chain = 3;
}
// old field number for trace_filter
reserved 32;
optional TraceFilter trace_filter = 33;
// Android-only. Not for general use. If set, reports the trace to the
// Android framework. This field is read by perfetto_cmd, rather than the
// tracing service. This field must be set when passing the --upload flag to
// perfetto_cmd.
message AndroidReportConfig {
// In this message, either:
// * |reporter_service_package| and |reporter_service_class| must be set.
// * |skip_reporting| must be explicitly set to true.
optional string reporter_service_package = 1;
optional string reporter_service_class = 2;
// If true, then skips reporting the trace to Android framework.
//
// This flag is useful in testing (e.g. Perfetto-statsd integration tests)
// or when we explicitly don't want to report traces to the framework even
// when they usually would (e.g. configs deployed using statsd but only
// used for inclusion in bugreports using |bugreport_score|).
//
// The motivation for having this flag, instead of just not setting
// |framework_report_config|, is prevent accidents where
// |framework_report_config| is omitted by mistake.
optional bool skip_report = 3;
// If true, will direct the Android framework to read the data in trace
// file and pass it to the reporter class over a pipe instead of passing
// the file descriptor directly.
//
// This flag is needed because the Android test framework does not
// currently support priv-app helper apps (in terms of SELinux) and we
// really don't want to add an allow rule for untrusted_app to receive
// trace fds.
//
// Because of this, we instead will direct the framework to create a new
// pipe and pass this to the reporter process instead. As the pipe is
// created by the framework, we won't have any problems with SELinux
// (system_server is already allowed to pass pipe fds, even
// to untrusted apps).
//
// As the name suggests this option *MUST* only be used for testing.
// Note that the framework will reject (and drop) files which are too
// large both for simplicity and to be minimize the amount of data we
// pass to a non-priv app (note that the framework will still check
// manifest permissions even though SELinux permissions are worked around).
optional bool use_pipe_in_framework_for_testing = 4;
}
optional AndroidReportConfig android_report_config = 34;
// If set, delays the start of tracing by a random duration. The duration is
// chosen from a uniform distribution between the specified minimum and
// maximum.
// Note: this delay is implemented by perfetto_cmd *not* by traced so will
// not work if you communicate with traced directly over the consumer API.
// Introduced in Android T.
message CmdTraceStartDelay {
optional uint32 min_delay_ms = 1;
optional uint32 max_delay_ms = 2;
}
optional CmdTraceStartDelay cmd_trace_start_delay = 35;
}
// End of protos/perfetto/config/trace_config.proto
// Begin of protos/perfetto/common/trace_stats.proto
// Statistics for the internals of the tracing service.
//
// Next id: 19.
message TraceStats {
// From TraceBuffer::Stats.
//
// Next id: 20.
message BufferStats {
// Size of the circular buffer in bytes.
optional uint64 buffer_size = 12;
// Num. bytes written into the circular buffer, including chunk headers.
optional uint64 bytes_written = 1;
// Num. bytes overwritten before they have been read (i.e. loss of data).
optional uint64 bytes_overwritten = 13;
// Total size of chunks that were fully read from the circular buffer by the
// consumer. This may not be equal to |bytes_written| either in the middle
// of tracing, or if |chunks_overwritten| is non-zero. Note that this is the
// size of the chunks read from the buffer, including chunk headers, which
// will be different from the total size of packets returned to the
// consumer.
//
// The current utilization of the trace buffer (mid-tracing) can be obtained
// by subtracting |bytes_read| and |bytes_overwritten| from |bytes_written|,
// adding the difference of |padding_bytes_written| and
// |padding_bytes_cleared|, and comparing this sum to the |buffer_size|.
// Note that this represents the total size of buffered data in the buffer,
// yet this data may be spread non-contiguously through the buffer and may
// be overridden before the utilization reaches 100%.
optional uint64 bytes_read = 14;
// Num. bytes that were allocated as padding between chunks in the circular
// buffer.
optional uint64 padding_bytes_written = 15;
// Num. of padding bytes that were removed from the circular buffer when
// they were overwritten.
//
// The difference between |padding_bytes_written| and
// |padding_bytes_cleared| denotes the total size of padding currently
// present in the buffer.
optional uint64 padding_bytes_cleared = 16;
// Num. chunks (!= packets) written into the buffer.
optional uint64 chunks_written = 2;
// Num. chunks (!= packets) rewritten into the buffer. This means we rewrote
// the same chunk with additional packets appended to the end.
optional uint64 chunks_rewritten = 10;
// Num. chunks overwritten before they have been read (i.e. loss of data).
optional uint64 chunks_overwritten = 3;
// Num. chunks discarded (i.e. loss of data). Can be > 0 only when a buffer
// is configured with FillPolicy == DISCARD.
optional uint64 chunks_discarded = 18;
// Num. chunks (!= packets) that were fully read from the circular buffer by
// the consumer. This may not be equal to |chunks_written| either in the
// middle of tracing, or if |chunks_overwritten| is non-zero.
optional uint64 chunks_read = 17;
// Num. chunks that were committed out of order.
optional uint64 chunks_committed_out_of_order = 11;
// Num. times the ring buffer wrapped around.
optional uint64 write_wrap_count = 4;
// Num. out-of-band (OOB) patches that succeeded.
optional uint64 patches_succeeded = 5;
// Num. OOB patches that failed (e.g., the chunk to patch was gone).
optional uint64 patches_failed = 6;
// Num. readaheads (for large multi-chunk packet reads) that ended up in a
// successful packet read.
optional uint64 readaheads_succeeded = 7;
// Num. readaheads aborted because of missing chunks in the sequence stream.
// Note that a small number > 0 is totally expected: occasionally, when
// issuing a read, the very last packet in a sequence might be incomplete
// (because the producer is still writing it while we read). The read will
// stop at that point, for that sequence, increasing this counter.
optional uint64 readaheads_failed = 8;
// Num. of violations of the SharedMemoryABI found while writing or reading
// the buffer. This is an indication of either a bug in the producer(s) or
// malicious producer(s).
optional uint64 abi_violations = 9;
// The fields below have been introduced in Android R.
// Num. of times the service detected packet loss on a trace writer
// sequence. This is usually caused by exhaustion of available chunks in the
// writer process's SMB. Note that this relies on the client's TraceWriter
// indicating this loss to the service -- packets lost for other reasons are
// not reflected in this stat.
optional uint64 trace_writer_packet_loss = 19;
}
// Stats for the TraceBuffer(s) of the current trace session.
repeated BufferStats buffer_stats = 1;
// Per TraceWriter stat. Each {producer, trace writer} tuple is publicly
// visible as a unique sequence ID in the trace.
message WriterStats {
// This matches the TracePacket.trusted_packet_sequence_id and is used to
// correlate the stats with the actual packet types.
optional uint64 sequence_id = 1;
// These two arrays have the same cardinality and match the cardinality of
// chunk_payload_histogram_def + 1 (for the overflow bucket, see below).
// `sum` contains the SUM(entries) and `counts` contains the COUNT(entries)
// for each bucket.
repeated uint64 chunk_payload_histogram_counts = 2 [packed = true];
repeated int64 chunk_payload_histogram_sum = 3 [packed = true];
}
// The thresholds of each the `writer_stats` histogram buckets. This is
// emitted only once as all WriterStats share the same bucket layout.
// This field has the same cardinality of the
// `writer_stats.chunk_payload_histogram_{counts,sum}` - 1.
// (The -1 is because the last overflow bucket is not reported in the _def).
// An array of values [10, 100, 1000] in the _def array means that there are
// four buckets (3 + the implicit overflow bucket):
// [0]: x <= 10; [1]: 100 < x <= 1000; [2]: 1000 < x <= 1000; [3]: x > 1000.
repeated int64 chunk_payload_histogram_def = 17;
repeated WriterStats writer_stats = 18;
// Num. producers connected (whether they are involved in the current tracing
// session or not).
optional uint32 producers_connected = 2;
// Num. producers ever seen for all trace sessions since startup (it's a good
// proxy for inferring num. producers crashed / killed).
optional uint64 producers_seen = 3;
// Num. data sources registered for all trace sessions.
optional uint32 data_sources_registered = 4;
// Num. data sources ever seen for all trace sessions since startup.
optional uint64 data_sources_seen = 5;
// Num. concurrently active tracing sessions.
optional uint32 tracing_sessions = 6;
// Num. buffers for all tracing session (not just the current one). This will
// be >= buffer_stats.size(), because the latter is only about the current
// session.
optional uint32 total_buffers = 7;
// The fields below have been introduced in Android Q.
// Num. chunks that were discarded by the service before attempting to commit
// them to a buffer, e.g. because the producer specified an invalid buffer ID.
optional uint64 chunks_discarded = 8;
// Num. patches that were discarded by the service before attempting to apply
// them to a buffer, e.g. because the producer specified an invalid buffer ID.
optional uint64 patches_discarded = 9;
// Packets that failed validation of the TrustedPacket. If this is > 0, there
// is a bug in the producer.
optional uint64 invalid_packets = 10;
// This is set only when the TraceConfig specifies a TraceFilter.
message FilterStats {
optional uint64 input_packets = 1;
optional uint64 input_bytes = 2;
optional uint64 output_bytes = 3;
optional uint64 errors = 4;
optional uint64 time_taken_ns = 5;
}
optional FilterStats filter_stats = 11;
// Count of Flush() requests (either from the Consumer, or self-induced
// periodic flushes). The final Flush() is also included in the count.
optional uint64 flushes_requested = 12;
// The count of the Flush() requests that were completed successfully.
// In a well behaving trace this should always be == `flush_requests`.
optional uint64 flushes_succeeded = 13;
// The count of the Flush() requests that failed (in most timed out).
// In a well behaving trace this should always be == 0.
optional uint64 flushes_failed = 14;
enum FinalFlushOutcome {
FINAL_FLUSH_UNSPECIFIED = 0;
FINAL_FLUSH_SUCCEEDED = 1;
FINAL_FLUSH_FAILED = 2;
}
optional FinalFlushOutcome final_flush_outcome = 15;
}
// End of protos/perfetto/common/trace_stats.proto
// Begin of protos/perfetto/trace/android/android_game_intervention_list.proto
message AndroidGameInterventionList {
message GameModeInfo {
optional uint32 mode = 1;
optional bool use_angle = 2;
optional float resolution_downscale = 3;
optional float fps = 4;
}
message GamePackageInfo {
optional string name = 1;
optional uint64 uid = 2;
optional uint32 current_mode = 3;
repeated GameModeInfo game_mode_info = 4;
}
repeated GamePackageInfo game_packages = 1;
// True when at least one error occured when parsing
// game_mode_intervention.list
optional bool parse_error = 2;
// Failed to open / read game_mode_intervention.list
optional bool read_error = 3;
}
// End of protos/perfetto/trace/android/android_game_intervention_list.proto
// Begin of protos/perfetto/trace/android/android_log.proto
message AndroidLogPacket {
message LogEvent {
// The log buffer (e.g. MAIN, SYSTEM, RADIO) the event comes from.
optional AndroidLogId log_id = 1;
// PID (TGID), TID and UID of the task that emitted the event.
optional int32 pid = 2;
optional int32 tid = 3;
optional int32 uid = 4;
// Timestamp [ns]. The clock source is CLOCK_REALTIME, unlike many other
// Perfetto trace events that instead use CLOCK_BOOTTIME. The trace
// processor will take care of realigning clocks using the ClockSnapshot(s).
optional uint64 timestamp = 5;
// When log_id == LID_EVENTS, |tag| corresponds to the event name defined in
// the second column of /system/etc/event-log-tags. For all other events,
// |tag| is the app-specified argument passed to __android_log_write().
optional string tag = 6;
// Empty when log_id == LID_EVENTS.
optional AndroidLogPriority prio = 7;
// Empty when log_id == LID_EVENTS.
optional string message = 8;
message Arg {
optional string name = 1;
oneof value {
int64 int_value = 2;
float float_value = 3;
string string_value = 4;
}
}
// Only populated when log_id == LID_EVENTS.
repeated Arg args = 9;
}
repeated LogEvent events = 1;
// Stats are emitted only upon Flush() and are monotonic (i.e. they are
// absolute counters since the beginning of the lifetime of the tracing
// session and NOT relative to the previous Stats snapshot).
message Stats {
// Total number of log events seen, including errors and skipped entries
// (num of events stored in the trace = total - failed - skipped).
optional uint64 num_total = 1;
// Parser failures.
optional uint64 num_failed = 2;
// Messages skipped due to filters.
optional uint64 num_skipped = 3;
}
optional Stats stats = 2;
}
// End of protos/perfetto/trace/android/android_log.proto
// Begin of protos/perfetto/trace/android/android_system_property.proto
message AndroidSystemProperty {
message PropertyValue {
optional string name = 1;
optional string value = 2;
}
repeated PropertyValue values = 1;
}
// End of protos/perfetto/trace/android/android_system_property.proto
// Begin of protos/perfetto/trace/android/camera_event.proto
// A profiling event corresponding to a single camera frame. This message
// collects important details and timestamps involved in producing a single
// camera frame.
// Next ID: 17
message AndroidCameraFrameEvent {
// Identifier for the CameraCaptureSession this frame originates from. See:
// https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession
optional uint64 session_id = 1;
// Identifier for the camera sensor that is the source of this frame. This may
// be either a physical or logical camera (up to vendor interpretation).
optional uint32 camera_id = 2;
// The frame number identifying this frame on this camera.
optional int64 frame_number = 3;
// Identifier for the CaptureRequest. See:
// https://developer.android.com/reference/android/hardware/camera2/CaptureRequest
//
// If multiple cameras are streaming simultaneously, the request_id may be
// used to identify which frames were captured in service of the same request.
optional int64 request_id = 4;
// The CLOCK_BOOTTIME timestamp at which the camera framework request is
// received by the camera HAL pipeline. Note that this request may wait for
// some time before processing actually begins. See also
// request_processing_started_ns.
optional int64 request_received_ns = 5;
// The CLOCK_BOOTTIME timestamp at which the framework request is accepted for
// processing by the camera HAL pipeline. This is the time at which the
// pipeline actually begins to work on the request.
optional int64 request_processing_started_ns = 6;
// The CLOCK_BOOTTIME timestamp at which the sensor begins its exposure.
optional int64 start_of_exposure_ns = 7;
// The CLOCK_BOOTTIME timestamp corresponding to the sensor start of frame
// event.
optional int64 start_of_frame_ns = 8;
// The CLOCK_BOOTTIME timestamp at which the camera HAL has sent all responses
// for the frame.
optional int64 responses_all_sent_ns = 9;
// The error status, if any, reported to the camera framework. Any status
// other than STATUS_OK indicates a dropped frame.
// Next Enum: 6
enum CaptureResultStatus {
STATUS_UNSPECIFIED = 0;
STATUS_OK = 1;
// Early metadata was returned to the camera framework with an error.
STATUS_EARLY_METADATA_ERROR = 2;
// Final metadata was returned to the camera framework with an error.
STATUS_FINAL_METADATA_ERROR = 3;
// One or more buffers were returned to the camera framework with an error.
STATUS_BUFFER_ERROR = 4;
// The frame was dropped as a result of a flush operation.
STATUS_FLUSH_ERROR = 5;
}
optional CaptureResultStatus capture_result_status = 10;
// The number of sensor frames that were skipped between this frame and the
// previous frame. Under normal operation, this should be zero. Any number
// greater than zero indicates dropped sensor frames.
optional int32 skipped_sensor_frames = 11;
// The value of CONTROL_CAPTURE_INTENT. See:
// https://developer.android.com/reference/android/hardware/camera2/CaptureRequest#CONTROL_CAPTURE_INTENT
optional int32 capture_intent = 12;
// The number of streams in the capture request.
optional int32 num_streams = 13;
// A profiling event corresponding to a single node processing within the camera
// pipeline. Intuitively this corresponds to a single stage of processing to
// produce a camera frame.
// Next ID: 6
message CameraNodeProcessingDetails {
optional int64 node_id = 1;
// The timestamp at which node processing begins to run.
optional int64 start_processing_ns = 2;
// The timestamp at which node processing finishes running.
optional int64 end_processing_ns = 3;
// The delay between inputs becoming ready and the node actually beginning to
// run.
optional int64 scheduling_latency_ns = 4;
}
repeated CameraNodeProcessingDetails node_processing_details = 14;
// These fields capture vendor-specific additions to this proto message. In
// practice `vendor_data` typically contains a serialized message of the
// vendor's design, and `vendor_data_version` is incremented each time there
// is a backwards incompatible change made to the message.
optional int32 vendor_data_version = 15;
optional bytes vendor_data = 16;
}
// A profiling event that may be emitted periodically (i.e., at a slower rate
// than `AndroidCameraFrameEvent`s) to record fixed and aggregated camera
// session-specific values.
message AndroidCameraSessionStats {
// Identifier for the CameraCaptureSession this frame originates from. See:
// https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession
optional uint64 session_id = 1;
// Although vendor implementations may vary, camera pipeline processing is
// typically arranged into a directed graph-like structure. This message is
// used to record that graph.
message CameraGraph {
message CameraNode {
optional int64 node_id = 1;
// A list of inputs consumed by this node.
repeated int64 input_ids = 2;
// A list of outputs produced by this node.
repeated int64 output_ids = 3;
// These fields capture vendor-specific additions to this proto message. In
// practice `vendor_data` typically contains a serialized message of the
// vendor's design, and `vendor_data_version` is incremented each time there
// is a backwards incompatible change made to the message.
optional int32 vendor_data_version = 4;
optional bytes vendor_data = 5;
}
repeated CameraNode nodes = 1;
// An adjacency list describing connections between CameraNodes, mapping
// nodes and their outputs to other nodes that consume them as inputs.
message CameraEdge {
// The pair of IDs identifying the node and output connected by this edge.
optional int64 output_node_id = 1;
optional int64 output_id = 2;
// The pair of IDs identifying the node and input connected by this edge.
optional int64 input_node_id = 3;
optional int64 input_id = 4;
// These fields capture vendor-specific additions to this proto message. In
// practice `vendor_data` typically contains a serialized message of the
// vendor's design, and `vendor_data_version` is incremented each time there
// is a backwards incompatible change made to the message.
optional int32 vendor_data_version = 5;
optional bytes vendor_data = 6;
}
repeated CameraEdge edges = 2;
}
optional CameraGraph graph = 2;
}
// End of protos/perfetto/trace/android/camera_event.proto
// Begin of protos/perfetto/trace/android/frame_timeline_event.proto
// Generated by SurfaceFlinger's FrameTimeline (go/adaptive-scheduling-fr).
// Used in comparing the expected timeline of a frame to the actual timeline.
// Key terms:
// 1) DisplayFrame - represents SurfaceFlinger's work on a frame(composited)
// 2) SurfaceFrame - represents App's work on its frame
// 3) Timeline = start to end of a component's(app/SF) work on a frame.
// SurfaceFlinger composites frames from many apps together, so
// One DisplayFrame can map to N SurfaceFrame(s)
// This relationship can be reconstructed by using
// DisplayFrame.token = SurfaceFrame.display_frame_token
message FrameTimelineEvent {
// Specifies the reason(s) most likely to have caused the jank.
// Used as a bitmask.
enum JankType {
JANK_UNSPECIFIED = 0;
JANK_NONE = 1;
JANK_SF_SCHEDULING = 2;
JANK_PREDICTION_ERROR = 4;
JANK_DISPLAY_HAL = 8;
JANK_SF_CPU_DEADLINE_MISSED = 16;
JANK_SF_GPU_DEADLINE_MISSED = 32;
JANK_APP_DEADLINE_MISSED = 64;
JANK_BUFFER_STUFFING = 128;
JANK_UNKNOWN = 256;
JANK_SF_STUFFING = 512;
JANK_DROPPED = 1024;
};
// Specifies how a frame was presented on screen w.r.t. timing.
// Can be different for SurfaceFrame and DisplayFrame.
enum PresentType {
PRESENT_UNSPECIFIED = 0;
PRESENT_ON_TIME = 1;
PRESENT_LATE = 2;
PRESENT_EARLY = 3;
PRESENT_DROPPED = 4;
PRESENT_UNKNOWN = 5;
};
// Specifies if the predictions for the frame are still valid, expired or
// unknown.
enum PredictionType {
PREDICTION_UNSPECIFIED = 0;
PREDICTION_VALID = 1;
PREDICTION_EXPIRED = 2;
PREDICTION_UNKNOWN = 3;
};
// Indicates the start of expected timeline slice for SurfaceFrames.
message ExpectedSurfaceFrameStart {
// Cookie used to correlate between the start and end messages of the same
// frame. Since all values except the ts are same for start and end, cookie
// helps in preventing redundant data transmission.
// The same cookie is used only by start and end messages of a single frame
// and is otherwise unique.
optional int64 cookie = 1;
// Token received by the app for its work. Can be shared between multiple
// layers of the same app (example: pip mode).
optional int64 token = 2;
// The corresponding DisplayFrame token is required to link the App's work
// with SurfaceFlinger's work. Many SurfaceFrames can be mapped to a single
// DisplayFrame.
// this.display_frame_token = DisplayFrame.token
optional int64 display_frame_token = 3;
// Pid of the app. Used in creating the timeline tracks (and slices) inside
// the respective process track group.
optional int32 pid = 4;
optional string layer_name = 5;
};
// Indicates the start of actual timeline slice for SurfaceFrames. Also
// includes the jank information.
message ActualSurfaceFrameStart {
// Cookie used to correlate between the start and end messages of the same
// frame. Since all values except the ts are same for start and end, cookie
// helps in preventing redundant data transmission.
// The same cookie is used only by start and end messages of a single frame
// and is otherwise unique.
optional int64 cookie = 1;
// Token received by the app for its work. Can be shared between multiple
// layers of the same app (example: pip mode).
optional int64 token = 2;
// The corresponding DisplayFrame token is required to link the App's work
// with SurfaceFlinger's work. Many SurfaceFrames can be mapped to a single
// DisplayFrame.
// this.display_frame_token = DisplayFrame.token
optional int64 display_frame_token = 3;
// Pid of the app. Used in creating the timeline tracks (and slices) inside
// the respective process track group.
optional int32 pid = 4;
optional string layer_name = 5;
optional PresentType present_type = 6;
optional bool on_time_finish = 7;
optional bool gpu_composition = 8;
// A bitmask of JankType. More than one reason can be attributed to a janky
// frame.
optional int32 jank_type = 9;
optional PredictionType prediction_type = 10;
optional bool is_buffer = 11;
};
// Indicates the start of expected timeline slice for DisplayFrames.
message ExpectedDisplayFrameStart {
// Cookie used to correlate between the start and end messages of the same
// frame. Since all values except the ts are same for start and end, cookie
// helps in preventing redundant data transmission.
// The same cookie is used only by start and end messages of a single frame
// and is otherwise unique.
optional int64 cookie = 1;
// Token received by SurfaceFlinger for its work
// this.token = SurfaceFrame.display_frame_token
optional int64 token = 2;
// Pid of SurfaceFlinger. Used in creating the timeline tracks (and slices)
// inside the SurfaceFlinger process group.
optional int32 pid = 3;
};
// Indicates the start of actual timeline slice for DisplayFrames. Also
// includes the jank information.
message ActualDisplayFrameStart {
// Cookie used to correlate between the start and end messages of the same
// frame. Since all values except the ts are same for start and end, cookie
// helps in preventing redundant data transmission.
// The same cookie is used only by start and end messages of a single frame
// and is otherwise unique.
optional int64 cookie = 1;
// Token received by SurfaceFlinger for its work
// this.token = SurfaceFrame.display_frame_token
optional int64 token = 2;
// Pid of SurfaceFlinger. Used in creating the timeline tracks (and slices)
// inside the SurfaceFlinger process group.
optional int32 pid = 3;
optional PresentType present_type = 4;
optional bool on_time_finish = 5;
optional bool gpu_composition = 6;
// A bitmask of JankType. More than one reason can be attributed to a janky
// frame.
optional int32 jank_type = 7;
optional PredictionType prediction_type = 8;
};
// FrameEnd just sends the cookie to indicate that the corresponding
// <display/surface>frame slice's end.
message FrameEnd { optional int64 cookie = 1; };
oneof event {
ExpectedDisplayFrameStart expected_display_frame_start = 1;
ActualDisplayFrameStart actual_display_frame_start = 2;
ExpectedSurfaceFrameStart expected_surface_frame_start = 3;
ActualSurfaceFrameStart actual_surface_frame_start = 4;
FrameEnd frame_end = 5;
}
}
// End of protos/perfetto/trace/android/frame_timeline_event.proto
// Begin of protos/perfetto/trace/android/gpu_mem_event.proto
// Generated by Android's GpuService.
message GpuMemTotalEvent {
optional uint32 gpu_id = 1;
optional uint32 pid = 2;
optional uint64 size = 3;
}
// End of protos/perfetto/trace/android/gpu_mem_event.proto
// Begin of protos/perfetto/trace/android/graphics_frame_event.proto
// Generated by Android's SurfaceFlinger.
message GraphicsFrameEvent {
enum BufferEventType {
UNSPECIFIED = 0;
DEQUEUE = 1;
QUEUE = 2;
POST = 3;
ACQUIRE_FENCE = 4;
LATCH = 5;
// HWC will compose this buffer
HWC_COMPOSITION_QUEUED = 6;
// renderEngine composition
FALLBACK_COMPOSITION = 7;
PRESENT_FENCE = 8;
RELEASE_FENCE = 9;
MODIFY = 10;
DETACH = 11;
ATTACH = 12;
CANCEL = 13;
}
message BufferEvent {
optional uint32 frame_number = 1;
optional BufferEventType type = 2;
optional string layer_name = 3;
// If no duration is set, the event is an instant event.
optional uint64 duration_ns = 4;
// Unique buffer identifier.
optional uint32 buffer_id = 5;
}
optional BufferEvent buffer_event = 1;
}
// End of protos/perfetto/trace/android/graphics_frame_event.proto
// Begin of protos/perfetto/trace/android/initial_display_state.proto
message InitialDisplayState {
// Same values as android.view.Display.STATE_*
optional int32 display_state = 1;
optional double brightness = 2;
}
// End of protos/perfetto/trace/android/initial_display_state.proto
// Begin of protos/perfetto/trace/android/network_trace.proto
enum TrafficDirection {
DIR_UNSPECIFIED = 0;
DIR_INGRESS = 1;
DIR_EGRESS = 2;
}
// NetworkPacketEvent records the details of a single packet sent or received
// on the network (in Linux kernel terminology, one sk_buff struct).
message NetworkPacketEvent {
// The direction traffic is flowing for this event.
optional TrafficDirection direction = 1;
// The name of the interface if available (e.g. 'rmnet0').
optional string interface = 2;
// The length of the packet in bytes (wire_size - L2_header_size). Ignored
// when using NetworkPacketEvent as the ctx in either NetworkPacketBundle or
// NetworkPacketContext.
optional uint32 length = 3;
// The Linux user id associated with the packet's socket.
optional uint32 uid = 4;
// The Android network tag associated with the packet's socket.
optional uint32 tag = 5;
// The packet's IP protocol (TCP=6, UDP=17, etc).
optional uint32 ip_proto = 6;
// The packet's TCP flags as a bitmask (FIN=0x1, SYN=0x2, RST=0x4, etc).
optional uint32 tcp_flags = 7;
// The local udp/tcp port of the packet.
optional uint32 local_port = 8;
// The remote udp/tcp port of the packet.
optional uint32 remote_port = 9;
// The 1-byte ICMP type identifier.
optional uint32 icmp_type = 10;
// The 1-byte ICMP code identifier.
optional uint32 icmp_code = 11;
}
// NetworkPacketBundle bundles one or more packets sharing the same attributes.
message NetworkPacketBundle {
oneof packet_context {
// The intern id for looking up the associated packet context.
uint64 iid = 1;
// The inlined context for events in this bundle.
NetworkPacketEvent ctx = 2;
}
// The timestamp of the i-th packet encoded as the nanoseconds since the
// enclosing TracePacket's timestamp.
repeated uint64 packet_timestamps = 3 [packed = true];
// The length of the i-th packet in bytes (wire_size - L2_header_size).
repeated uint32 packet_lengths = 4 [packed = true];
// Total number of packets in the bundle (when above aggregation_threshold).
optional uint32 total_packets = 5;
// Duration between first and last packet (when above aggregation_threshold).
optional uint64 total_duration = 6;
// Total packet length in bytes (when above aggregation_threshold).
optional uint64 total_length = 7;
}
// An internable packet context.
message NetworkPacketContext {
optional uint64 iid = 1;
optional NetworkPacketEvent ctx = 2;
}
// End of protos/perfetto/trace/android/network_trace.proto
// Begin of protos/perfetto/trace/android/packages_list.proto
message PackagesList {
message PackageInfo {
optional string name = 1;
optional uint64 uid = 2;
optional bool debuggable = 3;
optional bool profileable_from_shell = 4;
optional int64 version_code = 5;
}
repeated PackageInfo packages = 1;
// At least one error occurred parsing the packages.list.
optional bool parse_error = 2;
// Failed to open / read packages.list.
optional bool read_error = 3;
}
// End of protos/perfetto/trace/android/packages_list.proto
// Begin of protos/perfetto/trace/android/shell_transition.proto
// ShellTransition messages record information about the shell transitions in
// the system. This is used to track the animations that are created and execute
// through the shell transition system.
message ShellTransition {
// The unique identifier of the transition.
optional int32 id = 1;
// The time the transition was created on the WM side
// (using SystemClock.elapsedRealtimeNanos())
optional int64 create_time_ns = 2;
// The time the transition was sent from the WM side to shell
// (using SystemClock.elapsedRealtimeNanos())
optional int64 send_time_ns = 3;
// The time the transition was dispatched by shell to execute
// (using SystemClock.elapsedRealtimeNanos())
optional int64 dispatch_time_ns = 4;
// If the transition merge was accepted by the transition handler, this
// contains the time the transition was merged into transition with id
// `merge_target`.
// (using SystemClock.elapsedRealtimeNanos())
optional int64 merge_time_ns = 5;
// The time shell proposed the transition should be merged to the transition
// handler into transition with id `merge_target`.
// (using SystemClock.elapsedRealtimeNanos()).
optional int64 merge_request_time_ns = 6;
// If the transition was aborted on the shell side, this is the time that
// occured.
// (using SystemClock.elapsedRealtimeNanos())
optional int64 shell_abort_time_ns = 7;
// If the transition was aborted on the wm side, this is the time that
// occured.
// (using SystemClock.elapsedRealtimeNanos())
optional int64 wm_abort_time_ns = 8;
// The time WM considers the transition to be complete.
// (using SystemClock.elapsedRealtimeNanos())
optional int64 finish_time_ns = 9;
// The id of the transaction that WM proposed to use as the starting
// transaction. It contains all the layer changes required to setup the
// transition and should be executed right at the start of the transition
// by the transition handler.
optional uint64 start_transaction_id = 10;
// The if of the transaction that WM proposed to use as the finish
// transaction. It contains all the layer changes required to set the final
// state of the transition.
optional uint64 finish_transaction_id = 11;
// The id of the handler that executed the transition. A HandlerMappings
// message in the trace will contain the mapping of id to a string
// representation of the handler.
optional int32 handler = 12;
// The transition type of this transition (e.g. TO_FRONT, OPEN, CLOSE).
optional int32 type = 13;
// The list of targets that are part of this transition.
repeated Target targets = 14;
// The id of the transition we have requested to merge or have merged this
// transition into.
optional int32 merge_target = 15;
// The flags set on this transition.
optional int32 flags = 16;
// The time the starting window was removed. Tracked because this can
// happen after the transition finishes, but the app may not yet be visible
// until the starting window is removed. So in a sense the transition is not
// finished until the starting window is removed. (b/284302118)
// (using SystemClock.elapsedRealtimeNanos())
optional int64 starting_window_remove_time_ns = 17;
// Contains the information about the windows targeted in a transition.
message Target {
// The transition mode of this target (e.g. TO_FRONT, CLOSE...)
optional int32 mode = 1;
// The layer id of this target.
optional int32 layer_id = 2;
// The window id of this target.
optional int32 window_id = 3;
// The flags set on this target.
optional int32 flags = 4;
}
}
// Contains mappings from handler ids to string representation of the handlers.
message ShellHandlerMappings {
repeated ShellHandlerMapping mapping = 1;
}
message ShellHandlerMapping {
// The id of the handler used in the ShellTransition message.
optional int32 id = 1;
// A human readable and meaningful string representation of the handler.
optional string name = 2;
}
// End of protos/perfetto/trace/android/shell_transition.proto
// Begin of protos/perfetto/trace/android/surfaceflinger_common.proto
message RegionProto {
// Previously: uint64 id
reserved 1;
repeated RectProto rect = 2;
}
message RectProto {
optional int32 left = 1;
optional int32 top = 2;
optional int32 right = 3;
optional int32 bottom = 4;
}
message SizeProto {
optional int32 w = 1;
optional int32 h = 2;
}
message TransformProto {
optional float dsdx = 1;
optional float dtdx = 2;
optional float dsdy = 3;
optional float dtdy = 4;
optional int32 type = 5;
}
message ColorProto {
optional float r = 1;
optional float g = 2;
optional float b = 3;
optional float a = 4;
}
message InputWindowInfoProto {
optional uint32 layout_params_flags = 1;
optional int32 layout_params_type = 2;
optional RectProto frame = 3;
optional RegionProto touchable_region = 4;
optional int32 surface_inset = 5;
optional bool visible = 6;
optional bool can_receive_keys = 7 [deprecated = true];
optional bool focusable = 8;
optional bool has_wallpaper = 9;
optional float global_scale_factor = 10;
optional float window_x_scale = 11 [deprecated = true];
optional float window_y_scale = 12 [deprecated = true];
optional int32 crop_layer_id = 13;
optional bool replace_touchable_region_with_crop = 14;
optional RectProto touchable_region_crop = 15;
optional TransformProto transform = 16;
optional uint32 input_config = 17;
}
message BlurRegion {
optional uint32 blur_radius = 1;
optional uint32 corner_radius_tl = 2;
optional uint32 corner_radius_tr = 3;
optional uint32 corner_radius_bl = 4;
optional float corner_radius_br = 5;
optional float alpha = 6;
optional int32 left = 7;
optional int32 top = 8;
optional int32 right = 9;
optional int32 bottom = 10;
}
message ColorTransformProto {
// This will be a 4x4 matrix of float values
repeated float val = 1 [packed = true];
}
// End of protos/perfetto/trace/android/surfaceflinger_common.proto
// Begin of protos/perfetto/trace/android/surfaceflinger_layers.proto
// Message used by Winscope to process legacy trace files.
// Represents a file full of surface flinger trace entries.
// Encoded, it should start with 0x4c 0x59 0x52 0x54 0x52 0x41 0x43 0x45
// (.LYRTRACE), such that they can be easily identified.
message LayersTraceFileProto {
// constant; MAGIC_NUMBER = (long) MAGIC_NUMBER_H << 32 |
// MagicNumber.MAGIC_NUMBER_L (this is needed because enums have to be 32 bits
// and there's no nice way to put 64bit constants into .proto files.
enum MagicNumber {
INVALID = 0;
// LYRT (little-endian ASCII)
MAGIC_NUMBER_L = 0x5452594c;
// RACE (little-endian ASCII)
MAGIC_NUMBER_H = 0x45434152;
}
// Must be the first field, set to value in MagicNumber
optional fixed64 magic_number = 1;
repeated LayersSnapshotProto entry = 2;
// Offset between real-time clock and elapsed time clock in nanoseconds.
// Calculated as: systemTime(SYSTEM_TIME_REALTIME) -
// systemTime(SYSTEM_TIME_MONOTONIC)
optional fixed64 real_to_elapsed_time_offset_nanos = 3;
}
message LayersSnapshotProto {
// elapsed realtime in nanos since boot of when this entry was logged
optional sfixed64 elapsed_realtime_nanos = 1;
// where the trace originated
optional string where = 2;
optional LayersProto layers = 3;
// Blob for the current HWC information for all layers, reported by dumpsys.
optional string hwc_blob = 4;
// Excludes state sent during composition like visible region and composition
// type.
optional bool excludes_composition_state = 5;
// Number of missed entries since the last entry was recorded.
optional uint32 missed_entries = 6;
repeated DisplayProto displays = 7;
optional int64 vsync_id = 8;
}
// Contains a list of all layers.
message LayersProto {
repeated LayerProto layers = 1;
}
message DisplayProto {
optional uint64 id = 1;
optional string name = 2;
optional uint32 layer_stack = 3;
optional SizeProto size = 4;
optional RectProto layer_stack_space_rect = 5;
optional TransformProto transform = 6;
optional bool is_virtual = 7;
optional double dpi_x = 8;
optional double dpi_y = 9;
}
// Must match definition in the IComposerClient HAL
enum HwcCompositionType {
// Invalid composition type
HWC_TYPE_UNSPECIFIED = 0;
// Layer was composited by the client into the client target buffer
HWC_TYPE_CLIENT = 1;
// Layer was composited by the device through hardware overlays
HWC_TYPE_DEVICE = 2;
// Layer was composited by the device using a color
HWC_TYPE_SOLID_COLOR = 3;
// Similar to DEVICE, but the layer position may have been asynchronously set
// through setCursorPosition
HWC_TYPE_CURSOR = 4;
// Layer was composited by the device via a sideband stream.
HWC_TYPE_SIDEBAND = 5;
}
// Information about each layer.
message LayerProto {
// unique id per layer.
optional int32 id = 1;
// unique name per layer.
optional string name = 2;
// list of children this layer may have. May be empty.
repeated int32 children = 3 [packed = true];
// list of layers that are z order relative to this layer.
repeated int32 relatives = 4 [packed = true];
// The type of layer, ex Color, Layer
optional string type = 5;
optional RegionProto transparent_region = 6;
optional RegionProto visible_region = 7;
optional RegionProto damage_region = 8;
optional uint32 layer_stack = 9;
// The layer's z order. Can be z order in layer stack, relative to parent,
// or relative to another layer specified in zOrderRelative.
optional int32 z = 10;
// The layer's position on the display.
optional PositionProto position = 11;
// The layer's requested position.
optional PositionProto requested_position = 12;
// The layer's size.
optional SizeProto size = 13;
// The layer's crop in its own bounds.
optional RectProto crop = 14;
// The layer's crop in its parent's bounds.
optional RectProto final_crop = 15 [deprecated = true];
optional bool is_opaque = 16;
optional bool invalidate = 17;
optional string dataspace = 18;
optional string pixel_format = 19;
// The layer's actual color.
optional ColorProto color = 20;
// The layer's requested color.
optional ColorProto requested_color = 21;
// Can be any combination of
// hidden = 0x01
// opaque = 0x02,
// secure = 0x80,
optional uint32 flags = 22;
// The layer's actual transform
optional TransformProto transform = 23;
// The layer's requested transform.
optional TransformProto requested_transform = 24;
// The parent layer. This value can be null if there is no parent.
optional int32 parent = 25;
// The layer that this layer has a z order relative to. This value can be
// null.
optional int32 z_order_relative_of = 26;
// This value can be null if there's nothing to draw.
optional ActiveBufferProto active_buffer = 27;
// The number of frames available.
optional int32 queued_frames = 28;
optional bool refresh_pending = 29;
// The layer's composer backend destination frame
optional RectProto hwc_frame = 30;
// The layer's composer backend source crop
optional FloatRectProto hwc_crop = 31;
// The layer's composer backend transform
optional int32 hwc_transform = 32;
optional int32 window_type = 33 [deprecated = true];
optional int32 app_id = 34 [deprecated = true];
// The layer's composition type
optional HwcCompositionType hwc_composition_type = 35;
// If it's a buffer layer, indicate if the content is protected
optional bool is_protected = 36;
// Current frame number being rendered.
optional uint64 curr_frame = 37;
// A list of barriers that the layer is waiting to update state.
repeated BarrierLayerProto barrier_layer = 38;
// If active_buffer is not null, record its transform.
optional TransformProto buffer_transform = 39;
optional int32 effective_scaling_mode = 40;
// Layer's corner radius.
optional float corner_radius = 41;
// Metadata map. May be empty.
map<int32, string> metadata = 42;
optional TransformProto effective_transform = 43;
optional FloatRectProto source_bounds = 44;
optional FloatRectProto bounds = 45;
optional FloatRectProto screen_bounds = 46;
optional InputWindowInfoProto input_window_info = 47;
// Crop used to draw the rounded corner.
optional FloatRectProto corner_radius_crop = 48;
// length of the shadow to draw around the layer, it may be set on the
// layer or set by a parent layer.
optional float shadow_radius = 49;
optional ColorTransformProto color_transform = 50;
optional bool is_relative_of = 51;
// Layer's background blur radius in pixels.
optional int32 background_blur_radius = 52;
optional uint32 owner_uid = 53;
// Regions of a layer, where blur should be applied.
repeated BlurRegion blur_regions = 54;
optional bool is_trusted_overlay = 55;
// Corner radius explicitly set on layer rather than inherited
optional float requested_corner_radius = 56;
optional RectProto destination_frame = 57;
optional uint32 original_id = 58;
}
message PositionProto {
optional float x = 1;
optional float y = 2;
}
message FloatRectProto {
optional float left = 1;
optional float top = 2;
optional float right = 3;
optional float bottom = 4;
}
message ActiveBufferProto {
optional uint32 width = 1;
optional uint32 height = 2;
optional uint32 stride = 3;
optional int32 format = 4;
optional uint64 usage = 5;
}
message BarrierLayerProto {
// layer id the barrier is waiting on.
optional int32 id = 1;
// frame number the barrier is waiting on.
optional uint64 frame_number = 2;
}
// End of protos/perfetto/trace/android/surfaceflinger_layers.proto
// Begin of protos/perfetto/trace/android/surfaceflinger_transactions.proto
// Message used by Winscope to process legacy trace files.
// Represents a file full of surface flinger transactions.
// Encoded, it should start with 0x54 0x4E 0x58 0x54 0x52 0x41 0x43 0x45
// (.TNXTRACE), such that they can be easily identified.
message TransactionTraceFile {
// constant; MAGIC_NUMBER = (long) MAGIC_NUMBER_H << 32 |
// MagicNumber.MAGIC_NUMBER_L (this is needed because enums have to be 32 bits
// and there's no nice way to put 64bit constants into .proto files.
enum MagicNumber {
INVALID = 0;
// TNXT (little-endian ASCII)
MAGIC_NUMBER_L = 0x54584E54;
// RACE (little-endian ASCII)
MAGIC_NUMBER_H = 0x45434152;
}
// Must be the first field, set to value in MagicNumber
optional fixed64 magic_number = 1;
repeated TransactionTraceEntry entry = 2;
// offset between real-time clock and elapsed time clock in nanoseconds.
// Calculated as: systemTime(SYSTEM_TIME_REALTIME) -
// systemTime(SYSTEM_TIME_MONOTONIC)
optional fixed64 real_to_elapsed_time_offset_nanos = 3;
optional uint32 version = 4;
}
message TransactionTraceEntry {
optional int64 elapsed_realtime_nanos = 1;
optional int64 vsync_id = 2;
repeated TransactionState transactions = 3;
repeated LayerCreationArgs added_layers = 4;
repeated uint32 destroyed_layers = 5;
repeated DisplayState added_displays = 6;
repeated int32 removed_displays = 7;
repeated uint32 destroyed_layer_handles = 8;
optional bool displays_changed = 9;
repeated DisplayInfo displays = 10;
}
message DisplayInfo {
optional uint32 layer_stack = 1;
optional int32 display_id = 2;
optional int32 logical_width = 3;
optional int32 logical_height = 4;
optional Transform transform_inverse = 5;
optional Transform transform = 6;
optional bool receives_input = 7;
optional bool is_secure = 8;
optional bool is_primary = 9;
optional bool is_virtual = 10;
optional int32 rotation_flags = 11;
optional int32 transform_hint = 12;
}
message LayerCreationArgs {
optional uint32 layer_id = 1;
optional string name = 2;
optional uint32 flags = 3;
optional uint32 parent_id = 4;
optional uint32 mirror_from_id = 5;
optional bool add_to_root = 6;
optional uint32 layer_stack_to_mirror = 7;
}
message Transform {
optional float dsdx = 1;
optional float dtdx = 2;
optional float dtdy = 3;
optional float dsdy = 4;
optional float tx = 5;
optional float ty = 6;
}
message TransactionState {
optional int32 pid = 1;
optional int32 uid = 2;
optional int64 vsync_id = 3;
optional int32 input_event_id = 4;
optional int64 post_time = 5;
optional uint64 transaction_id = 6;
repeated LayerState layer_changes = 7;
repeated DisplayState display_changes = 8;
repeated uint64 merged_transaction_ids = 9;
}
// Keep insync with layer_state_t
message LayerState {
optional uint32 layer_id = 1;
// Changes are split into ChangesLsb and ChangesMsb. First 32 bits are in
// ChangesLsb and the next 32 bits are in ChangesMsb. This is needed because
// enums have to be 32 bits and there's no nice way to put 64bit constants
// into .proto files.
enum ChangesLsb {
eChangesLsbNone = 0;
ePositionChanged = 0x00000001;
eLayerChanged = 0x00000002;
// unused = 0x00000004;
eAlphaChanged = 0x00000008;
eMatrixChanged = 0x00000010;
eTransparentRegionChanged = 0x00000020;
eFlagsChanged = 0x00000040;
eLayerStackChanged = 0x00000080;
eReleaseBufferListenerChanged = 0x00000400;
eShadowRadiusChanged = 0x00000800;
eBufferCropChanged = 0x00002000;
eRelativeLayerChanged = 0x00004000;
eReparent = 0x00008000;
eColorChanged = 0x00010000;
eBufferTransformChanged = 0x00040000;
eTransformToDisplayInverseChanged = 0x00080000;
eCropChanged = 0x00100000;
eBufferChanged = 0x00200000;
eAcquireFenceChanged = 0x00400000;
eDataspaceChanged = 0x00800000;
eHdrMetadataChanged = 0x01000000;
eSurfaceDamageRegionChanged = 0x02000000;
eApiChanged = 0x04000000;
eSidebandStreamChanged = 0x08000000;
eColorTransformChanged = 0x10000000;
eHasListenerCallbacksChanged = 0x20000000;
eInputInfoChanged = 0x40000000;
// 0x80000000; (proto stores enums as signed int)
eCornerRadiusChanged = -2147483648;
};
enum ChangesMsb {
eChangesMsbNone = 0;
eDestinationFrameChanged = 0x1;
eCachedBufferChanged = 0x2;
eBackgroundColorChanged = 0x4;
eMetadataChanged = 0x8;
eColorSpaceAgnosticChanged = 0x10;
eFrameRateSelectionPriority = 0x20;
eFrameRateChanged = 0x40;
eBackgroundBlurRadiusChanged = 0x80;
eProducerDisconnect = 0x100;
eFixedTransformHintChanged = 0x200;
eFrameNumberChanged = 0x400;
eBlurRegionsChanged = 0x800;
eAutoRefreshChanged = 0x1000;
eStretchChanged = 0x2000;
eTrustedOverlayChanged = 0x4000;
eDropInputModeChanged = 0x8000;
};
optional uint64 what = 2;
optional float x = 3;
optional float y = 4;
optional int32 z = 5;
optional uint32 w = 6;
optional uint32 h = 7;
optional uint32 layer_stack = 8;
enum Flags {
eFlagsNone = 0;
eLayerHidden = 0x01;
eLayerOpaque = 0x02;
eLayerSkipScreenshot = 0x40;
eLayerSecure = 0x80;
eEnableBackpressure = 0x100;
eLayerIsDisplayDecoration = 0x200;
};
optional uint32 flags = 9;
optional uint32 mask = 10;
message Matrix22 {
optional float dsdx = 1;
optional float dtdx = 2;
optional float dtdy = 3;
optional float dsdy = 4;
};
optional Matrix22 matrix = 11;
optional float corner_radius = 12;
optional uint32 background_blur_radius = 13;
optional uint32 parent_id = 14;
optional uint32 relative_parent_id = 15;
optional float alpha = 16;
message Color3 {
optional float r = 1;
optional float g = 2;
optional float b = 3;
}
optional Color3 color = 17;
optional RegionProto transparent_region = 18;
optional uint32 transform = 19;
optional bool transform_to_display_inverse = 20;
optional RectProto crop = 21;
message BufferData {
optional uint64 buffer_id = 1;
optional uint32 width = 2;
optional uint32 height = 3;
optional uint64 frame_number = 4;
enum BufferDataChange {
BufferDataChangeNone = 0;
fenceChanged = 0x01;
frameNumberChanged = 0x02;
cachedBufferChanged = 0x04;
}
optional uint32 flags = 5;
optional uint64 cached_buffer_id = 6;
enum PixelFormat {
PIXEL_FORMAT_UNKNOWN = 0;
PIXEL_FORMAT_CUSTOM = -4;
PIXEL_FORMAT_TRANSLUCENT = -3;
PIXEL_FORMAT_TRANSPARENT = -2;
PIXEL_FORMAT_OPAQUE = -1;
PIXEL_FORMAT_RGBA_8888 = 1;
PIXEL_FORMAT_RGBX_8888 = 2;
PIXEL_FORMAT_RGB_888 = 3;
PIXEL_FORMAT_RGB_565 = 4;
PIXEL_FORMAT_BGRA_8888 = 5;
PIXEL_FORMAT_RGBA_5551 = 6;
PIXEL_FORMAT_RGBA_4444 = 7;
PIXEL_FORMAT_RGBA_FP16 = 22;
PIXEL_FORMAT_RGBA_1010102 = 43;
PIXEL_FORMAT_R_8 = 0x38;
}
optional PixelFormat pixel_format = 7;
optional uint64 usage = 8;
}
optional BufferData buffer_data = 22;
optional int32 api = 23;
optional bool has_sideband_stream = 24;
optional ColorTransformProto color_transform = 25;
repeated BlurRegion blur_regions = 26;
message WindowInfo {
optional uint32 layout_params_flags = 1;
optional int32 layout_params_type = 2;
optional RegionProto touchable_region = 3;
optional int32 surface_inset = 4;
// unused
optional bool focusable = 5;
// unused
optional bool has_wallpaper = 6;
optional float global_scale_factor = 7;
optional uint32 crop_layer_id = 8;
optional bool replace_touchable_region_with_crop = 9;
optional RectProto touchable_region_crop = 10;
optional Transform transform = 11;
optional uint32 input_config = 12;
}
optional WindowInfo window_info_handle = 27;
optional float bg_color_alpha = 28;
optional int32 bg_color_dataspace = 29;
optional bool color_space_agnostic = 30;
optional float shadow_radius = 31;
optional int32 frame_rate_selection_priority = 32;
optional float frame_rate = 33;
optional int32 frame_rate_compatibility = 34;
optional int32 change_frame_rate_strategy = 35;
optional uint32 fixed_transform_hint = 36;
optional uint64 frame_number = 37;
optional bool auto_refresh = 38;
optional bool is_trusted_overlay = 39;
optional RectProto buffer_crop = 40;
optional RectProto destination_frame = 41;
enum DropInputMode {
NONE = 0;
ALL = 1;
OBSCURED = 2;
};
optional DropInputMode drop_input_mode = 42;
}
message DisplayState {
enum Changes {
eChangesNone = 0;
eSurfaceChanged = 0x01;
eLayerStackChanged = 0x02;
eDisplayProjectionChanged = 0x04;
eDisplaySizeChanged = 0x08;
eFlagsChanged = 0x10;
};
optional int32 id = 1;
optional uint32 what = 2;
optional uint32 flags = 3;
optional uint32 layer_stack = 4;
optional uint32 orientation = 5;
optional RectProto layer_stack_space_rect = 6;
optional RectProto oriented_display_space_rect = 7;
optional uint32 width = 8;
optional uint32 height = 9;
}
// End of protos/perfetto/trace/android/surfaceflinger_transactions.proto
// Begin of protos/perfetto/trace/chrome/chrome_benchmark_metadata.proto
// This message is not intended to be written by the chrome on the device.
// It's emitted on the host by the telemetry benchmark infrastructure (it's a
// part of the trace that's written by the telemetry tracing agent).
message ChromeBenchmarkMetadata {
// Time when the benchmark execution started (host unixtime in microseconds).
optional int64 benchmark_start_time_us = 1;
// Time when this particular story was run (host unixtime in microseconds).
optional int64 story_run_time_us = 2;
// Name of benchmark.
optional string benchmark_name = 3;
// Description of benchmark.
optional string benchmark_description = 4;
// Optional label.
optional string label = 5;
// Name of story.
optional string story_name = 6;
// List of story tags.
repeated string story_tags = 7;
// Index of the story run (>0 if the same story was run several times).
optional int32 story_run_index = 8;
// Whether this run failed.
optional bool had_failures = 9;
}
// End of protos/perfetto/trace/chrome/chrome_benchmark_metadata.proto
// Begin of protos/perfetto/trace/chrome/chrome_metadata.proto
// Metadata for chrome traces.
message ChromeMetadataPacket {
optional BackgroundTracingMetadata background_tracing_metadata = 1;
// Version code of Chrome used by Android's Play Store. This field is only set
// on Android.
optional int32 chrome_version_code = 2;
// Comma separated list of enabled categories for tracing. The list of
// possible category strings are listed in code
// base/trace_event/builtin_categories.h.
optional string enabled_categories = 3;
}
// Metadata related to background tracing scenarios, states and triggers.
message BackgroundTracingMetadata {
// Information about a trigger rule defined in the experiment config.
message TriggerRule {
enum TriggerType {
TRIGGER_UNSPECIFIED = 0;
// Traces are triggered by specific range of values of an UMA histogram.
MONITOR_AND_DUMP_WHEN_SPECIFIC_HISTOGRAM_AND_VALUE = 1;
// Traces are triggered by specific named events in chromium codebase,
// like "second-update-failure".
MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED = 2;
}
optional TriggerType trigger_type = 1;
// Configuration of histogram trigger.
message HistogramRule {
// UMA histogram name hash, same as HistogramEventProto.name_hash.
optional fixed64 histogram_name_hash = 1;
// Range of values of the histogram that activates trigger.
optional int64 histogram_min_trigger = 2;
optional int64 histogram_max_trigger = 3;
}
optional HistogramRule histogram_rule = 2;
// Configuration of named trigger.
message NamedRule {
enum EventType {
UNSPECIFIED = 0;
SESSION_RESTORE = 1;
NAVIGATION = 2;
STARTUP = 3;
REACHED_CODE = 4;
CONTENT_TRIGGER = 5;
TEST_RULE = 1000;
}
optional EventType event_type = 1;
// If |event_type| is CONTENT_TRIGGER, then this stores the hash of the
// content-trigger that actually fired.
optional fixed64 content_trigger_name_hash = 2;
}
optional NamedRule named_rule = 3;
// Hash of the rule name.
optional fixed32 name_hash = 4;
}
// Specifies the rule that caused the trace to be uploaded.
optional TriggerRule triggered_rule = 1;
// List of all active triggers in current session, when trace was triggered.
repeated TriggerRule active_rules = 2;
// Hash of the scenario name.
optional fixed32 scenario_name_hash = 3;
}
// End of protos/perfetto/trace/chrome/chrome_metadata.proto
// Begin of protos/perfetto/trace/chrome/chrome_trace_event.proto
message ChromeTracedValue {
enum NestedType {
DICT = 0;
ARRAY = 1;
}
optional NestedType nested_type = 1;
repeated string dict_keys = 2;
repeated ChromeTracedValue dict_values = 3;
repeated ChromeTracedValue array_values = 4;
optional int32 int_value = 5;
optional double double_value = 6;
optional bool bool_value = 7;
optional string string_value = 8;
}
message ChromeStringTableEntry {
optional string value = 1;
optional int32 index = 2;
}
// Deprecated, use TrackEvent protos instead.
message ChromeTraceEvent {
message Arg {
optional string name = 1;
oneof value {
bool bool_value = 2;
uint64 uint_value = 3;
int64 int_value = 4;
double double_value = 5;
string string_value = 6;
// Pointers are stored in a separate type as the JSON output treats them
// differently from other uint64 values.
uint64 pointer_value = 7;
string json_value = 8;
ChromeTracedValue traced_value = 10;
}
// Takes precedence over |name| if set,
// and is an index into |string_table|.
optional uint32 name_index = 9;
}
optional string name = 1;
optional int64 timestamp = 2;
optional int32 phase = 3;
optional int32 thread_id = 4;
optional int64 duration = 5;
optional int64 thread_duration = 6;
optional string scope = 7;
optional uint64 id = 8;
optional uint32 flags = 9;
optional string category_group_name = 10;
optional int32 process_id = 11;
optional int64 thread_timestamp = 12;
optional uint64 bind_id = 13;
repeated Arg args = 14;
// Takes precedence over respectively |name| and
// |category_group_name_index| if set,
// and are indices into |string_table|.
optional uint32 name_index = 15;
optional uint32 category_group_name_index = 16;
}
message ChromeMetadata {
optional string name = 1;
oneof value {
string string_value = 2;
bool bool_value = 3;
int64 int_value = 4;
string json_value = 5;
}
}
// Subtraces produced in legacy json format by Chrome tracing agents not yet
// updated to support the new binary format, e.g. ETW and CrOS ARC.
// TODO(eseckler): Update these agents to become perfetto producers.
message ChromeLegacyJsonTrace {
enum TraceType {
USER_TRACE = 0;
// Deprecated.
SYSTEM_TRACE = 1;
}
optional TraceType type = 1;
optional string data = 2;
}
message ChromeEventBundle {
// Deprecated, use TrackEvent protos instead.
repeated ChromeTraceEvent trace_events = 1 [deprecated = true];
// TODO(ssid): This should be deprecated in favor of ChromeMetadataPacket
// which contains typed fields.
repeated ChromeMetadata metadata = 2;
// ftrace output from CrOS and Cast system tracing agents.
// TODO(eseckler): Replace system traces with native perfetto service.
repeated string legacy_ftrace_output = 4;
repeated ChromeLegacyJsonTrace legacy_json_trace = 5;
// Contents of a string table that's valid for
// the whole ChromeEventBundle entry.
repeated ChromeStringTableEntry string_table = 3 [deprecated = true];
}
// End of protos/perfetto/trace/chrome/chrome_trace_event.proto
// Begin of protos/perfetto/trace/clock_snapshot.proto
// A snapshot of clock readings to allow for trace alignment.
message ClockSnapshot {
message Clock {
// DEPRECATED. This enum has moved to ../common/builtin_clock.proto.
enum BuiltinClocks {
UNKNOWN = 0;
REALTIME = 1;
REALTIME_COARSE = 2;
MONOTONIC = 3;
MONOTONIC_COARSE = 4;
MONOTONIC_RAW = 5;
BOOTTIME = 6;
BUILTIN_CLOCK_MAX_ID = 63;
reserved 7, 8;
}
// Clock IDs have the following semantic:
// [1, 63]: Builtin types, see BuiltinClock from
// ../common/builtin_clock.proto.
// [64, 127]: User-defined clocks. These clocks are sequence-scoped. They
// are only valid within the same |trusted_packet_sequence_id|
// (i.e. only for TracePacket(s) emitted by the same TraceWriter
// that emitted the clock snapshot).
// [128, MAX]: Reserved for future use. The idea is to allow global clock
// IDs and setting this ID to hash(full_clock_name) & ~127.
optional uint32 clock_id = 1;
// Absolute timestamp. Unit is ns unless specified otherwise by the
// unit_multiplier_ns field below.
optional uint64 timestamp = 2;
// When true each TracePacket's timestamp should be interpreted as a delta
// from the last TracePacket's timestamp (referencing this clock) emitted by
// the same packet_sequence_id. Should only be used for user-defined
// sequence-local clocks. The first packet timestamp after each
// ClockSnapshot that contains this clock is relative to the |timestamp| in
// the ClockSnapshot.
optional bool is_incremental = 3;
// Allows to specify a custom unit different than the default (ns) for this
// clock domain. A multiplier of 1000 means that a timestamp = 3 should be
// interpreted as 3000 ns = 3 us. All snapshots for the same clock within a
// trace need to use the same unit.
optional uint64 unit_multiplier_ns = 4;
}
repeated Clock clocks = 1;
// The authoritative clock domain for the trace. Defaults to BOOTTIME, but can
// be overridden in TraceConfig's builtin_data_sources. Trace processor will
// attempt to translate packet/event timestamps from various data sources (and
// their chosen clock domains) to this domain during import.
optional BuiltinClock primary_trace_clock = 2;
}
// End of protos/perfetto/trace/clock_snapshot.proto
// Begin of protos/perfetto/trace/etw/etw.proto
// Proto definition based on the Thread_v2 CSwitch class definition
// See: https://learn.microsoft.com/en-us/windows/win32/etw/cswitch
message CSwitchEtwEvent {
// New thread ID after the switch.
optional uint32 new_thread_id = 1;
// Previous thread ID.
optional uint32 old_thread_id = 2;
// Thread priority of the new thread.
optional sint32 new_thread_priority = 3;
// Thread priority of the previous thread.
optional sint32 old_thread_priority = 4;
// The index of the C-state that was last used by the processor. A value of 0
// represents the lightest idle state with higher values representing deeper
// C-states.
optional uint32 previous_c_state = 5;
// Wait reason for the previous thread. The ordering is important as based on
// the OldThreadWaitReason definition from the link above. The following are
// the possible values:
enum OldThreadWaitReason {
EXECUTIVE = 0;
FREE_PAGE = 1;
PAGE_IN = 2;
POOL_ALLOCATION = 3;
DELAY_EXECUTION = 4;
SUSPEND = 5;
USER_REQUEST = 6;
WR_EXECUTIVE = 7;
WR_FREE_PAGE = 8;
WR_PAGE_IN = 9;
WR_POOL_ALLOCATION = 10;
WR_DELAY_EXECUTION = 11;
WR_SUSPENDED = 12;
WR_USER_REQUEST = 13;
WR_EVENT_PAIR = 14;
WR_QUEUE = 15;
WR_LPC_RECEIVER = 16;
WR_LPC_REPLY = 17;
WR_VIRTUAL_MEMORY = 18;
WR_PAGE_OUT = 19;
WR_RENDEZ_VOUS = 20;
WR_KEYED_EVENT = 21;
WR_TERMINATED = 22;
WR_PROCESS_IN_SWAP = 23;
WR_CPU_RATE_CONTROL = 24;
WR_CALLOUT_STACK = 25;
WR_KERNEL = 26;
WR_RESOURCE = 27;
WR_PUSH_LOCK = 28;
WR_MUTEX = 29;
WR_QUANTUM_END = 30;
WR_DISPATCH_INT = 31;
WR_PREEMPTED = 32;
WR_YIELD_EXECUTION = 33;
WR_FAST_MUTEX = 34;
WR_GUARD_MUTEX = 35;
WR_RUNDOWN = 36;
MAXIMUM_WAIT_REASON = 37;
}
optional OldThreadWaitReason old_thread_wait_reason = 6;
// Wait mode for the previous thread. The ordering is important as based on
// the OldThreadWaitMode definition from the link above. The following are the
// possible values:
enum OldThreadWaitMode {
KERNEL_MODE = 0;
USER_MODE = 1;
}
optional OldThreadWaitMode old_thread_wait_mode = 7;
// State of the previous thread. The ordering is important as based on the
// OldThreadState definition from the link above. The following are the
// possible state values:
enum OldThreadState {
INITIALIZED = 0;
READY = 1;
RUNNING = 2;
STANDBY = 3;
TERMINATED = 4;
WAITING = 5;
TRANSITION = 6;
DEFERRED_READY = 7;
}
optional OldThreadState old_thread_state = 8;
// Ideal wait time of the previous thread.
optional sint32 old_thread_wait_ideal_processor = 9;
// Wait time for the new thread.
optional uint32 new_thread_wait_time = 10;
}
// Proto definition based on the Thread_v2 CSwitch class definition
// See: https://learn.microsoft.com/en-us/windows/win32/etw/readythread
message ReadyThreadEtwEvent {
// The thread identifier of the thread being readied for execution.
optional uint32 t_thread_id = 1;
// The reason for the priority boost. The ordering is important as based on
// the AdjustReason definition from the link above.
enum AdjustReason {
IGNORE_THE_INCREMENT = 0;
// Apply the increment, which will decay incrementally at the end of each
// quantum.
APPLY_INCREMENT = 1;
// Apply the increment as a boost that will decay in its entirety at quantum
// (typically for priority donation).
APPLY_INCREMENT_BOOST = 2;
}
optional AdjustReason adjust_reason = 2;
// The value by which the priority is being adjusted.
optional sint32 adjust_increment = 3;
enum TraceFlag {
TRACE_FLAG_UNSPECIFIED = 0;
// The thread has been readied from DPC (deferred procedure call).
THREAD_READIED = 0x1;
// The kernel stack is currently swapped out.
KERNEL_STACK_SWAPPED_OUT = 0x2;
// The process address space is swapped out.
PROCESS_ADDRESS_SWAPPED_OUT = 0x4;
}
optional TraceFlag flag = 4;
}
// End of protos/perfetto/trace/etw/etw.proto
// Begin of protos/perfetto/trace/etw/etw_event.proto
message EtwTraceEvent {
optional uint64 timestamp = 1;
oneof event {
CSwitchEtwEvent c_switch = 2;
ReadyThreadEtwEvent ready_thread = 3;
}
}
// End of protos/perfetto/trace/etw/etw_event.proto
// Begin of protos/perfetto/trace/etw/etw_event_bundle.proto
// The result of tracing one or more etw event uses per-processor buffers where
// an in-use buffer is assigned to each processor at all times. Therefore,
// collecting multiple events they should already be synchronized.
message EtwTraceEventBundle {
optional uint32 cpu = 1;
repeated EtwTraceEvent event = 2;
}
// End of protos/perfetto/trace/etw/etw_event_bundle.proto
// Begin of protos/perfetto/common/descriptor.proto
// The protocol compiler can output a FileDescriptorSet containing the .proto
// files it parses.
message FileDescriptorSet {
repeated FileDescriptorProto file = 1;
}
// Describes a complete .proto file.
message FileDescriptorProto {
// file name, relative to root of source tree
optional string name = 1;
// e.g. "foo", "foo.bar", etc.
optional string package = 2;
// Names of files imported by this file.
repeated string dependency = 3;
// Indexes of the public imported files in the dependency list above.
repeated int32 public_dependency = 10;
// Indexes of the weak imported files in the dependency list.
// For Google-internal migration only. Do not use.
repeated int32 weak_dependency = 11;
// All top-level definitions in this file.
repeated DescriptorProto message_type = 4;
repeated EnumDescriptorProto enum_type = 5;
repeated FieldDescriptorProto extension = 7;
reserved 6;
reserved 8;
reserved 9;
reserved 12;
}
// Describes a message type.
message DescriptorProto {
optional string name = 1;
repeated FieldDescriptorProto field = 2;
repeated FieldDescriptorProto extension = 6;
repeated DescriptorProto nested_type = 3;
repeated EnumDescriptorProto enum_type = 4;
reserved 5;
repeated OneofDescriptorProto oneof_decl = 8;
reserved 7;
// Range of reserved tag numbers. Reserved tag numbers may not be used by
// fields or extension ranges in the same message. Reserved ranges may
// not overlap.
message ReservedRange {
// Inclusive.
optional int32 start = 1;
// Exclusive.
optional int32 end = 2;
}
repeated ReservedRange reserved_range = 9;
// Reserved field names, which may not be used by fields in the same message.
// A given name may only be reserved once.
repeated string reserved_name = 10;
}
// A message representing a option the parser does not recognize. This only
// appears in options protos created by the compiler::Parser class.
// DescriptorPool resolves these when building Descriptor objects. Therefore,
// options protos in descriptor objects (e.g. returned by Descriptor::options(),
// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
// in them.
message UninterpretedOption {
// The name of the uninterpreted option. Each string represents a segment in
// a dot-separated name. is_extension is true iff a segment represents an
// extension (denoted with parentheses in options specs in .proto files).
// E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents
// "foo.(bar.baz).moo".
message NamePart {
optional string name_part = 1;
optional bool is_extension = 2;
}
repeated NamePart name = 2;
// The value of the uninterpreted option, in whatever type the tokenizer
// identified it as during parsing. Exactly one of these should be set.
optional string identifier_value = 3;
optional uint64 positive_int_value = 4;
optional int64 negative_int_value = 5;
optional double double_value = 6;
optional bytes string_value = 7;
optional string aggregate_value = 8;
}
message FieldOptions {
// The packed option can be enabled for repeated primitive fields to enable
// a more efficient representation on the wire. Rather than repeatedly
// writing the tag and type for each element, the entire array is encoded as
// a single length-delimited blob. In proto3, only explicit setting it to
// false will avoid using packed encoding.
optional bool packed = 2;
// The parser stores options it doesn't recognize here. See above.
repeated UninterpretedOption uninterpreted_option = 999;
}
// Describes a field within a message.
message FieldDescriptorProto {
enum Type {
// 0 is reserved for errors.
// Order is weird for historical reasons.
TYPE_DOUBLE = 1;
TYPE_FLOAT = 2;
// Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if
// negative values are likely.
TYPE_INT64 = 3;
TYPE_UINT64 = 4;
// Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if
// negative values are likely.
TYPE_INT32 = 5;
TYPE_FIXED64 = 6;
TYPE_FIXED32 = 7;
TYPE_BOOL = 8;
TYPE_STRING = 9;
// Tag-delimited aggregate.
// Group type is deprecated and not supported in proto3. However, Proto3
// implementations should still be able to parse the group wire format and
// treat group fields as unknown fields.
TYPE_GROUP = 10;
// Length-delimited aggregate.
TYPE_MESSAGE = 11;
// New in version 2.
TYPE_BYTES = 12;
TYPE_UINT32 = 13;
TYPE_ENUM = 14;
TYPE_SFIXED32 = 15;
TYPE_SFIXED64 = 16;
// Uses ZigZag encoding.
TYPE_SINT32 = 17;
// Uses ZigZag encoding.
TYPE_SINT64 = 18;
};
enum Label {
// 0 is reserved for errors
LABEL_OPTIONAL = 1;
LABEL_REQUIRED = 2;
LABEL_REPEATED = 3;
};
optional string name = 1;
optional int32 number = 3;
optional Label label = 4;
// If type_name is set, this need not be set. If both this and type_name
// are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
optional Type type = 5;
// For message and enum types, this is the name of the type. If the name
// starts with a '.', it is fully-qualified. Otherwise, C++-like scoping
// rules are used to find the type (i.e. first the nested types within this
// message are searched, then within the parent, on up to the root
// namespace).
optional string type_name = 6;
// For extensions, this is the name of the type being extended. It is
// resolved in the same manner as type_name.
optional string extendee = 2;
// For numeric types, contains the original text representation of the value.
// For booleans, "true" or "false".
// For strings, contains the default text contents (not escaped in any way).
// For bytes, contains the C escaped value. All bytes >= 128 are escaped.
// TODO(kenton): Base-64 encode?
optional string default_value = 7;
optional FieldOptions options = 8;
// If set, gives the index of a oneof in the containing type's oneof_decl
// list. This field is a member of that oneof.
optional int32 oneof_index = 9;
reserved 10;
}
// Describes a oneof.
message OneofDescriptorProto {
optional string name = 1;
optional OneofOptions options = 2;
}
// Describes an enum type.
message EnumDescriptorProto {
optional string name = 1;
repeated EnumValueDescriptorProto value = 2;
reserved 3;
reserved 4;
// Reserved enum value names, which may not be reused. A given name may only
// be reserved once.
repeated string reserved_name = 5;
}
// Describes a value within an enum.
message EnumValueDescriptorProto {
optional string name = 1;
optional int32 number = 2;
reserved 3;
}
message OneofOptions {
reserved 999;
// Clients can define custom options in extensions of this message. See above.
extensions 1000 to max;
}
// End of protos/perfetto/common/descriptor.proto
// Begin of protos/perfetto/trace/extension_descriptor.proto
// This message contains descriptors used to parse extension fields of
// TrackEvent.
//
// See docs/design-docs/extensions.md for more details.
message ExtensionDescriptor {
optional FileDescriptorSet extension_set = 1;
}
// End of protos/perfetto/trace/extension_descriptor.proto
// Begin of protos/perfetto/trace/filesystem/inode_file_map.proto
// Represents the mapping between inode numbers in a block device and their path
// on the filesystem
message InodeFileMap {
// Representation of Entry
message Entry {
optional uint64 inode_number = 1;
// The path to the file, e.g. "etc/file.xml"
// List of strings for multiple hardlinks
repeated string paths = 2;
// The file type
enum Type {
UNKNOWN = 0;
FILE = 1;
DIRECTORY = 2;
}
optional Type type = 3;
}
optional uint64 block_device_id = 1;
// The mount points of the block device, e.g. ["system"].
repeated string mount_points = 2;
// The list of all the entries from the block device
repeated Entry entries = 3;
}
// End of protos/perfetto/trace/filesystem/inode_file_map.proto
// Begin of protos/perfetto/trace/ftrace/android_fs.proto
message AndroidFsDatareadEndFtraceEvent {
optional int32 bytes = 1;
optional uint64 ino = 2;
optional int64 offset = 3;
}
message AndroidFsDatareadStartFtraceEvent {
optional int32 bytes = 1;
optional string cmdline = 2;
optional int64 i_size = 3;
optional uint64 ino = 4;
optional int64 offset = 5;
optional string pathbuf = 6;
optional int32 pid = 7;
}
message AndroidFsDatawriteEndFtraceEvent {
optional int32 bytes = 1;
optional uint64 ino = 2;
optional int64 offset = 3;
}
message AndroidFsDatawriteStartFtraceEvent {
optional int32 bytes = 1;
optional string cmdline = 2;
optional int64 i_size = 3;
optional uint64 ino = 4;
optional int64 offset = 5;
optional string pathbuf = 6;
optional int32 pid = 7;
}
message AndroidFsFsyncEndFtraceEvent {
optional int32 bytes = 1;
optional uint64 ino = 2;
optional int64 offset = 3;
}
message AndroidFsFsyncStartFtraceEvent {
optional string cmdline = 1;
optional int64 i_size = 2;
optional uint64 ino = 3;
optional string pathbuf = 4;
optional int32 pid = 5;
}
// End of protos/perfetto/trace/ftrace/android_fs.proto
// Begin of protos/perfetto/trace/ftrace/binder.proto
message BinderTransactionFtraceEvent {
optional int32 debug_id = 1;
optional int32 target_node = 2;
optional int32 to_proc = 3;
optional int32 to_thread = 4;
optional int32 reply = 5;
optional uint32 code = 6;
optional uint32 flags = 7;
}
message BinderTransactionReceivedFtraceEvent {
optional int32 debug_id = 1;
}
message BinderSetPriorityFtraceEvent {
optional int32 proc = 1;
optional int32 thread = 2;
optional uint32 old_prio = 3;
optional uint32 new_prio = 4;
optional uint32 desired_prio = 5;
}
message BinderLockFtraceEvent {
optional string tag = 1;
}
message BinderLockedFtraceEvent {
optional string tag = 1;
}
message BinderUnlockFtraceEvent {
optional string tag = 1;
}
message BinderTransactionAllocBufFtraceEvent {
optional uint64 data_size = 1;
optional int32 debug_id = 2;
optional uint64 offsets_size = 3;
optional uint64 extra_buffers_size = 4;
}
message BinderCommandFtraceEvent {
optional uint32 cmd = 1;
}
message BinderReturnFtraceEvent {
optional uint32 cmd = 1;
}
// End of protos/perfetto/trace/ftrace/binder.proto
// Begin of protos/perfetto/trace/ftrace/block.proto
message BlockRqIssueFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional uint32 bytes = 4;
optional string rwbs = 5;
optional string comm = 6;
optional string cmd = 7;
}
message BlockBioBackmergeFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional string rwbs = 4;
optional string comm = 5;
}
message BlockBioBounceFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional string rwbs = 4;
optional string comm = 5;
}
message BlockBioCompleteFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional int32 error = 4;
optional string rwbs = 5;
}
message BlockBioFrontmergeFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional string rwbs = 4;
optional string comm = 5;
}
message BlockBioQueueFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional string rwbs = 4;
optional string comm = 5;
}
message BlockBioRemapFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional uint64 old_dev = 4;
optional uint64 old_sector = 5;
optional string rwbs = 6;
}
message BlockDirtyBufferFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint64 size = 3;
}
message BlockGetrqFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional string rwbs = 4;
optional string comm = 5;
}
message BlockPlugFtraceEvent {
optional string comm = 1;
}
message BlockRqAbortFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional int32 errors = 4;
optional string rwbs = 5;
optional string cmd = 6;
}
message BlockRqCompleteFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional int32 errors = 4;
optional string rwbs = 5;
optional string cmd = 6;
optional int32 error = 7;
}
message BlockRqInsertFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional uint32 bytes = 4;
optional string rwbs = 5;
optional string comm = 6;
optional string cmd = 7;
}
message BlockRqRemapFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional uint64 old_dev = 4;
optional uint64 old_sector = 5;
optional uint32 nr_bios = 6;
optional string rwbs = 7;
}
message BlockRqRequeueFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional int32 errors = 4;
optional string rwbs = 5;
optional string cmd = 6;
}
message BlockSleeprqFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint32 nr_sector = 3;
optional string rwbs = 4;
optional string comm = 5;
}
message BlockSplitFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint64 new_sector = 3;
optional string rwbs = 4;
optional string comm = 5;
}
message BlockTouchBufferFtraceEvent {
optional uint64 dev = 1;
optional uint64 sector = 2;
optional uint64 size = 3;
}
message BlockUnplugFtraceEvent {
optional int32 nr_rq = 1;
optional string comm = 2;
}
// End of protos/perfetto/trace/ftrace/block.proto
// Begin of protos/perfetto/trace/ftrace/cgroup.proto
message CgroupAttachTaskFtraceEvent {
optional int32 dst_root = 1;
optional int32 dst_id = 2;
optional int32 pid = 3;
optional string comm = 4;
optional string cname = 5;
optional int32 dst_level = 6;
optional string dst_path = 7;
}
message CgroupMkdirFtraceEvent {
optional int32 root = 1;
optional int32 id = 2;
optional string cname = 3;
optional int32 level = 4;
optional string path = 5;
}
message CgroupRemountFtraceEvent {
optional int32 root = 1;
optional uint32 ss_mask = 2;
optional string name = 3;
}
message CgroupRmdirFtraceEvent {
optional int32 root = 1;
optional int32 id = 2;
optional string cname = 3;
optional int32 level = 4;
optional string path = 5;
}
message CgroupTransferTasksFtraceEvent {
optional int32 dst_root = 1;
optional int32 dst_id = 2;
optional int32 pid = 3;
optional string comm = 4;
optional string cname = 5;
optional int32 dst_level = 6;
optional string dst_path = 7;
}
message CgroupDestroyRootFtraceEvent {
optional int32 root = 1;
optional uint32 ss_mask = 2;
optional string name = 3;
}
message CgroupReleaseFtraceEvent {
optional int32 root = 1;
optional int32 id = 2;
optional string cname = 3;
optional int32 level = 4;
optional string path = 5;
}
message CgroupRenameFtraceEvent {
optional int32 root = 1;
optional int32 id = 2;
optional string cname = 3;
optional int32 level = 4;
optional string path = 5;
}
message CgroupSetupRootFtraceEvent {
optional int32 root = 1;
optional uint32 ss_mask = 2;
optional string name = 3;
}
// End of protos/perfetto/trace/ftrace/cgroup.proto
// Begin of protos/perfetto/trace/ftrace/clk.proto
message ClkEnableFtraceEvent {
optional string name = 1;
}
message ClkDisableFtraceEvent {
optional string name = 1;
}
message ClkSetRateFtraceEvent {
optional string name = 1;
optional uint64 rate = 2;
}
// End of protos/perfetto/trace/ftrace/clk.proto
// Begin of protos/perfetto/trace/ftrace/cma.proto
message CmaAllocStartFtraceEvent {
optional uint32 align = 1;
optional uint32 count = 2;
optional string name = 3;
}
message CmaAllocInfoFtraceEvent {
optional uint32 align = 1;
optional uint32 count = 2;
optional uint32 err_iso = 3;
optional uint32 err_mig = 4;
optional uint32 err_test = 5;
optional string name = 6;
optional uint64 nr_mapped = 7;
optional uint64 nr_migrated = 8;
optional uint64 nr_reclaimed = 9;
optional uint64 pfn = 10;
}
// End of protos/perfetto/trace/ftrace/cma.proto
// Begin of protos/perfetto/trace/ftrace/compaction.proto
message MmCompactionBeginFtraceEvent {
optional uint64 zone_start = 1;
optional uint64 migrate_pfn = 2;
optional uint64 free_pfn = 3;
optional uint64 zone_end = 4;
optional uint32 sync = 5;
}
message MmCompactionDeferCompactionFtraceEvent {
optional int32 nid = 1;
optional uint32 idx = 2;
optional int32 order = 3;
optional uint32 considered = 4;
optional uint32 defer_shift = 5;
optional int32 order_failed = 6;
}
message MmCompactionDeferredFtraceEvent {
optional int32 nid = 1;
optional uint32 idx = 2;
optional int32 order = 3;
optional uint32 considered = 4;
optional uint32 defer_shift = 5;
optional int32 order_failed = 6;
}
message MmCompactionDeferResetFtraceEvent {
optional int32 nid = 1;
optional uint32 idx = 2;
optional int32 order = 3;
optional uint32 considered = 4;
optional uint32 defer_shift = 5;
optional int32 order_failed = 6;
}
message MmCompactionEndFtraceEvent {
optional uint64 zone_start = 1;
optional uint64 migrate_pfn = 2;
optional uint64 free_pfn = 3;
optional uint64 zone_end = 4;
optional uint32 sync = 5;
optional int32 status = 6;
}
message MmCompactionFinishedFtraceEvent {
optional int32 nid = 1;
optional uint32 idx = 2;
optional int32 order = 3;
optional int32 ret = 4;
}
message MmCompactionIsolateFreepagesFtraceEvent {
optional uint64 start_pfn = 1;
optional uint64 end_pfn = 2;
optional uint64 nr_scanned = 3;
optional uint64 nr_taken = 4;
}
message MmCompactionIsolateMigratepagesFtraceEvent {
optional uint64 start_pfn = 1;
optional uint64 end_pfn = 2;
optional uint64 nr_scanned = 3;
optional uint64 nr_taken = 4;
}
message MmCompactionKcompactdSleepFtraceEvent {
optional int32 nid = 1;
}
message MmCompactionKcompactdWakeFtraceEvent {
optional int32 nid = 1;
optional int32 order = 2;
optional uint32 classzone_idx = 3;
optional uint32 highest_zoneidx = 4;
}
message MmCompactionMigratepagesFtraceEvent {
optional uint64 nr_migrated = 1;
optional uint64 nr_failed = 2;
}
message MmCompactionSuitableFtraceEvent {
optional int32 nid = 1;
optional uint32 idx = 2;
optional int32 order = 3;
optional int32 ret = 4;
}
message MmCompactionTryToCompactPagesFtraceEvent {
optional int32 order = 1;
optional uint32 gfp_mask = 2;
optional uint32 mode = 3;
optional int32 prio = 4;
}
message MmCompactionWakeupKcompactdFtraceEvent {
optional int32 nid = 1;
optional int32 order = 2;
optional uint32 classzone_idx = 3;
optional uint32 highest_zoneidx = 4;
}
// End of protos/perfetto/trace/ftrace/compaction.proto
// Begin of protos/perfetto/trace/ftrace/cpuhp.proto
message CpuhpExitFtraceEvent {
optional uint32 cpu = 1;
optional int32 idx = 2;
optional int32 ret = 3;
optional int32 state = 4;
}
message CpuhpMultiEnterFtraceEvent {
optional uint32 cpu = 1;
optional uint64 fun = 2;
optional int32 idx = 3;
optional int32 target = 4;
}
message CpuhpEnterFtraceEvent {
optional uint32 cpu = 1;
optional uint64 fun = 2;
optional int32 idx = 3;
optional int32 target = 4;
}
message CpuhpLatencyFtraceEvent {
optional uint32 cpu = 1;
optional int32 ret = 2;
optional uint32 state = 3;
optional uint64 time = 4;
}
message CpuhpPauseFtraceEvent {
optional uint32 active_cpus = 1;
optional uint32 cpus = 2;
optional uint32 pause = 3;
optional uint32 time = 4;
}
// End of protos/perfetto/trace/ftrace/cpuhp.proto
// Begin of protos/perfetto/trace/ftrace/cros_ec.proto
message CrosEcSensorhubDataFtraceEvent {
optional int64 current_time = 1;
optional int64 current_timestamp = 2;
optional int64 delta = 3;
optional uint32 ec_fifo_timestamp = 4;
optional uint32 ec_sensor_num = 5;
optional int64 fifo_timestamp = 6;
}
// End of protos/perfetto/trace/ftrace/cros_ec.proto
// Begin of protos/perfetto/trace/ftrace/dma_fence.proto
message DmaFenceInitFtraceEvent {
optional uint32 context = 1;
optional string driver = 2;
optional uint32 seqno = 3;
optional string timeline = 4;
}
message DmaFenceEmitFtraceEvent {
optional uint32 context = 1;
optional string driver = 2;
optional uint32 seqno = 3;
optional string timeline = 4;
}
message DmaFenceSignaledFtraceEvent {
optional uint32 context = 1;
optional string driver = 2;
optional uint32 seqno = 3;
optional string timeline = 4;
}
message DmaFenceWaitStartFtraceEvent {
optional uint32 context = 1;
optional string driver = 2;
optional uint32 seqno = 3;
optional string timeline = 4;
}
message DmaFenceWaitEndFtraceEvent {
optional uint32 context = 1;
optional string driver = 2;
optional uint32 seqno = 3;
optional string timeline = 4;
}
// End of protos/perfetto/trace/ftrace/dma_fence.proto
// Begin of protos/perfetto/trace/ftrace/dmabuf_heap.proto
message DmaHeapStatFtraceEvent {
optional uint64 inode = 1;
optional int64 len = 2;
optional uint64 total_allocated = 3;
}
// End of protos/perfetto/trace/ftrace/dmabuf_heap.proto
// Begin of protos/perfetto/trace/ftrace/dpu.proto
message DpuTracingMarkWriteFtraceEvent {
optional int32 pid = 1;
optional string trace_name = 2;
optional uint32 trace_begin = 3;
optional string name = 4;
optional uint32 type = 5;
optional int32 value = 6;
}
// End of protos/perfetto/trace/ftrace/dpu.proto
// Begin of protos/perfetto/trace/ftrace/drm.proto
message DrmVblankEventFtraceEvent {
optional int32 crtc = 1;
optional uint32 high_prec = 2;
optional uint32 seq = 3;
optional int64 time = 4;
}
message DrmVblankEventDeliveredFtraceEvent {
optional int32 crtc = 1;
optional uint64 file = 2;
optional uint32 seq = 3;
}
// End of protos/perfetto/trace/ftrace/drm.proto
// Begin of protos/perfetto/trace/ftrace/ext4.proto
message Ext4DaWriteBeginFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 pos = 3;
optional uint32 len = 4;
optional uint32 flags = 5;
}
message Ext4DaWriteEndFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 pos = 3;
optional uint32 len = 4;
optional uint32 copied = 5;
}
message Ext4SyncFileEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 parent = 3;
optional int32 datasync = 4;
}
message Ext4SyncFileExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 ret = 3;
}
message Ext4AllocDaBlocksFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 data_blocks = 3;
optional uint32 meta_blocks = 4;
}
message Ext4AllocateBlocksFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 block = 3;
optional uint32 len = 4;
optional uint32 logical = 5;
optional uint32 lleft = 6;
optional uint32 lright = 7;
optional uint64 goal = 8;
optional uint64 pleft = 9;
optional uint64 pright = 10;
optional uint32 flags = 11;
}
message Ext4AllocateInodeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 dir = 3;
optional uint32 mode = 4;
}
message Ext4BeginOrderedTruncateFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 new_size = 3;
}
message Ext4CollapseRangeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 offset = 3;
optional int64 len = 4;
}
message Ext4DaReleaseSpaceFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 i_blocks = 3;
optional int32 freed_blocks = 4;
optional int32 reserved_data_blocks = 5;
optional int32 reserved_meta_blocks = 6;
optional int32 allocated_meta_blocks = 7;
optional uint32 mode = 8;
}
message Ext4DaReserveSpaceFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 i_blocks = 3;
optional int32 reserved_data_blocks = 4;
optional int32 reserved_meta_blocks = 5;
optional uint32 mode = 6;
optional int32 md_needed = 7;
}
message Ext4DaUpdateReserveSpaceFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 i_blocks = 3;
optional int32 used_blocks = 4;
optional int32 reserved_data_blocks = 5;
optional int32 reserved_meta_blocks = 6;
optional int32 allocated_meta_blocks = 7;
optional int32 quota_claim = 8;
optional uint32 mode = 9;
}
message Ext4DaWritePagesFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 first_page = 3;
optional int64 nr_to_write = 4;
optional int32 sync_mode = 5;
optional uint64 b_blocknr = 6;
optional uint32 b_size = 7;
optional uint32 b_state = 8;
optional int32 io_done = 9;
optional int32 pages_written = 10;
}
message Ext4DaWritePagesExtentFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 lblk = 3;
optional uint32 len = 4;
optional uint32 flags = 5;
}
message Ext4DirectIOEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 pos = 3;
optional uint64 len = 4;
optional int32 rw = 5;
}
message Ext4DirectIOExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 pos = 3;
optional uint64 len = 4;
optional int32 rw = 5;
optional int32 ret = 6;
}
message Ext4DiscardBlocksFtraceEvent {
optional uint64 dev = 1;
optional uint64 blk = 2;
optional uint64 count = 3;
}
message Ext4DiscardPreallocationsFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 len = 3;
optional uint32 needed = 4;
}
message Ext4DropInodeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 drop = 3;
}
message Ext4EsCacheExtentFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 lblk = 3;
optional uint32 len = 4;
optional uint64 pblk = 5;
optional uint32 status = 6;
}
message Ext4EsFindDelayedExtentRangeEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 lblk = 3;
}
message Ext4EsFindDelayedExtentRangeExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 lblk = 3;
optional uint32 len = 4;
optional uint64 pblk = 5;
optional uint64 status = 6;
}
message Ext4EsInsertExtentFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 lblk = 3;
optional uint32 len = 4;
optional uint64 pblk = 5;
optional uint64 status = 6;
}
message Ext4EsLookupExtentEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 lblk = 3;
}
message Ext4EsLookupExtentExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 lblk = 3;
optional uint32 len = 4;
optional uint64 pblk = 5;
optional uint64 status = 6;
optional int32 found = 7;
}
message Ext4EsRemoveExtentFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 lblk = 3;
optional int64 len = 4;
}
message Ext4EsShrinkFtraceEvent {
optional uint64 dev = 1;
optional int32 nr_shrunk = 2;
optional uint64 scan_time = 3;
optional int32 nr_skipped = 4;
optional int32 retried = 5;
}
message Ext4EsShrinkCountFtraceEvent {
optional uint64 dev = 1;
optional int32 nr_to_scan = 2;
optional int32 cache_cnt = 3;
}
message Ext4EsShrinkScanEnterFtraceEvent {
optional uint64 dev = 1;
optional int32 nr_to_scan = 2;
optional int32 cache_cnt = 3;
}
message Ext4EsShrinkScanExitFtraceEvent {
optional uint64 dev = 1;
optional int32 nr_shrunk = 2;
optional int32 cache_cnt = 3;
}
message Ext4EvictInodeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 nlink = 3;
}
message Ext4ExtConvertToInitializedEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 m_lblk = 3;
optional uint32 m_len = 4;
optional uint32 u_lblk = 5;
optional uint32 u_len = 6;
optional uint64 u_pblk = 7;
}
message Ext4ExtConvertToInitializedFastpathFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 m_lblk = 3;
optional uint32 m_len = 4;
optional uint32 u_lblk = 5;
optional uint32 u_len = 6;
optional uint64 u_pblk = 7;
optional uint32 i_lblk = 8;
optional uint32 i_len = 9;
optional uint64 i_pblk = 10;
}
message Ext4ExtHandleUnwrittenExtentsFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 flags = 3;
optional uint32 lblk = 4;
optional uint64 pblk = 5;
optional uint32 len = 6;
optional uint32 allocated = 7;
optional uint64 newblk = 8;
}
message Ext4ExtInCacheFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 lblk = 3;
optional int32 ret = 4;
}
message Ext4ExtLoadExtentFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 pblk = 3;
optional uint32 lblk = 4;
}
message Ext4ExtMapBlocksEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 lblk = 3;
optional uint32 len = 4;
optional uint32 flags = 5;
}
message Ext4ExtMapBlocksExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 flags = 3;
optional uint64 pblk = 4;
optional uint32 lblk = 5;
optional uint32 len = 6;
optional uint32 mflags = 7;
optional int32 ret = 8;
}
message Ext4ExtPutInCacheFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 lblk = 3;
optional uint32 len = 4;
optional uint64 start = 5;
}
message Ext4ExtRemoveSpaceFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 start = 3;
optional uint32 end = 4;
optional int32 depth = 5;
}
message Ext4ExtRemoveSpaceDoneFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 start = 3;
optional uint32 end = 4;
optional int32 depth = 5;
optional int64 partial = 6;
optional uint32 eh_entries = 7;
optional uint32 pc_lblk = 8;
optional uint64 pc_pclu = 9;
optional int32 pc_state = 10;
}
message Ext4ExtRmIdxFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 pblk = 3;
}
message Ext4ExtRmLeafFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 partial = 3;
optional uint32 start = 4;
optional uint32 ee_lblk = 5;
optional uint64 ee_pblk = 6;
optional int32 ee_len = 7;
optional uint32 pc_lblk = 8;
optional uint64 pc_pclu = 9;
optional int32 pc_state = 10;
}
message Ext4ExtShowExtentFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 pblk = 3;
optional uint32 lblk = 4;
optional uint32 len = 5;
}
message Ext4FallocateEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 offset = 3;
optional int64 len = 4;
optional int32 mode = 5;
optional int64 pos = 6;
}
message Ext4FallocateExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 pos = 3;
optional uint32 blocks = 4;
optional int32 ret = 5;
}
message Ext4FindDelallocRangeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 from = 3;
optional uint32 to = 4;
optional int32 reverse = 5;
optional int32 found = 6;
optional uint32 found_blk = 7;
}
message Ext4ForgetFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 block = 3;
optional int32 is_metadata = 4;
optional uint32 mode = 5;
}
message Ext4FreeBlocksFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 block = 3;
optional uint64 count = 4;
optional int32 flags = 5;
optional uint32 mode = 6;
}
message Ext4FreeInodeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 uid = 3;
optional uint32 gid = 4;
optional uint64 blocks = 5;
optional uint32 mode = 6;
}
message Ext4GetImpliedClusterAllocExitFtraceEvent {
optional uint64 dev = 1;
optional uint32 flags = 2;
optional uint32 lblk = 3;
optional uint64 pblk = 4;
optional uint32 len = 5;
optional int32 ret = 6;
}
message Ext4GetReservedClusterAllocFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 lblk = 3;
optional uint32 len = 4;
}
message Ext4IndMapBlocksEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 lblk = 3;
optional uint32 len = 4;
optional uint32 flags = 5;
}
message Ext4IndMapBlocksExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 flags = 3;
optional uint64 pblk = 4;
optional uint32 lblk = 5;
optional uint32 len = 6;
optional uint32 mflags = 7;
optional int32 ret = 8;
}
message Ext4InsertRangeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 offset = 3;
optional int64 len = 4;
}
message Ext4InvalidatepageFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 index = 3;
optional uint64 offset = 4;
optional uint32 length = 5;
}
message Ext4JournalStartFtraceEvent {
optional uint64 dev = 1;
optional uint64 ip = 2;
optional int32 blocks = 3;
optional int32 rsv_blocks = 4;
optional int32 nblocks = 5;
optional int32 revoke_creds = 6;
}
message Ext4JournalStartReservedFtraceEvent {
optional uint64 dev = 1;
optional uint64 ip = 2;
optional int32 blocks = 3;
}
message Ext4JournalledInvalidatepageFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 index = 3;
optional uint64 offset = 4;
optional uint32 length = 5;
}
message Ext4JournalledWriteEndFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 pos = 3;
optional uint32 len = 4;
optional uint32 copied = 5;
}
message Ext4LoadInodeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
}
message Ext4LoadInodeBitmapFtraceEvent {
optional uint64 dev = 1;
optional uint32 group = 2;
}
message Ext4MarkInodeDirtyFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 ip = 3;
}
message Ext4MbBitmapLoadFtraceEvent {
optional uint64 dev = 1;
optional uint32 group = 2;
}
message Ext4MbBuddyBitmapLoadFtraceEvent {
optional uint64 dev = 1;
optional uint32 group = 2;
}
message Ext4MbDiscardPreallocationsFtraceEvent {
optional uint64 dev = 1;
optional int32 needed = 2;
}
message Ext4MbNewGroupPaFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 pa_pstart = 3;
optional uint64 pa_lstart = 4;
optional uint32 pa_len = 5;
}
message Ext4MbNewInodePaFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 pa_pstart = 3;
optional uint64 pa_lstart = 4;
optional uint32 pa_len = 5;
}
message Ext4MbReleaseGroupPaFtraceEvent {
optional uint64 dev = 1;
optional uint64 pa_pstart = 2;
optional uint32 pa_len = 3;
}
message Ext4MbReleaseInodePaFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 block = 3;
optional uint32 count = 4;
}
message Ext4MballocAllocFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 orig_logical = 3;
optional int32 orig_start = 4;
optional uint32 orig_group = 5;
optional int32 orig_len = 6;
optional uint32 goal_logical = 7;
optional int32 goal_start = 8;
optional uint32 goal_group = 9;
optional int32 goal_len = 10;
optional uint32 result_logical = 11;
optional int32 result_start = 12;
optional uint32 result_group = 13;
optional int32 result_len = 14;
optional uint32 found = 15;
optional uint32 groups = 16;
optional uint32 buddy = 17;
optional uint32 flags = 18;
optional uint32 tail = 19;
optional uint32 cr = 20;
}
message Ext4MballocDiscardFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 result_start = 3;
optional uint32 result_group = 4;
optional int32 result_len = 5;
}
message Ext4MballocFreeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 result_start = 3;
optional uint32 result_group = 4;
optional int32 result_len = 5;
}
message Ext4MballocPreallocFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 orig_logical = 3;
optional int32 orig_start = 4;
optional uint32 orig_group = 5;
optional int32 orig_len = 6;
optional uint32 result_logical = 7;
optional int32 result_start = 8;
optional uint32 result_group = 9;
optional int32 result_len = 10;
}
message Ext4OtherInodeUpdateTimeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 orig_ino = 3;
optional uint32 uid = 4;
optional uint32 gid = 5;
optional uint32 mode = 6;
}
message Ext4PunchHoleFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 offset = 3;
optional int64 len = 4;
optional int32 mode = 5;
}
message Ext4ReadBlockBitmapLoadFtraceEvent {
optional uint64 dev = 1;
optional uint32 group = 2;
optional uint32 prefetch = 3;
}
message Ext4ReadpageFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 index = 3;
}
message Ext4ReleasepageFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 index = 3;
}
message Ext4RemoveBlocksFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 from = 3;
optional uint32 to = 4;
optional int64 partial = 5;
optional uint64 ee_pblk = 6;
optional uint32 ee_lblk = 7;
optional uint32 ee_len = 8;
optional uint32 pc_lblk = 9;
optional uint64 pc_pclu = 10;
optional int32 pc_state = 11;
}
message Ext4RequestBlocksFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 len = 3;
optional uint32 logical = 4;
optional uint32 lleft = 5;
optional uint32 lright = 6;
optional uint64 goal = 7;
optional uint64 pleft = 8;
optional uint64 pright = 9;
optional uint32 flags = 10;
}
message Ext4RequestInodeFtraceEvent {
optional uint64 dev = 1;
optional uint64 dir = 2;
optional uint32 mode = 3;
}
message Ext4SyncFsFtraceEvent {
optional uint64 dev = 1;
optional int32 wait = 2;
}
message Ext4TrimAllFreeFtraceEvent {
optional int32 dev_major = 1;
optional int32 dev_minor = 2;
optional uint32 group = 3;
optional int32 start = 4;
optional int32 len = 5;
}
message Ext4TrimExtentFtraceEvent {
optional int32 dev_major = 1;
optional int32 dev_minor = 2;
optional uint32 group = 3;
optional int32 start = 4;
optional int32 len = 5;
}
message Ext4TruncateEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 blocks = 3;
}
message Ext4TruncateExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 blocks = 3;
}
message Ext4UnlinkEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 parent = 3;
optional int64 size = 4;
}
message Ext4UnlinkExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 ret = 3;
}
message Ext4WriteBeginFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 pos = 3;
optional uint32 len = 4;
optional uint32 flags = 5;
}
message Ext4WriteEndFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 pos = 3;
optional uint32 len = 4;
optional uint32 copied = 5;
}
message Ext4WritepageFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 index = 3;
}
message Ext4WritepagesFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 nr_to_write = 3;
optional int64 pages_skipped = 4;
optional int64 range_start = 5;
optional int64 range_end = 6;
optional uint64 writeback_index = 7;
optional int32 sync_mode = 8;
optional uint32 for_kupdate = 9;
optional uint32 range_cyclic = 10;
}
message Ext4WritepagesResultFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 ret = 3;
optional int32 pages_written = 4;
optional int64 pages_skipped = 5;
optional uint64 writeback_index = 6;
optional int32 sync_mode = 7;
}
message Ext4ZeroRangeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 offset = 3;
optional int64 len = 4;
optional int32 mode = 5;
}
// End of protos/perfetto/trace/ftrace/ext4.proto
// Begin of protos/perfetto/trace/ftrace/f2fs.proto
message F2fsDoSubmitBioFtraceEvent {
optional uint64 dev = 1;
optional int32 btype = 2;
optional uint32 sync = 3;
optional uint64 sector = 4;
optional uint32 size = 5;
}
message F2fsEvictInodeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 pino = 3;
optional uint32 mode = 4;
optional int64 size = 5;
optional uint32 nlink = 6;
optional uint64 blocks = 7;
optional uint32 advise = 8;
}
message F2fsFallocateFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 mode = 3;
optional int64 offset = 4;
optional int64 len = 5;
optional int64 size = 6;
optional uint64 blocks = 7;
optional int32 ret = 8;
}
message F2fsGetDataBlockFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 iblock = 3;
optional uint64 bh_start = 4;
optional uint64 bh_size = 5;
optional int32 ret = 6;
}
message F2fsGetVictimFtraceEvent {
optional uint64 dev = 1;
optional int32 type = 2;
optional int32 gc_type = 3;
optional int32 alloc_mode = 4;
optional int32 gc_mode = 5;
optional uint32 victim = 6;
optional uint32 ofs_unit = 7;
optional uint32 pre_victim = 8;
optional uint32 prefree = 9;
optional uint32 free = 10;
optional uint32 cost = 11;
}
message F2fsIgetFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 pino = 3;
optional uint32 mode = 4;
optional int64 size = 5;
optional uint32 nlink = 6;
optional uint64 blocks = 7;
optional uint32 advise = 8;
}
message F2fsIgetExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 ret = 3;
}
message F2fsNewInodeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 ret = 3;
}
message F2fsReadpageFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 index = 3;
optional uint64 blkaddr = 4;
optional int32 type = 5;
optional int32 dir = 6;
optional int32 dirty = 7;
optional int32 uptodate = 8;
}
message F2fsReserveNewBlockFtraceEvent {
optional uint64 dev = 1;
optional uint32 nid = 2;
optional uint32 ofs_in_node = 3;
}
message F2fsSetPageDirtyFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 type = 3;
optional int32 dir = 4;
optional uint64 index = 5;
optional int32 dirty = 6;
optional int32 uptodate = 7;
}
message F2fsSubmitWritePageFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 type = 3;
optional uint64 index = 4;
optional uint32 block = 5;
}
message F2fsSyncFileEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 pino = 3;
optional uint32 mode = 4;
optional int64 size = 5;
optional uint32 nlink = 6;
optional uint64 blocks = 7;
optional uint32 advise = 8;
}
message F2fsSyncFileExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 need_cp = 3;
optional int32 datasync = 4;
optional int32 ret = 5;
optional int32 cp_reason = 6;
}
message F2fsSyncFsFtraceEvent {
optional uint64 dev = 1;
optional int32 dirty = 2;
optional int32 wait = 3;
}
message F2fsTruncateFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint64 pino = 3;
optional uint32 mode = 4;
optional int64 size = 5;
optional uint32 nlink = 6;
optional uint64 blocks = 7;
optional uint32 advise = 8;
}
message F2fsTruncateBlocksEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 size = 3;
optional uint64 blocks = 4;
optional uint64 from = 5;
}
message F2fsTruncateBlocksExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 ret = 3;
}
message F2fsTruncateDataBlocksRangeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 nid = 3;
optional uint32 ofs = 4;
optional int32 free = 5;
}
message F2fsTruncateInodeBlocksEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 size = 3;
optional uint64 blocks = 4;
optional uint64 from = 5;
}
message F2fsTruncateInodeBlocksExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 ret = 3;
}
message F2fsTruncateNodeFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 nid = 3;
optional uint32 blk_addr = 4;
}
message F2fsTruncateNodesEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 nid = 3;
optional uint32 blk_addr = 4;
}
message F2fsTruncateNodesExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 ret = 3;
}
message F2fsTruncatePartialNodesFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional uint32 nid = 3;
optional int32 depth = 4;
optional int32 err = 5;
}
message F2fsUnlinkEnterFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 size = 3;
optional uint64 blocks = 4;
optional string name = 5;
}
message F2fsUnlinkExitFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 ret = 3;
}
message F2fsVmPageMkwriteFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int32 type = 3;
optional int32 dir = 4;
optional uint64 index = 5;
optional int32 dirty = 6;
optional int32 uptodate = 7;
}
message F2fsWriteBeginFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 pos = 3;
optional uint32 len = 4;
optional uint32 flags = 5;
}
message F2fsWriteCheckpointFtraceEvent {
optional uint64 dev = 1;
optional uint32 is_umount = 2;
optional string msg = 3;
optional int32 reason = 4;
}
message F2fsWriteEndFtraceEvent {
optional uint64 dev = 1;
optional uint64 ino = 2;
optional int64 pos = 3;
optional uint32 len = 4;
optional uint32 copied = 5;
}
message F2fsIostatFtraceEvent {
optional uint64 app_bio = 1;
optional uint64 app_brio = 2;
optional uint64 app_dio = 3;
optional uint64 app_drio = 4;
optional uint64 app_mio = 5;
optional uint64 app_mrio = 6;
optional uint64 app_rio = 7;
optional uint64 app_wio = 8;
optional uint64 dev = 9;
optional uint64 fs_cdrio = 10;
optional uint64 fs_cp_dio = 11;
optional uint64 fs_cp_mio = 12;
optional uint64 fs_cp_nio = 13;
optional uint64 fs_dio = 14;
optional uint64 fs_discard = 15;
optional uint64 fs_drio = 16;
optional uint64 fs_gc_dio = 17;
optional uint64 fs_gc_nio = 18;
optional uint64 fs_gdrio = 19;
optional uint64 fs_mio = 20;
optional uint64 fs_mrio = 21;
optional uint64 fs_nio = 22;
optional uint64 fs_nrio = 23;
}
message F2fsIostatLatencyFtraceEvent {
optional uint32 d_rd_avg = 1;
optional uint32 d_rd_cnt = 2;
optional uint32 d_rd_peak = 3;
optional uint32 d_wr_as_avg = 4;
optional uint32 d_wr_as_cnt = 5;
optional uint32 d_wr_as_peak = 6;
optional uint32 d_wr_s_avg = 7;
optional uint32 d_wr_s_cnt = 8;
optional uint32 d_wr_s_peak = 9;
optional uint64 dev = 10;
optional uint32 m_rd_avg = 11;
optional uint32 m_rd_cnt = 12;
optional uint32 m_rd_peak = 13;
optional uint32 m_wr_as_avg = 14;
optional uint32 m_wr_as_cnt = 15;
optional uint32 m_wr_as_peak = 16;
optional uint32 m_wr_s_avg = 17;
optional uint32 m_wr_s_cnt = 18;
optional uint32 m_wr_s_peak = 19;
optional uint32 n_rd_avg = 20;
optional uint32 n_rd_cnt = 21;
optional uint32 n_rd_peak = 22;
optional uint32 n_wr_as_avg = 23;
optional uint32 n_wr_as_cnt = 24;
optional uint32 n_wr_as_peak = 25;
optional uint32 n_wr_s_avg = 26;
optional uint32 n_wr_s_cnt = 27;
optional uint32 n_wr_s_peak = 28;
}
// End of protos/perfetto/trace/ftrace/f2fs.proto
// Begin of protos/perfetto/trace/ftrace/fastrpc.proto
message FastrpcDmaStatFtraceEvent {
optional int32 cid = 1;
optional int64 len = 2;
optional uint64 total_allocated = 3;
}
// End of protos/perfetto/trace/ftrace/fastrpc.proto
// Begin of protos/perfetto/trace/ftrace/fence.proto
message FenceInitFtraceEvent {
optional uint32 context = 1;
optional string driver = 2;
optional uint32 seqno = 3;
optional string timeline = 4;
}
message FenceDestroyFtraceEvent {
optional uint32 context = 1;
optional string driver = 2;
optional uint32 seqno = 3;
optional string timeline = 4;
}
message FenceEnableSignalFtraceEvent {
optional uint32 context = 1;
optional string driver = 2;
optional uint32 seqno = 3;
optional string timeline = 4;
}
message FenceSignaledFtraceEvent {
optional uint32 context = 1;
optional string driver = 2;
optional uint32 seqno = 3;
optional string timeline = 4;
}
// End of protos/perfetto/trace/ftrace/fence.proto
// Begin of protos/perfetto/trace/ftrace/filemap.proto
message MmFilemapAddToPageCacheFtraceEvent {
optional uint64 pfn = 1;
optional uint64 i_ino = 2;
optional uint64 index = 3;
optional uint64 s_dev = 4;
optional uint64 page = 5;
}
message MmFilemapDeleteFromPageCacheFtraceEvent {
optional uint64 pfn = 1;
optional uint64 i_ino = 2;
optional uint64 index = 3;
optional uint64 s_dev = 4;
optional uint64 page = 5;
}
// End of protos/perfetto/trace/ftrace/filemap.proto
// Begin of protos/perfetto/trace/ftrace/ftrace.proto
message PrintFtraceEvent {
optional uint64 ip = 1;
optional string buf = 2;
}
message FuncgraphEntryFtraceEvent {
optional int32 depth = 1;
optional uint64 func = 2;
}
message FuncgraphExitFtraceEvent {
optional uint64 calltime = 1;
optional int32 depth = 2;
optional uint64 func = 3;
optional uint64 overrun = 4;
optional uint64 rettime = 5;
}
// End of protos/perfetto/trace/ftrace/ftrace.proto
// Begin of protos/perfetto/trace/ftrace/g2d.proto
message G2dTracingMarkWriteFtraceEvent {
optional int32 pid = 1;
optional string name = 4;
optional uint32 type = 5;
optional int32 value = 6;
}
// End of protos/perfetto/trace/ftrace/g2d.proto
// Begin of protos/perfetto/trace/ftrace/generic.proto
// This generic proto is used to output events in the trace
// when a specific proto for that event does not exist.
message GenericFtraceEvent {
message Field {
optional string name = 1;
oneof value {
string str_value = 3;
int64 int_value = 4;
uint64 uint_value = 5;
}
}
optional string event_name = 1;
repeated Field field = 2;
}
// End of protos/perfetto/trace/ftrace/generic.proto
// Begin of protos/perfetto/trace/ftrace/gpu_mem.proto
message GpuMemTotalFtraceEvent {
optional uint32 gpu_id = 1;
optional uint32 pid = 2;
optional uint64 size = 3;
}
// End of protos/perfetto/trace/ftrace/gpu_mem.proto
// Begin of protos/perfetto/trace/ftrace/gpu_scheduler.proto
message DrmSchedJobFtraceEvent {
optional uint64 entity = 1;
optional uint64 fence = 2;
optional int32 hw_job_count = 3;
optional uint64 id = 4;
optional uint32 job_count = 5;
optional string name = 6;
}
message DrmRunJobFtraceEvent {
optional uint64 entity = 1;
optional uint64 fence = 2;
optional int32 hw_job_count = 3;
optional uint64 id = 4;
optional uint32 job_count = 5;
optional string name = 6;
}
message DrmSchedProcessJobFtraceEvent {
optional uint64 fence = 1;
}
// End of protos/perfetto/trace/ftrace/gpu_scheduler.proto
// Begin of protos/perfetto/trace/ftrace/hyp.proto
message HypEnterFtraceEvent {}
message HypExitFtraceEvent {}
message HostHcallFtraceEvent {
optional uint32 id = 1;
optional uint32 invalid = 2;
}
message HostSmcFtraceEvent {
optional uint64 id = 1;
optional uint32 forwarded = 2;
}
message HostMemAbortFtraceEvent {
optional uint64 esr = 1;
optional uint64 addr = 2;
}
// End of protos/perfetto/trace/ftrace/hyp.proto
// Begin of protos/perfetto/trace/ftrace/i2c.proto
message I2cReadFtraceEvent {
optional int32 adapter_nr = 1;
optional uint32 msg_nr = 2;
optional uint32 addr = 3;
optional uint32 flags = 4;
optional uint32 len = 5;
}
message I2cWriteFtraceEvent {
optional int32 adapter_nr = 1;
optional uint32 msg_nr = 2;
optional uint32 addr = 3;
optional uint32 flags = 4;
optional uint32 len = 5;
optional uint32 buf = 6;
}
message I2cResultFtraceEvent {
optional int32 adapter_nr = 1;
optional uint32 nr_msgs = 2;
optional int32 ret = 3;
}
message I2cReplyFtraceEvent {
optional int32 adapter_nr = 1;
optional uint32 msg_nr = 2;
optional uint32 addr = 3;
optional uint32 flags = 4;
optional uint32 len = 5;
optional uint32 buf = 6;
}
message SmbusReadFtraceEvent {
optional int32 adapter_nr = 1;
optional uint32 flags = 2;
optional uint32 addr = 3;
optional uint32 command = 4;
optional uint32 protocol = 5;
}
message SmbusWriteFtraceEvent {
optional int32 adapter_nr = 1;
optional uint32 addr = 2;
optional uint32 flags = 3;
optional uint32 command = 4;
optional uint32 len = 5;
optional uint32 protocol = 6;
}
message SmbusResultFtraceEvent {
optional int32 adapter_nr = 1;
optional uint32 addr = 2;
optional uint32 flags = 3;
optional uint32 read_write = 4;
optional uint32 command = 5;
optional int32 res = 6;
optional uint32 protocol = 7;
}
message SmbusReplyFtraceEvent {
optional int32 adapter_nr = 1;
optional uint32 addr = 2;
optional uint32 flags = 3;
optional uint32 command = 4;
optional uint32 len = 5;
optional uint32 protocol = 6;
}
// End of protos/perfetto/trace/ftrace/i2c.proto
// Begin of protos/perfetto/trace/ftrace/ion.proto
message IonStatFtraceEvent {
optional uint32 buffer_id = 1;
optional int64 len = 2;
optional uint64 total_allocated = 3;
}
// End of protos/perfetto/trace/ftrace/ion.proto
// Begin of protos/perfetto/trace/ftrace/ipi.proto
message IpiEntryFtraceEvent {
optional string reason = 1;
}
message IpiExitFtraceEvent {
optional string reason = 1;
}
message IpiRaiseFtraceEvent {
optional uint32 target_cpus = 1;
optional string reason = 2;
}
// End of protos/perfetto/trace/ftrace/ipi.proto
// Begin of protos/perfetto/trace/ftrace/irq.proto
message SoftirqEntryFtraceEvent {
optional uint32 vec = 1;
}
message SoftirqExitFtraceEvent {
optional uint32 vec = 1;
}
message SoftirqRaiseFtraceEvent {
optional uint32 vec = 1;
}
message IrqHandlerEntryFtraceEvent {
optional int32 irq = 1;
optional string name = 2;
optional uint32 handler = 3;
}
message IrqHandlerExitFtraceEvent {
optional int32 irq = 1;
optional int32 ret = 2;
}
// End of protos/perfetto/trace/ftrace/irq.proto
// Begin of protos/perfetto/trace/ftrace/kmem.proto
message AllocPagesIommuEndFtraceEvent {
optional uint32 gfp_flags = 1;
optional uint32 order = 2;
}
message AllocPagesIommuFailFtraceEvent {
optional uint32 gfp_flags = 1;
optional uint32 order = 2;
}
message AllocPagesIommuStartFtraceEvent {
optional uint32 gfp_flags = 1;
optional uint32 order = 2;
}
message AllocPagesSysEndFtraceEvent {
optional uint32 gfp_flags = 1;
optional uint32 order = 2;
}
message AllocPagesSysFailFtraceEvent {
optional uint32 gfp_flags = 1;
optional uint32 order = 2;
}
message AllocPagesSysStartFtraceEvent {
optional uint32 gfp_flags = 1;
optional uint32 order = 2;
}
message DmaAllocContiguousRetryFtraceEvent {
optional int32 tries = 1;
}
message IommuMapRangeFtraceEvent {
optional uint64 chunk_size = 1;
optional uint64 len = 2;
optional uint64 pa = 3;
optional uint64 va = 4;
}
message IommuSecPtblMapRangeEndFtraceEvent {
optional uint64 len = 1;
optional int32 num = 2;
optional uint32 pa = 3;
optional int32 sec_id = 4;
optional uint64 va = 5;
}
message IommuSecPtblMapRangeStartFtraceEvent {
optional uint64 len = 1;
optional int32 num = 2;
optional uint32 pa = 3;
optional int32 sec_id = 4;
optional uint64 va = 5;
}
message IonAllocBufferEndFtraceEvent {
optional string client_name = 1;
optional uint32 flags = 2;
optional string heap_name = 3;
optional uint64 len = 4;
optional uint32 mask = 5;
}
message IonAllocBufferFailFtraceEvent {
optional string client_name = 1;
optional int64 error = 2;
optional uint32 flags = 3;
optional string heap_name = 4;
optional uint64 len = 5;
optional uint32 mask = 6;
}
message IonAllocBufferFallbackFtraceEvent {
optional string client_name = 1;
optional int64 error = 2;
optional uint32 flags = 3;
optional string heap_name = 4;
optional uint64 len = 5;
optional uint32 mask = 6;
}
message IonAllocBufferStartFtraceEvent {
optional string client_name = 1;
optional uint32 flags = 2;
optional string heap_name = 3;
optional uint64 len = 4;
optional uint32 mask = 5;
}
message IonCpAllocRetryFtraceEvent {
optional int32 tries = 1;
}
message IonCpSecureBufferEndFtraceEvent {
optional uint64 align = 1;
optional uint64 flags = 2;
optional string heap_name = 3;
optional uint64 len = 4;
}
message IonCpSecureBufferStartFtraceEvent {
optional uint64 align = 1;
optional uint64 flags = 2;
optional string heap_name = 3;
optional uint64 len = 4;
}
message IonPrefetchingFtraceEvent {
optional uint64 len = 1;
}
message IonSecureCmaAddToPoolEndFtraceEvent {
optional uint32 is_prefetch = 1;
optional uint64 len = 2;
optional int32 pool_total = 3;
}
message IonSecureCmaAddToPoolStartFtraceEvent {
optional uint32 is_prefetch = 1;
optional uint64 len = 2;
optional int32 pool_total = 3;
}
message IonSecureCmaAllocateEndFtraceEvent {
optional uint64 align = 1;
optional uint64 flags = 2;
optional string heap_name = 3;
optional uint64 len = 4;
}
message IonSecureCmaAllocateStartFtraceEvent {
optional uint64 align = 1;
optional uint64 flags = 2;
optional string heap_name = 3;
optional uint64 len = 4;
}
message IonSecureCmaShrinkPoolEndFtraceEvent {
optional uint64 drained_size = 1;
optional uint64 skipped_size = 2;
}
message IonSecureCmaShrinkPoolStartFtraceEvent {
optional uint64 drained_size = 1;
optional uint64 skipped_size = 2;
}
message KfreeFtraceEvent {
optional uint64 call_site = 1;
optional uint64 ptr = 2;
}
message KmallocFtraceEvent {
optional uint64 bytes_alloc = 1;
optional uint64 bytes_req = 2;
optional uint64 call_site = 3;
optional uint32 gfp_flags = 4;
optional uint64 ptr = 5;
}
message KmallocNodeFtraceEvent {
optional uint64 bytes_alloc = 1;
optional uint64 bytes_req = 2;
optional uint64 call_site = 3;
optional uint32 gfp_flags = 4;
optional int32 node = 5;
optional uint64 ptr = 6;
}
message KmemCacheAllocFtraceEvent {
optional uint64 bytes_alloc = 1;
optional uint64 bytes_req = 2;
optional uint64 call_site = 3;
optional uint32 gfp_flags = 4;
optional uint64 ptr = 5;
}
message KmemCacheAllocNodeFtraceEvent {
optional uint64 bytes_alloc = 1;
optional uint64 bytes_req = 2;
optional uint64 call_site = 3;
optional uint32 gfp_flags = 4;
optional int32 node = 5;
optional uint64 ptr = 6;
}
message KmemCacheFreeFtraceEvent {
optional uint64 call_site = 1;
optional uint64 ptr = 2;
}
message MigratePagesEndFtraceEvent {
optional int32 mode = 1;
}
message MigratePagesStartFtraceEvent {
optional int32 mode = 1;
}
message MigrateRetryFtraceEvent {
optional int32 tries = 1;
}
message MmPageAllocFtraceEvent {
optional uint32 gfp_flags = 1;
optional int32 migratetype = 2;
optional uint32 order = 3;
optional uint64 page = 4;
optional uint64 pfn = 5;
}
message MmPageAllocExtfragFtraceEvent {
optional int32 alloc_migratetype = 1;
optional int32 alloc_order = 2;
optional int32 fallback_migratetype = 3;
optional int32 fallback_order = 4;
optional uint64 page = 5;
optional int32 change_ownership = 6;
optional uint64 pfn = 7;
}
message MmPageAllocZoneLockedFtraceEvent {
optional int32 migratetype = 1;
optional uint32 order = 2;
optional uint64 page = 3;
optional uint64 pfn = 4;
}
message MmPageFreeFtraceEvent {
optional uint32 order = 1;
optional uint64 page = 2;
optional uint64 pfn = 3;
}
message MmPageFreeBatchedFtraceEvent {
optional int32 cold = 1;
optional uint64 page = 2;
optional uint64 pfn = 3;
}
message MmPagePcpuDrainFtraceEvent {
optional int32 migratetype = 1;
optional uint32 order = 2;
optional uint64 page = 3;
optional uint64 pfn = 4;
}
message RssStatFtraceEvent {
optional int32 member = 1;
optional int64 size = 2;
optional uint32 curr = 3;
optional uint32 mm_id = 4;
}
message IonHeapShrinkFtraceEvent {
optional string heap_name = 1;
optional uint64 len = 2;
optional int64 total_allocated = 3;
}
message IonHeapGrowFtraceEvent {
optional string heap_name = 1;
optional uint64 len = 2;
optional int64 total_allocated = 3;
}
message IonBufferCreateFtraceEvent {
optional uint64 addr = 1;
optional uint64 len = 2;
}
message IonBufferDestroyFtraceEvent {
optional uint64 addr = 1;
optional uint64 len = 2;
}
// End of protos/perfetto/trace/ftrace/kmem.proto
// Begin of protos/perfetto/trace/ftrace/kvm.proto
message KvmAccessFaultFtraceEvent {
optional uint64 ipa = 1;
}
message KvmAckIrqFtraceEvent {
optional uint32 irqchip = 1;
optional uint32 pin = 2;
}
message KvmAgeHvaFtraceEvent {
optional uint64 end = 1;
optional uint64 start = 2;
}
message KvmAgePageFtraceEvent {
optional uint64 gfn = 1;
optional uint64 hva = 2;
optional uint32 level = 3;
optional uint32 referenced = 4;
}
message KvmArmClearDebugFtraceEvent {
optional uint32 guest_debug = 1;
}
message KvmArmSetDreg32FtraceEvent {
optional string name = 1;
optional uint32 value = 2;
}
message KvmArmSetRegsetFtraceEvent {
optional int32 len = 1;
optional string name = 2;
}
message KvmArmSetupDebugFtraceEvent {
optional uint32 guest_debug = 1;
optional uint64 vcpu = 2;
}
message KvmEntryFtraceEvent {
optional uint64 vcpu_pc = 1;
}
message KvmExitFtraceEvent {
optional uint32 esr_ec = 1;
optional int32 ret = 2;
optional uint64 vcpu_pc = 3;
}
message KvmFpuFtraceEvent {
optional uint32 load = 1;
}
message KvmGetTimerMapFtraceEvent {
optional int32 direct_ptimer = 1;
optional int32 direct_vtimer = 2;
optional int32 emul_ptimer = 3;
optional uint64 vcpu_id = 4;
}
message KvmGuestFaultFtraceEvent {
optional uint64 hsr = 1;
optional uint64 hxfar = 2;
optional uint64 ipa = 3;
optional uint64 vcpu_pc = 4;
}
message KvmHandleSysRegFtraceEvent {
optional uint64 hsr = 1;
}
message KvmHvcArm64FtraceEvent {
optional uint64 imm = 1;
optional uint64 r0 = 2;
optional uint64 vcpu_pc = 3;
}
message KvmIrqLineFtraceEvent {
optional int32 irq_num = 1;
optional int32 level = 2;
optional uint32 type = 3;
optional int32 vcpu_idx = 4;
}
message KvmMmioFtraceEvent {
optional uint64 gpa = 1;
optional uint32 len = 2;
optional uint32 type = 3;
optional uint64 val = 4;
}
message KvmMmioEmulateFtraceEvent {
optional uint64 cpsr = 1;
optional uint64 instr = 2;
optional uint64 vcpu_pc = 3;
}
message KvmSetGuestDebugFtraceEvent {
optional uint32 guest_debug = 1;
optional uint64 vcpu = 2;
}
message KvmSetIrqFtraceEvent {
optional uint32 gsi = 1;
optional int32 irq_source_id = 2;
optional int32 level = 3;
}
message KvmSetSpteHvaFtraceEvent {
optional uint64 hva = 1;
}
message KvmSetWayFlushFtraceEvent {
optional uint32 cache = 1;
optional uint64 vcpu_pc = 2;
}
message KvmSysAccessFtraceEvent {
optional uint32 CRm = 1;
optional uint32 CRn = 2;
optional uint32 Op0 = 3;
optional uint32 Op1 = 4;
optional uint32 Op2 = 5;
optional uint32 is_write = 6;
optional string name = 7;
optional uint64 vcpu_pc = 8;
}
message KvmTestAgeHvaFtraceEvent {
optional uint64 hva = 1;
}
message KvmTimerEmulateFtraceEvent {
optional uint32 should_fire = 1;
optional int32 timer_idx = 2;
}
message KvmTimerHrtimerExpireFtraceEvent {
optional int32 timer_idx = 1;
}
message KvmTimerRestoreStateFtraceEvent {
optional uint64 ctl = 1;
optional uint64 cval = 2;
optional int32 timer_idx = 3;
}
message KvmTimerSaveStateFtraceEvent {
optional uint64 ctl = 1;
optional uint64 cval = 2;
optional int32 timer_idx = 3;
}
message KvmTimerUpdateIrqFtraceEvent {
optional uint32 irq = 1;
optional int32 level = 2;
optional uint64 vcpu_id = 3;
}
message KvmToggleCacheFtraceEvent {
optional uint32 now = 1;
optional uint64 vcpu_pc = 2;
optional uint32 was = 3;
}
message KvmUnmapHvaRangeFtraceEvent {
optional uint64 end = 1;
optional uint64 start = 2;
}
message KvmUserspaceExitFtraceEvent {
optional uint32 reason = 1;
}
message KvmVcpuWakeupFtraceEvent {
optional uint64 ns = 1;
optional uint32 valid = 2;
optional uint32 waited = 3;
}
message KvmWfxArm64FtraceEvent {
optional uint32 is_wfe = 1;
optional uint64 vcpu_pc = 2;
}
message TrapRegFtraceEvent {
optional string fn = 1;
optional uint32 is_write = 2;
optional int32 reg = 3;
optional uint64 write_value = 4;
}
message VgicUpdateIrqPendingFtraceEvent {
optional uint32 irq = 1;
optional uint32 level = 2;
optional uint64 vcpu_id = 3;
}
// End of protos/perfetto/trace/ftrace/kvm.proto
// Begin of protos/perfetto/trace/ftrace/lowmemorykiller.proto
message LowmemoryKillFtraceEvent {
optional string comm = 1;
optional int32 pid = 2;
optional int64 pagecache_size = 3;
optional int64 pagecache_limit = 4;
optional int64 free = 5;
}
// End of protos/perfetto/trace/ftrace/lowmemorykiller.proto
// Begin of protos/perfetto/trace/ftrace/lwis.proto
message LwisTracingMarkWriteFtraceEvent {
optional string lwis_name = 1;
optional uint32 type = 2;
optional int32 pid = 3;
optional string func_name = 4;
optional int64 value = 5;
}
// End of protos/perfetto/trace/ftrace/lwis.proto
// Begin of protos/perfetto/trace/ftrace/mali.proto
message MaliTracingMarkWriteFtraceEvent {
optional string name = 1;
optional int32 pid = 2;
optional uint32 type = 3;
optional int32 value = 4;
}
message MaliMaliKCPUCQSSETFtraceEvent {
optional uint32 id = 1;
optional uint64 info_val1 = 2;
optional uint64 info_val2 = 3;
optional uint32 kctx_id = 4;
optional int32 kctx_tgid = 5;
}
message MaliMaliKCPUCQSWAITSTARTFtraceEvent {
optional uint32 id = 1;
optional uint64 info_val1 = 2;
optional uint64 info_val2 = 3;
optional uint32 kctx_id = 4;
optional int32 kctx_tgid = 5;
}
message MaliMaliKCPUCQSWAITENDFtraceEvent {
optional uint32 id = 1;
optional uint64 info_val1 = 2;
optional uint64 info_val2 = 3;
optional uint32 kctx_id = 4;
optional int32 kctx_tgid = 5;
}
message MaliMaliKCPUFENCESIGNALFtraceEvent {
optional uint64 info_val1 = 1;
optional uint64 info_val2 = 2;
optional int32 kctx_tgid = 3;
optional uint32 kctx_id = 4;
optional uint32 id = 5;
}
message MaliMaliKCPUFENCEWAITSTARTFtraceEvent {
optional uint64 info_val1 = 1;
optional uint64 info_val2 = 2;
optional int32 kctx_tgid = 3;
optional uint32 kctx_id = 4;
optional uint32 id = 5;
}
message MaliMaliKCPUFENCEWAITENDFtraceEvent {
optional uint64 info_val1 = 1;
optional uint64 info_val2 = 2;
optional int32 kctx_tgid = 3;
optional uint32 kctx_id = 4;
optional uint32 id = 5;
}
message MaliMaliCSFINTERRUPTSTARTFtraceEvent {
optional int32 kctx_tgid = 1;
optional uint32 kctx_id = 2;
optional uint64 info_val = 3;
}
message MaliMaliCSFINTERRUPTENDFtraceEvent {
optional int32 kctx_tgid = 1;
optional uint32 kctx_id = 2;
optional uint64 info_val = 3;
}
// End of protos/perfetto/trace/ftrace/mali.proto
// Begin of protos/perfetto/trace/ftrace/mdss.proto
message MdpCmdKickoffFtraceEvent {
optional uint32 ctl_num = 1;
optional int32 kickoff_cnt = 2;
}
message MdpCommitFtraceEvent {
optional uint32 num = 1;
optional uint32 play_cnt = 2;
optional uint32 clk_rate = 3;
optional uint64 bandwidth = 4;
}
message MdpPerfSetOtFtraceEvent {
optional uint32 pnum = 1;
optional uint32 xin_id = 2;
optional uint32 rd_lim = 3;
optional uint32 is_vbif_rt = 4;
}
message MdpSsppChangeFtraceEvent {
optional uint32 num = 1;
optional uint32 play_cnt = 2;
optional uint32 mixer = 3;
optional uint32 stage = 4;
optional uint32 flags = 5;
optional uint32 format = 6;
optional uint32 img_w = 7;
optional uint32 img_h = 8;
optional uint32 src_x = 9;
optional uint32 src_y = 10;
optional uint32 src_w = 11;
optional uint32 src_h = 12;
optional uint32 dst_x = 13;
optional uint32 dst_y = 14;
optional uint32 dst_w = 15;
optional uint32 dst_h = 16;
}
message TracingMarkWriteFtraceEvent {
optional int32 pid = 1;
optional string trace_name = 2;
optional uint32 trace_begin = 3;
}
message MdpCmdPingpongDoneFtraceEvent {
optional uint32 ctl_num = 1;
optional uint32 intf_num = 2;
optional uint32 pp_num = 3;
optional int32 koff_cnt = 4;
}
message MdpCompareBwFtraceEvent {
optional uint64 new_ab = 1;
optional uint64 new_ib = 2;
optional uint64 new_wb = 3;
optional uint64 old_ab = 4;
optional uint64 old_ib = 5;
optional uint64 old_wb = 6;
optional uint32 params_changed = 7;
optional uint32 update_bw = 8;
}
message MdpPerfSetPanicLutsFtraceEvent {
optional uint32 pnum = 1;
optional uint32 fmt = 2;
optional uint32 mode = 3;
optional uint32 panic_lut = 4;
optional uint32 robust_lut = 5;
}
message MdpSsppSetFtraceEvent {
optional uint32 num = 1;
optional uint32 play_cnt = 2;
optional uint32 mixer = 3;
optional uint32 stage = 4;
optional uint32 flags = 5;
optional uint32 format = 6;
optional uint32 img_w = 7;
optional uint32 img_h = 8;
optional uint32 src_x = 9;
optional uint32 src_y = 10;
optional uint32 src_w = 11;
optional uint32 src_h = 12;
optional uint32 dst_x = 13;
optional uint32 dst_y = 14;
optional uint32 dst_w = 15;
optional uint32 dst_h = 16;
}
message MdpCmdReadptrDoneFtraceEvent {
optional uint32 ctl_num = 1;
optional int32 koff_cnt = 2;
}
message MdpMisrCrcFtraceEvent {
optional uint32 block_id = 1;
optional uint32 vsync_cnt = 2;
optional uint32 crc = 3;
}
message MdpPerfSetQosLutsFtraceEvent {
optional uint32 pnum = 1;
optional uint32 fmt = 2;
optional uint32 intf = 3;
optional uint32 rot = 4;
optional uint32 fl = 5;
optional uint32 lut = 6;
optional uint32 linear = 7;
}
message MdpTraceCounterFtraceEvent {
optional int32 pid = 1;
optional string counter_name = 2;
optional int32 value = 3;
}
message MdpCmdReleaseBwFtraceEvent {
optional uint32 ctl_num = 1;
}
message MdpMixerUpdateFtraceEvent {
optional uint32 mixer_num = 1;
}
message MdpPerfSetWmLevelsFtraceEvent {
optional uint32 pnum = 1;
optional uint32 use_space = 2;
optional uint32 priority_bytes = 3;
optional uint32 wm0 = 4;
optional uint32 wm1 = 5;
optional uint32 wm2 = 6;
optional uint32 mb_cnt = 7;
optional uint32 mb_size = 8;
}
message MdpVideoUnderrunDoneFtraceEvent {
optional uint32 ctl_num = 1;
optional uint32 underrun_cnt = 2;
}
message MdpCmdWaitPingpongFtraceEvent {
optional uint32 ctl_num = 1;
optional int32 kickoff_cnt = 2;
}
message MdpPerfPrefillCalcFtraceEvent {
optional uint32 pnum = 1;
optional uint32 latency_buf = 2;
optional uint32 ot = 3;
optional uint32 y_buf = 4;
optional uint32 y_scaler = 5;
optional uint32 pp_lines = 6;
optional uint32 pp_bytes = 7;
optional uint32 post_sc = 8;
optional uint32 fbc_bytes = 9;
optional uint32 prefill_bytes = 10;
}
message MdpPerfUpdateBusFtraceEvent {
optional int32 client = 1;
optional uint64 ab_quota = 2;
optional uint64 ib_quota = 3;
}
message RotatorBwAoAsContextFtraceEvent {
optional uint32 state = 1;
}
// End of protos/perfetto/trace/ftrace/mdss.proto
// Begin of protos/perfetto/trace/ftrace/mm_event.proto
message MmEventRecordFtraceEvent {
optional uint32 avg_lat = 1;
optional uint32 count = 2;
optional uint32 max_lat = 3;
optional uint32 type = 4;
}
// End of protos/perfetto/trace/ftrace/mm_event.proto
// Begin of protos/perfetto/trace/ftrace/net.proto
message NetifReceiveSkbFtraceEvent {
optional uint32 len = 1;
optional string name = 2;
optional uint64 skbaddr = 3;
}
message NetDevXmitFtraceEvent {
optional uint32 len = 1;
optional string name = 2;
optional int32 rc = 3;
optional uint64 skbaddr = 4;
}
message NapiGroReceiveEntryFtraceEvent {
optional uint32 data_len = 1;
optional uint32 gso_size = 2;
optional uint32 gso_type = 3;
optional uint32 hash = 4;
optional uint32 ip_summed = 5;
optional uint32 l4_hash = 6;
optional uint32 len = 7;
optional int32 mac_header = 8;
optional uint32 mac_header_valid = 9;
optional string name = 10;
optional uint32 napi_id = 11;
optional uint32 nr_frags = 12;
optional uint32 protocol = 13;
optional uint32 queue_mapping = 14;
optional uint64 skbaddr = 15;
optional uint32 truesize = 16;
optional uint32 vlan_proto = 17;
optional uint32 vlan_tagged = 18;
optional uint32 vlan_tci = 19;
}
message NapiGroReceiveExitFtraceEvent {
optional int32 ret = 1;
}
// End of protos/perfetto/trace/ftrace/net.proto
// Begin of protos/perfetto/trace/ftrace/oom.proto
message OomScoreAdjUpdateFtraceEvent {
optional string comm = 1;
optional int32 oom_score_adj = 2;
optional int32 pid = 3;
}
message MarkVictimFtraceEvent {
optional int32 pid = 1;
}
// End of protos/perfetto/trace/ftrace/oom.proto
// Begin of protos/perfetto/trace/ftrace/panel.proto
message DsiCmdFifoStatusFtraceEvent {
optional uint32 header = 1;
optional uint32 payload = 2;
}
message DsiRxFtraceEvent {
optional uint32 cmd = 1;
optional uint32 rx_buf = 2;
}
message DsiTxFtraceEvent {
optional uint32 last = 1;
optional uint32 tx_buf = 2;
optional uint32 type = 3;
}
// End of protos/perfetto/trace/ftrace/panel.proto
// Begin of protos/perfetto/trace/ftrace/power.proto
message CpuFrequencyFtraceEvent {
optional uint32 state = 1;
optional uint32 cpu_id = 2;
}
message CpuFrequencyLimitsFtraceEvent {
optional uint32 min_freq = 1;
optional uint32 max_freq = 2;
optional uint32 cpu_id = 3;
}
message CpuIdleFtraceEvent {
optional uint32 state = 1;
optional uint32 cpu_id = 2;
}
message ClockEnableFtraceEvent {
optional string name = 1;
optional uint64 state = 2;
optional uint64 cpu_id = 3;
}
message ClockDisableFtraceEvent {
optional string name = 1;
optional uint64 state = 2;
optional uint64 cpu_id = 3;
}
message ClockSetRateFtraceEvent {
optional string name = 1;
optional uint64 state = 2;
optional uint64 cpu_id = 3;
}
message SuspendResumeFtraceEvent {
optional string action = 1;
optional int32 val = 2;
optional uint32 start = 3;
}
message GpuFrequencyFtraceEvent {
optional uint32 gpu_id = 1;
optional uint32 state = 2;
}
message WakeupSourceActivateFtraceEvent {
optional string name = 1;
optional uint64 state = 2;
}
message WakeupSourceDeactivateFtraceEvent {
optional string name = 1;
optional uint64 state = 2;
}
// End of protos/perfetto/trace/ftrace/power.proto
// Begin of protos/perfetto/trace/ftrace/printk.proto
message ConsoleFtraceEvent {
optional string msg = 1;
}
// End of protos/perfetto/trace/ftrace/printk.proto
// Begin of protos/perfetto/trace/ftrace/raw_syscalls.proto
message SysEnterFtraceEvent {
optional int64 id = 1;
repeated uint64 args = 2;
}
message SysExitFtraceEvent {
optional int64 id = 1;
optional int64 ret = 2;
}
// End of protos/perfetto/trace/ftrace/raw_syscalls.proto
// Begin of protos/perfetto/trace/ftrace/regulator.proto
message RegulatorDisableFtraceEvent {
optional string name = 1;
}
message RegulatorDisableCompleteFtraceEvent {
optional string name = 1;
}
message RegulatorEnableFtraceEvent {
optional string name = 1;
}
message RegulatorEnableCompleteFtraceEvent {
optional string name = 1;
}
message RegulatorEnableDelayFtraceEvent {
optional string name = 1;
}
message RegulatorSetVoltageFtraceEvent {
optional string name = 1;
optional int32 min = 2;
optional int32 max = 3;
}
message RegulatorSetVoltageCompleteFtraceEvent {
optional string name = 1;
optional uint32 val = 2;
}
// End of protos/perfetto/trace/ftrace/regulator.proto
// Begin of protos/perfetto/trace/ftrace/samsung.proto
message SamsungTracingMarkWriteFtraceEvent {
optional int32 pid = 1;
optional string trace_name = 2;
optional uint32 trace_begin = 3;
optional uint32 trace_type = 4;
optional int32 value = 5;
}
// End of protos/perfetto/trace/ftrace/samsung.proto
// Begin of protos/perfetto/trace/ftrace/sched.proto
message SchedSwitchFtraceEvent {
optional string prev_comm = 1;
optional int32 prev_pid = 2;
optional int32 prev_prio = 3;
optional int64 prev_state = 4;
optional string next_comm = 5;
optional int32 next_pid = 6;
optional int32 next_prio = 7;
}
message SchedWakeupFtraceEvent {
optional string comm = 1;
optional int32 pid = 2;
optional int32 prio = 3;
optional int32 success = 4;
optional int32 target_cpu = 5;
}
message SchedBlockedReasonFtraceEvent {
optional int32 pid = 1;
optional uint64 caller = 2;
optional uint32 io_wait = 3;
}
message SchedCpuHotplugFtraceEvent {
optional int32 affected_cpu = 1;
optional int32 error = 2;
optional int32 status = 3;
}
message SchedWakingFtraceEvent {
optional string comm = 1;
optional int32 pid = 2;
optional int32 prio = 3;
optional int32 success = 4;
optional int32 target_cpu = 5;
}
message SchedWakeupNewFtraceEvent {
optional string comm = 1;
optional int32 pid = 2;
optional int32 prio = 3;
optional int32 success = 4;
optional int32 target_cpu = 5;
}
message SchedProcessExecFtraceEvent {
optional string filename = 1;
optional int32 pid = 2;
optional int32 old_pid = 3;
}
message SchedProcessExitFtraceEvent {
optional string comm = 1;
optional int32 pid = 2;
optional int32 tgid = 3;
optional int32 prio = 4;
}
message SchedProcessForkFtraceEvent {
optional string parent_comm = 1;
optional int32 parent_pid = 2;
optional string child_comm = 3;
optional int32 child_pid = 4;
}
message SchedProcessFreeFtraceEvent {
optional string comm = 1;
optional int32 pid = 2;
optional int32 prio = 3;
}
message SchedProcessHangFtraceEvent {
optional string comm = 1;
optional int32 pid = 2;
}
message SchedProcessWaitFtraceEvent {
optional string comm = 1;
optional int32 pid = 2;
optional int32 prio = 3;
}
message SchedPiSetprioFtraceEvent {
optional string comm = 1;
optional int32 newprio = 2;
optional int32 oldprio = 3;
optional int32 pid = 4;
}
message SchedCpuUtilCfsFtraceEvent {
optional int32 active = 1;
optional uint64 capacity = 2;
optional uint64 capacity_orig = 3;
optional uint32 cpu = 4;
optional uint64 cpu_importance = 5;
optional uint64 cpu_util = 6;
optional uint32 exit_lat = 7;
optional uint64 group_capacity = 8;
optional uint32 grp_overutilized = 9;
optional uint32 idle_cpu = 10;
optional uint32 nr_running = 11;
optional int64 spare_cap = 12;
optional uint32 task_fits = 13;
optional uint64 wake_group_util = 14;
optional uint64 wake_util = 15;
}
// End of protos/perfetto/trace/ftrace/sched.proto
// Begin of protos/perfetto/trace/ftrace/scm.proto
message ScmCallStartFtraceEvent {
optional uint32 arginfo = 1;
optional uint64 x0 = 2;
optional uint64 x5 = 3;
}
message ScmCallEndFtraceEvent {}
// End of protos/perfetto/trace/ftrace/scm.proto
// Begin of protos/perfetto/trace/ftrace/sde.proto
message SdeTracingMarkWriteFtraceEvent {
optional int32 pid = 1;
optional string trace_name = 2;
optional uint32 trace_type = 3;
optional int32 value = 4;
optional uint32 trace_begin = 5;
}
message SdeSdeEvtlogFtraceEvent {
optional string evtlog_tag = 1;
optional int32 pid = 2;
optional uint32 tag_id = 3;
}
message SdeSdePerfCalcCrtcFtraceEvent {
optional uint64 bw_ctl_ebi = 1;
optional uint64 bw_ctl_llcc = 2;
optional uint64 bw_ctl_mnoc = 3;
optional uint32 core_clk_rate = 4;
optional uint32 crtc = 5;
optional uint64 ib_ebi = 6;
optional uint64 ib_llcc = 7;
optional uint64 ib_mnoc = 8;
}
message SdeSdePerfCrtcUpdateFtraceEvent {
optional uint64 bw_ctl_ebi = 1;
optional uint64 bw_ctl_llcc = 2;
optional uint64 bw_ctl_mnoc = 3;
optional uint32 core_clk_rate = 4;
optional uint32 crtc = 5;
optional int32 params = 6;
optional uint64 per_pipe_ib_ebi = 7;
optional uint64 per_pipe_ib_llcc = 8;
optional uint64 per_pipe_ib_mnoc = 9;
optional uint32 stop_req = 10;
optional uint32 update_bus = 11;
optional uint32 update_clk = 12;
}
message SdeSdePerfSetQosLutsFtraceEvent {
optional uint32 fl = 1;
optional uint32 fmt = 2;
optional uint64 lut = 3;
optional uint32 lut_usage = 4;
optional uint32 pnum = 5;
optional uint32 rt = 6;
}
message SdeSdePerfUpdateBusFtraceEvent {
optional uint64 ab_quota = 1;
optional uint32 bus_id = 2;
optional int32 client = 3;
optional uint64 ib_quota = 4;
}
// End of protos/perfetto/trace/ftrace/sde.proto
// Begin of protos/perfetto/trace/ftrace/signal.proto
message SignalDeliverFtraceEvent {
optional int32 code = 1;
optional uint64 sa_flags = 2;
optional int32 sig = 3;
}
message SignalGenerateFtraceEvent {
optional int32 code = 1;
optional string comm = 2;
optional int32 group = 3;
optional int32 pid = 4;
optional int32 result = 5;
optional int32 sig = 6;
}
// End of protos/perfetto/trace/ftrace/signal.proto
// Begin of protos/perfetto/trace/ftrace/skb.proto
message KfreeSkbFtraceEvent {
optional uint64 location = 1;
optional uint32 protocol = 2;
optional uint64 skbaddr = 3;
}
// End of protos/perfetto/trace/ftrace/skb.proto
// Begin of protos/perfetto/trace/ftrace/sock.proto
message InetSockSetStateFtraceEvent {
optional uint32 daddr = 1;
optional uint32 dport = 2;
optional uint32 family = 3;
optional int32 newstate = 4;
optional int32 oldstate = 5;
optional uint32 protocol = 6;
optional uint32 saddr = 7;
optional uint64 skaddr = 8;
optional uint32 sport = 9;
}
// End of protos/perfetto/trace/ftrace/sock.proto
// Begin of protos/perfetto/trace/ftrace/sync.proto
message SyncPtFtraceEvent {
optional string timeline = 1;
optional string value = 2;
}
message SyncTimelineFtraceEvent {
optional string name = 1;
optional string value = 2;
}
message SyncWaitFtraceEvent {
optional string name = 1;
optional int32 status = 2;
optional uint32 begin = 3;
}
// End of protos/perfetto/trace/ftrace/sync.proto
// Begin of protos/perfetto/trace/ftrace/synthetic.proto
message RssStatThrottledFtraceEvent {
optional uint32 curr = 1;
optional int32 member = 2;
optional uint32 mm_id = 3;
optional int64 size = 4;
}
message SuspendResumeMinimalFtraceEvent {
optional uint32 start = 1;
}
// End of protos/perfetto/trace/ftrace/synthetic.proto
// Begin of protos/perfetto/trace/ftrace/systrace.proto
message ZeroFtraceEvent {
optional int32 flag = 1;
optional string name = 2;
optional int32 pid = 3;
optional int64 value = 4;
}
// End of protos/perfetto/trace/ftrace/systrace.proto
// Begin of protos/perfetto/trace/ftrace/task.proto
message TaskNewtaskFtraceEvent {
optional int32 pid = 1;
optional string comm = 2;
optional uint64 clone_flags = 3;
optional int32 oom_score_adj = 4;
}
message TaskRenameFtraceEvent {
optional int32 pid = 1;
optional string oldcomm = 2;
optional string newcomm = 3;
optional int32 oom_score_adj = 4;
}
// End of protos/perfetto/trace/ftrace/task.proto
// Begin of protos/perfetto/trace/ftrace/tcp.proto
message TcpRetransmitSkbFtraceEvent {
optional uint32 daddr = 1;
optional uint32 dport = 2;
optional uint32 saddr = 3;
optional uint64 skaddr = 4;
optional uint64 skbaddr = 5;
optional uint32 sport = 6;
optional int32 state = 7;
}
// End of protos/perfetto/trace/ftrace/tcp.proto
// Begin of protos/perfetto/trace/ftrace/thermal.proto
message ThermalTemperatureFtraceEvent {
optional int32 id = 1;
optional int32 temp = 2;
optional int32 temp_prev = 3;
optional string thermal_zone = 4;
}
message CdevUpdateFtraceEvent {
optional uint64 target = 1;
optional string type = 2;
}
// End of protos/perfetto/trace/ftrace/thermal.proto
// Begin of protos/perfetto/trace/ftrace/trusty.proto
message TrustySmcFtraceEvent {
optional uint64 r0 = 1;
optional uint64 r1 = 2;
optional uint64 r2 = 3;
optional uint64 r3 = 4;
}
message TrustySmcDoneFtraceEvent {
optional uint64 ret = 1;
}
message TrustyStdCall32FtraceEvent {
optional uint64 r0 = 1;
optional uint64 r1 = 2;
optional uint64 r2 = 3;
optional uint64 r3 = 4;
}
message TrustyStdCall32DoneFtraceEvent {
optional int64 ret = 1;
}
message TrustyShareMemoryFtraceEvent {
optional uint64 len = 1;
optional uint32 lend = 2;
optional uint32 nents = 3;
}
message TrustyShareMemoryDoneFtraceEvent {
optional uint64 handle = 1;
optional uint64 len = 2;
optional uint32 lend = 3;
optional uint32 nents = 4;
optional int32 ret = 5;
}
message TrustyReclaimMemoryFtraceEvent {
optional uint64 id = 1;
}
message TrustyReclaimMemoryDoneFtraceEvent {
optional uint64 id = 1;
optional int32 ret = 2;
}
message TrustyIrqFtraceEvent {
optional int32 irq = 1;
}
message TrustyIpcHandleEventFtraceEvent {
optional uint32 chan = 1;
optional uint32 event_id = 2;
optional string srv_name = 3;
}
message TrustyIpcConnectFtraceEvent {
optional uint32 chan = 1;
optional string port = 2;
optional int32 state = 3;
}
message TrustyIpcConnectEndFtraceEvent {
optional uint32 chan = 1;
optional int32 err = 2;
optional int32 state = 3;
}
message TrustyIpcWriteFtraceEvent {
optional uint64 buf_id = 1;
optional uint32 chan = 2;
optional int32 kind_shm = 3;
optional int32 len_or_err = 4;
optional uint64 shm_cnt = 5;
optional string srv_name = 6;
}
message TrustyIpcPollFtraceEvent {
optional uint32 chan = 1;
optional uint32 poll_mask = 2;
optional string srv_name = 3;
}
message TrustyIpcReadFtraceEvent {
optional uint32 chan = 1;
optional string srv_name = 2;
}
message TrustyIpcReadEndFtraceEvent {
optional uint64 buf_id = 1;
optional uint32 chan = 2;
optional int32 len_or_err = 3;
optional uint64 shm_cnt = 4;
optional string srv_name = 5;
}
message TrustyIpcRxFtraceEvent {
optional uint64 buf_id = 1;
optional uint32 chan = 2;
optional string srv_name = 3;
}
message TrustyEnqueueNopFtraceEvent {
optional uint32 arg1 = 1;
optional uint32 arg2 = 2;
optional uint32 arg3 = 3;
}
// End of protos/perfetto/trace/ftrace/trusty.proto
// Begin of protos/perfetto/trace/ftrace/ufs.proto
message UfshcdCommandFtraceEvent {
optional string dev_name = 1;
optional uint32 doorbell = 2;
optional uint32 intr = 3;
optional uint64 lba = 4;
optional uint32 opcode = 5;
optional string str = 6;
optional uint32 tag = 7;
optional int32 transfer_len = 8;
optional uint32 group_id = 9;
optional uint32 str_t = 10;
}
message UfshcdClkGatingFtraceEvent {
optional string dev_name = 1;
optional int32 state = 2;
}
// End of protos/perfetto/trace/ftrace/ufs.proto
// Begin of protos/perfetto/trace/ftrace/v4l2.proto
message V4l2QbufFtraceEvent {
optional uint32 bytesused = 1;
optional uint32 field = 2;
optional uint32 flags = 3;
optional uint32 index = 4;
optional int32 minor = 5;
optional uint32 sequence = 6;
optional uint32 timecode_flags = 7;
optional uint32 timecode_frames = 8;
optional uint32 timecode_hours = 9;
optional uint32 timecode_minutes = 10;
optional uint32 timecode_seconds = 11;
optional uint32 timecode_type = 12;
optional uint32 timecode_userbits0 = 13;
optional uint32 timecode_userbits1 = 14;
optional uint32 timecode_userbits2 = 15;
optional uint32 timecode_userbits3 = 16;
optional int64 timestamp = 17;
optional uint32 type = 18;
}
message V4l2DqbufFtraceEvent {
optional uint32 bytesused = 1;
optional uint32 field = 2;
optional uint32 flags = 3;
optional uint32 index = 4;
optional int32 minor = 5;
optional uint32 sequence = 6;
optional uint32 timecode_flags = 7;
optional uint32 timecode_frames = 8;
optional uint32 timecode_hours = 9;
optional uint32 timecode_minutes = 10;
optional uint32 timecode_seconds = 11;
optional uint32 timecode_type = 12;
optional uint32 timecode_userbits0 = 13;
optional uint32 timecode_userbits1 = 14;
optional uint32 timecode_userbits2 = 15;
optional uint32 timecode_userbits3 = 16;
optional int64 timestamp = 17;
optional uint32 type = 18;
}
message Vb2V4l2BufQueueFtraceEvent {
optional uint32 field = 1;
optional uint32 flags = 2;
optional int32 minor = 3;
optional uint32 sequence = 4;
optional uint32 timecode_flags = 5;
optional uint32 timecode_frames = 6;
optional uint32 timecode_hours = 7;
optional uint32 timecode_minutes = 8;
optional uint32 timecode_seconds = 9;
optional uint32 timecode_type = 10;
optional uint32 timecode_userbits0 = 11;
optional uint32 timecode_userbits1 = 12;
optional uint32 timecode_userbits2 = 13;
optional uint32 timecode_userbits3 = 14;
optional int64 timestamp = 15;
}
message Vb2V4l2BufDoneFtraceEvent {
optional uint32 field = 1;
optional uint32 flags = 2;
optional int32 minor = 3;
optional uint32 sequence = 4;
optional uint32 timecode_flags = 5;
optional uint32 timecode_frames = 6;
optional uint32 timecode_hours = 7;
optional uint32 timecode_minutes = 8;
optional uint32 timecode_seconds = 9;
optional uint32 timecode_type = 10;
optional uint32 timecode_userbits0 = 11;
optional uint32 timecode_userbits1 = 12;
optional uint32 timecode_userbits2 = 13;
optional uint32 timecode_userbits3 = 14;
optional int64 timestamp = 15;
}
message Vb2V4l2QbufFtraceEvent {
optional uint32 field = 1;
optional uint32 flags = 2;
optional int32 minor = 3;
optional uint32 sequence = 4;
optional uint32 timecode_flags = 5;
optional uint32 timecode_frames = 6;
optional uint32 timecode_hours = 7;
optional uint32 timecode_minutes = 8;
optional uint32 timecode_seconds = 9;
optional uint32 timecode_type = 10;
optional uint32 timecode_userbits0 = 11;
optional uint32 timecode_userbits1 = 12;
optional uint32 timecode_userbits2 = 13;
optional uint32 timecode_userbits3 = 14;
optional int64 timestamp = 15;
}
message Vb2V4l2DqbufFtraceEvent {
optional uint32 field = 1;
optional uint32 flags = 2;
optional int32 minor = 3;
optional uint32 sequence = 4;
optional uint32 timecode_flags = 5;
optional uint32 timecode_frames = 6;
optional uint32 timecode_hours = 7;
optional uint32 timecode_minutes = 8;
optional uint32 timecode_seconds = 9;
optional uint32 timecode_type = 10;
optional uint32 timecode_userbits0 = 11;
optional uint32 timecode_userbits1 = 12;
optional uint32 timecode_userbits2 = 13;
optional uint32 timecode_userbits3 = 14;
optional int64 timestamp = 15;
}
// End of protos/perfetto/trace/ftrace/v4l2.proto
// Begin of protos/perfetto/trace/ftrace/virtio_gpu.proto
message VirtioGpuCmdQueueFtraceEvent {
optional uint32 ctx_id = 1;
optional int32 dev = 2;
optional uint64 fence_id = 3;
optional uint32 flags = 4;
optional string name = 5;
optional uint32 num_free = 6;
optional uint32 seqno = 7;
optional uint32 type = 8;
optional uint32 vq = 9;
}
message VirtioGpuCmdResponseFtraceEvent {
optional uint32 ctx_id = 1;
optional int32 dev = 2;
optional uint64 fence_id = 3;
optional uint32 flags = 4;
optional string name = 5;
optional uint32 num_free = 6;
optional uint32 seqno = 7;
optional uint32 type = 8;
optional uint32 vq = 9;
}
// End of protos/perfetto/trace/ftrace/virtio_gpu.proto
// Begin of protos/perfetto/trace/ftrace/virtio_video.proto
message VirtioVideoCmdFtraceEvent {
optional uint32 stream_id = 1;
optional uint32 type = 2;
}
message VirtioVideoCmdDoneFtraceEvent {
optional uint32 stream_id = 1;
optional uint32 type = 2;
}
message VirtioVideoResourceQueueFtraceEvent {
optional uint32 data_size0 = 1;
optional uint32 data_size1 = 2;
optional uint32 data_size2 = 3;
optional uint32 data_size3 = 4;
optional uint32 queue_type = 5;
optional int32 resource_id = 6;
optional int32 stream_id = 7;
optional uint64 timestamp = 8;
}
message VirtioVideoResourceQueueDoneFtraceEvent {
optional uint32 data_size0 = 1;
optional uint32 data_size1 = 2;
optional uint32 data_size2 = 3;
optional uint32 data_size3 = 4;
optional uint32 queue_type = 5;
optional int32 resource_id = 6;
optional int32 stream_id = 7;
optional uint64 timestamp = 8;
}
// End of protos/perfetto/trace/ftrace/virtio_video.proto
// Begin of protos/perfetto/trace/ftrace/vmscan.proto
message MmVmscanDirectReclaimBeginFtraceEvent {
optional int32 order = 1;
optional int32 may_writepage = 2;
optional uint32 gfp_flags = 3;
}
message MmVmscanDirectReclaimEndFtraceEvent {
optional uint64 nr_reclaimed = 1;
}
message MmVmscanKswapdWakeFtraceEvent {
optional int32 nid = 1;
optional int32 order = 2;
optional int32 zid = 3;
}
message MmVmscanKswapdSleepFtraceEvent {
optional int32 nid = 1;
}
message MmShrinkSlabStartFtraceEvent {
optional uint64 cache_items = 1;
optional uint64 delta = 2;
optional uint32 gfp_flags = 3;
optional uint64 lru_pgs = 4;
optional int64 nr_objects_to_shrink = 5;
optional uint64 pgs_scanned = 6;
optional uint64 shr = 7;
optional uint64 shrink = 8;
optional uint64 total_scan = 9;
optional int32 nid = 10;
optional int32 priority = 11;
}
message MmShrinkSlabEndFtraceEvent {
optional int64 new_scan = 1;
optional int32 retval = 2;
optional uint64 shr = 3;
optional uint64 shrink = 4;
optional int64 total_scan = 5;
optional int64 unused_scan = 6;
optional int32 nid = 7;
}
// End of protos/perfetto/trace/ftrace/vmscan.proto
// Begin of protos/perfetto/trace/ftrace/workqueue.proto
message WorkqueueActivateWorkFtraceEvent {
optional uint64 work = 1;
}
message WorkqueueExecuteEndFtraceEvent {
optional uint64 work = 1;
optional uint64 function = 2;
}
message WorkqueueExecuteStartFtraceEvent {
optional uint64 work = 1;
optional uint64 function = 2;
}
message WorkqueueQueueWorkFtraceEvent {
optional uint64 work = 1;
optional uint64 function = 2;
optional uint64 workqueue = 3;
optional uint32 req_cpu = 4;
optional uint32 cpu = 5;
}
// End of protos/perfetto/trace/ftrace/workqueue.proto
// Begin of protos/perfetto/trace/ftrace/ftrace_event.proto
message FtraceEvent {
// Timestamp in nanoseconds using .../tracing/trace_clock.
optional uint64 timestamp = 1;
// Kernel pid (do not confuse with userspace pid aka tgid).
optional uint32 pid = 2;
// Not populated in actual traces. Wire format might change.
// Placeholder declaration so that the ftrace parsing code accepts the
// existence of this common field. If this becomes needed for all events:
// consider merging with common_preempt_count to avoid extra proto tags.
optional uint32 common_flags = 5;
oneof event {
PrintFtraceEvent print = 3;
SchedSwitchFtraceEvent sched_switch = 4;
// removed field with id 5;
// removed field with id 6;
// removed field with id 7;
// removed field with id 8;
// removed field with id 9;
// removed field with id 10;
CpuFrequencyFtraceEvent cpu_frequency = 11;
CpuFrequencyLimitsFtraceEvent cpu_frequency_limits = 12;
CpuIdleFtraceEvent cpu_idle = 13;
ClockEnableFtraceEvent clock_enable = 14;
ClockDisableFtraceEvent clock_disable = 15;
ClockSetRateFtraceEvent clock_set_rate = 16;
SchedWakeupFtraceEvent sched_wakeup = 17;
SchedBlockedReasonFtraceEvent sched_blocked_reason = 18;
SchedCpuHotplugFtraceEvent sched_cpu_hotplug = 19;
SchedWakingFtraceEvent sched_waking = 20;
IpiEntryFtraceEvent ipi_entry = 21;
IpiExitFtraceEvent ipi_exit = 22;
IpiRaiseFtraceEvent ipi_raise = 23;
SoftirqEntryFtraceEvent softirq_entry = 24;
SoftirqExitFtraceEvent softirq_exit = 25;
SoftirqRaiseFtraceEvent softirq_raise = 26;
I2cReadFtraceEvent i2c_read = 27;
I2cWriteFtraceEvent i2c_write = 28;
I2cResultFtraceEvent i2c_result = 29;
I2cReplyFtraceEvent i2c_reply = 30;
SmbusReadFtraceEvent smbus_read = 31;
SmbusWriteFtraceEvent smbus_write = 32;
SmbusResultFtraceEvent smbus_result = 33;
SmbusReplyFtraceEvent smbus_reply = 34;
LowmemoryKillFtraceEvent lowmemory_kill = 35;
IrqHandlerEntryFtraceEvent irq_handler_entry = 36;
IrqHandlerExitFtraceEvent irq_handler_exit = 37;
SyncPtFtraceEvent sync_pt = 38;
SyncTimelineFtraceEvent sync_timeline = 39;
SyncWaitFtraceEvent sync_wait = 40;
Ext4DaWriteBeginFtraceEvent ext4_da_write_begin = 41;
Ext4DaWriteEndFtraceEvent ext4_da_write_end = 42;
Ext4SyncFileEnterFtraceEvent ext4_sync_file_enter = 43;
Ext4SyncFileExitFtraceEvent ext4_sync_file_exit = 44;
BlockRqIssueFtraceEvent block_rq_issue = 45;
MmVmscanDirectReclaimBeginFtraceEvent mm_vmscan_direct_reclaim_begin = 46;
MmVmscanDirectReclaimEndFtraceEvent mm_vmscan_direct_reclaim_end = 47;
MmVmscanKswapdWakeFtraceEvent mm_vmscan_kswapd_wake = 48;
MmVmscanKswapdSleepFtraceEvent mm_vmscan_kswapd_sleep = 49;
BinderTransactionFtraceEvent binder_transaction = 50;
BinderTransactionReceivedFtraceEvent binder_transaction_received = 51;
BinderSetPriorityFtraceEvent binder_set_priority = 52;
BinderLockFtraceEvent binder_lock = 53;
BinderLockedFtraceEvent binder_locked = 54;
BinderUnlockFtraceEvent binder_unlock = 55;
WorkqueueActivateWorkFtraceEvent workqueue_activate_work = 56;
WorkqueueExecuteEndFtraceEvent workqueue_execute_end = 57;
WorkqueueExecuteStartFtraceEvent workqueue_execute_start = 58;
WorkqueueQueueWorkFtraceEvent workqueue_queue_work = 59;
RegulatorDisableFtraceEvent regulator_disable = 60;
RegulatorDisableCompleteFtraceEvent regulator_disable_complete = 61;
RegulatorEnableFtraceEvent regulator_enable = 62;
RegulatorEnableCompleteFtraceEvent regulator_enable_complete = 63;
RegulatorEnableDelayFtraceEvent regulator_enable_delay = 64;
RegulatorSetVoltageFtraceEvent regulator_set_voltage = 65;
RegulatorSetVoltageCompleteFtraceEvent regulator_set_voltage_complete = 66;
CgroupAttachTaskFtraceEvent cgroup_attach_task = 67;
CgroupMkdirFtraceEvent cgroup_mkdir = 68;
CgroupRemountFtraceEvent cgroup_remount = 69;
CgroupRmdirFtraceEvent cgroup_rmdir = 70;
CgroupTransferTasksFtraceEvent cgroup_transfer_tasks = 71;
CgroupDestroyRootFtraceEvent cgroup_destroy_root = 72;
CgroupReleaseFtraceEvent cgroup_release = 73;
CgroupRenameFtraceEvent cgroup_rename = 74;
CgroupSetupRootFtraceEvent cgroup_setup_root = 75;
MdpCmdKickoffFtraceEvent mdp_cmd_kickoff = 76;
MdpCommitFtraceEvent mdp_commit = 77;
MdpPerfSetOtFtraceEvent mdp_perf_set_ot = 78;
MdpSsppChangeFtraceEvent mdp_sspp_change = 79;
TracingMarkWriteFtraceEvent tracing_mark_write = 80;
MdpCmdPingpongDoneFtraceEvent mdp_cmd_pingpong_done = 81;
MdpCompareBwFtraceEvent mdp_compare_bw = 82;
MdpPerfSetPanicLutsFtraceEvent mdp_perf_set_panic_luts = 83;
MdpSsppSetFtraceEvent mdp_sspp_set = 84;
MdpCmdReadptrDoneFtraceEvent mdp_cmd_readptr_done = 85;
MdpMisrCrcFtraceEvent mdp_misr_crc = 86;
MdpPerfSetQosLutsFtraceEvent mdp_perf_set_qos_luts = 87;
MdpTraceCounterFtraceEvent mdp_trace_counter = 88;
MdpCmdReleaseBwFtraceEvent mdp_cmd_release_bw = 89;
MdpMixerUpdateFtraceEvent mdp_mixer_update = 90;
MdpPerfSetWmLevelsFtraceEvent mdp_perf_set_wm_levels = 91;
MdpVideoUnderrunDoneFtraceEvent mdp_video_underrun_done = 92;
MdpCmdWaitPingpongFtraceEvent mdp_cmd_wait_pingpong = 93;
MdpPerfPrefillCalcFtraceEvent mdp_perf_prefill_calc = 94;
MdpPerfUpdateBusFtraceEvent mdp_perf_update_bus = 95;
RotatorBwAoAsContextFtraceEvent rotator_bw_ao_as_context = 96;
MmFilemapAddToPageCacheFtraceEvent mm_filemap_add_to_page_cache = 97;
MmFilemapDeleteFromPageCacheFtraceEvent mm_filemap_delete_from_page_cache =
98;
MmCompactionBeginFtraceEvent mm_compaction_begin = 99;
MmCompactionDeferCompactionFtraceEvent mm_compaction_defer_compaction = 100;
MmCompactionDeferredFtraceEvent mm_compaction_deferred = 101;
MmCompactionDeferResetFtraceEvent mm_compaction_defer_reset = 102;
MmCompactionEndFtraceEvent mm_compaction_end = 103;
MmCompactionFinishedFtraceEvent mm_compaction_finished = 104;
MmCompactionIsolateFreepagesFtraceEvent mm_compaction_isolate_freepages =
105;
MmCompactionIsolateMigratepagesFtraceEvent
mm_compaction_isolate_migratepages = 106;
MmCompactionKcompactdSleepFtraceEvent mm_compaction_kcompactd_sleep = 107;
MmCompactionKcompactdWakeFtraceEvent mm_compaction_kcompactd_wake = 108;
MmCompactionMigratepagesFtraceEvent mm_compaction_migratepages = 109;
MmCompactionSuitableFtraceEvent mm_compaction_suitable = 110;
MmCompactionTryToCompactPagesFtraceEvent
mm_compaction_try_to_compact_pages = 111;
MmCompactionWakeupKcompactdFtraceEvent mm_compaction_wakeup_kcompactd = 112;
SuspendResumeFtraceEvent suspend_resume = 113;
SchedWakeupNewFtraceEvent sched_wakeup_new = 114;
BlockBioBackmergeFtraceEvent block_bio_backmerge = 115;
BlockBioBounceFtraceEvent block_bio_bounce = 116;
BlockBioCompleteFtraceEvent block_bio_complete = 117;
BlockBioFrontmergeFtraceEvent block_bio_frontmerge = 118;
BlockBioQueueFtraceEvent block_bio_queue = 119;
BlockBioRemapFtraceEvent block_bio_remap = 120;
BlockDirtyBufferFtraceEvent block_dirty_buffer = 121;
BlockGetrqFtraceEvent block_getrq = 122;
BlockPlugFtraceEvent block_plug = 123;
BlockRqAbortFtraceEvent block_rq_abort = 124;
BlockRqCompleteFtraceEvent block_rq_complete = 125;
BlockRqInsertFtraceEvent block_rq_insert = 126;
// removed field with id 127;
BlockRqRemapFtraceEvent block_rq_remap = 128;
BlockRqRequeueFtraceEvent block_rq_requeue = 129;
BlockSleeprqFtraceEvent block_sleeprq = 130;
BlockSplitFtraceEvent block_split = 131;
BlockTouchBufferFtraceEvent block_touch_buffer = 132;
BlockUnplugFtraceEvent block_unplug = 133;
Ext4AllocDaBlocksFtraceEvent ext4_alloc_da_blocks = 134;
Ext4AllocateBlocksFtraceEvent ext4_allocate_blocks = 135;
Ext4AllocateInodeFtraceEvent ext4_allocate_inode = 136;
Ext4BeginOrderedTruncateFtraceEvent ext4_begin_ordered_truncate = 137;
Ext4CollapseRangeFtraceEvent ext4_collapse_range = 138;
Ext4DaReleaseSpaceFtraceEvent ext4_da_release_space = 139;
Ext4DaReserveSpaceFtraceEvent ext4_da_reserve_space = 140;
Ext4DaUpdateReserveSpaceFtraceEvent ext4_da_update_reserve_space = 141;
Ext4DaWritePagesFtraceEvent ext4_da_write_pages = 142;
Ext4DaWritePagesExtentFtraceEvent ext4_da_write_pages_extent = 143;
Ext4DirectIOEnterFtraceEvent ext4_direct_IO_enter = 144;
Ext4DirectIOExitFtraceEvent ext4_direct_IO_exit = 145;
Ext4DiscardBlocksFtraceEvent ext4_discard_blocks = 146;
Ext4DiscardPreallocationsFtraceEvent ext4_discard_preallocations = 147;
Ext4DropInodeFtraceEvent ext4_drop_inode = 148;
Ext4EsCacheExtentFtraceEvent ext4_es_cache_extent = 149;
Ext4EsFindDelayedExtentRangeEnterFtraceEvent
ext4_es_find_delayed_extent_range_enter = 150;
Ext4EsFindDelayedExtentRangeExitFtraceEvent
ext4_es_find_delayed_extent_range_exit = 151;
Ext4EsInsertExtentFtraceEvent ext4_es_insert_extent = 152;
Ext4EsLookupExtentEnterFtraceEvent ext4_es_lookup_extent_enter = 153;
Ext4EsLookupExtentExitFtraceEvent ext4_es_lookup_extent_exit = 154;
Ext4EsRemoveExtentFtraceEvent ext4_es_remove_extent = 155;
Ext4EsShrinkFtraceEvent ext4_es_shrink = 156;
Ext4EsShrinkCountFtraceEvent ext4_es_shrink_count = 157;
Ext4EsShrinkScanEnterFtraceEvent ext4_es_shrink_scan_enter = 158;
Ext4EsShrinkScanExitFtraceEvent ext4_es_shrink_scan_exit = 159;
Ext4EvictInodeFtraceEvent ext4_evict_inode = 160;
Ext4ExtConvertToInitializedEnterFtraceEvent
ext4_ext_convert_to_initialized_enter = 161;
Ext4ExtConvertToInitializedFastpathFtraceEvent
ext4_ext_convert_to_initialized_fastpath = 162;
Ext4ExtHandleUnwrittenExtentsFtraceEvent ext4_ext_handle_unwritten_extents =
163;
Ext4ExtInCacheFtraceEvent ext4_ext_in_cache = 164;
Ext4ExtLoadExtentFtraceEvent ext4_ext_load_extent = 165;
Ext4ExtMapBlocksEnterFtraceEvent ext4_ext_map_blocks_enter = 166;
Ext4ExtMapBlocksExitFtraceEvent ext4_ext_map_blocks_exit = 167;
Ext4ExtPutInCacheFtraceEvent ext4_ext_put_in_cache = 168;
Ext4ExtRemoveSpaceFtraceEvent ext4_ext_remove_space = 169;
Ext4ExtRemoveSpaceDoneFtraceEvent ext4_ext_remove_space_done = 170;
Ext4ExtRmIdxFtraceEvent ext4_ext_rm_idx = 171;
Ext4ExtRmLeafFtraceEvent ext4_ext_rm_leaf = 172;
Ext4ExtShowExtentFtraceEvent ext4_ext_show_extent = 173;
Ext4FallocateEnterFtraceEvent ext4_fallocate_enter = 174;
Ext4FallocateExitFtraceEvent ext4_fallocate_exit = 175;
Ext4FindDelallocRangeFtraceEvent ext4_find_delalloc_range = 176;
Ext4ForgetFtraceEvent ext4_forget = 177;
Ext4FreeBlocksFtraceEvent ext4_free_blocks = 178;
Ext4FreeInodeFtraceEvent ext4_free_inode = 179;
Ext4GetImpliedClusterAllocExitFtraceEvent
ext4_get_implied_cluster_alloc_exit = 180;
Ext4GetReservedClusterAllocFtraceEvent ext4_get_reserved_cluster_alloc =
181;
Ext4IndMapBlocksEnterFtraceEvent ext4_ind_map_blocks_enter = 182;
Ext4IndMapBlocksExitFtraceEvent ext4_ind_map_blocks_exit = 183;
Ext4InsertRangeFtraceEvent ext4_insert_range = 184;
Ext4InvalidatepageFtraceEvent ext4_invalidatepage = 185;
Ext4JournalStartFtraceEvent ext4_journal_start = 186;
Ext4JournalStartReservedFtraceEvent ext4_journal_start_reserved = 187;
Ext4JournalledInvalidatepageFtraceEvent ext4_journalled_invalidatepage =
188;
Ext4JournalledWriteEndFtraceEvent ext4_journalled_write_end = 189;
Ext4LoadInodeFtraceEvent ext4_load_inode = 190;
Ext4LoadInodeBitmapFtraceEvent ext4_load_inode_bitmap = 191;
Ext4MarkInodeDirtyFtraceEvent ext4_mark_inode_dirty = 192;
Ext4MbBitmapLoadFtraceEvent ext4_mb_bitmap_load = 193;
Ext4MbBuddyBitmapLoadFtraceEvent ext4_mb_buddy_bitmap_load = 194;
Ext4MbDiscardPreallocationsFtraceEvent ext4_mb_discard_preallocations = 195;
Ext4MbNewGroupPaFtraceEvent ext4_mb_new_group_pa = 196;
Ext4MbNewInodePaFtraceEvent ext4_mb_new_inode_pa = 197;
Ext4MbReleaseGroupPaFtraceEvent ext4_mb_release_group_pa = 198;
Ext4MbReleaseInodePaFtraceEvent ext4_mb_release_inode_pa = 199;
Ext4MballocAllocFtraceEvent ext4_mballoc_alloc = 200;
Ext4MballocDiscardFtraceEvent ext4_mballoc_discard = 201;
Ext4MballocFreeFtraceEvent ext4_mballoc_free = 202;
Ext4MballocPreallocFtraceEvent ext4_mballoc_prealloc = 203;
Ext4OtherInodeUpdateTimeFtraceEvent ext4_other_inode_update_time = 204;
Ext4PunchHoleFtraceEvent ext4_punch_hole = 205;
Ext4ReadBlockBitmapLoadFtraceEvent ext4_read_block_bitmap_load = 206;
Ext4ReadpageFtraceEvent ext4_readpage = 207;
Ext4ReleasepageFtraceEvent ext4_releasepage = 208;
Ext4RemoveBlocksFtraceEvent ext4_remove_blocks = 209;
Ext4RequestBlocksFtraceEvent ext4_request_blocks = 210;
Ext4RequestInodeFtraceEvent ext4_request_inode = 211;
Ext4SyncFsFtraceEvent ext4_sync_fs = 212;
Ext4TrimAllFreeFtraceEvent ext4_trim_all_free = 213;
Ext4TrimExtentFtraceEvent ext4_trim_extent = 214;
Ext4TruncateEnterFtraceEvent ext4_truncate_enter = 215;
Ext4TruncateExitFtraceEvent ext4_truncate_exit = 216;
Ext4UnlinkEnterFtraceEvent ext4_unlink_enter = 217;
Ext4UnlinkExitFtraceEvent ext4_unlink_exit = 218;
Ext4WriteBeginFtraceEvent ext4_write_begin = 219;
// removed field with id 220;
// removed field with id 221;
// removed field with id 222;
// removed field with id 223;
// removed field with id 224;
// removed field with id 225;
// removed field with id 226;
// removed field with id 227;
// removed field with id 228;
// removed field with id 229;
Ext4WriteEndFtraceEvent ext4_write_end = 230;
Ext4WritepageFtraceEvent ext4_writepage = 231;
Ext4WritepagesFtraceEvent ext4_writepages = 232;
Ext4WritepagesResultFtraceEvent ext4_writepages_result = 233;
Ext4ZeroRangeFtraceEvent ext4_zero_range = 234;
TaskNewtaskFtraceEvent task_newtask = 235;
TaskRenameFtraceEvent task_rename = 236;
SchedProcessExecFtraceEvent sched_process_exec = 237;
SchedProcessExitFtraceEvent sched_process_exit = 238;
SchedProcessForkFtraceEvent sched_process_fork = 239;
SchedProcessFreeFtraceEvent sched_process_free = 240;
SchedProcessHangFtraceEvent sched_process_hang = 241;
SchedProcessWaitFtraceEvent sched_process_wait = 242;
F2fsDoSubmitBioFtraceEvent f2fs_do_submit_bio = 243;
F2fsEvictInodeFtraceEvent f2fs_evict_inode = 244;
F2fsFallocateFtraceEvent f2fs_fallocate = 245;
F2fsGetDataBlockFtraceEvent f2fs_get_data_block = 246;
F2fsGetVictimFtraceEvent f2fs_get_victim = 247;
F2fsIgetFtraceEvent f2fs_iget = 248;
F2fsIgetExitFtraceEvent f2fs_iget_exit = 249;
F2fsNewInodeFtraceEvent f2fs_new_inode = 250;
F2fsReadpageFtraceEvent f2fs_readpage = 251;
F2fsReserveNewBlockFtraceEvent f2fs_reserve_new_block = 252;
F2fsSetPageDirtyFtraceEvent f2fs_set_page_dirty = 253;
F2fsSubmitWritePageFtraceEvent f2fs_submit_write_page = 254;
F2fsSyncFileEnterFtraceEvent f2fs_sync_file_enter = 255;
F2fsSyncFileExitFtraceEvent f2fs_sync_file_exit = 256;
F2fsSyncFsFtraceEvent f2fs_sync_fs = 257;
F2fsTruncateFtraceEvent f2fs_truncate = 258;
F2fsTruncateBlocksEnterFtraceEvent f2fs_truncate_blocks_enter = 259;
F2fsTruncateBlocksExitFtraceEvent f2fs_truncate_blocks_exit = 260;
F2fsTruncateDataBlocksRangeFtraceEvent f2fs_truncate_data_blocks_range =
261;
F2fsTruncateInodeBlocksEnterFtraceEvent f2fs_truncate_inode_blocks_enter =
262;
F2fsTruncateInodeBlocksExitFtraceEvent f2fs_truncate_inode_blocks_exit =
263;
F2fsTruncateNodeFtraceEvent f2fs_truncate_node = 264;
F2fsTruncateNodesEnterFtraceEvent f2fs_truncate_nodes_enter = 265;
F2fsTruncateNodesExitFtraceEvent f2fs_truncate_nodes_exit = 266;
F2fsTruncatePartialNodesFtraceEvent f2fs_truncate_partial_nodes = 267;
F2fsUnlinkEnterFtraceEvent f2fs_unlink_enter = 268;
F2fsUnlinkExitFtraceEvent f2fs_unlink_exit = 269;
F2fsVmPageMkwriteFtraceEvent f2fs_vm_page_mkwrite = 270;
F2fsWriteBeginFtraceEvent f2fs_write_begin = 271;
F2fsWriteCheckpointFtraceEvent f2fs_write_checkpoint = 272;
F2fsWriteEndFtraceEvent f2fs_write_end = 273;
AllocPagesIommuEndFtraceEvent alloc_pages_iommu_end = 274;
AllocPagesIommuFailFtraceEvent alloc_pages_iommu_fail = 275;
AllocPagesIommuStartFtraceEvent alloc_pages_iommu_start = 276;
AllocPagesSysEndFtraceEvent alloc_pages_sys_end = 277;
AllocPagesSysFailFtraceEvent alloc_pages_sys_fail = 278;
AllocPagesSysStartFtraceEvent alloc_pages_sys_start = 279;
DmaAllocContiguousRetryFtraceEvent dma_alloc_contiguous_retry = 280;
IommuMapRangeFtraceEvent iommu_map_range = 281;
IommuSecPtblMapRangeEndFtraceEvent iommu_sec_ptbl_map_range_end = 282;
IommuSecPtblMapRangeStartFtraceEvent iommu_sec_ptbl_map_range_start = 283;
IonAllocBufferEndFtraceEvent ion_alloc_buffer_end = 284;
IonAllocBufferFailFtraceEvent ion_alloc_buffer_fail = 285;
IonAllocBufferFallbackFtraceEvent ion_alloc_buffer_fallback = 286;
IonAllocBufferStartFtraceEvent ion_alloc_buffer_start = 287;
IonCpAllocRetryFtraceEvent ion_cp_alloc_retry = 288;
IonCpSecureBufferEndFtraceEvent ion_cp_secure_buffer_end = 289;
IonCpSecureBufferStartFtraceEvent ion_cp_secure_buffer_start = 290;
IonPrefetchingFtraceEvent ion_prefetching = 291;
IonSecureCmaAddToPoolEndFtraceEvent ion_secure_cma_add_to_pool_end = 292;
IonSecureCmaAddToPoolStartFtraceEvent ion_secure_cma_add_to_pool_start =
293;
IonSecureCmaAllocateEndFtraceEvent ion_secure_cma_allocate_end = 294;
IonSecureCmaAllocateStartFtraceEvent ion_secure_cma_allocate_start = 295;
IonSecureCmaShrinkPoolEndFtraceEvent ion_secure_cma_shrink_pool_end = 296;
IonSecureCmaShrinkPoolStartFtraceEvent ion_secure_cma_shrink_pool_start =
297;
KfreeFtraceEvent kfree = 298;
KmallocFtraceEvent kmalloc = 299;
KmallocNodeFtraceEvent kmalloc_node = 300;
KmemCacheAllocFtraceEvent kmem_cache_alloc = 301;
KmemCacheAllocNodeFtraceEvent kmem_cache_alloc_node = 302;
KmemCacheFreeFtraceEvent kmem_cache_free = 303;
MigratePagesEndFtraceEvent migrate_pages_end = 304;
MigratePagesStartFtraceEvent migrate_pages_start = 305;
MigrateRetryFtraceEvent migrate_retry = 306;
MmPageAllocFtraceEvent mm_page_alloc = 307;
MmPageAllocExtfragFtraceEvent mm_page_alloc_extfrag = 308;
MmPageAllocZoneLockedFtraceEvent mm_page_alloc_zone_locked = 309;
MmPageFreeFtraceEvent mm_page_free = 310;
MmPageFreeBatchedFtraceEvent mm_page_free_batched = 311;
MmPagePcpuDrainFtraceEvent mm_page_pcpu_drain = 312;
RssStatFtraceEvent rss_stat = 313;
IonHeapShrinkFtraceEvent ion_heap_shrink = 314;
IonHeapGrowFtraceEvent ion_heap_grow = 315;
FenceInitFtraceEvent fence_init = 316;
FenceDestroyFtraceEvent fence_destroy = 317;
FenceEnableSignalFtraceEvent fence_enable_signal = 318;
FenceSignaledFtraceEvent fence_signaled = 319;
ClkEnableFtraceEvent clk_enable = 320;
ClkDisableFtraceEvent clk_disable = 321;
ClkSetRateFtraceEvent clk_set_rate = 322;
BinderTransactionAllocBufFtraceEvent binder_transaction_alloc_buf = 323;
SignalDeliverFtraceEvent signal_deliver = 324;
SignalGenerateFtraceEvent signal_generate = 325;
OomScoreAdjUpdateFtraceEvent oom_score_adj_update = 326;
GenericFtraceEvent generic = 327;
MmEventRecordFtraceEvent mm_event_record = 328;
SysEnterFtraceEvent sys_enter = 329;
SysExitFtraceEvent sys_exit = 330;
ZeroFtraceEvent zero = 331;
GpuFrequencyFtraceEvent gpu_frequency = 332;
SdeTracingMarkWriteFtraceEvent sde_tracing_mark_write = 333;
MarkVictimFtraceEvent mark_victim = 334;
IonStatFtraceEvent ion_stat = 335;
IonBufferCreateFtraceEvent ion_buffer_create = 336;
IonBufferDestroyFtraceEvent ion_buffer_destroy = 337;
ScmCallStartFtraceEvent scm_call_start = 338;
ScmCallEndFtraceEvent scm_call_end = 339;
GpuMemTotalFtraceEvent gpu_mem_total = 340;
ThermalTemperatureFtraceEvent thermal_temperature = 341;
CdevUpdateFtraceEvent cdev_update = 342;
CpuhpExitFtraceEvent cpuhp_exit = 343;
CpuhpMultiEnterFtraceEvent cpuhp_multi_enter = 344;
CpuhpEnterFtraceEvent cpuhp_enter = 345;
CpuhpLatencyFtraceEvent cpuhp_latency = 346;
FastrpcDmaStatFtraceEvent fastrpc_dma_stat = 347;
DpuTracingMarkWriteFtraceEvent dpu_tracing_mark_write = 348;
G2dTracingMarkWriteFtraceEvent g2d_tracing_mark_write = 349;
MaliTracingMarkWriteFtraceEvent mali_tracing_mark_write = 350;
DmaHeapStatFtraceEvent dma_heap_stat = 351;
CpuhpPauseFtraceEvent cpuhp_pause = 352;
SchedPiSetprioFtraceEvent sched_pi_setprio = 353;
SdeSdeEvtlogFtraceEvent sde_sde_evtlog = 354;
SdeSdePerfCalcCrtcFtraceEvent sde_sde_perf_calc_crtc = 355;
SdeSdePerfCrtcUpdateFtraceEvent sde_sde_perf_crtc_update = 356;
SdeSdePerfSetQosLutsFtraceEvent sde_sde_perf_set_qos_luts = 357;
SdeSdePerfUpdateBusFtraceEvent sde_sde_perf_update_bus = 358;
RssStatThrottledFtraceEvent rss_stat_throttled = 359;
NetifReceiveSkbFtraceEvent netif_receive_skb = 360;
NetDevXmitFtraceEvent net_dev_xmit = 361;
InetSockSetStateFtraceEvent inet_sock_set_state = 362;
TcpRetransmitSkbFtraceEvent tcp_retransmit_skb = 363;
CrosEcSensorhubDataFtraceEvent cros_ec_sensorhub_data = 364;
NapiGroReceiveEntryFtraceEvent napi_gro_receive_entry = 365;
NapiGroReceiveExitFtraceEvent napi_gro_receive_exit = 366;
KfreeSkbFtraceEvent kfree_skb = 367;
KvmAccessFaultFtraceEvent kvm_access_fault = 368;
KvmAckIrqFtraceEvent kvm_ack_irq = 369;
KvmAgeHvaFtraceEvent kvm_age_hva = 370;
KvmAgePageFtraceEvent kvm_age_page = 371;
KvmArmClearDebugFtraceEvent kvm_arm_clear_debug = 372;
KvmArmSetDreg32FtraceEvent kvm_arm_set_dreg32 = 373;
KvmArmSetRegsetFtraceEvent kvm_arm_set_regset = 374;
KvmArmSetupDebugFtraceEvent kvm_arm_setup_debug = 375;
KvmEntryFtraceEvent kvm_entry = 376;
KvmExitFtraceEvent kvm_exit = 377;
KvmFpuFtraceEvent kvm_fpu = 378;
KvmGetTimerMapFtraceEvent kvm_get_timer_map = 379;
KvmGuestFaultFtraceEvent kvm_guest_fault = 380;
KvmHandleSysRegFtraceEvent kvm_handle_sys_reg = 381;
KvmHvcArm64FtraceEvent kvm_hvc_arm64 = 382;
KvmIrqLineFtraceEvent kvm_irq_line = 383;
KvmMmioFtraceEvent kvm_mmio = 384;
KvmMmioEmulateFtraceEvent kvm_mmio_emulate = 385;
KvmSetGuestDebugFtraceEvent kvm_set_guest_debug = 386;
KvmSetIrqFtraceEvent kvm_set_irq = 387;
KvmSetSpteHvaFtraceEvent kvm_set_spte_hva = 388;
KvmSetWayFlushFtraceEvent kvm_set_way_flush = 389;
KvmSysAccessFtraceEvent kvm_sys_access = 390;
KvmTestAgeHvaFtraceEvent kvm_test_age_hva = 391;
KvmTimerEmulateFtraceEvent kvm_timer_emulate = 392;
KvmTimerHrtimerExpireFtraceEvent kvm_timer_hrtimer_expire = 393;
KvmTimerRestoreStateFtraceEvent kvm_timer_restore_state = 394;
KvmTimerSaveStateFtraceEvent kvm_timer_save_state = 395;
KvmTimerUpdateIrqFtraceEvent kvm_timer_update_irq = 396;
KvmToggleCacheFtraceEvent kvm_toggle_cache = 397;
KvmUnmapHvaRangeFtraceEvent kvm_unmap_hva_range = 398;
KvmUserspaceExitFtraceEvent kvm_userspace_exit = 399;
KvmVcpuWakeupFtraceEvent kvm_vcpu_wakeup = 400;
KvmWfxArm64FtraceEvent kvm_wfx_arm64 = 401;
TrapRegFtraceEvent trap_reg = 402;
VgicUpdateIrqPendingFtraceEvent vgic_update_irq_pending = 403;
WakeupSourceActivateFtraceEvent wakeup_source_activate = 404;
WakeupSourceDeactivateFtraceEvent wakeup_source_deactivate = 405;
UfshcdCommandFtraceEvent ufshcd_command = 406;
UfshcdClkGatingFtraceEvent ufshcd_clk_gating = 407;
ConsoleFtraceEvent console = 408;
DrmVblankEventFtraceEvent drm_vblank_event = 409;
DrmVblankEventDeliveredFtraceEvent drm_vblank_event_delivered = 410;
DrmSchedJobFtraceEvent drm_sched_job = 411;
DrmRunJobFtraceEvent drm_run_job = 412;
DrmSchedProcessJobFtraceEvent drm_sched_process_job = 413;
DmaFenceInitFtraceEvent dma_fence_init = 414;
DmaFenceEmitFtraceEvent dma_fence_emit = 415;
DmaFenceSignaledFtraceEvent dma_fence_signaled = 416;
DmaFenceWaitStartFtraceEvent dma_fence_wait_start = 417;
DmaFenceWaitEndFtraceEvent dma_fence_wait_end = 418;
F2fsIostatFtraceEvent f2fs_iostat = 419;
F2fsIostatLatencyFtraceEvent f2fs_iostat_latency = 420;
SchedCpuUtilCfsFtraceEvent sched_cpu_util_cfs = 421;
V4l2QbufFtraceEvent v4l2_qbuf = 422;
V4l2DqbufFtraceEvent v4l2_dqbuf = 423;
Vb2V4l2BufQueueFtraceEvent vb2_v4l2_buf_queue = 424;
Vb2V4l2BufDoneFtraceEvent vb2_v4l2_buf_done = 425;
Vb2V4l2QbufFtraceEvent vb2_v4l2_qbuf = 426;
Vb2V4l2DqbufFtraceEvent vb2_v4l2_dqbuf = 427;
DsiCmdFifoStatusFtraceEvent dsi_cmd_fifo_status = 428;
DsiRxFtraceEvent dsi_rx = 429;
DsiTxFtraceEvent dsi_tx = 430;
AndroidFsDatareadEndFtraceEvent android_fs_dataread_end = 431;
AndroidFsDatareadStartFtraceEvent android_fs_dataread_start = 432;
AndroidFsDatawriteEndFtraceEvent android_fs_datawrite_end = 433;
AndroidFsDatawriteStartFtraceEvent android_fs_datawrite_start = 434;
AndroidFsFsyncEndFtraceEvent android_fs_fsync_end = 435;
AndroidFsFsyncStartFtraceEvent android_fs_fsync_start = 436;
FuncgraphEntryFtraceEvent funcgraph_entry = 437;
FuncgraphExitFtraceEvent funcgraph_exit = 438;
VirtioVideoCmdFtraceEvent virtio_video_cmd = 439;
VirtioVideoCmdDoneFtraceEvent virtio_video_cmd_done = 440;
VirtioVideoResourceQueueFtraceEvent virtio_video_resource_queue = 441;
VirtioVideoResourceQueueDoneFtraceEvent virtio_video_resource_queue_done =
442;
MmShrinkSlabStartFtraceEvent mm_shrink_slab_start = 443;
MmShrinkSlabEndFtraceEvent mm_shrink_slab_end = 444;
TrustySmcFtraceEvent trusty_smc = 445;
TrustySmcDoneFtraceEvent trusty_smc_done = 446;
TrustyStdCall32FtraceEvent trusty_std_call32 = 447;
TrustyStdCall32DoneFtraceEvent trusty_std_call32_done = 448;
TrustyShareMemoryFtraceEvent trusty_share_memory = 449;
TrustyShareMemoryDoneFtraceEvent trusty_share_memory_done = 450;
TrustyReclaimMemoryFtraceEvent trusty_reclaim_memory = 451;
TrustyReclaimMemoryDoneFtraceEvent trusty_reclaim_memory_done = 452;
TrustyIrqFtraceEvent trusty_irq = 453;
TrustyIpcHandleEventFtraceEvent trusty_ipc_handle_event = 454;
TrustyIpcConnectFtraceEvent trusty_ipc_connect = 455;
TrustyIpcConnectEndFtraceEvent trusty_ipc_connect_end = 456;
TrustyIpcWriteFtraceEvent trusty_ipc_write = 457;
TrustyIpcPollFtraceEvent trusty_ipc_poll = 458;
// removed field with id 459;
TrustyIpcReadFtraceEvent trusty_ipc_read = 460;
TrustyIpcReadEndFtraceEvent trusty_ipc_read_end = 461;
TrustyIpcRxFtraceEvent trusty_ipc_rx = 462;
// removed field with id 463;
TrustyEnqueueNopFtraceEvent trusty_enqueue_nop = 464;
CmaAllocStartFtraceEvent cma_alloc_start = 465;
CmaAllocInfoFtraceEvent cma_alloc_info = 466;
LwisTracingMarkWriteFtraceEvent lwis_tracing_mark_write = 467;
VirtioGpuCmdQueueFtraceEvent virtio_gpu_cmd_queue = 468;
VirtioGpuCmdResponseFtraceEvent virtio_gpu_cmd_response = 469;
MaliMaliKCPUCQSSETFtraceEvent mali_mali_KCPU_CQS_SET = 470;
MaliMaliKCPUCQSWAITSTARTFtraceEvent mali_mali_KCPU_CQS_WAIT_START = 471;
MaliMaliKCPUCQSWAITENDFtraceEvent mali_mali_KCPU_CQS_WAIT_END = 472;
MaliMaliKCPUFENCESIGNALFtraceEvent mali_mali_KCPU_FENCE_SIGNAL = 473;
MaliMaliKCPUFENCEWAITSTARTFtraceEvent mali_mali_KCPU_FENCE_WAIT_START = 474;
MaliMaliKCPUFENCEWAITENDFtraceEvent mali_mali_KCPU_FENCE_WAIT_END = 475;
HypEnterFtraceEvent hyp_enter = 476;
HypExitFtraceEvent hyp_exit = 477;
HostHcallFtraceEvent host_hcall = 478;
HostSmcFtraceEvent host_smc = 479;
HostMemAbortFtraceEvent host_mem_abort = 480;
SuspendResumeMinimalFtraceEvent suspend_resume_minimal = 481;
MaliMaliCSFINTERRUPTSTARTFtraceEvent mali_mali_CSF_INTERRUPT_START = 482;
MaliMaliCSFINTERRUPTENDFtraceEvent mali_mali_CSF_INTERRUPT_END = 483;
SamsungTracingMarkWriteFtraceEvent samsung_tracing_mark_write = 484;
BinderCommandFtraceEvent binder_command = 485;
BinderReturnFtraceEvent binder_return = 486;
}
}
// End of protos/perfetto/trace/ftrace/ftrace_event.proto
// Begin of protos/perfetto/trace/ftrace/ftrace_event_bundle.proto
// The result of tracing one or more ftrace data pages from a single per-cpu
// kernel ring buffer. If collating multiple pages' worth of events, all of
// them come from contiguous pages, with no kernel data loss in between.
message FtraceEventBundle {
optional uint32 cpu = 1;
repeated FtraceEvent event = 2;
// Set to true if there was data loss between the last time we've read from
// the corresponding per-cpu kernel buffer, and the earliest event recorded
// in this bundle.
optional bool lost_events = 3;
// Optionally-enabled compact encoding of a batch of scheduling events. Only
// a subset of events & their fields is recorded.
// All fields (except comms) are stored in a structure-of-arrays form, one
// entry in each repeated field per event.
message CompactSched {
// Interned table of unique strings for this bundle.
repeated string intern_table = 5;
// Delta-encoded timestamps across all sched_switch events within this
// bundle. The first is absolute, each next one is relative to its
// predecessor.
repeated uint64 switch_timestamp = 1 [packed = true];
repeated int64 switch_prev_state = 2 [packed = true];
repeated int32 switch_next_pid = 3 [packed = true];
repeated int32 switch_next_prio = 4 [packed = true];
// One per event, index into |intern_table| corresponding to the
// next_comm field of the event.
repeated uint32 switch_next_comm_index = 6 [packed = true];
// Delta-encoded timestamps across all sched_waking events within this
// bundle. The first is absolute, each next one is relative to its
// predecessor.
repeated uint64 waking_timestamp = 7 [packed = true];
repeated int32 waking_pid = 8 [packed = true];
repeated int32 waking_target_cpu = 9 [packed = true];
repeated int32 waking_prio = 10 [packed = true];
// One per event, index into |intern_table| corresponding to the
// comm field of the event.
repeated uint32 waking_comm_index = 11 [packed = true];
repeated uint32 waking_common_flags = 12 [packed = true];
}
optional CompactSched compact_sched = 4;
// traced_probes always sets the ftrace_clock to "boot". That is not available
// in older kernels (v3.x). In that case we fallback on "global" or "local".
// When we do that, we report the fallback clock in each bundle so we can do
// proper clock syncing at parsing time in TraceProcessor. We cannot use the
// TracePacket timestamp_clock_id because: (1) there is no per-packet
// timestamp for ftrace bundles; (2) "global" does not match CLOCK_MONOTONIC.
// Having a dedicated and explicit flag allows us to correct further misakes
// in future by looking at the kernel version.
// This field has been introduced in perfetto v19 / Android T (13).
// This field is omitted when the ftrace clock is just "boot", as that is the
// default assumption (and for consistency with the past).
optional FtraceClock ftrace_clock = 5;
// The timestamp according to the ftrace clock, taken at the same instant
// as |boot_timestamp|. This is used to sync ftrace events when a non-boot
// clock is used as the ftrace clock. We don't use the ClockSnapshot packet
// because the ftrace global/local clocks don't match any of the clock_gettime
// domains and can be only read by traced_probes.
//
// Only set when |ftrace_clock| != FTRACE_CLOCK_UNSPECIFIED.
//
// Implementation note: Populated by reading the 'now ts:' field in
// tracefs/per_cpu/cpuX/stat.
optional int64 ftrace_timestamp = 6;
// The timestamp according to CLOCK_BOOTTIME, taken at the same instant as
// |ftrace_timestamp|. See documentation of |ftrace_timestamp| for
// more info.
//
// Only set when |ftrace_clock| != FTRACE_CLOCK_UNSPECIFIED.
optional int64 boot_timestamp = 7;
}
enum FtraceClock {
// There is no FTRACE_CLOCK_BOOT entry as that's the default assumption. When
// the ftrace clock is "boot", it's just omitted (so UNSPECIFIED == BOOT).
FTRACE_CLOCK_UNSPECIFIED = 0;
FTRACE_CLOCK_UNKNOWN = 1;
FTRACE_CLOCK_GLOBAL = 2;
FTRACE_CLOCK_LOCAL = 3;
FTRACE_CLOCK_MONO_RAW = 4;
}
// End of protos/perfetto/trace/ftrace/ftrace_event_bundle.proto
// Begin of protos/perfetto/trace/ftrace/ftrace_stats.proto
// Per-CPU stats for the ftrace data source gathered from the kernel from
// /sys/kernel/debug/tracing/per_cpu/cpuX/stats.
message FtraceCpuStats {
// CPU index.
optional uint64 cpu = 1;
// Number of entries still in the kernel buffer. Ideally this should be close
// to zero, as events are consumed regularly and moved into the userspace
// buffers (or file).
optional uint64 entries = 2;
// Number of events lost in kernel buffers due to overwriting of old events
// before userspace had a chance to drain them.
optional uint64 overrun = 3;
// This should always be zero. If not the buffer size is way too small or
// something went wrong with the tracer.
optional uint64 commit_overrun = 4;
// Bytes actually read (not overwritten).
optional uint64 bytes_read = 5;
// The timestamp for the oldest event still in the ring buffer.
optional double oldest_event_ts = 6;
// The current timestamp.
optional double now_ts = 7;
// If the kernel buffer has overwrite mode disabled, this will show the number
// of new events that were lost because the buffer was full. This is similar
// to |overrun| but only for the overwrite=false case.
optional uint64 dropped_events = 8;
// The number of events read.
optional uint64 read_events = 9;
}
// Ftrace stats for all CPUs.
message FtraceStats {
enum Phase {
UNSPECIFIED = 0;
START_OF_TRACE = 1;
END_OF_TRACE = 2;
}
// Tells when stats were sampled. There should be one sample at the beginning
// of the trace and one sample at the end.
optional Phase phase = 1;
// Per-CPU stats (one entry for each CPU).
repeated FtraceCpuStats cpu_stats = 2;
// When FtraceConfig.symbolize_ksyms = true, this records the number of
// symbols parsed from /proc/kallsyms, whether they have been seen in the
// trace or not. It can be used to debug kptr_restrict or security-related
// errors.
// Note: this will be valid only when phase = END_OF_TRACE. The symbolizer is
// initialized. When START_OF_TRACE is emitted it is not ready yet.
optional uint32 kernel_symbols_parsed = 3;
// The memory used by the kernel symbolizer (KernelSymbolMap.size_bytes()).
optional uint32 kernel_symbols_mem_kb = 4;
// Atrace errors (even non-fatal ones) are reported here. A typical example is
// one or more atrace categories not available on the device.
optional string atrace_errors = 5;
// Ftrace events requested by the config but not present on device.
repeated string unknown_ftrace_events = 6;
// Ftrace events requested by the config and present on device, but which we
// failed to enable due to permissions, or due to a conflicting option
// (currently FtraceConfig.disable_generic_events).
repeated string failed_ftrace_events = 7;
// The data source was configured to preserve existing events in the ftrace
// buffer before the start of the trace.
optional bool preserve_ftrace_buffer = 8;
}
// End of protos/perfetto/trace/ftrace/ftrace_stats.proto
// Begin of protos/perfetto/trace/gpu/gpu_counter_event.proto
message GpuCounterEvent {
// The first trace packet of each session should include counter_spec.
optional GpuCounterDescriptor counter_descriptor = 1;
message GpuCounter {
// required. Identifier for counter.
optional uint32 counter_id = 1;
// required. Value of the counter.
oneof value {
int64 int_value = 2;
double double_value = 3;
}
}
repeated GpuCounter counters = 2;
// optional. Identifier for GPU in a multi-gpu device.
optional int32 gpu_id = 3;
}
// End of protos/perfetto/trace/gpu/gpu_counter_event.proto
// Begin of protos/perfetto/trace/gpu/gpu_log.proto
// Message for logging events GPU data producer.
message GpuLog {
enum Severity {
LOG_SEVERITY_UNSPECIFIED = 0;
LOG_SEVERITY_VERBOSE = 1;
LOG_SEVERITY_DEBUG = 2;
LOG_SEVERITY_INFO = 3;
LOG_SEVERITY_WARNING = 4;
LOG_SEVERITY_ERROR = 5;
};
optional Severity severity = 1;
optional string tag = 2;
optional string log_message = 3;
}
// End of protos/perfetto/trace/gpu/gpu_log.proto
// Begin of protos/perfetto/trace/gpu/gpu_render_stage_event.proto
// next id: 15
message GpuRenderStageEvent {
// required. Unique ID for the event.
optional uint64 event_id = 1;
// optional. Duration of the event in nanoseconds. If unset, this is a
// single time point event.
optional uint64 duration = 2;
// required. ID to a hardware queue description in the specifications.
// InternedGpuRenderStageSpecification
optional uint64 hw_queue_iid = 13;
// required. ID to a render stage description in the specifications.
// InternedGpuRenderStageSpecification
optional uint64 stage_iid = 14;
// optional. Identifier for GPU in a multi-gpu device.
optional int32 gpu_id = 11;
// required. Graphics context for the event.
// For OpenGL, this is the GL context.
// For Vulkan, this is the VkDevice.
optional uint64 context = 5;
// optional. The render target for this event.
// For OpenGL, this is the GL frame buffer handle.
// For Vulkan, this is the VkFrameBuffer handle.
optional uint64 render_target_handle = 8;
// optional. Submission ID generated by the UMD.
// For OpenGL, the ID should map to an API submission (e.g., glFlush,
// glFinish, eglSwapBufffers) event. The set of submissions to the HW due
// to a single API submission should share the same ID.
// For Vulkan, it should map 1:1 with a vkQueueSubmit.
optional uint32 submission_id = 10;
// optional. Additional data for the user. This may include attributes for
// the event like resource ids, shaders, etc.
message ExtraData {
optional string name = 1;
optional string value = 2;
}
repeated ExtraData extra_data = 6;
// VULKAN SPECIFICS
// optional. The Vulkan render pass handle.
optional uint64 render_pass_handle = 9;
// optional. A bit mask representing which render subpasses contributed to
// this render stage event. Subpass index 0 is represented by setting the
// LSB of the mask. Additional mask can be added for subpass index greater
// than 63.
repeated uint64 render_subpass_index_mask = 15;
// optional. The Vulkan command buffer handle.
optional uint64 command_buffer_handle = 12;
// DEPRECATED
// Deprecated. Use InternedGpuRenderStageSpecification instead.
// The first trace packet of each session should include a Specifications
// to enumerate *all* IDs that will be used. The timestamp of this packet
// must be earlier than all other packets. Only one packet with Specifications
// is expected.
message Specifications {
message ContextSpec {
optional uint64 context = 1;
optional int32 pid = 2;
}
optional ContextSpec context_spec = 1;
message Description {
optional string name = 1;
optional string description = 2;
}
// Labels to categorize the hw Queue this event goes on.
repeated Description hw_queue = 2;
// Labels to categorize render stage(binning, render, compute etc).
repeated Description stage = 3;
}
// Deprecated. Use hw_queue_iid and stage_iid to refer to
// InternedGpuRenderStageSpecification instead.
optional Specifications specifications = 7 [deprecated = true];
// Deprecated. Use hw_queue_iid instead;
optional int32 hw_queue_id = 3 [deprecated = true];
// Deprecated. Use stage_iid instead;
optional int32 stage_id = 4 [deprecated = true];
// Extension for vendor's custom proto.
extensions 100;
}
// Interned data.
// The iid is the numeric value of either the GL Context or the VkDevice
// handle.
message InternedGraphicsContext {
optional uint64 iid = 1;
optional int32 pid = 2;
enum Api {
UNDEFINED = 0;
OPEN_GL = 1;
VULKAN = 2;
OPEN_CL = 3;
}
optional Api api = 3;
}
message InternedGpuRenderStageSpecification {
optional uint64 iid = 1;
optional string name = 2;
optional string description = 3;
enum RenderStageCategory {
OTHER = 0;
GRAPHICS = 1;
COMPUTE = 2;
}
optional RenderStageCategory category = 4;
}
// End of protos/perfetto/trace/gpu/gpu_render_stage_event.proto
// Begin of protos/perfetto/trace/gpu/vulkan_api_event.proto
// Message for recording the Vulkan call.
message VulkanApiEvent {
oneof event {
VkDebugUtilsObjectName vk_debug_utils_object_name = 1;
VkQueueSubmit vk_queue_submit = 2;
}
// For recording vkSetDebugUtilsObjectNameEXT and
// vkDebugMarkerSetObjectNameEXT
message VkDebugUtilsObjectName {
optional uint32 pid = 1;
optional uint64 vk_device = 2;
// VkObjectType. Value must match
// https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkObjectType.html.
optional int32 object_type = 3;
optional uint64 object = 4;
optional string object_name = 5;
}
// For recording vkQueueSubmit call.
message VkQueueSubmit {
optional uint64 duration_ns = 1;
optional uint32 pid = 2;
optional uint32 tid = 3;
optional uint64 vk_queue = 4;
repeated uint64 vk_command_buffers = 5;
// Submission ID. An identifier unique to each vkQueueSubmit call. This
// submission_id must match GpuRenderStageEvent.submission_id if the
// GpuRenderStageEvent is created due to this vkQueueSubmit.
optional uint32 submission_id = 6;
}
}
// End of protos/perfetto/trace/gpu/vulkan_api_event.proto
// Begin of protos/perfetto/trace/gpu/vulkan_memory_event.proto
// All the information that cannot be sent within a VulkanMemoryEvent message,
// are sent as annotations to the main memory event. One example is the
// properties of the object that consumes the allocated memory, for example, a
// buffer or an image.
// key_iid and string_iid are both interned strings. Original string value is
// stored in vulkan_memory_keys from
// protos/perfetto/trace/interned_data/interned_data.proto.
message VulkanMemoryEventAnnotation {
optional uint64 key_iid = 1;
oneof value {
int64 int_value = 2;
double double_value = 3;
uint64 string_iid = 4;
}
}
// Each VulkanMemoryEvent encompasses information regarding one single function
// call that results in reserving, binding or freeing host or GPU memory. There
// is a special message type, ANNOTATIONS, which is used to communicate
// information that are not directly related to a memory event, nonetheless are
// essential to understand the memory usage. An example is the size and memory
// types of the memory heaps.
//
// Next reserved id: 10 (up to 15).
// Next id: 21.
message VulkanMemoryEvent {
enum Source {
SOURCE_UNSPECIFIED = 0;
SOURCE_DRIVER = 1;
SOURCE_DEVICE = 2;
SOURCE_DEVICE_MEMORY = 3;
SOURCE_BUFFER = 4;
SOURCE_IMAGE = 5;
}
enum Operation {
OP_UNSPECIFIED = 0;
// alloc, create
OP_CREATE = 1;
// free, destroy(non-bound)
OP_DESTROY = 2;
// bind buffer and image
OP_BIND = 3;
// destroy (bound)
OP_DESTROY_BOUND = 4;
// only annotations
OP_ANNOTATIONS = 5;
}
enum AllocationScope {
SCOPE_UNSPECIFIED = 0;
SCOPE_COMMAND = 1;
SCOPE_OBJECT = 2;
SCOPE_CACHE = 3;
SCOPE_DEVICE = 4;
SCOPE_INSTANCE = 5;
}
optional Source source = 1;
optional Operation operation = 2;
optional int64 timestamp = 3;
optional uint32 pid = 4;
optional fixed64 memory_address = 5;
optional uint64 memory_size = 6;
// Interned string. Original string value is stored in function_names from
// protos/perfetto/trace/interned_data/interned_data.proto.
optional uint64 caller_iid = 7;
optional AllocationScope allocation_scope = 8;
// Extra related information, e.g., create configs, etc.
repeated VulkanMemoryEventAnnotation annotations = 9;
// Field IDs used for device memory (low sampling rate)
optional fixed64 device = 16;
optional fixed64 device_memory = 17;
optional uint32 memory_type = 18;
optional uint32 heap = 19;
optional fixed64 object_handle = 20;
}
// End of protos/perfetto/trace/gpu/vulkan_memory_event.proto
// Begin of protos/perfetto/trace/profiling/profile_common.proto
// TODO(fmayer): Figure out naming thoroughout this file to get a
// nomenclature that works between Windows and Linux.
// The interning fields in this file can refer to 2 different intern tables,
// depending on the message they are used in. If the interned fields are present
// in ProfilePacket proto, then the intern tables included in the ProfilePacket
// should be used. If the intered fields are present in the
// StreamingProfilePacket proto, then the intern tables included in all of the
// previous InternedData message with same sequence ID should be used.
// TODO(fmayer): Move to the intern tables to a common location.
message InternedString {
optional uint64 iid = 1;
optional bytes str = 2;
}
// A symbol field that is emitted after the trace is written. These tables would
// be appended as the last packets in the trace that the profiler will use, so
// that the actual trace need not be rewritten to symbolize the profiles.
message ProfiledFrameSymbols {
// Use the frame id as the interning key for the symbols.
optional uint64 frame_iid = 1;
// These are repeated because when inlining happens, multiple functions'
// frames can be at a single address. Imagine function Foo calling the
// std::vector<int> constructor, which gets inlined at 0xf00. We then get
// both Foo and the std::vector<int> constructor when we symbolize the
// address.
// key to InternedString
repeated uint64 function_name_id = 2;
// key to InternedString
repeated uint64 file_name_id = 3;
repeated uint32 line_number = 4;
}
message Line {
optional string function_name = 1;
optional string source_file_name = 2;
optional uint32 line_number = 3;
}
// Symbols for a given address in a module.
message AddressSymbols {
optional uint64 address = 1;
// Source lines that correspond to this address.
//
// These are repeated because when inlining happens, multiple functions'
// frames can be at a single address. Imagine function Foo calling the
// std::vector<int> constructor, which gets inlined at 0xf00. We then get
// both Foo and the std::vector<int> constructor when we symbolize the
// address.
repeated Line lines = 2;
}
// Symbols for addresses seen in a module.
message ModuleSymbols {
// Fully qualified path to the mapping.
// E.g. /system/lib64/libc.so.
optional string path = 1;
// .note.gnu.build-id on Linux (not hex encoded).
// uuid on MacOS.
// Module GUID on Windows.
optional string build_id = 2;
repeated AddressSymbols address_symbols = 3;
}
message Mapping {
// Interning key.
optional uint64 iid = 1;
// Interning key.
optional uint64 build_id = 2;
// The linker may create multiple memory mappings for the same shared
// library.
// This is so that the ELF header is mapped as read only, while the
// executable memory is mapped as executable only.
// The details of this depend on the linker, a possible mapping of an ELF
// file is this:
// +----------------------+
// ELF |xxxxxxxxxyyyyyyyyyyyyy|
// +---------+------------+
// | |
// | read | executable
// v mapping v mapping
// +----------------------+
// Memory |xxxxxxxxx|yyyyyyyyyyyy|
// +------------------+---+
// ^ ^ ^
// + + +
// start exact relpc
// offset offset 0x1800
// 0x0000 0x1000
//
// exact_offset is the offset into the library file of this mapping.
// start_offset is the offset into the library file of the first mapping
// for that library. For native libraries (.so files) this should be 0.
// This is not set on Android 10.
optional uint64 exact_offset = 8;
optional uint64 start_offset = 3;
optional uint64 start = 4;
optional uint64 end = 5;
optional uint64 load_bias = 6;
// E.g. ["system", "lib64", "libc.so"]
// id of string.
repeated uint64 path_string_ids = 7;
}
message Frame {
// Interning key
optional uint64 iid = 1;
// E.g. "fopen"
// id of string.
optional uint64 function_name_id = 2;
optional uint64 mapping_id = 3;
optional uint64 rel_pc = 4;
}
message Callstack {
optional uint64 iid = 1;
// Frames of this callstack. Bottom frame first.
repeated uint64 frame_ids = 2;
}
// End of protos/perfetto/trace/profiling/profile_common.proto
// Begin of protos/perfetto/trace/track_event/chrome_histogram_sample.proto
message HistogramName {
optional uint64 iid = 1;
optional string name = 2;
}
// An individual histogram sample logged via Chrome's UMA metrics system.
message ChromeHistogramSample {
// MD5 hash of the metric name. Either |name_hash| or |name|/|name_iid| or
// both must be present.
optional uint64 name_hash = 1;
optional string name = 2;
optional int64 sample = 3;
// Interned HistogramName. Only one of |name|, |name_iid| can be set.
optional uint64 name_iid = 4;
}
// End of protos/perfetto/trace/track_event/chrome_histogram_sample.proto
// Begin of protos/perfetto/trace/track_event/debug_annotation.proto
// Proto representation of untyped key/value annotations provided in TRACE_EVENT
// macros. Users of the Perfetto SDK should prefer to use the
// perfetto::TracedValue API to fill these protos, rather than filling them
// manually.
//
// Debug annotations are intended for debug use and are not considered a stable
// API of the trace contents. Trace-based metrics that use debug annotation
// values are prone to breakage, so please rely on typed TrackEvent fields for
// these instead.
//
// DebugAnnotations support nested arrays and dictionaries. Each entry is
// encoded as a single DebugAnnotation message. Only dictionary entries
// set the "name" field. The TrackEvent message forms an implicit root
// dictionary.
//
// Example TrackEvent with nested annotations:
// track_event {
// debug_annotations {
// name: "foo"
// dict_entries {
// name: "a"
// bool_value: true
// }
// dict_entries {
// name: "b"
// int_value: 123
// }
// }
// debug_annotations {
// name: "bar"
// array_values {
// string_value: "hello"
// }
// array_values {
// string_value: "world"
// }
// }
// }
//
// Next ID: 18.
// Reserved ID: 15
message DebugAnnotation {
// Name fields are set only for dictionary entries.
oneof name_field {
// interned DebugAnnotationName.
uint64 name_iid = 1;
// non-interned variant.
string name = 10;
}
oneof value {
bool bool_value = 2;
uint64 uint_value = 3;
int64 int_value = 4;
double double_value = 5;
// Pointers are stored in a separate type as the JSON output treats them
// differently from other uint64 values.
uint64 pointer_value = 7;
// Deprecated. Use dict_entries / array_values instead.
NestedValue nested_value = 8;
// Legacy instrumentation may not support conversion of nested data to
// NestedValue yet.
string legacy_json_value = 9;
// interned and non-interned variants of strings.
string string_value = 6;
// Corresponds to |debug_annotation_string_values| field in InternedData.
uint64 string_value_iid = 17;
}
// Used to embed arbitrary proto messages (which are also typically used to
// represent typed TrackEvent arguments). |proto_type_name| or
// |proto_type_name_iid| are storing the full name of the proto messages (e.g.
// .perfetto.protos.DebugAnnotation) and |proto_value| contains the serialised
// proto messages. See |TracedValue::WriteProto| for more details.
oneof proto_type_descriptor {
string proto_type_name = 16;
// interned DebugAnnotationValueTypeName.
uint64 proto_type_name_iid = 13;
}
optional bytes proto_value = 14;
repeated DebugAnnotation dict_entries = 11;
repeated DebugAnnotation array_values = 12;
// Deprecated legacy way to use nested values. Only kept for
// backwards-compatibility in TraceProcessor. May be removed in the future -
// code filling protos should use |dict_entries| and |array_values| instead.
message NestedValue {
enum NestedType {
// leaf value.
UNSPECIFIED = 0;
DICT = 1;
ARRAY = 2;
}
optional NestedType nested_type = 1;
repeated string dict_keys = 2;
repeated NestedValue dict_values = 3;
repeated NestedValue array_values = 4;
optional int64 int_value = 5;
optional double double_value = 6;
optional bool bool_value = 7;
optional string string_value = 8;
}
}
// --------------------
// Interned data types:
// --------------------
message DebugAnnotationName {
optional uint64 iid = 1;
optional string name = 2;
}
// See the |proto_type_descriptor| comment.
message DebugAnnotationValueTypeName {
optional uint64 iid = 1;
optional string name = 2;
}
// End of protos/perfetto/trace/track_event/debug_annotation.proto
// Begin of protos/perfetto/trace/track_event/log_message.proto
message LogMessage {
// interned SourceLocation.
optional uint64 source_location_iid = 1;
// interned LogMessageBody.
optional uint64 body_iid = 2;
enum Priority {
PRIO_UNSPECIFIED = 0;
PRIO_UNUSED = 1;
PRIO_VERBOSE = 2;
PRIO_DEBUG = 3;
PRIO_INFO = 4;
PRIO_WARN = 5;
PRIO_ERROR = 6;
PRIO_FATAL = 7;
}
optional Priority prio = 3;
}
// --------------------
// Interned data types:
// --------------------
message LogMessageBody {
optional uint64 iid = 1;
optional string body = 2;
}
// End of protos/perfetto/trace/track_event/log_message.proto
// Begin of protos/perfetto/trace/track_event/source_location.proto
// --------------------
// Interned data types:
// --------------------
// A source location, represented as a native symbol.
// This is similar to `message Frame` from
// protos/perfetto/trace/profiling/profile_common.proto, but for abitrary
// source code locations (for example in track event args), not stack frames.
message UnsymbolizedSourceLocation {
optional uint64 iid = 1;
optional uint64 mapping_id = 2;
optional uint64 rel_pc = 3;
}
message SourceLocation {
optional uint64 iid = 1;
optional string file_name = 2;
optional string function_name = 3;
optional uint32 line_number = 4;
}
// End of protos/perfetto/trace/track_event/source_location.proto
// Begin of protos/perfetto/trace/track_event/chrome_active_processes.proto
// A list of processes connected to the tracing service.
message ChromeActiveProcesses {
repeated int32 pid = 1;
}
// End of protos/perfetto/trace/track_event/chrome_active_processes.proto
// Begin of protos/perfetto/trace/track_event/chrome_application_state_info.proto
// Trace event arguments for application state changes.
message ChromeApplicationStateInfo {
// Enum definition taken from:
// https://source.chromium.org/chromium/chromium/src/+/master:base/android/application_status_listener.h
enum ChromeApplicationState {
APPLICATION_STATE_UNKNOWN = 0;
APPLICATION_STATE_HAS_RUNNING_ACTIVITIES = 1;
APPLICATION_STATE_HAS_PAUSED_ACTIVITIES = 2;
APPLICATION_STATE_HAS_STOPPED_ACTIVITIES = 3;
APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES = 4;
};
optional ChromeApplicationState application_state = 1;
}
// End of protos/perfetto/trace/track_event/chrome_application_state_info.proto
// Begin of protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto
// Describes Chrome's Compositor scheduler's current state and associated
// variables.
//
// These protos and enums were adapted from the corresponding original JSON
// trace event for the scheduler state. In contrast to the JSON, we use strongly
// typed enum values instead of strings for many fields, and
// microsecond-granularity timestamps.
//
// The original format was generated in JSON by the code at
// https://cs.chromium.org/chromium/src/cc/scheduler/scheduler.cc?l=870&rcl=5e15eabc9c0eec8daf94fdf78e93f13b6e3b63dd
//
// And is now generated as protozero:
// https://cs.chromium.org/chromium/src/cc/scheduler/scheduler.cc?q=Scheduler::AsPro
//
// All non-delta-timestamps are absolute CLOCK_MONOTONIC timestamps.
enum ChromeCompositorSchedulerAction {
CC_SCHEDULER_ACTION_UNSPECIFIED = 0;
CC_SCHEDULER_ACTION_NONE = 1;
CC_SCHEDULER_ACTION_SEND_BEGIN_MAIN_FRAME = 2;
CC_SCHEDULER_ACTION_COMMIT = 3;
CC_SCHEDULER_ACTION_ACTIVATE_SYNC_TREE = 4;
CC_SCHEDULER_ACTION_DRAW_IF_POSSIBLE = 5;
CC_SCHEDULER_ACTION_DRAW_FORCED = 6;
CC_SCHEDULER_ACTION_DRAW_ABORT = 7;
CC_SCHEDULER_ACTION_BEGIN_LAYER_TREE_FRAME_SINK_CREATION = 8;
CC_SCHEDULER_ACTION_PREPARE_TILES = 9;
CC_SCHEDULER_ACTION_INVALIDATE_LAYER_TREE_FRAME_SINK = 10;
CC_SCHEDULER_ACTION_PERFORM_IMPL_SIDE_INVALIDATION = 11;
CC_SCHEDULER_ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_EXPECTED_UNTIL = 12;
CC_SCHEDULER_ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_EXPECTED_SOON = 13;
}
// Next id: 18
message ChromeCompositorSchedulerState {
enum BeginImplFrameDeadlineMode {
DEADLINE_MODE_UNSPECIFIED = 0;
DEADLINE_MODE_NONE = 1;
DEADLINE_MODE_IMMEDIATE = 2;
DEADLINE_MODE_REGULAR = 3;
DEADLINE_MODE_LATE = 4;
DEADLINE_MODE_BLOCKED = 5;
}
optional ChromeCompositorStateMachine state_machine = 1;
optional bool observing_begin_frame_source = 2;
optional bool begin_impl_frame_deadline_task = 3;
optional bool pending_begin_frame_task = 4;
optional bool skipped_last_frame_missed_exceeded_deadline = 5;
optional ChromeCompositorSchedulerAction inside_action = 7;
optional BeginImplFrameDeadlineMode deadline_mode = 8;
optional int64 deadline_us = 9;
optional int64 deadline_scheduled_at_us = 10;
optional int64 now_us = 11;
optional int64 now_to_deadline_delta_us = 12;
optional int64 now_to_deadline_scheduled_at_delta_us = 13;
optional BeginImplFrameArgs begin_impl_frame_args = 14;
optional BeginFrameObserverState begin_frame_observer_state = 15;
optional BeginFrameSourceState begin_frame_source_state = 16;
optional CompositorTimingHistory compositor_timing_history = 17;
reserved 6;
}
// Describes the current values stored in the Chrome Compositor state machine.
// Next id: 3
message ChromeCompositorStateMachine {
// Next id: 6
message MajorState {
enum BeginImplFrameState {
BEGIN_IMPL_FRAME_UNSPECIFIED = 0;
BEGIN_IMPL_FRAME_IDLE = 1;
BEGIN_IMPL_FRAME_INSIDE_BEGIN_FRAME = 2;
BEGIN_IMPL_FRAME_INSIDE_DEADLINE = 3;
}
enum BeginMainFrameState {
BEGIN_MAIN_FRAME_UNSPECIFIED = 0;
BEGIN_MAIN_FRAME_IDLE = 1;
BEGIN_MAIN_FRAME_SENT = 2;
BEGIN_MAIN_FRAME_READY_TO_COMMIT = 3;
}
enum LayerTreeFrameSinkState {
LAYER_TREE_FRAME_UNSPECIFIED = 0;
LAYER_TREE_FRAME_NONE = 1;
LAYER_TREE_FRAME_ACTIVE = 2;
LAYER_TREE_FRAME_CREATING = 3;
LAYER_TREE_FRAME_WAITING_FOR_FIRST_COMMIT = 4;
LAYER_TREE_FRAME_WAITING_FOR_FIRST_ACTIVATION = 5;
}
enum ForcedRedrawOnTimeoutState {
FORCED_REDRAW_UNSPECIFIED = 0;
FORCED_REDRAW_IDLE = 1;
FORCED_REDRAW_WAITING_FOR_COMMIT = 2;
FORCED_REDRAW_WAITING_FOR_ACTIVATION = 3;
FORCED_REDRAW_WAITING_FOR_DRAW = 4;
}
optional ChromeCompositorSchedulerAction next_action = 1;
optional BeginImplFrameState begin_impl_frame_state = 2;
optional BeginMainFrameState begin_main_frame_state = 3;
optional LayerTreeFrameSinkState layer_tree_frame_sink_state = 4;
optional ForcedRedrawOnTimeoutState forced_redraw_state = 5;
}
optional MajorState major_state = 1;
// Next id: 47
message MinorState {
enum TreePriority {
TREE_PRIORITY_UNSPECIFIED = 0;
TREE_PRIORITY_SAME_PRIORITY_FOR_BOTH_TREES = 1;
TREE_PRIORITY_SMOOTHNESS_TAKES_PRIORITY = 2;
TREE_PRIORITY_NEW_CONTENT_TAKES_PRIORITY = 3;
}
enum ScrollHandlerState {
SCROLL_HANDLER_UNSPECIFIED = 0;
SCROLL_AFFECTS_SCROLL_HANDLER = 1;
SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER = 2;
}
optional int32 commit_count = 1;
optional int32 current_frame_number = 2;
optional int32 last_frame_number_submit_performed = 3;
optional int32 last_frame_number_draw_performed = 4;
optional int32 last_frame_number_begin_main_frame_sent = 5;
optional bool did_draw = 6;
optional bool did_send_begin_main_frame_for_current_frame = 7;
optional bool did_notify_begin_main_frame_not_expected_until = 8;
optional bool did_notify_begin_main_frame_not_expected_soon = 9;
optional bool wants_begin_main_frame_not_expected = 10;
optional bool did_commit_during_frame = 11;
optional bool did_invalidate_layer_tree_frame_sink = 12;
optional bool did_perform_impl_side_invalidaion = 13;
optional bool did_prepare_tiles = 14;
optional int32 consecutive_checkerboard_animations = 15;
optional int32 pending_submit_frames = 16;
optional int32 submit_frames_with_current_layer_tree_frame_sink = 17;
optional bool needs_redraw = 18;
optional bool needs_prepare_tiles = 19;
optional bool needs_begin_main_frame = 20;
optional bool needs_one_begin_impl_frame = 21;
optional bool visible = 22;
optional bool begin_frame_source_paused = 23;
optional bool can_draw = 24;
optional bool resourceless_draw = 25;
optional bool has_pending_tree = 26;
optional bool pending_tree_is_ready_for_activation = 27;
optional bool active_tree_needs_first_draw = 28;
optional bool active_tree_is_ready_to_draw = 29;
optional bool did_create_and_initialize_first_layer_tree_frame_sink = 30;
optional TreePriority tree_priority = 31;
optional ScrollHandlerState scroll_handler_state = 32;
optional bool critical_begin_main_frame_to_activate_is_fast = 33;
optional bool main_thread_missed_last_deadline = 34;
optional bool video_needs_begin_frames = 36;
optional bool defer_begin_main_frame = 37;
optional bool last_commit_had_no_updates = 38;
optional bool did_draw_in_last_frame = 39;
optional bool did_submit_in_last_frame = 40;
optional bool needs_impl_side_invalidation = 41;
optional bool current_pending_tree_is_impl_side = 42;
optional bool previous_pending_tree_was_impl_side = 43;
optional bool processing_animation_worklets_for_active_tree = 44;
optional bool processing_animation_worklets_for_pending_tree = 45;
optional bool processing_paint_worklets_for_pending_tree = 46;
reserved 35;
}
optional MinorState minor_state = 2;
}
// Next id: 13
message BeginFrameArgs {
// JSON format has a "type" field that was always just "BeginFrameArgs" we
// drop this in the proto representation, and instead make the JSON format
// "subtype" field become the type field.
enum BeginFrameArgsType {
BEGIN_FRAME_ARGS_TYPE_UNSPECIFIED = 0;
BEGIN_FRAME_ARGS_TYPE_INVALID = 1;
BEGIN_FRAME_ARGS_TYPE_NORMAL = 2;
BEGIN_FRAME_ARGS_TYPE_MISSED = 3;
}
optional BeginFrameArgsType type = 1;
optional uint64 source_id = 2;
optional uint64 sequence_number = 3;
optional int64 frame_time_us = 4;
optional int64 deadline_us = 5;
optional int64 interval_delta_us = 6;
optional bool on_critical_path = 7;
optional bool animate_only = 8;
oneof created_from {
// The interned SourceLocation.
uint64 source_location_iid = 9;
// The SourceLocation that this args was created from.
// TODO(nuskos): Eventually we will support interning inside of
// TypedArgument TraceEvents and then we shouldn't need this SourceLocation
// since we can emit it as part of the InternedData message. When we can
// remove this |source_location|.
SourceLocation source_location = 10;
}
optional int64 frames_throttled_since_last = 12;
}
// Next id: 7
message BeginImplFrameArgs {
optional int64 updated_at_us = 1;
optional int64 finished_at_us = 2;
enum State {
BEGIN_FRAME_FINISHED = 0;
BEGIN_FRAME_USING = 1;
}
optional State state = 3;
oneof args {
// Only set if |state| is BEGIN_FRAME_FINISHED.
BeginFrameArgs current_args = 4;
// Only set if |state| is BEGIN_FRAME_USING.
BeginFrameArgs last_args = 5;
}
message TimestampsInUs {
optional int64 interval_delta = 1;
optional int64 now_to_deadline_delta = 2;
optional int64 frame_time_to_now_delta = 3;
optional int64 frame_time_to_deadline_delta = 4;
optional int64 now = 5;
optional int64 frame_time = 6;
optional int64 deadline = 7;
}
optional TimestampsInUs timestamps_in_us = 6;
}
message BeginFrameObserverState {
optional int64 dropped_begin_frame_args = 1;
optional BeginFrameArgs last_begin_frame_args = 2;
}
message BeginFrameSourceState {
optional uint32 source_id = 1;
optional bool paused = 2;
optional uint32 num_observers = 3;
optional BeginFrameArgs last_begin_frame_args = 4;
}
message CompositorTimingHistory {
optional int64 begin_main_frame_queue_critical_estimate_delta_us = 1;
optional int64 begin_main_frame_queue_not_critical_estimate_delta_us = 2;
optional int64 begin_main_frame_start_to_ready_to_commit_estimate_delta_us =
3;
optional int64 commit_to_ready_to_activate_estimate_delta_us = 4;
optional int64 prepare_tiles_estimate_delta_us = 5;
optional int64 activate_estimate_delta_us = 6;
optional int64 draw_estimate_delta_us = 7;
}
// End of protos/perfetto/trace/track_event/chrome_compositor_scheduler_state.proto
// Begin of protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto
// Details about ContentSettings trace events.
message ChromeContentSettingsEventInfo {
// The number of user defined hostname patterns for content settings at
// browser start. Similar to UMA histogram
// 'ContentSettings.NumberOfExceptions'.
optional uint32 number_of_exceptions = 1;
}
// End of protos/perfetto/trace/track_event/chrome_content_settings_event_info.proto
// Begin of protos/perfetto/trace/track_event/chrome_frame_reporter.proto
message ChromeFrameReporter {
enum State {
// The frame did not have any updates to present.
STATE_NO_UPDATE_DESIRED = 0;
// The frame presented all the desired updates (i.e. any updates requested
// from both the compositor thread and main-threads were handled).
STATE_PRESENTED_ALL = 1;
// The frame was presented with some updates, but also missed some updates
// (e.g. missed updates from the main-thread, but included updates from the
// compositor thread).
STATE_PRESENTED_PARTIAL = 2;
// The frame was dropped, i.e. some updates were desired for the frame, but
// was not presented.
STATE_DROPPED = 3;
};
optional State state = 1;
enum FrameDropReason {
REASON_UNSPECIFIED = 0;
// Frame was dropped by the display-compositor.
// The display-compositor may drop a frame some times (e.g. the frame missed
// the deadline, or was blocked on surface-sync, etc.)
REASON_DISPLAY_COMPOSITOR = 1;
// Frame was dropped because of the main-thread.
// The main-thread may cause a frame to be dropped, e.g. if the main-thread
// is running expensive javascript, or doing a lot of layout updates, etc.
REASON_MAIN_THREAD = 2;
// Frame was dropped by the client compositor.
// The client compositor can drop some frames too (e.g. attempting to
// recover latency, missing the deadline, etc.).
REASON_CLIENT_COMPOSITOR = 3;
};
// The reason is set only if |state| is not |STATE_UPDATED_ALL|.
optional FrameDropReason reason = 2;
optional uint64 frame_source = 3;
optional uint64 frame_sequence = 4;
// If this is a droped frame (i.e. if |state| is set to |STATE_DROPPED| or
// |STATE_PRESENTED_PARTIAL|), then indicates whether this frame impacts
// smoothness.
optional bool affects_smoothness = 5;
enum ScrollState {
SCROLL_NONE = 0;
SCROLL_MAIN_THREAD = 1;
SCROLL_COMPOSITOR_THREAD = 2;
// Used when it can't be determined whether a scroll is in progress or not.
SCROLL_UNKNOWN = 3;
}
// The type of active scroll.
optional ScrollState scroll_state = 6;
// If any main thread animation is active during this frame.
optional bool has_main_animation = 7;
// If any compositor thread animation is active during this frame.
optional bool has_compositor_animation = 8;
// If any touch-driven UX (not scroll) is active during this frame.
optional bool has_smooth_input_main = 9;
// Whether the frame contained any missing content (i.e. whether there was
// checkerboarding in the frame).
optional bool has_missing_content = 10;
// The id of layer_tree_host that the frame has been produced for.
optional uint64 layer_tree_host_id = 11;
// If total latency of PipelineReporter exceeds a certain limit.
optional bool has_high_latency = 12;
enum FrameType {
FORKED = 0;
BACKFILL = 1;
}
// Indicate if the frame is "FORKED" (i.e. a PipelineReporter event starts at
// the same frame sequence as another PipelineReporter) or "BACKFILL"
// (i.e. dropped frames when there are no partial compositor updates).
optional FrameType frame_type = 13;
// The breakdown stage of PipelineReporter that is most likely accountable for
// high latency.
repeated string high_latency_contribution_stage = 14;
}
// End of protos/perfetto/trace/track_event/chrome_frame_reporter.proto
// Begin of protos/perfetto/trace/track_event/chrome_keyed_service.proto
// Details about one of Chrome's keyed services associated with the event.
message ChromeKeyedService {
// Name of the service, e.g. "MediaRouter", "PreviewsService", etc. (in
// Chrome, these are static strings known at compile time).
optional string name = 1;
}
// End of protos/perfetto/trace/track_event/chrome_keyed_service.proto
// Begin of protos/perfetto/trace/track_event/chrome_latency_info.proto
message ChromeLatencyInfo {
optional int64 trace_id = 1;
// NEXT ID: 12
// All step are optional but the enum is ordered (not by number) below in the
// order we expect them to appear if they are emitted in trace in a blocking
// fashion.
enum Step {
STEP_UNSPECIFIED = 0;
// Emitted on the browser main thread.
STEP_SEND_INPUT_EVENT_UI = 3;
// Happens on the renderer's compositor.
STEP_HANDLE_INPUT_EVENT_IMPL = 5;
STEP_DID_HANDLE_INPUT_AND_OVERSCROLL = 8;
// Occurs on the Renderer's main thread.
STEP_HANDLE_INPUT_EVENT_MAIN = 4;
STEP_MAIN_THREAD_SCROLL_UPDATE = 2;
STEP_HANDLE_INPUT_EVENT_MAIN_COMMIT = 1;
// Could be emitted on both the renderer's main OR compositor.
STEP_HANDLED_INPUT_EVENT_MAIN_OR_IMPL = 9;
// Optionally sometimes HANDLED_INPUT_EVENT_MAIN_OR_IMPL will proxy to the
// renderer's compositor and this will be emitted.
STEP_HANDLED_INPUT_EVENT_IMPL = 10;
// Renderer's compositor.
STEP_SWAP_BUFFERS = 6;
// Happens on the VizCompositor in the GPU process.
STEP_DRAW_AND_SWAP = 7;
// Happens on the GPU main thread after the swap has completed.
STEP_FINISHED_SWAP_BUFFERS = 11;
// See above for NEXT ID, enum steps are not ordered by tag number.
};
optional Step step = 2;
optional int32 frame_tree_node_id = 3;
// This enum is a copy of LatencyComponentType enum in Chrome, located in
// ui/latency/latency_info.h, modulo added UNKNOWN value per protobuf
// practices.
enum LatencyComponentType {
COMPONENT_UNSPECIFIED = 0;
COMPONENT_INPUT_EVENT_LATENCY_BEGIN_RWH = 1;
COMPONENT_INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL = 2;
COMPONENT_INPUT_EVENT_LATENCY_FIRST_SCROLL_UPDATE_ORIGINAL = 3;
COMPONENT_INPUT_EVENT_LATENCY_ORIGINAL = 4;
COMPONENT_INPUT_EVENT_LATENCY_UI = 5;
COMPONENT_INPUT_EVENT_LATENCY_RENDERER_MAIN = 6;
COMPONENT_INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_MAIN = 7;
COMPONENT_INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_IMPL = 8;
COMPONENT_INPUT_EVENT_LATENCY_SCROLL_UPDATE_LAST_EVENT = 9;
COMPONENT_INPUT_EVENT_LATENCY_ACK_RWH = 10;
COMPONENT_INPUT_EVENT_LATENCY_RENDERER_SWAP = 11;
COMPONENT_DISPLAY_COMPOSITOR_RECEIVED_FRAME = 12;
COMPONENT_INPUT_EVENT_GPU_SWAP_BUFFER = 13;
COMPONENT_INPUT_EVENT_LATENCY_FRAME_SWAP = 14;
}
message ComponentInfo {
optional LatencyComponentType component_type = 1;
// Microsecond timestamp in CLOCK_MONOTONIC domain
optional uint64 time_us = 2;
};
repeated ComponentInfo component_info = 4;
optional bool is_coalesced = 5;
optional int64 gesture_scroll_id = 6;
optional int64 touch_id = 7;
}
// End of protos/perfetto/trace/track_event/chrome_latency_info.proto
// Begin of protos/perfetto/trace/track_event/chrome_legacy_ipc.proto
// Details about a legacy Chrome IPC message that is either sent by the event.
// TODO(eseckler): Also use this message on the receiving side?
message ChromeLegacyIpc {
enum MessageClass {
CLASS_UNSPECIFIED = 0;
CLASS_AUTOMATION = 1;
CLASS_FRAME = 2;
CLASS_PAGE = 3;
CLASS_VIEW = 4;
CLASS_WIDGET = 5;
CLASS_INPUT = 6;
CLASS_TEST = 7;
CLASS_WORKER = 8;
CLASS_NACL = 9;
CLASS_GPU_CHANNEL = 10;
CLASS_MEDIA = 11;
CLASS_PPAPI = 12;
CLASS_CHROME = 13;
CLASS_DRAG = 14;
CLASS_PRINT = 15;
CLASS_EXTENSION = 16;
CLASS_TEXT_INPUT_CLIENT = 17;
CLASS_BLINK_TEST = 18;
CLASS_ACCESSIBILITY = 19;
CLASS_PRERENDER = 20;
CLASS_CHROMOTING = 21;
CLASS_BROWSER_PLUGIN = 22;
CLASS_ANDROID_WEB_VIEW = 23;
CLASS_NACL_HOST = 24;
CLASS_ENCRYPTED_MEDIA = 25;
CLASS_CAST = 26;
CLASS_GIN_JAVA_BRIDGE = 27;
CLASS_CHROME_UTILITY_PRINTING = 28;
CLASS_OZONE_GPU = 29;
CLASS_WEB_TEST = 30;
CLASS_NETWORK_HINTS = 31;
CLASS_EXTENSIONS_GUEST_VIEW = 32;
CLASS_GUEST_VIEW = 33;
CLASS_MEDIA_PLAYER_DELEGATE = 34;
CLASS_EXTENSION_WORKER = 35;
CLASS_SUBRESOURCE_FILTER = 36;
CLASS_UNFREEZABLE_FRAME = 37;
}
// Corresponds to the message class type defined in Chrome's IPCMessageStart
// enum, e.g. FrameMsgStart,
optional MessageClass message_class = 1;
// Line number of the message definition. See Chrome's IPC_MESSAGE_ID and
// IPC_MESSAGE_START macros.
optional uint32 message_line = 2;
}
// End of protos/perfetto/trace/track_event/chrome_legacy_ipc.proto
// Begin of protos/perfetto/trace/track_event/chrome_message_pump.proto
// Details about Chrome message pump events
message ChromeMessagePump {
// True if there are sent messages in the queue.
optional bool sent_messages_in_queue = 1;
// Interned SourceLocation of IO handler that MessagePumpForIO is about to
// invoke.
optional uint64 io_handler_location_iid = 2;
}
// End of protos/perfetto/trace/track_event/chrome_message_pump.proto
// Begin of protos/perfetto/trace/track_event/chrome_mojo_event_info.proto
// Contains information to identify mojo handling events. The trace events in
// mojo are common for all mojo interfaces and this information is used to
// identify who is the caller or callee.
message ChromeMojoEventInfo {
// Contains the interface name or the file name of the creator of a mojo
// handle watcher, recorded when an event if notified to the watcher. The code
// that runs within the track event belongs to the interface.
optional string watcher_notify_interface_tag = 1;
// The hash of the IPC message that is being handled.
optional uint32 ipc_hash = 2;
// A static string representing the mojo interface name of the message that is
// being handled.
optional string mojo_interface_tag = 3;
// Refers to an interned UnsymbolizedSourceLocation.
// The UnsymbolizedSourceLocation contains the interface method that's being
// handled, represented as a native symbol.
// The native symbol can be symbolized after the trace is recorded.
// Not using a symbolized source location for official Chromium builds to
// reduce binary size - emitting file/function names as strings into the
// trace requires storing them in the binary, which causes a significant
// binary size bloat for Chromium.
optional uint64 mojo_interface_method_iid = 4;
// Indicate whether this is a message or reply.
optional bool is_reply = 5;
// The payload size of the message being sent through mojo messages.
optional uint64 payload_size = 6;
// Represents the size of the message. Includes all headers and user payload.
optional uint64 data_num_bytes = 7;
}
// End of protos/perfetto/trace/track_event/chrome_mojo_event_info.proto
// Begin of protos/perfetto/trace/track_event/chrome_renderer_scheduler_state.proto
// Describes the state of the RendererScheduler for a given Renderer Process.
// RAIL Mode is an indication of the kind of work that a Renderer is currently
// performing which is in turn used to prioritise work accordingly.
// A fuller description of these modes can be found https://web.dev/rail/
enum ChromeRAILMode {
RAIL_MODE_NONE = 0;
RAIL_MODE_RESPONSE = 1;
RAIL_MODE_ANIMATION = 2;
RAIL_MODE_IDLE = 3;
RAIL_MODE_LOAD = 4;
}
message ChromeRendererSchedulerState {
optional ChromeRAILMode rail_mode = 1;
optional bool is_backgrounded = 2;
optional bool is_hidden = 3;
}
// End of protos/perfetto/trace/track_event/chrome_renderer_scheduler_state.proto
// Begin of protos/perfetto/trace/track_event/chrome_user_event.proto
// Details about a UI interaction initiated by the user, such as opening or
// closing a tab or a context menu.
message ChromeUserEvent {
// Name of the action, e.g. "NewTab", "ShowBookmarkManager", etc. (in
// Chrome, these are usually static strings known at compile time, or
// concatenations of multiple such static strings).
optional string action = 1;
// MD5 hash of the action string.
optional uint64 action_hash = 2;
}
// End of protos/perfetto/trace/track_event/chrome_user_event.proto
// Begin of protos/perfetto/trace/track_event/chrome_window_handle_event_info.proto
// Details about HWNDMessageHandler trace events.
message ChromeWindowHandleEventInfo {
optional uint32 dpi = 1;
optional uint32 message_id = 2;
optional fixed64 hwnd_ptr = 3;
}
// End of protos/perfetto/trace/track_event/chrome_window_handle_event_info.proto
// Begin of protos/perfetto/trace/track_event/screenshot.proto
message Screenshot {
optional bytes jpg_image = 1;
}
// End of protos/perfetto/trace/track_event/screenshot.proto
// Begin of protos/perfetto/trace/track_event/task_execution.proto
// TrackEvent arguments describing the execution of a task.
message TaskExecution {
// Source location that the task was posted from.
// interned SourceLocation.
optional uint64 posted_from_iid = 1;
}
// End of protos/perfetto/trace/track_event/task_execution.proto
// Begin of protos/perfetto/trace/track_event/track_event.proto
// NOTE: Full TrackEvent support in the client lib and chrome is WIP, thus these
// protos are still subject to change. Don't depend on them staying as they are.
// Trace events emitted by client instrumentation library (TRACE_EVENT macros),
// which describe activity on a track, such as a thread or asynchronous event
// track. The track is specified using separate TrackDescriptor messages and
// referred to via the track's UUID.
//
// A simple TrackEvent packet specifies a timestamp, category, name and type:
// ```protobuf
// trace_packet {
// timestamp: 1000
// track_event {
// categories: ["my_cat"]
// name: "my_event"
// type: TYPE_INSTANT
// }
// }
// ```
//
// To associate an event with a custom track (e.g. a thread), the track is
// defined in a separate packet and referred to from the TrackEvent by its UUID:
// ```protobuf
// trace_packet {
// track_descriptor {
// track_uuid: 1234
// name: "my_track"
//
// // Optionally, associate the track with a thread.
// thread_descriptor {
// pid: 10
// tid: 10
// ..
// }
// }
// }
// ```
//
// A pair of TYPE_SLICE_BEGIN and _END events form a slice on the track:
//
// ```protobuf
// trace_packet {
// timestamp: 1200
// track_event {
// track_uuid: 1234
// categories: ["my_cat"]
// name: "my_slice"
// type: TYPE_SLICE_BEGIN
// }
// }
// trace_packet {
// timestamp: 1400
// track_event {
// track_uuid: 1234
// type: TYPE_SLICE_END
// }
// }
// ```
// TrackEvents also support optimizations to reduce data repetition and encoded
// data size, e.g. through data interning (names, categories, ...) and delta
// encoding of timestamps/counters. For details, see the InternedData message.
// Further, default values for attributes of events on the same sequence (e.g.
// their default track association) can be emitted as part of a
// TrackEventDefaults message.
//
// Next reserved id: 13 (up to 15). Next id: 51.
message TrackEvent {
// Names of categories of the event. In the client library, categories are a
// way to turn groups of individual events on or off.
// interned EventCategoryName.
repeated uint64 category_iids = 3;
// non-interned variant.
repeated string categories = 22;
// Optional name of the event for its display in trace viewer. May be left
// unspecified for events with typed arguments.
//
// Note that metrics should not rely on event names, as they are prone to
// changing. Instead, they should use typed arguments to identify the events
// they are interested in.
oneof name_field {
// interned EventName.
uint64 name_iid = 10;
// non-interned variant.
string name = 23;
}
// TODO(eseckler): Support using binary symbols for category/event names.
// Type of the TrackEvent (required if |phase| in LegacyEvent is not set).
enum Type {
TYPE_UNSPECIFIED = 0;
// Slice events are events that have a begin and end timestamp, i.e. a
// duration. They can be nested similar to a callstack: If, on the same
// track, event B begins after event A, but before A ends, B is a child
// event of A and will be drawn as a nested event underneath A in the UI.
// Note that child events should always end before their parents (e.g. B
// before A).
//
// Each slice event is formed by a pair of BEGIN + END events. The END event
// does not need to repeat any TrackEvent fields it has in common with its
// corresponding BEGIN event. Arguments and debug annotations of the BEGIN +
// END pair will be merged during trace import.
//
// Note that we deliberately chose not to support COMPLETE events (which
// would specify a duration directly) since clients would need to delay
// writing them until the slice is completed, which can result in reordered
// events in the trace and loss of unfinished events at the end of a trace.
TYPE_SLICE_BEGIN = 1;
TYPE_SLICE_END = 2;
// Instant events are nestable events without duration. They can be children
// of slice events on the same track.
TYPE_INSTANT = 3;
// Event that provides a value for a counter track. |track_uuid| should
// refer to a counter track and |counter_value| set to the new value. Note
// that most other TrackEvent fields (e.g. categories, name, ..) are not
// supported for TYPE_COUNTER events. See also CounterDescriptor.
TYPE_COUNTER = 4;
}
optional Type type = 9;
// Identifies the track of the event. The default value may be overridden
// using TrackEventDefaults, e.g., to specify the track of the TraceWriter's
// sequence (in most cases sequence = one thread). If no value is specified
// here or in TrackEventDefaults, the TrackEvent will be associated with an
// implicit trace-global track (uuid 0). See TrackDescriptor::uuid.
optional uint64 track_uuid = 11;
// A new value for a counter track. |track_uuid| should refer to a track with
// a CounterDescriptor, and |type| should be TYPE_COUNTER. For a more
// efficient encoding of counter values that are sampled at the beginning/end
// of a slice, see |extra_counter_values| and |extra_counter_track_uuids|.
// Counter values can optionally be encoded in as delta values (positive or
// negative) on each packet sequence (see CounterIncrementalBase).
oneof counter_value_field {
int64 counter_value = 30;
double double_counter_value = 44;
}
// To encode counter values more efficiently, we support attaching additional
// counter values to a TrackEvent of any type. All values will share the same
// timestamp specified in the TracePacket. The value at
// extra_counter_values[N] is for the counter track referenced by
// extra_counter_track_uuids[N].
//
// |extra_counter_track_uuids| may also be set via TrackEventDefaults. There
// should always be equal or more uuids than values. It is valid to set more
// uuids (e.g. via defaults) than values. If uuids are specified in
// TrackEventDefaults and a TrackEvent, the TrackEvent uuids override the
// default uuid list.
//
// For example, this allows snapshotting the thread time clock at each
// thread-track BEGIN and END event to capture the cpu time delta of a slice.
repeated uint64 extra_counter_track_uuids = 31;
repeated int64 extra_counter_values = 12;
// Counter snapshots using floating point instead of integer values.
repeated uint64 extra_double_counter_track_uuids = 45;
repeated double extra_double_counter_values = 46;
// IDs of flows originating, passing through, or ending at this event.
// Flow IDs are global within a trace.
//
// A flow connects a sequence of TrackEvents within or across tracks, e.g.
// an input event may be handled on one thread but cause another event on
// a different thread - a flow between the two events can associate them.
//
// The direction of the flows between events is inferred from the events'
// timestamps. The earliest event with the same flow ID becomes the source
// of the flow. Any events thereafter are intermediate steps of the flow,
// until the flow terminates at the last event with the flow ID.
//
// Flows can also be explicitly terminated (see |terminating_flow_ids|), so
// that the same ID can later be reused for another flow.
// DEPRECATED. Only kept for backwards compatibility. Use |flow_ids|.
repeated uint64 flow_ids_old = 36 [deprecated = true];
// TODO(b/204341740): replace "flow_ids_old" with "flow_ids" to reduce memory
// consumption.
repeated fixed64 flow_ids = 47;
// List of flow ids which should terminate on this event, otherwise same as
// |flow_ids|.
// Any one flow ID should be either listed as part of |flow_ids| OR
// |terminating_flow_ids|, not both.
// DEPRECATED. Only kept for backwards compatibility. Use
// |terminating_flow_ids|.
repeated uint64 terminating_flow_ids_old = 42 [deprecated = true];
// TODO(b/204341740): replace "terminating_flow_ids_old" with
// "terminating_flow_ids" to reduce memory consumption.
repeated fixed64 terminating_flow_ids = 48;
// ---------------------------------------------------------------------------
// TrackEvent arguments:
// ---------------------------------------------------------------------------
// Unstable key/value annotations shown in the trace viewer but not intended
// for metrics use.
repeated DebugAnnotation debug_annotations = 4;
// Typed event arguments:
optional TaskExecution task_execution = 5;
optional LogMessage log_message = 21;
optional ChromeCompositorSchedulerState cc_scheduler_state = 24;
optional ChromeUserEvent chrome_user_event = 25;
optional ChromeKeyedService chrome_keyed_service = 26;
optional ChromeLegacyIpc chrome_legacy_ipc = 27;
optional ChromeHistogramSample chrome_histogram_sample = 28;
optional ChromeLatencyInfo chrome_latency_info = 29;
optional ChromeFrameReporter chrome_frame_reporter = 32;
optional ChromeApplicationStateInfo chrome_application_state_info = 39;
optional ChromeRendererSchedulerState chrome_renderer_scheduler_state = 40;
optional ChromeWindowHandleEventInfo chrome_window_handle_event_info = 41;
optional ChromeContentSettingsEventInfo chrome_content_settings_event_info =
43;
optional ChromeActiveProcesses chrome_active_processes = 49;
optional Screenshot screenshot = 50;
// This field is used only if the source location represents the function that
// executes during this event.
oneof source_location_field {
// Non-interned field.
SourceLocation source_location = 33;
// Interned field.
uint64 source_location_iid = 34;
}
optional ChromeMessagePump chrome_message_pump = 35;
optional ChromeMojoEventInfo chrome_mojo_event_info = 38;
// New argument types go here :)
// Extension range for typed events defined externally.
// See docs/design-docs/extensions.md for more details.
//
// Extension support is work-in-progress, in the future the way to reserve a
// subrange for a particular project will be described here and in the design
// document linked above.
//
// Contact perfetto-dev@googlegroups.com if you are interested in a subrange
// for your project.
// Extension range reserved for chromium:
// https://source.chromium.org/chromium/chromium/src/+/main:base/tracing/protos/chrome_track_event.proto
extensions 1000 to 1999;
// Extension range reserved for https://b.corp.google.com/issues/301227627.
extensions 2000 to 2000;
// Extension range for future use.
extensions 2001 to 9899;
// Reserved for Perfetto unit and integration tests.
extensions 9900 to 10000;
// ---------------------------------------------------------------------------
// Deprecated / legacy event fields, which will be removed in the future:
// ---------------------------------------------------------------------------
// Deprecated. Use the |timestamp| and |timestamp_clock_id| fields in
// TracePacket instead.
//
// Timestamp in microseconds (usually CLOCK_MONOTONIC).
oneof timestamp {
// Delta timestamp value since the last TrackEvent or ThreadDescriptor. To
// calculate the absolute timestamp value, sum up all delta values of the
// preceding TrackEvents since the last ThreadDescriptor and add the sum to
// the |reference_timestamp| in ThreadDescriptor. This value should always
// be positive.
int64 timestamp_delta_us = 1;
// Absolute value (e.g. a manually specified timestamp in the macro).
// This is a one-off value that does not affect delta timestamp computation
// in subsequent TrackEvents.
int64 timestamp_absolute_us = 16;
}
// Deprecated. Use |extra_counter_values| and |extra_counter_track_uuids| to
// encode thread time instead.
//
// CPU time for the current thread (e.g., CLOCK_THREAD_CPUTIME_ID) in
// microseconds.
oneof thread_time {
// Delta timestamp value since the last TrackEvent or ThreadDescriptor. To
// calculate the absolute timestamp value, sum up all delta values of the
// preceding TrackEvents since the last ThreadDescriptor and add the sum to
// the |reference_timestamp| in ThreadDescriptor. This value should always
// be positive.
int64 thread_time_delta_us = 2;
// This is a one-off absolute value that does not affect delta timestamp
// computation in subsequent TrackEvents.
int64 thread_time_absolute_us = 17;
}
// Deprecated. Use |extra_counter_values| and |extra_counter_track_uuids| to
// encode thread instruction count instead.
//
// Value of the instruction counter for the current thread.
oneof thread_instruction_count {
// Same encoding as |thread_time| field above.
int64 thread_instruction_count_delta = 8;
int64 thread_instruction_count_absolute = 20;
}
// Apart from {category, time, thread time, tid, pid}, other legacy trace
// event attributes are initially simply proxied for conversion to a JSON
// trace. We intend to gradually transition these attributes to similar native
// features in TrackEvent (e.g. async + flow events), or deprecate them
// without replacement where transition is unsuitable.
//
// Next reserved id: 16 (up to 16).
// Next id: 20.
message LegacyEvent {
// Deprecated, use TrackEvent::name(_iid) instead.
// interned EventName.
optional uint64 name_iid = 1;
optional int32 phase = 2;
optional int64 duration_us = 3;
optional int64 thread_duration_us = 4;
// Elapsed retired instruction count during the event.
optional int64 thread_instruction_delta = 15;
// used to be |flags|.
reserved 5;
oneof id {
uint64 unscoped_id = 6;
uint64 local_id = 10;
uint64 global_id = 11;
}
// Additional optional scope for |id|.
optional string id_scope = 7;
// Consider the thread timestamps for async BEGIN/END event pairs as valid.
optional bool use_async_tts = 9;
// Idenfifies a flow. Flow events with the same bind_id are connected.
optional uint64 bind_id = 8;
// Use the enclosing slice as binding point for a flow end event instead of
// the next slice. Flow start/step events always bind to the enclosing
// slice.
optional bool bind_to_enclosing = 12;
enum FlowDirection {
FLOW_UNSPECIFIED = 0;
FLOW_IN = 1;
FLOW_OUT = 2;
FLOW_INOUT = 3;
}
optional FlowDirection flow_direction = 13;
enum InstantEventScope {
SCOPE_UNSPECIFIED = 0;
SCOPE_GLOBAL = 1;
SCOPE_PROCESS = 2;
SCOPE_THREAD = 3;
}
optional InstantEventScope instant_event_scope = 14;
// Override the pid/tid if the writer needs to emit events on behalf of
// another process/thread. This should be the exception. Normally, the
// pid+tid from ThreadDescriptor is used.
optional int32 pid_override = 18;
optional int32 tid_override = 19;
}
optional LegacyEvent legacy_event = 6;
}
// Default values for fields of all TrackEvents on the same packet sequence.
// Should be emitted as part of TracePacketDefaults whenever incremental state
// is cleared. It's defined here because field IDs should match those of the
// corresponding fields in TrackEvent.
message TrackEventDefaults {
optional uint64 track_uuid = 11;
repeated uint64 extra_counter_track_uuids = 31;
repeated uint64 extra_double_counter_track_uuids = 45;
// TODO(eseckler): Support default values for more TrackEvent fields.
}
// --------------------
// Interned data types:
// --------------------
message EventCategory {
optional uint64 iid = 1;
optional string name = 2;
}
message EventName {
optional uint64 iid = 1;
optional string name = 2;
}
// End of protos/perfetto/trace/track_event/track_event.proto
// Begin of protos/perfetto/trace/interned_data/interned_data.proto
// ------------------------------ DATA INTERNING: ------------------------------
// Interning indexes are built up gradually by adding the entries contained in
// each TracePacket of the same packet sequence (packets emitted by the same
// producer and TraceWriter, see |trusted_packet_sequence_id|). Thus, packets
// can only refer to interned data from other packets in the same sequence.
//
// The writer will emit new entries when it encounters new internable values
// that aren't yet in the index. Data in current and subsequent TracePackets can
// then refer to the entry by its position (interning ID, abbreviated "iid") in
// its index. An interning ID with value 0 is considered invalid (not set).
//
// Because of the incremental build-up, the interning index will miss data when
// TracePackets are lost, e.g. because a chunk was overridden in the central
// ring buffer. To avoid invalidation of the whole trace in such a case, the
// index is periodically reset (see SEQ_INCREMENTAL_STATE_CLEARED).
// When packet loss occurs, the reader will only lose interning data up to the
// next reset.
// -----------------------------------------------------------------------------
// Message that contains new entries for the interning indices of a packet
// sequence.
//
// The writer will usually emit new entries in the same TracePacket that first
// refers to them (since the last reset of interning state). They may also be
// emitted proactively in advance of referring to them in later packets.
//
// Next reserved id: 8 (up to 15).
// Next id: 31.
message InternedData {
// TODO(eseckler): Replace iid fields inside interned messages with
// map<iid, message> type fields in InternedData.
// Each field's message type needs to specify an |iid| field, which is the ID
// of the entry in the field's interning index. Each field constructs its own
// index, thus interning IDs are scoped to the tracing session and field
// (usually as a counter for efficient var-int encoding). It is illegal to
// override entries in an index (using the same iid for two different values)
// within the same tracing session, even after a reset of the emitted
// interning state.
repeated EventCategory event_categories = 1;
repeated EventName event_names = 2;
repeated DebugAnnotationName debug_annotation_names = 3;
repeated DebugAnnotationValueTypeName debug_annotation_value_type_names = 27;
repeated SourceLocation source_locations = 4;
repeated UnsymbolizedSourceLocation unsymbolized_source_locations = 28;
repeated LogMessageBody log_message_body = 20;
repeated HistogramName histogram_names = 25;
// Note: field IDs up to 15 should be used for frequent data only.
// Build IDs of exectuable files.
repeated InternedString build_ids = 16;
// Paths to executable files.
repeated InternedString mapping_paths = 17;
// Paths to source files.
repeated InternedString source_paths = 18;
// Names of functions used in frames below.
repeated InternedString function_names = 5;
// Symbols that were added to this trace after the fact.
repeated ProfiledFrameSymbols profiled_frame_symbols = 21;
// Executable files mapped into processes.
repeated Mapping mappings = 19;
// Frames of callstacks of a program.
repeated Frame frames = 6;
// A callstack of a program.
repeated Callstack callstacks = 7;
// Additional Vulkan information sent in a VulkanMemoryEvent message
repeated InternedString vulkan_memory_keys = 22;
// Graphics context of a render stage event. This represent the GL
// context for an OpenGl app or the VkDevice for a Vulkan app.
repeated InternedGraphicsContext graphics_contexts = 23;
// Description of a GPU hardware queue or render stage.
repeated InternedGpuRenderStageSpecification gpu_specifications = 24;
// This is set when FtraceConfig.symbolize_ksyms = true.
// The id of each symbol the number that will be reported in ftrace events
// like sched_block_reason.caller and is obtained from a monotonic counter.
// The same symbol can have different indexes in different bundles.
// This is is NOT the real address. This is to avoid disclosing KASLR through
// traces.
repeated InternedString kernel_symbols = 26;
// Interned string values in the DebugAnnotation proto.
repeated InternedString debug_annotation_string_values = 29;
// Interned packet context for android.network_packets.
repeated NetworkPacketContext packet_context = 30;
}
// End of protos/perfetto/trace/interned_data/interned_data.proto
// Begin of protos/perfetto/trace/memory_graph.proto
// Message definitions for app-reported memory breakdowns. At the moment, this
// is a Chrome-only tracing feature, historically known as 'memory-infra'. See
// https://chromium.googlesource.com/chromium/src/+/master/docs/memory-infra/ .
// This is unrelated to the native or java heap profilers (those protos live
// in //protos/perfetto/trace/profiling/).
message MemoryTrackerSnapshot {
// Memory snapshot of a process. The snapshot contains memory data that is
// from 2 different sources, namely system stats and instrumentation stats.
// The system memory usage stats come from the OS based on standard API
// available in the platform to query memory usage. The instrumentation stats
// are added by instrumenting specific piece of code which tracks memory
// allocations and deallocations made by a small sub-system within the
// application.
// The system stats of the global memory snapshot are recorded as part of
// ProcessStats and SmapsPacket fields in trace packet with the same
// timestamp.
message ProcessSnapshot {
// Process ID of the process
optional int32 pid = 1;
// Memory dumps are represented as a graph of memory nodes which contain
// statistics. To avoid double counting the same memory across different
// nodes, edges are used to mark nodes that account for the same memory. See
// this doc for examples of the usage:
// https://docs.google.com/document/d/1WGQRJ1sjJrfVkNcgPVY6frm64UqPc94tsxUOXImZUZI
// A single node in the memory graph.
message MemoryNode {
// Unique ID of the node across all processes involved in the global
// memory dump. The ID is only unique within this particular global dump
// identified by GlobalMemoryDumpPacket.global_dump_id.
optional uint64 id = 1;
// Absolute name is a unique name for the memory node within the process
// with ProcessMemoryDump.pid. The name can contain multiple parts
// separated by '/', which traces the edges of the node from the root
// node.
// Eg: "partition_allocator/array_buffers/buffer1" refers to the child
// node "buffer1" in a graph structure of:
// root -> partition_allocator -> array_buffers -> buffer1.
optional string absolute_name = 2;
// A weak node means that the instrumentation that added the current node
// is unsure about the existence of the actual memory. Unless a "strong"
// (non-weak is default) node that has an edge to the current node exists
// in the current global dump, the current node will be discarded.
optional bool weak = 3;
// Size of the node in bytes, used to compute the effective size of the
// nodes without double counting.
optional uint64 size_bytes = 4;
// Entries in the memory node that contain statistics and additional
// debuggable information about the memory. The size of the node is
// tracked separately in the |size_bytes| field.
message MemoryNodeEntry {
optional string name = 1;
enum Units {
UNSPECIFIED = 0;
BYTES = 1;
COUNT = 2;
}
optional Units units = 2;
// Contains either one of uint64 or string value.
optional uint64 value_uint64 = 3;
optional string value_string = 4;
}
repeated MemoryNodeEntry entries = 5;
}
repeated MemoryNode allocator_dumps = 2;
// A directed edge that connects any 2 nodes in the graph above. These are
// in addition to the inherent edges added due to the tree structure of the
// node's absolute names.
// Node with id |source_id| owns the node with id |target_id|, and has the
// effect of attributing the memory usage of target to source. |importance|
// is optional and relevant only for the cases of co-ownership, where it
// acts as a z-index: the owner with the highest importance will be
// attributed target's memory.
message MemoryEdge {
optional uint64 source_id = 1;
optional uint64 target_id = 2;
optional uint32 importance = 3;
optional bool overridable = 4;
}
repeated MemoryEdge memory_edges = 3;
}
// Unique ID that represents the global memory dump.
optional uint64 global_dump_id = 1;
enum LevelOfDetail {
DETAIL_FULL = 0;
DETAIL_LIGHT = 1;
DETAIL_BACKGROUND = 2;
}
optional LevelOfDetail level_of_detail = 2;
repeated ProcessSnapshot process_memory_dumps = 3;
}
// End of protos/perfetto/trace/memory_graph.proto
// Begin of protos/perfetto/trace/perfetto/perfetto_metatrace.proto
// Used to trace the execution of perfetto itself.
message PerfettoMetatrace {
// See base/metatrace_events.h for definitions.
oneof record_type {
uint32 event_id = 1;
uint32 counter_id = 2;
// For trace processor metatracing.
string event_name = 8;
uint64 event_name_iid = 11;
string counter_name = 9;
}
message Arg {
oneof key_or_interned_key {
string key = 1;
uint64 key_iid = 3;
}
oneof value_or_interned_value {
string value = 2;
uint64 value_iid = 4;
}
}
// Only when using |event_id|.
optional uint64 event_duration_ns = 3;
// Only when using |counter_id|.
optional int32 counter_value = 4;
// ID of the thread that emitted the event.
optional uint32 thread_id = 5;
// If true the meta-tracing ring buffer had overruns and hence some data is
// missing from this point.
optional bool has_overruns = 6;
// Args for the event.
repeated Arg args = 7;
// Interned strings corresponding to the |event_name_iid|, |key_iid| and
// |value_iid| above.
message InternedString {
optional uint64 iid = 1;
optional string value = 2;
};
repeated InternedString interned_strings = 10;
}
// End of protos/perfetto/trace/perfetto/perfetto_metatrace.proto
// Begin of protos/perfetto/trace/perfetto/tracing_service_event.proto
// Events emitted by the tracing service.
message TracingServiceEvent {
oneof event_type {
// When each of the following booleans are set to true, they report the
// point in time (through TracePacket's timestamp) where the condition
// they describe happened.
// The order of the booleans below matches the timestamp ordering
// they would generally be expected to have.
// Emitted when we start tracing and specifically, this will be before any
// producer is notified about the existence of this trace. This is always
// emitted before the all_data_sources_started event. This event is also
// guaranteed to be seen (byte-offset wise) before any data packets from
// producers.
bool tracing_started = 2;
// Emitted after all data sources saw the start event and ACKed it.
// This identifies the point in time when it's safe to assume that all data
// sources have been recording events.
bool all_data_sources_started = 1;
// Emitted when all data sources have been flushed successfully or with an
// error (including timeouts). This can generally happen many times over the
// course of the trace.
bool all_data_sources_flushed = 3;
// Emitted when reading back the central tracing buffers has been completed.
// If |write_into_file| is specified, this can happen many times over the
// course of the trace.
bool read_tracing_buffers_completed = 4;
// Emitted after tracing has been disabled and specifically, this will be
// after all packets from producers have been included in the central
// tracing buffer.
bool tracing_disabled = 5;
// Emitted if perfetto --save-for-bugreport was invoked while the current
// tracing session was running and it had the highest bugreport_score. In
// this case the original consumer will see a nearly empty trace, because
// the contents are routed onto the bugreport file. This event flags the
// situation explicitly. Traces that contain this marker should be discarded
// by test infrastructures / pipelines.
// Deprecated since Android U, where --save-for-bugreport uses
// non-destructive cloning.
bool seized_for_bugreport = 6;
}
}
// End of protos/perfetto/trace/perfetto/tracing_service_event.proto
// Begin of protos/perfetto/common/android_energy_consumer_descriptor.proto
// Energy consumer based on aidl class:
// android.hardware.power.stats.EnergyConsumer.
message AndroidEnergyConsumer {
// Unique ID of this energy consumer. Matches the ID in a
// AndroidEnergyEstimationBreakdown.
optional int32 energy_consumer_id = 1;
// For a group of energy consumers of the same logical type, sorting by
// ordinal gives their physical order. Ordinals must be consecutive integers
// starting from 0.
optional int32 ordinal = 2;
// Type of this energy consumer.
optional string type = 3;
// Unique name of this energy consumer. Vendor/device specific. Opaque to
// framework.
optional string name = 4;
}
message AndroidEnergyConsumerDescriptor {
repeated AndroidEnergyConsumer energy_consumers = 1;
}
// End of protos/perfetto/common/android_energy_consumer_descriptor.proto
// Begin of protos/perfetto/trace/power/android_energy_estimation_breakdown.proto
// Energy data retrieve using the ODPM(On Device Power Monitor) API.
// This proto represents the aidl class:
// android.hardware.power.stats.EnergyConsumerResult.
message AndroidEnergyEstimationBreakdown {
// The first trace packet of each session should include a energy consumer
// descriptor.
optional AndroidEnergyConsumerDescriptor energy_consumer_descriptor = 1;
// ID of the AndroidEnergyConsumer associated with this result. Matches
// the energy_consumer_id in the AndroidEnergyConsumerDescriptor that
// should be sent at the beginning of a trace.
optional int32 energy_consumer_id = 2;
// Total accumulated energy since boot in microwatt-seconds (uWs)
optional int64 energy_uws = 3;
message EnergyUidBreakdown {
// Android ID/Linux UID, the accumulated energy is attributed to.
optional int32 uid = 1;
// Accumulated energy since boot in microwatt-seconds (uWs).
optional int64 energy_uws = 2;
}
// Optional attributed energy per Android ID / Linux UID for this
// EnergyConsumer. Sum total of attributed energy must be less than or equal
// to total accumulated energy.
repeated EnergyUidBreakdown per_uid_breakdown = 4;
}
// End of protos/perfetto/trace/power/android_energy_estimation_breakdown.proto
// Begin of protos/perfetto/trace/power/android_entity_state_residency.proto
message EntityStateResidency {
message PowerEntityState {
// Index corresponding to the entity
optional int32 entity_index = 1;
// Index corresponding to the state
optional int32 state_index = 2;
// Name of the entity. This is device-specific, determined by the PowerStats
// HAL, and cannot be configured by the user. An example would be
// "Bluetooth".
optional string entity_name = 3;
// Name of the state. This is device-specific, determined by the PowerStats
// HAL, and cannot be configured by the user. An example would be
// "Active".
optional string state_name = 4;
}
// This is only emitted at the beginning of the trace.
repeated PowerEntityState power_entity_state = 1;
message StateResidency {
// Index corresponding to PowerEntityState.entity_index
optional int32 entity_index = 1;
// Index corresponding to PowerEntityState.state_index
optional int32 state_index = 2;
// Time since boot that this entity has been in this state
optional uint64 total_time_in_state_ms = 3;
// Total number of times since boot that the entity has entered this state
optional uint64 total_state_entry_count = 4;
// Timestamp of the last time the entity entered this state
optional uint64 last_entry_timestamp_ms = 5;
}
repeated StateResidency residency = 2;
}
// End of protos/perfetto/trace/power/android_entity_state_residency.proto
// Begin of protos/perfetto/trace/power/battery_counters.proto
message BatteryCounters {
// Battery capacity in microampere-hours(µAh). Also known as Coulomb counter.
optional int64 charge_counter_uah = 1;
// Remaining battery capacity percentage of total capacity
optional float capacity_percent = 2;
// Instantaneous battery current in microamperes(µA).
// Positive values indicate current drained from the battery,
// negative values current feeding the battery from a charge source (USB).
// See https://perfetto.dev/docs/data-sources/battery-counters for more.
optional int64 current_ua = 3;
// Instantaneous battery current in microamperes(µA).
optional int64 current_avg_ua = 4;
// Battery name, emitted only on multiple batteries.
optional string name = 5;
// Battery capacity in microwatt-hours(µWh).
optional int64 energy_counter_uwh = 6;
// Battery voltage in microvolts(µV).
optional int64 voltage_uv = 7;
}
// End of protos/perfetto/trace/power/battery_counters.proto
// Begin of protos/perfetto/trace/power/power_rails.proto
message PowerRails {
message RailDescriptor {
// Index corresponding to the rail
optional uint32 index = 1;
// Name of the rail
optional string rail_name = 2;
// Name of the subsystem to which this rail belongs
optional string subsys_name = 3;
// Hardware sampling rate (Hz).
optional uint32 sampling_rate = 4;
}
// This is only emitted at the beginning of the trace.
repeated RailDescriptor rail_descriptor = 1;
message EnergyData {
// Index corresponding to RailDescriptor.index
optional uint32 index = 1;
// Time since device boot(CLOCK_BOOTTIME) in milli-seconds.
optional uint64 timestamp_ms = 2;
// Accumulated energy since device boot in microwatt-seconds (uWs).
optional uint64 energy = 3;
}
repeated EnergyData energy_data = 2;
}
// End of protos/perfetto/trace/power/power_rails.proto
// Begin of protos/perfetto/trace/profiling/deobfuscation.proto
message ObfuscatedMember {
// This is the obfuscated field name relative to the class containing the
// ObfuscatedMember.
optional string obfuscated_name = 1;
// If this is fully qualified (i.e. contains a '.') this is the deobfuscated
// field name including its class. Otherwise, this is this the unqualified
// deobfuscated field name relative to the class containing this
// ObfuscatedMember.
optional string deobfuscated_name = 2;
}
message ObfuscatedClass {
optional string obfuscated_name = 1;
optional string deobfuscated_name = 2;
// fields.
repeated ObfuscatedMember obfuscated_members = 3;
repeated ObfuscatedMember obfuscated_methods = 4;
}
message DeobfuscationMapping {
optional string package_name = 1;
optional int64 version_code = 2;
repeated ObfuscatedClass obfuscated_classes = 3;
}
// End of protos/perfetto/trace/profiling/deobfuscation.proto
// Begin of protos/perfetto/trace/profiling/heap_graph.proto
message HeapGraphRoot {
enum Type {
ROOT_UNKNOWN = 0;
ROOT_JNI_GLOBAL = 1;
ROOT_JNI_LOCAL = 2;
ROOT_JAVA_FRAME = 3;
ROOT_NATIVE_STACK = 4;
ROOT_STICKY_CLASS = 5;
ROOT_THREAD_BLOCK = 6;
ROOT_MONITOR_USED = 7;
ROOT_THREAD_OBJECT = 8;
ROOT_INTERNED_STRING = 9;
ROOT_FINALIZING = 10;
ROOT_DEBUGGER = 11;
ROOT_REFERENCE_CLEANUP = 12;
ROOT_VM_INTERNAL = 13;
ROOT_JNI_MONITOR = 14;
};
// Objects retained by this root.
repeated uint64 object_ids = 1 [packed = true];
optional Type root_type = 2;
}
message HeapGraphType {
enum Kind {
KIND_UNKNOWN = 0;
KIND_NORMAL = 1;
KIND_NOREFERENCES = 2;
KIND_STRING = 3;
KIND_ARRAY = 4;
KIND_CLASS = 5;
KIND_CLASSLOADER = 6;
KIND_DEXCACHE = 7;
KIND_SOFT_REFERENCE = 8;
KIND_WEAK_REFERENCE = 9;
KIND_FINALIZER_REFERENCE = 10;
KIND_PHANTOM_REFERENCE = 11;
};
// TODO(fmayer): Consider removing this and using the index in the repeaed
// field to save space.
optional uint64 id = 1;
optional uint64 location_id = 2;
optional string class_name = 3;
// Size of objects of this type.
optional uint64 object_size = 4;
optional uint64 superclass_id = 5;
// Indices for InternedData.field_names for the names of the fields of
// instances of this class. This does NOT include the fields from
// superclasses. The consumer of this data needs to walk all super
// classes to get a full lists of fields. Objects always write the
// fields in order of most specific class to the furthest up superclass.
repeated uint64 reference_field_id = 6 [packed = true];
optional Kind kind = 7;
optional uint64 classloader_id = 8;
}
message HeapGraphObject {
oneof identifier {
uint64 id = 1;
uint64 id_delta = 7;
}
// Index for InternedData.types for the name of the type of this object.
optional uint64 type_id = 2;
// Bytes occupied by this objects.
optional uint64 self_size = 3;
// Add this to all non-zero values in reference_object_id. This is used to
// get more compact varint encoding.
//
// The name is confusing, but this has always been used as a base for
// reference_object_id. The field should be named reference_object_id_base.
optional uint64 reference_field_id_base = 6;
// Indices for InternedData.field_names for the name of the field referring
// to the object. For Android S+ and for instances of normal classes (e.g.
// not instances of java.lang.Class or arrays), this is instead set in the
// corresponding HeapGraphType, and this is left empty.
repeated uint64 reference_field_id = 4 [packed = true];
// Ids of the Object that is referred to.
repeated uint64 reference_object_id = 5 [packed = true];
// If this object is an instance of `libcore.util.NativeAllocationRegistry`,
// the value of the `size` field.
//
// N.B. This is not the native size of this object.
optional int64 native_allocation_registry_size_field = 8;
}
message HeapGraph {
optional int32 pid = 1;
// This contains all objects at the time this dump was taken. Some of these
// will be live, some of those unreachable (garbage). To find the live
// objects, the client needs to build the transitive closure of objects
// reachable from |roots|.
// All objects not contained within that transitive closure are garbage that
// has not yet been collected.
repeated HeapGraphObject objects = 2;
// Roots at the time this dump was taken.
// All live objects are reachable from the roots. All other objects are
// garbage.
repeated HeapGraphRoot roots = 7;
// Types used in HeapGraphObjects.
repeated HeapGraphType types = 9;
reserved 3;
// Field names for references in managed heap graph.
repeated InternedString field_names = 4;
// Paths of files used in managed heap graph.
repeated InternedString location_names = 8;
optional bool continued = 5;
optional uint64 index = 6;
}
// End of protos/perfetto/trace/profiling/heap_graph.proto
// Begin of protos/perfetto/trace/profiling/profile_packet.proto
// This file contains a mixture of messages emitted by various sampling
// profilers:
//
// Memory allocator profiling
// ----------------
// ProfilePacket:
// The packet emitted by heapprofd, which started off as a native heap
// (malloc/free) profiler, but now supports custom allocators as well. Each
// packet contains a preaggregated state of the heap at snapshot time, which
// report the total allocated/free bytes per callstack (plus other info such
// as the number of samples).
// StreamingAllocation/StreamingFree:
// Emitted by heapprofd when configured in streaming mode (i.e. when
// stream_allocations = true). This is only for local testing, and doesn't
// report callstacks (only address time and size of each alloc/free). It can
// lead to enormous traces, as it contains the stream of each alloc/free call.
//
// Callstack sampling
// ------------------
// StreamingProfilePacket:
// The packet emitted by the chromium in-process sampling profiler, which is
// based on periodically sending a signal to itself, and unwinding the stack
// in the signal handler. Each packet contains a series of individual stack
// samples for a Chromium thread.
//
// Callstack and performance counter sampling
// ---------------------
// PerfSample:
// The packet emitted by traced_perf sampling performance profiler based on
// the perf_event_open syscall. Each packet represents an individual sample
// of a performance counter (which might be a timer), and optionally a
// callstack of the process that was scheduled at the time of the sample.
//
// The packet emitted by heapprofd for each heap snapshot. A snapshot can
// involve more than one ProfilePacket if the snapshot is big (when |continued|
// is true). The cardinality and grouping is as follows:
// A ProfilePacket contains:
// - 1+ per-process heap snapshots (ProcessHeapSamples). Normally there is only
// one heap per process (the main malloc/free heap), but there can be more if
// the process is using the heapprofd API to profile custom allocators.
// - Globally interned strings, mappings and frames (to allow de-duplicating
// frames/mapping in common between different processes).
// A ProcessHeapSamples contains:
// - The process and heap identifier.
// - A number of HeapSample, one for each callsite that had some alloc/frees.
// - Statistics about heapprofd internals (e.g., sampling/unwinding timings).
// A HeapSample contains statistics about callsites:
// - Total number of bytes allocated and freed from that callsite.
// - Total number of alloc/free calls sampled.
// - Stats at the local maximum when dump_at_max = true.
// See https://perfetto.dev/docs/data-sources/native-heap-profiler for more.
message ProfilePacket {
// The following interning tables are only used in Android version Q.
// In newer versions, these tables are in InternedData
// (see protos/perfetto/trace/interned_data) and are shared across
// multiple ProfilePackets.
// For backwards compatibility, consumers need to first look up interned
// data in the tables within the ProfilePacket, and then, if they are empty,
// look up in the InternedData instead.
repeated InternedString strings = 1;
repeated Mapping mappings = 4;
repeated Frame frames = 2;
repeated Callstack callstacks = 3;
// Next ID: 9
message HeapSample {
optional uint64 callstack_id = 1;
// bytes allocated at this callstack.
optional uint64 self_allocated = 2;
// bytes allocated at this callstack that have been freed.
optional uint64 self_freed = 3;
// deprecated self_idle.
reserved 7;
// Bytes allocated by this callstack but not freed at the time the malloc
// heap usage of this process was maximal. This is only set if dump_at_max
// is true in HeapprofdConfig. In that case, self_allocated, self_freed and
// self_idle will not be set.
optional uint64 self_max = 8;
// Number of allocations that were sampled at this callstack but not freed
// at the time the malloc heap usage of this process was maximal. This is
// only set if dump_at_max is true in HeapprofdConfig. In that case,
// self_allocated, self_freed and self_idle will not be set.
optional uint64 self_max_count = 9;
// timestamp [opt]
optional uint64 timestamp = 4;
// Number of allocations that were sampled at this callstack.
optional uint64 alloc_count = 5;
// Number of allocations that were sampled at this callstack that have been
// freed.
optional uint64 free_count = 6;
}
message Histogram {
message Bucket {
// This bucket counts values from the previous bucket's (or -infinity if
// this is the first bucket) upper_limit (inclusive) to this upper_limit
// (exclusive).
optional uint64 upper_limit = 1;
// This is the highest bucket. This is set instead of the upper_limit. Any
// values larger or equal to the previous bucket's upper_limit are counted
// in this bucket.
optional bool max_bucket = 2;
// Number of values that fall into this range.
optional uint64 count = 3;
}
repeated Bucket buckets = 1;
}
message ProcessStats {
optional uint64 unwinding_errors = 1;
optional uint64 heap_samples = 2;
optional uint64 map_reparses = 3;
optional Histogram unwinding_time_us = 4;
optional uint64 total_unwinding_time_us = 5;
optional uint64 client_spinlock_blocked_us = 6;
}
repeated ProcessHeapSamples process_dumps = 5;
message ProcessHeapSamples {
enum ClientError {
CLIENT_ERROR_NONE = 0;
CLIENT_ERROR_HIT_TIMEOUT = 1;
CLIENT_ERROR_INVALID_STACK_BOUNDS = 2;
}
optional uint64 pid = 1;
// This process was profiled from startup.
// If false, this process was already running when profiling started.
optional bool from_startup = 3;
// This process was not profiled because a concurrent session was active.
// If this is true, samples will be empty.
optional bool rejected_concurrent = 4;
// This process disconnected while it was profiled.
// If false, the process outlived the profiling session.
optional bool disconnected = 6;
// If disconnected, this disconnect was caused by the client overrunning
// the buffer.
// Equivalent to client_error == CLIENT_ERROR_HIT_TIMEOUT
// on new S builds.
optional bool buffer_overran = 7;
optional ClientError client_error = 14;
// If disconnected, this disconnected was caused by the shared memory
// buffer being corrupted. THIS IS ALWAYS A BUG IN HEAPPROFD OR CLIENT
// MEMORY CORRUPTION.
optional bool buffer_corrupted = 8;
// If disconnected, this disconnect was caused by heapprofd exceeding
// guardrails during this profiling session.
optional bool hit_guardrail = 10;
optional string heap_name = 11;
optional uint64 sampling_interval_bytes = 12;
optional uint64 orig_sampling_interval_bytes = 13;
// Timestamp of the state of the target process that this dump represents.
// This can be different to the timestamp of the TracePackets for various
// reasons:
// * If disconnected is set above, this is the timestamp of last state
// heapprofd had of the process before it disconnected.
// * Otherwise, if the rate of events produced by the process is high,
// heapprofd might be behind.
//
// TODO(fmayer): This is MONOTONIC_COARSE. Refactor ClockSnapshot::Clock
// to have a type enum that we can reuse here.
optional uint64 timestamp = 9;
// Metadata about heapprofd.
optional ProcessStats stats = 5;
repeated HeapSample samples = 2;
}
// If this is true, the next ProfilePacket in this package_sequence_id is a
// continuation of this one.
// To get all samples for a process, accummulate its
// ProcessHeapSamples.samples until you see continued=false.
optional bool continued = 6;
// Index of this ProfilePacket on its package_sequence_id. Can be used
// to detect dropped data.
// Verify these are consecutive.
optional uint64 index = 7;
}
// Packet emitted by heapprofd when stream_allocations = true. Only for local
// testing. Doesn't report the callsite.
message StreamingAllocation {
// TODO(fmayer): Add callstack.
repeated uint64 address = 1;
repeated uint64 size = 2;
repeated uint64 sample_size = 3;
repeated uint64 clock_monotonic_coarse_timestamp = 4;
repeated uint32 heap_id = 5;
repeated uint64 sequence_number = 6;
};
// Packet emitted by heapprofd when stream_allocations = true. Only for local
// testing. Doesn't report the callsite.
message StreamingFree {
// TODO(fmayer): Add callstack.
repeated uint64 address = 1;
repeated uint32 heap_id = 2;
repeated uint64 sequence_number = 3;
};
// Packet emitted by the chromium in-process signal-based callstack sampler.
// Represents a series of individual stack samples (sampled at discrete points
// in time), rather than aggregated over an interval.
message StreamingProfilePacket {
// Index into InternedData.callstacks
repeated uint64 callstack_iid = 1;
// TODO(eseckler): ThreadDescriptor-based timestamps are deprecated. Replace
// this with ClockSnapshot-based delta encoding instead.
repeated int64 timestamp_delta_us = 2;
optional int32 process_priority = 3;
}
// Namespace for the contained enums.
message Profiling {
enum CpuMode {
MODE_UNKNOWN = 0;
MODE_KERNEL = 1;
MODE_USER = 2;
// The following values aren't expected, but included for completeness:
MODE_HYPERVISOR = 3;
MODE_GUEST_KERNEL = 4;
MODE_GUEST_USER = 5;
}
// Enumeration of libunwindstack's error codes.
// NB: the integral representations of the two enums are different.
enum StackUnwindError {
UNWIND_ERROR_UNKNOWN = 0;
UNWIND_ERROR_NONE = 1;
UNWIND_ERROR_MEMORY_INVALID = 2;
UNWIND_ERROR_UNWIND_INFO = 3;
UNWIND_ERROR_UNSUPPORTED = 4;
UNWIND_ERROR_INVALID_MAP = 5;
UNWIND_ERROR_MAX_FRAMES_EXCEEDED = 6;
UNWIND_ERROR_REPEATED_FRAME = 7;
UNWIND_ERROR_INVALID_ELF = 8;
UNWIND_ERROR_SYSTEM_CALL = 9;
UNWIND_ERROR_THREAD_TIMEOUT = 10;
UNWIND_ERROR_THREAD_DOES_NOT_EXIST = 11;
UNWIND_ERROR_BAD_ARCH = 12;
UNWIND_ERROR_MAPS_PARSE = 13;
UNWIND_ERROR_INVALID_PARAMETER = 14;
UNWIND_ERROR_PTRACE_CALL = 15;
}
}
// Packet emitted by the traced_perf sampling performance profiler, which
// gathers data via the perf_event_open syscall. Each packet contains an
// individual sample with a counter value, and optionally a
// callstack.
//
// Timestamps are within the root packet. The config can specify the clock, or
// the implementation will default to CLOCK_MONOTONIC_RAW. Within the Android R
// timeframe, the default was CLOCK_BOOTTIME.
//
// There are several distinct views of this message:
// * indication of kernel buffer data loss (kernel_records_lost set)
// * indication of skipped samples (sample_skipped_reason set)
// * notable event in the sampling implementation (producer_event set)
// * normal sample (timebase_count set, typically also callstack_iid)
message PerfSample {
optional uint32 cpu = 1;
optional uint32 pid = 2;
optional uint32 tid = 3;
// Execution state that the process was sampled at.
optional Profiling.CpuMode cpu_mode = 5;
// Value of the timebase counter (since the event was configured, no deltas).
optional uint64 timebase_count = 6;
// Unwound callstack. Might be partial, in which case a synthetic "error"
// frame is appended, and |unwind_error| is set accordingly.
optional uint64 callstack_iid = 4;
// If set, stack unwinding was incomplete due to an error.
// Unset values should be treated as UNWIND_ERROR_NONE.
oneof optional_unwind_error { Profiling.StackUnwindError unwind_error = 16; };
// If set, indicates that this message is not a sample, but rather an
// indication of data loss in the ring buffer allocated for |cpu|. Such data
// loss occurs when the kernel has insufficient ring buffer capacity to write
// a record (which gets discarded). A record in this context is an individual
// ring buffer entry, and counts more than just sample records.
//
// The |timestamp| of the packet corresponds to the time that the producer
// wrote the packet for trace-sorting purposes alone, and should not be
// interpreted relative to the sample timestamps. This field is sufficient to
// detect that *some* kernel data loss happened within the trace, but not the
// specific time bounds of that loss (which would require tracking precedessor
// & successor timestamps, which is not deemed necessary at the moment).
optional uint64 kernel_records_lost = 17;
// If set, indicates that the profiler encountered a sample that was relevant,
// but was skipped.
enum SampleSkipReason {
PROFILER_SKIP_UNKNOWN = 0;
PROFILER_SKIP_READ_STAGE = 1;
PROFILER_SKIP_UNWIND_STAGE = 2;
PROFILER_SKIP_UNWIND_ENQUEUE = 3;
}
oneof optional_sample_skipped_reason {
SampleSkipReason sample_skipped_reason = 18;
};
// A notable event within the sampling implementation.
message ProducerEvent {
enum DataSourceStopReason {
PROFILER_STOP_UNKNOWN = 0;
PROFILER_STOP_GUARDRAIL = 1;
}
oneof optional_source_stop_reason {
DataSourceStopReason source_stop_reason = 1;
}
}
optional ProducerEvent producer_event = 19;
}
// Submessage for TracePacketDefaults.
message PerfSampleDefaults {
// The sampling timebase. Might not be identical to the data source config if
// the implementation decided to default/override some parameters.
optional PerfEvents.Timebase timebase = 1;
// If the config requested process sharding, report back the count and which
// of those bins was selected. Never changes for the duration of a trace.
optional uint32 process_shard_count = 2;
optional uint32 chosen_process_shard = 3;
}
// End of protos/perfetto/trace/profiling/profile_packet.proto
// Begin of protos/perfetto/trace/profiling/smaps.proto
message SmapsEntry {
optional string path = 1;
optional uint64 size_kb = 2;
optional uint64 private_dirty_kb = 3;
optional uint64 swap_kb = 4;
// for field upload (instead of path).
optional string file_name = 5;
// TODO(crbug.com/1098746): Consider encoding this as incremental values.
optional uint64 start_address = 6;
optional uint64 module_timestamp = 7;
optional string module_debugid = 8;
optional string module_debug_path = 9;
optional uint32 protection_flags = 10;
optional uint64 private_clean_resident_kb = 11;
optional uint64 shared_dirty_resident_kb = 12;
optional uint64 shared_clean_resident_kb = 13;
optional uint64 locked_kb = 14;
optional uint64 proportional_resident_kb = 15;
};
message SmapsPacket {
optional uint32 pid = 1;
repeated SmapsEntry entries = 2;
};
// End of protos/perfetto/trace/profiling/smaps.proto
// Begin of protos/perfetto/trace/ps/process_stats.proto
// Per-process periodically sampled stats. These samples are wrapped in a
// dedicated message (as opposite to be fields in process_tree.proto) because
// they are dumped at a different rate than cmdline and thread list.
// Note: not all of these stats will be present in every ProcessStats message
// and sometimes processes may be missing . This is because counters are
// cached to reduce emission of counters which do not change.
message ProcessStats {
// Per-thread periodically sampled stats.
// Note: not all of these stats will be present in every message. See the note
// for ProcessStats.
message Thread {
optional int32 tid = 1;
// DEPRECATED cpu_freq_indices
reserved 2;
// DEPRECATED cpu_freq_ticks
reserved 3;
// DEPRECATED cpu_freq_full
reserved 4;
}
message FDInfo {
optional uint64 fd = 1;
optional string path = 2;
}
message Process {
optional int32 pid = 1;
// See /proc/[pid]/status in `man 5 proc` for a description of these fields.
optional uint64 vm_size_kb = 2;
optional uint64 vm_rss_kb = 3;
optional uint64 rss_anon_kb = 4;
optional uint64 rss_file_kb = 5;
optional uint64 rss_shmem_kb = 6;
optional uint64 vm_swap_kb = 7;
optional uint64 vm_locked_kb = 8;
optional uint64 vm_hwm_kb = 9;
// When adding a new field remember to update kProcMemCounterSize in
// the trace processor.
optional int64 oom_score_adj = 10;
repeated Thread threads = 11;
// The peak resident set size is resettable in newer Posix kernels.
// This field specifies if reset is supported and if the writer had reset
// the peaks after each process stats recording.
optional bool is_peak_rss_resettable = 12;
// Private, shared and swap footprint of the process as measured by
// Chrome. To know more about these metrics refer to:
// https://docs.google.com/document/d/1_WmgE1F5WUrhwkPqJis3dWyOiUmQKvpXp5cd4w86TvA
optional uint32 chrome_private_footprint_kb = 13;
optional uint32 chrome_peak_resident_set_kb = 14;
repeated FDInfo fds = 15;
// These fields are set only when scan_smaps_rollup=true
optional uint64 smr_rss_kb = 16;
optional uint64 smr_pss_kb = 17;
optional uint64 smr_pss_anon_kb = 18;
optional uint64 smr_pss_file_kb = 19;
optional uint64 smr_pss_shmem_kb = 20;
}
repeated Process processes = 1;
// The time at which we finish collecting this batch of samples;
// the top-level packet timestamp is the time at which
// we begin collection.
optional uint64 collection_end_timestamp = 2;
}
// End of protos/perfetto/trace/ps/process_stats.proto
// Begin of protos/perfetto/trace/ps/process_tree.proto
// Metadata about the processes and threads in the trace.
// Note: this proto was designed to be filled in by traced_probes and should
// only be populated with accurate information coming from the system. Other
// trace writers should prefer to fill ThreadDescriptor and ProcessDescriptor
// in TrackDescriptor.
message ProcessTree {
// Representation of a thread.
message Thread {
// The thread ID (as per gettid()) in the root PID namespace.
optional int32 tid = 1;
// Thread group id (i.e. the PID of the process, == TID of the main thread)
optional int32 tgid = 3;
// The name of the thread.
optional string name = 2;
// The non-root-level thread IDs if the thread runs in a PID namespace. Read
// from the NSpid entry of /proc/<tid>/status, with the first element (root-
// level thread ID) omitted.
repeated int32 nstid = 4;
}
// Representation of a process.
message Process {
// The UNIX process ID, aka thread group ID (as per getpid()) in the root
// PID namespace.
optional int32 pid = 1;
// The parent process ID, as per getppid().
optional int32 ppid = 2;
// The command line for the process, as per /proc/pid/cmdline.
// If it is a kernel thread there will only be one cmdline field
// and it will contain /proc/pid/comm.
repeated string cmdline = 3;
// No longer used as of Apr 2018, when the dedicated |threads| field was
// introduced in ProcessTree.
repeated Thread threads_deprecated = 4 [deprecated = true];
// The uid for the process, as per /proc/pid/status.
optional int32 uid = 5;
// The non-root-level process IDs if the process runs in a PID namespace.
// Read from the NSpid entry of /proc/<pid>/status, with the first element (
// root-level process ID) omitted.
repeated int32 nspid = 6;
}
// List of processes and threads in the client. These lists are incremental
// and not exhaustive. A process and its threads might show up separately in
// different ProcessTree messages. A thread might event not show up at all, if
// no sched_switch activity was detected, for instance:
// #0 { processes: [{pid: 10, ...}], threads: [{pid: 11, tgid: 10}] }
// #1 { threads: [{pid: 12, tgid: 10}] }
// #2 { processes: [{pid: 20, ...}], threads: [{pid: 13, tgid: 10}] }
repeated Process processes = 1;
repeated Thread threads = 2;
// The time at which we finish collecting this process tree;
// the top-level packet timestamp is the time at which
// we begin collection.
optional uint64 collection_end_timestamp = 3;
}
// End of protos/perfetto/trace/ps/process_tree.proto
// Begin of protos/perfetto/trace/statsd/statsd_atom.proto
// Deliberate empty message. See comment on StatsdAtom#atom below.
message Atom {}
// One or more statsd atoms. This must continue to match:
// perfetto/protos/third_party/statsd/shell_data.proto
// So that we can efficiently add data from statsd directly to the
// trace.
message StatsdAtom {
// Atom should be filled with an Atom proto from:
// https://cs.android.com/android/platform/superproject/+/master:frameworks/proto_logging/stats/atoms.proto?q=f:stats%2Fatoms.proto$%20message%5C%20Atom
// We don't reference Atom directly here since we don't want to import
// Atom.proto and all its transitive dependencies into Perfetto.
// atom and timestamp_nanos have the same cardinality
repeated Atom atom = 1;
repeated int64 timestamp_nanos = 2;
}
// End of protos/perfetto/trace/statsd/statsd_atom.proto
// Begin of protos/perfetto/trace/sys_stats/sys_stats.proto
// Various Linux system stat counters from /proc.
// The fields in this message can be reported at different rates and with
// different granularity. See sys_stats_config.proto.
message SysStats {
// Counters from /proc/meminfo. Values are in KB.
message MeminfoValue {
optional MeminfoCounters key = 1;
optional uint64 value = 2;
};
repeated MeminfoValue meminfo = 1;
// Counter from /proc/vmstat. Units are often pages, not KB.
message VmstatValue {
optional VmstatCounters key = 1;
optional uint64 value = 2;
};
repeated VmstatValue vmstat = 2;
// Times in each mode, since boot. Unit: nanoseconds.
message CpuTimes {
optional uint32 cpu_id = 1;
// Time spent in user mode.
optional uint64 user_ns = 2;
// Time spent in user mode (low prio).
optional uint64 user_nice_ns = 3;
// Time spent in system mode.
optional uint64 system_mode_ns = 4;
// Time spent in the idle task.
optional uint64 idle_ns = 5;
// Time spent waiting for I/O.
optional uint64 io_wait_ns = 6;
// Time spent servicing interrupts.
optional uint64 irq_ns = 7;
// Time spent servicing softirqs.
optional uint64 softirq_ns = 8;
}
// One entry per cpu.
repeated CpuTimes cpu_stat = 3;
// Num processes forked since boot.
// Populated only if FORK_COUNT in config.stat_counters.
optional uint64 num_forks = 4;
message InterruptCount {
optional int32 irq = 1;
optional uint64 count = 2;
}
// Number of interrupts, broken by IRQ number.
// Populated only if IRQ_COUNTS in config.stat_counters.
// Total num of irqs serviced since boot.
optional uint64 num_irq_total = 5;
repeated InterruptCount num_irq = 6;
// Number of softirqs, broken by softirq number.
// Populated only if SOFTIRQ_COUNTS in config.stat_counters.
// Total num of softirqs since boot.
optional uint64 num_softirq_total = 7;
// Per-softirq count.
repeated InterruptCount num_softirq = 8;
// The time at which we finish collecting this set of samples;
// the top-level packet timestamp is the time at which
// we begin collection.
optional uint64 collection_end_timestamp = 9;
// Frequencies for /sys/class/devfreq/ entries in kHz.
message DevfreqValue {
optional string key = 1;
optional uint64 value = 2;
};
// One entry per device.
repeated DevfreqValue devfreq = 10;
// Cpu current frequency from
// /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq in kHz.
// One entry per cpu. Report 0 for offline cpu
repeated uint32 cpufreq_khz = 11;
message BuddyInfo {
optional string node = 1;
optional string zone = 2;
repeated uint32 order_pages = 3;
}
// One entry per each node's zones.
repeated BuddyInfo buddy_info = 12;
// Counters from /proc/diskstats.
message DiskStat {
optional string device_name = 1;
optional uint64 read_sectors = 2;
optional uint64 read_time_ms = 3;
optional uint64 write_sectors = 4;
optional uint64 write_time_ms = 5;
optional uint64 discard_sectors = 6;
optional uint64 discard_time_ms = 7;
optional uint64 flush_count = 8;
optional uint64 flush_time_ms = 9;
}
// One entry per disk device.
repeated DiskStat disk_stat = 13;
}
// End of protos/perfetto/trace/sys_stats/sys_stats.proto
// Begin of protos/perfetto/trace/system_info.proto
message Utsname {
optional string sysname = 1;
optional string version = 2;
optional string release = 3;
optional string machine = 4;
}
message SystemInfo {
optional Utsname utsname = 1;
optional string android_build_fingerprint = 2;
// Ticks per second - sysconf(_SC_CLK_TCK).
optional int64 hz = 3;
// The version of traced (the same returned by `traced --version`).
// This is a human readable string with and its format varies depending on
// the build system and the repo (standalone vs AOSP).
// This is intended for human debugging only.
optional string tracing_service_version = 4;
// The Android SDK vesion (e.g. 21 for L, 31 for S etc).
// Introduced in Android T.
optional uint64 android_sdk_version = 5;
// Kernel page size - sysconf(_SC_PAGESIZE).
optional uint32 page_size = 6;
// The timezone offset from UTC, as per strftime("%z"), in minutes.
// Introduced in v38 / Android V.
optional int32 timezone_off_mins = 7;
}
// End of protos/perfetto/trace/system_info.proto
// Begin of protos/perfetto/trace/system_info/cpu_info.proto
// Information about CPUs from procfs and sysfs.
message CpuInfo {
// Information about a single CPU.
message Cpu {
// Value of "Processor" field from /proc/cpuinfo for this CPU.
// Example: "AArch64 Processor rev 12 (aarch64)"
optional string processor = 1;
// Frequencies from
// /sys/devices/system/cpu/cpuX/cpufreq/scaling_available_frequencies
// where X is the index of this CPU.
repeated uint32 frequencies = 2;
}
// Describes available CPUs, one entry per CPU.
repeated Cpu cpus = 1;
}
// End of protos/perfetto/trace/system_info/cpu_info.proto
// Begin of protos/perfetto/trace/test_event.proto
// Event used by testing code.
message TestEvent {
// Arbitrary string used in tests.
optional string str = 1;
// The current value of the random number sequence used in tests.
optional uint32 seq_value = 2;
// Monotonically increased on each packet.
optional uint64 counter = 3;
// No more packets should follow (from the current sequence).
optional bool is_last = 4;
message TestPayload {
repeated string str = 1;
repeated TestPayload nested = 2;
optional string single_string = 4;
optional int32 single_int = 5;
repeated int32 repeated_ints = 6;
// When 0 this is the bottom-most nested message.
optional uint32 remaining_nesting_depth = 3;
repeated DebugAnnotation debug_annotations = 7;
}
optional TestPayload payload = 5;
}
// End of protos/perfetto/trace/test_event.proto
// Begin of protos/perfetto/trace/trace_packet_defaults.proto
// Default values for TracePacket fields that hold for a particular TraceWriter
// packet sequence. This message contains a subset of the TracePacket fields
// with matching IDs. When provided, these fields define the default values
// that should be applied, at import time, to all TracePacket(s) with the same
// |trusted_packet_sequence_id|, unless otherwise specified in each packet.
//
// Should be reemitted whenever incremental state is cleared on the sequence.
message TracePacketDefaults {
optional uint32 timestamp_clock_id = 58;
// Default values for TrackEvents (e.g. default track).
optional TrackEventDefaults track_event_defaults = 11;
// Defaults for perf profiler packets (PerfSample).
optional PerfSampleDefaults perf_sample_defaults = 12;
}
// End of protos/perfetto/trace/trace_packet_defaults.proto
// Begin of protos/perfetto/trace/trace_uuid.proto
// A random unique ID that identifies the trace.
// This message has been introduced in v32. Prior to that, the UUID was
// only (optionally) present in the TraceConfig.trace_uuid_msb/lsb fields.
// This has been moved to a standalone packet to deal with new use-cases for
// go/gapless-aot, where the same tracing session can be serialized several
// times, in which case the UUID is changed on each snapshot and does not match
// the one in the TraceConfig.
message TraceUuid {
optional int64 msb = 1;
optional int64 lsb = 2;
}
// End of protos/perfetto/trace/trace_uuid.proto
// Begin of protos/perfetto/trace/track_event/process_descriptor.proto
// Describes a process's attributes. Emitted as part of a TrackDescriptor,
// usually by the process's main thread.
//
// Next id: 9.
message ProcessDescriptor {
optional int32 pid = 1;
repeated string cmdline = 2;
optional string process_name = 6;
optional int32 process_priority = 5;
// Process start time in nanoseconds.
// The timestamp refers to the trace clock by default. Other clock IDs
// provided in TracePacket are not supported.
optional int64 start_timestamp_ns = 7;
// ---------------------------------------------------------------------------
// Deprecated / legacy fields, which will be removed in the future:
// ---------------------------------------------------------------------------
// See chromium's content::ProcessType.
enum ChromeProcessType {
PROCESS_UNSPECIFIED = 0;
PROCESS_BROWSER = 1;
PROCESS_RENDERER = 2;
PROCESS_UTILITY = 3;
PROCESS_ZYGOTE = 4;
PROCESS_SANDBOX_HELPER = 5;
PROCESS_GPU = 6;
PROCESS_PPAPI_PLUGIN = 7;
PROCESS_PPAPI_BROKER = 8;
}
optional ChromeProcessType chrome_process_type = 4;
// To support old UI. New UI should determine default sorting by process_type.
optional int32 legacy_sort_index = 3;
// Labels can be used to further describe properties of the work performed by
// the process. For example, these can be used by Chrome renderer process to
// provide titles of frames being rendered.
repeated string process_labels = 8;
}
// End of protos/perfetto/trace/track_event/process_descriptor.proto
// Begin of protos/perfetto/trace/track_event/range_of_interest.proto
// This message specifies the "range of interest" for track events. With the
// `drop_track_event_data_before` option set to `kTrackEventRangeOfInterest`,
// Trace Processor drops track events outside of this range.
message TrackEventRangeOfInterest {
optional int64 start_us = 1;
}
// End of protos/perfetto/trace/track_event/range_of_interest.proto
// Begin of protos/perfetto/trace/track_event/thread_descriptor.proto
// Describes a thread's attributes. Emitted as part of a TrackDescriptor,
// usually by the thread's trace writer.
//
// Next id: 9.
message ThreadDescriptor {
optional int32 pid = 1;
optional int32 tid = 2;
optional string thread_name = 5;
// ---------------------------------------------------------------------------
// Deprecated / legacy fields, which will be removed in the future:
// ---------------------------------------------------------------------------
enum ChromeThreadType {
CHROME_THREAD_UNSPECIFIED = 0;
CHROME_THREAD_MAIN = 1;
CHROME_THREAD_IO = 2;
// Scheduler:
CHROME_THREAD_POOL_BG_WORKER = 3;
CHROME_THREAD_POOL_FG_WORKER = 4;
CHROME_THREAD_POOL_FB_BLOCKING = 5;
CHROME_THREAD_POOL_BG_BLOCKING = 6;
CHROME_THREAD_POOL_SERVICE = 7;
// Compositor:
CHROME_THREAD_COMPOSITOR = 8;
CHROME_THREAD_VIZ_COMPOSITOR = 9;
CHROME_THREAD_COMPOSITOR_WORKER = 10;
// Renderer:
CHROME_THREAD_SERVICE_WORKER = 11;
// Tracing related threads:
CHROME_THREAD_MEMORY_INFRA = 50;
CHROME_THREAD_SAMPLING_PROFILER = 51;
};
optional ChromeThreadType chrome_thread_type = 4;
// Deprecated. Use ClockSnapshot in combination with TracePacket's timestamp
// and timestamp_clock_id fields instead.
optional int64 reference_timestamp_us = 6;
// Absolute reference values. Clock values in subsequent TrackEvents can be
// encoded accumulatively and relative to these. This reduces their var-int
// encoding size.
// TODO(eseckler): Deprecated. Replace these with ClockSnapshot encoding.
optional int64 reference_thread_time_us = 7;
optional int64 reference_thread_instruction_count = 8;
// To support old UI. New UI should determine default sorting by thread_type.
optional int32 legacy_sort_index = 3;
}
// End of protos/perfetto/trace/track_event/thread_descriptor.proto
// Begin of protos/perfetto/trace/track_event/chrome_process_descriptor.proto
// Describes the attributes for a Chrome process. Must be paired with a
// ProcessDescriptor in the same TrackDescriptor.
//
// Next id: 6.
message ChromeProcessDescriptor {
// See chromium's content::ProcessType.
enum ProcessType {
PROCESS_UNSPECIFIED = 0;
PROCESS_BROWSER = 1;
PROCESS_RENDERER = 2;
PROCESS_UTILITY = 3;
PROCESS_ZYGOTE = 4;
PROCESS_SANDBOX_HELPER = 5;
PROCESS_GPU = 6;
PROCESS_PPAPI_PLUGIN = 7;
PROCESS_PPAPI_BROKER = 8;
PROCESS_SERVICE_NETWORK = 9;
PROCESS_SERVICE_TRACING = 10;
PROCESS_SERVICE_STORAGE = 11;
PROCESS_SERVICE_AUDIO = 12;
PROCESS_SERVICE_DATA_DECODER = 13;
PROCESS_SERVICE_UTIL_WIN = 14;
PROCESS_SERVICE_PROXY_RESOLVER = 15;
PROCESS_SERVICE_CDM = 16;
PROCESS_SERVICE_VIDEO_CAPTURE = 17;
PROCESS_SERVICE_UNZIPPER = 18;
PROCESS_SERVICE_MIRRORING = 19;
PROCESS_SERVICE_FILEPATCHER = 20;
PROCESS_SERVICE_TTS = 21;
PROCESS_SERVICE_PRINTING = 22;
PROCESS_SERVICE_QUARANTINE = 23;
PROCESS_SERVICE_CROS_LOCALSEARCH = 24;
PROCESS_SERVICE_CROS_ASSISTANT_AUDIO_DECODER = 25;
PROCESS_SERVICE_FILEUTIL = 26;
PROCESS_SERVICE_PRINTCOMPOSITOR = 27;
PROCESS_SERVICE_PAINTPREVIEW = 28;
PROCESS_SERVICE_SPEECHRECOGNITION = 29;
PROCESS_SERVICE_XRDEVICE = 30;
PROCESS_SERVICE_READICON = 31;
PROCESS_SERVICE_LANGUAGEDETECTION = 32;
PROCESS_SERVICE_SHARING = 33;
PROCESS_SERVICE_MEDIAPARSER = 34;
PROCESS_SERVICE_QRCODEGENERATOR = 35;
PROCESS_SERVICE_PROFILEIMPORT = 36;
PROCESS_SERVICE_IME = 37;
PROCESS_SERVICE_RECORDING = 38;
PROCESS_SERVICE_SHAPEDETECTION = 39;
PROCESS_RENDERER_EXTENSION = 40;
PROCESS_SERVICE_MEDIA_FOUNDATION = 41;
}
optional ProcessType process_type = 1;
optional int32 process_priority = 2;
// To support old UI. New UI should determine default sorting by process_type.
optional int32 legacy_sort_index = 3;
// Name of the hosting app for WebView. Used to match renderer processes to
// their hosting apps.
optional string host_app_package_name = 4;
// The ID to link crashes to trace.
// Notes:
// * The ID is per process. So, each trace may contain many IDs, and you need
// to look for the ID from crashed process to find the crash report.
// * Having a "chrome-trace-id" in crash doesn't necessarily mean we can
// get an uploaded trace, since uploads could have failed.
// * On the other hand, if there was a crash during the session and trace was
// uploaded, it is very likely to find a crash report with the trace ID.
// * This is not crash ID or trace ID. It is just a random 64-bit number
// recorded in both traces and crashes. It is possible to have collisions,
// though very rare.
optional uint64 crash_trace_id = 5;
}
// End of protos/perfetto/trace/track_event/chrome_process_descriptor.proto
// Begin of protos/perfetto/trace/track_event/chrome_thread_descriptor.proto
// Describes a Chrome thread's attributes. Emitted as part of a TrackDescriptor,
// usually by the thread's trace writer. Must be paired with a ThreadDescriptor
// in the same TrackDescriptor.
//
// Next id: 3.
message ChromeThreadDescriptor {
enum ThreadType {
THREAD_UNSPECIFIED = 0;
THREAD_MAIN = 1;
THREAD_IO = 2;
THREAD_POOL_BG_WORKER = 3;
THREAD_POOL_FG_WORKER = 4;
THREAD_POOL_FG_BLOCKING = 5;
THREAD_POOL_BG_BLOCKING = 6;
THREAD_POOL_SERVICE = 7;
THREAD_COMPOSITOR = 8;
THREAD_VIZ_COMPOSITOR = 9;
THREAD_COMPOSITOR_WORKER = 10;
THREAD_SERVICE_WORKER = 11;
THREAD_NETWORK_SERVICE = 12;
THREAD_CHILD_IO = 13;
THREAD_BROWSER_IO = 14;
THREAD_BROWSER_MAIN = 15;
THREAD_RENDERER_MAIN = 16;
THREAD_UTILITY_MAIN = 17;
THREAD_GPU_MAIN = 18;
THREAD_CACHE_BLOCKFILE = 19;
THREAD_MEDIA = 20;
THREAD_AUDIO_OUTPUTDEVICE = 21;
THREAD_AUDIO_INPUTDEVICE = 22;
THREAD_GPU_MEMORY = 23;
THREAD_GPU_VSYNC = 24;
THREAD_DXA_VIDEODECODER = 25;
THREAD_BROWSER_WATCHDOG = 26;
THREAD_WEBRTC_NETWORK = 27;
THREAD_WINDOW_OWNER = 28;
THREAD_WEBRTC_SIGNALING = 29;
THREAD_WEBRTC_WORKER = 30;
THREAD_PPAPI_MAIN = 31;
THREAD_GPU_WATCHDOG = 32;
THREAD_SWAPPER = 33;
THREAD_GAMEPAD_POLLING = 34;
THREAD_WEBCRYPTO = 35;
THREAD_DATABASE = 36;
THREAD_PROXYRESOLVER = 37;
THREAD_DEVTOOLSADB = 38;
THREAD_NETWORKCONFIGWATCHER = 39;
THREAD_WASAPI_RENDER = 40;
THREAD_LOADER_LOCK_SAMPLER = 41;
THREAD_MEMORY_INFRA = 50;
THREAD_SAMPLING_PROFILER = 51;
};
optional ThreadType thread_type = 1;
// To support old UI. New UI should determine default sorting by thread_type.
optional int32 legacy_sort_index = 2;
}
// End of protos/perfetto/trace/track_event/chrome_thread_descriptor.proto
// Begin of protos/perfetto/trace/track_event/counter_descriptor.proto
// Defines properties of a counter track, e.g. for built-in counters (thread
// time, instruction count, ..) or user-specified counters (e.g. memory usage of
// a specific app component).
//
// Counter tracks only support TYPE_COUNTER track events, which specify new
// values for the counter. For counters that require per-slice values, counter
// values can instead be provided in a more efficient encoding via TrackEvent's
// |extra_counter_track_uuids| and |extra_counter_values| fields. However,
// slice-type events cannot be emitted onto a counter track.
//
// Values for counters that are only emitted on a single packet sequence can
// optionally be delta-encoded, see |is_incremental|.
//
// Next id: 7.
message CounterDescriptor {
// Built-in counters, usually with special meaning in the client library,
// trace processor, legacy JSON format, or UI. Trace processor will infer a
// track name from the enum value if none is provided in TrackDescriptor.
enum BuiltinCounterType {
COUNTER_UNSPECIFIED = 0;
// Thread-scoped counters. The thread's track should be specified via
// |parent_uuid| in the TrackDescriptor for such a counter.
// implies UNIT_TIME_NS.
COUNTER_THREAD_TIME_NS = 1;
// implies UNIT_COUNT.
COUNTER_THREAD_INSTRUCTION_COUNT = 2;
}
// Type of the values for the counters - to supply lower granularity units,
// see also |unit_multiplier|.
enum Unit {
UNIT_UNSPECIFIED = 0;
UNIT_TIME_NS = 1;
UNIT_COUNT = 2;
UNIT_SIZE_BYTES = 3;
// TODO(eseckler): Support more units as necessary.
}
// For built-in counters (e.g. thread time). Custom user-specified counters
// (e.g. those emitted by TRACE_COUNTER macros of the client library)
// shouldn't set this, and instead provide a counter name via TrackDescriptor.
optional BuiltinCounterType type = 1;
// Names of categories of the counter (usually for user-specified counters).
// In the client library, categories are a way to turn groups of individual
// counters (or events) on or off.
repeated string categories = 2;
// Type of the counter's values. Built-in counters imply a value for this
// field.
optional Unit unit = 3;
// In order to use a unit not defined as a part of |Unit|, a free-form unit
// name can be used instead.
optional string unit_name = 6;
// Multiplication factor of this counter's values, e.g. to supply
// COUNTER_THREAD_TIME_NS timestamps in microseconds instead.
optional int64 unit_multiplier = 4;
// Whether values for this counter are provided as delta values. Only
// supported for counters that are emitted on a single packet-sequence (e.g.
// thread time). Counter values in subsequent packets on the current packet
// sequence will be interpreted as delta values from the sequence's most
// recent value for the counter. When incremental state is cleared, the
// counter value is considered to be reset to 0. Thus, the first value after
// incremental state is cleared is effectively an absolute value.
optional bool is_incremental = 5;
// TODO(eseckler): Support arguments describing the counter (?).
// repeated DebugAnnotation debug_annotations;
}
// End of protos/perfetto/trace/track_event/counter_descriptor.proto
// Begin of protos/perfetto/trace/track_event/track_descriptor.proto
// Defines a track for TrackEvents. Slices and instant events on the same track
// will be nested based on their timestamps, see TrackEvent::Type.
//
// A TrackDescriptor only needs to be emitted by one trace writer / producer and
// is valid for the entirety of the trace. To ensure the descriptor isn't lost
// when the ring buffer wraps, it should be reemitted whenever incremental state
// is cleared.
//
// As a fallback, TrackEvents emitted without an explicit track association will
// be associated with an implicit trace-global track (uuid = 0), see also
// |TrackEvent::track_uuid|. It is possible but not necessary to emit a
// TrackDescriptor for this implicit track.
//
// Next id: 10.
message TrackDescriptor {
// Unique ID that identifies this track. This ID is global to the whole trace.
// Producers should ensure that it is unlikely to clash with IDs emitted by
// other producers. A value of 0 denotes the implicit trace-global track.
//
// For example, legacy TRACE_EVENT macros may use a hash involving the async
// event id + id_scope, pid, and/or tid to compute this ID.
optional uint64 uuid = 1;
// A parent track reference can be used to describe relationships between
// tracks. For example, to define an asynchronous track which is scoped to a
// specific process, specify the uuid for that process's process track here.
// Similarly, to associate a COUNTER_THREAD_TIME_NS counter track with a
// thread, specify the uuid for that thread's thread track here.
optional uint64 parent_uuid = 5;
// Name of the track. Optional - if unspecified, it may be derived from the
// process/thread name (process/thread tracks), the first event's name (async
// tracks), or counter name (counter tracks).
optional string name = 2;
// Associate the track with a process, making it the process-global track.
// There should only be one such track per process (usually for instant
// events; trace processor uses this fact to detect pid reuse). If you need
// more (e.g. for asynchronous events), create child tracks using parent_uuid.
//
// Trace processor will merge events on a process track with slice-type events
// from other sources (e.g. ftrace) for the same process into a single
// timeline view.
optional ProcessDescriptor process = 3;
optional ChromeProcessDescriptor chrome_process = 6;
// Associate the track with a thread, indicating that the track's events
// describe synchronous code execution on the thread. There should only be one
// such track per thread (trace processor uses this fact to detect tid reuse).
//
// Trace processor will merge events on a thread track with slice-type events
// from other sources (e.g. ftrace) for the same thread into a single timeline
// view.
optional ThreadDescriptor thread = 4;
optional ChromeThreadDescriptor chrome_thread = 7;
// Descriptor for a counter track. If set, the track will only support
// TYPE_COUNTER TrackEvents (and values provided via TrackEvent's
// |extra_counter_values|).
optional CounterDescriptor counter = 8;
// If true, forces Trace Processor to use separate tracks for track events
// and system events for the same thread.
// Track events timestamps in Chrome have microsecond resolution, while
// system events use nanoseconds. It results in broken event nesting when
// track events and system events share a track.
optional bool disallow_merging_with_system_tracks = 9;
}
// End of protos/perfetto/trace/track_event/track_descriptor.proto
// Begin of protos/perfetto/trace/translation/translation_table.proto
// Translation rules for the trace processor.
// See the comments for each rule type for specific meaning.
message TranslationTable {
oneof table {
ChromeHistorgramTranslationTable chrome_histogram = 1;
ChromeUserEventTranslationTable chrome_user_event = 2;
ChromePerformanceMarkTranslationTable chrome_performance_mark = 3;
SliceNameTranslationTable slice_name = 4;
}
}
// Chrome histogram sample hash -> name translation rules.
message ChromeHistorgramTranslationTable {
map<uint64, string> hash_to_name = 1;
}
// Chrome user event action hash -> name translation rules.
message ChromeUserEventTranslationTable {
map<uint64, string> action_hash_to_name = 1;
}
// Chrome performance mark translation rules.
message ChromePerformanceMarkTranslationTable {
map<uint32, string> site_hash_to_name = 1;
map<uint32, string> mark_hash_to_name = 2;
};
// Raw -> deobfuscated slice name translation rules.
message SliceNameTranslationTable {
map<string, string> raw_to_deobfuscated_name = 1;
};
// End of protos/perfetto/trace/translation/translation_table.proto
// Begin of protos/perfetto/trace/trigger.proto
// When a TracingSession receives a trigger it records the boot time nanoseconds
// in the TracePacket's timestamp field as well as the name of the producer that
// triggered it. We emit this data so filtering can be done on triggers received
// in the trace.
message Trigger {
// Name of the trigger which was received.
optional string trigger_name = 1;
// The actual producer that activated |trigger|.
optional string producer_name = 2;
// The verified UID of the producer.
optional int32 trusted_producer_uid = 3;
}
// End of protos/perfetto/trace/trigger.proto
// Begin of protos/perfetto/trace/ui_state.proto
// Common state for UIs visualizing Perfetto traces.
// This message can be appended as a TracePacket by UIs to save the
// visible state (e.g. scroll position/zoom state) for future opening
// of the trace.
// Design doc: go/trace-ui-state.
message UiState {
// The start and end bounds of the viewport of the UI in nanoseconds.
//
// This is the absolute time associated to slices and other events in
// trace processor tables (i.e. the |ts| column of most tables)
optional int64 timeline_start_ts = 1;
optional int64 timeline_end_ts = 2;
// Indicates that the given process should be highlighted by the UI.
message HighlightProcess {
oneof selector {
// The pid of the process to highlight. This is useful for UIs to focus
// on tracks of a particular process in the trace.
//
// If more than one process in a trace has the same pid, it is UI
// implementation specific how the process to be focused will be
// chosen.
uint32 pid = 1;
// The command line of the process to highlight; for most Android apps,
// this is the package name of the app. This is useful for UIs to focus
// on a particular app in the trace.
//
// If more than one process hasthe same cmdline, it is UI implementation
// specific how the process to be focused will be chosen.
string cmdline = 2;
}
}
optional HighlightProcess highlight_process = 3;
}
// End of protos/perfetto/trace/ui_state.proto
// Begin of protos/perfetto/trace/trace_packet.proto
// TracePacket is the root object of a Perfetto trace.
// A Perfetto trace is a linear sequence of TracePacket(s).
//
// The tracing service guarantees that all TracePacket(s) written by a given
// TraceWriter are seen in-order, without gaps or duplicates. If, for any
// reason, a TraceWriter sequence becomes invalid, no more packets are returned
// to the Consumer (or written into the trace file).
// TracePacket(s) written by different TraceWriter(s), hence even different
// data sources, can be seen in arbitrary order.
// The consumer can re-establish a total order, if interested, using the packet
// timestamps, after having synchronized the different clocks onto a global
// clock.
//
// The tracing service is agnostic of the content of TracePacket, with the
// exception of few fields (e.g.. trusted_*, trace_config) that are written by
// the service itself.
//
// See the [Buffers and Dataflow](/docs/concepts/buffers.md) doc for details.
//
// Next reserved id: 14 (up to 15).
// Next id: 96.
message TracePacket {
// The timestamp of the TracePacket.
// By default this timestamps refers to the trace clock (CLOCK_BOOTTIME on
// Android). It can be overridden using a different timestamp_clock_id.
// The clock domain definition in ClockSnapshot can also override:
// - The unit (default: 1ns).
// - The absolute vs delta encoding (default: absolute timestamp).
optional uint64 timestamp = 8;
// Specifies the ID of the clock used for the TracePacket |timestamp|. Can be
// one of the built-in types from ClockSnapshot::BuiltinClocks, or a
// producer-defined clock id.
// If unspecified and if no default per-sequence value has been provided via
// TracePacketDefaults, it defaults to BuiltinClocks::BOOTTIME.
optional uint32 timestamp_clock_id = 58;
oneof data {
ProcessTree process_tree = 2;
ProcessStats process_stats = 9;
InodeFileMap inode_file_map = 4;
ChromeEventBundle chrome_events = 5;
ClockSnapshot clock_snapshot = 6;
SysStats sys_stats = 7;
TrackEvent track_event = 11;
// IDs up to 15 are reserved. They take only one byte to encode their
// preamble so should be used for frequent events.
TraceUuid trace_uuid = 89;
TraceConfig trace_config = 33;
FtraceStats ftrace_stats = 34;
TraceStats trace_stats = 35;
ProfilePacket profile_packet = 37;
StreamingAllocation streaming_allocation = 74;
StreamingFree streaming_free = 75;
BatteryCounters battery = 38;
PowerRails power_rails = 40;
AndroidLogPacket android_log = 39;
SystemInfo system_info = 45;
Trigger trigger = 46;
PackagesList packages_list = 47;
ChromeBenchmarkMetadata chrome_benchmark_metadata = 48;
PerfettoMetatrace perfetto_metatrace = 49;
ChromeMetadataPacket chrome_metadata = 51;
GpuCounterEvent gpu_counter_event = 52;
GpuRenderStageEvent gpu_render_stage_event = 53;
StreamingProfilePacket streaming_profile_packet = 54;
HeapGraph heap_graph = 56;
GraphicsFrameEvent graphics_frame_event = 57;
VulkanMemoryEvent vulkan_memory_event = 62;
GpuLog gpu_log = 63;
VulkanApiEvent vulkan_api_event = 65;
PerfSample perf_sample = 66;
CpuInfo cpu_info = 67;
SmapsPacket smaps_packet = 68;
TracingServiceEvent service_event = 69;
InitialDisplayState initial_display_state = 70;
GpuMemTotalEvent gpu_mem_total_event = 71;
MemoryTrackerSnapshot memory_tracker_snapshot = 73;
FrameTimelineEvent frame_timeline_event = 76;
AndroidEnergyEstimationBreakdown android_energy_estimation_breakdown = 77;
UiState ui_state = 78;
AndroidCameraFrameEvent android_camera_frame_event = 80;
AndroidCameraSessionStats android_camera_session_stats = 81;
TranslationTable translation_table = 82;
AndroidGameInterventionList android_game_intervention_list = 83;
StatsdAtom statsd_atom = 84;
AndroidSystemProperty android_system_property = 86;
EntityStateResidency entity_state_residency = 91;
// Only used in profile packets.
ProfiledFrameSymbols profiled_frame_symbols = 55;
ModuleSymbols module_symbols = 61;
DeobfuscationMapping deobfuscation_mapping = 64;
// Only used by TrackEvent.
TrackDescriptor track_descriptor = 60;
// Deprecated, use TrackDescriptor instead.
ProcessDescriptor process_descriptor = 43;
// Deprecated, use TrackDescriptor instead.
ThreadDescriptor thread_descriptor = 44;
// Events from the Linux kernel ftrace infrastructure.
FtraceEventBundle ftrace_events = 1;
// This field is emitted at periodic intervals (~10s) and
// contains always the binary representation of the UUID
// {82477a76-b28d-42ba-81dc-33326d57a079}. This is used to be able to
// efficiently partition long traces without having to fully parse them.
bytes synchronization_marker = 36;
// Zero or more proto encoded trace packets compressed using deflate.
// Each compressed_packets TracePacket (including the two field ids and
// sizes) should be less than 512KB.
bytes compressed_packets = 50;
// Data sources can extend the trace proto with custom extension protos (see
// docs/design-docs/extensions.md). When they do that, the descriptor of
// their extension proto descriptor is serialized in this packet. This
// allows trace_processor to deserialize extended messages using reflection
// even if the extension proto is not checked in the Perfetto repo.
ExtensionDescriptor extension_descriptor = 72;
// Represents a single packet sent or received by the network.
NetworkPacketEvent network_packet = 88;
// Represents one or more packets sent or received by the network.
NetworkPacketBundle network_packet_bundle = 92;
// The "range of interest" for track events. See the message definition
// comments for more details.
TrackEventRangeOfInterest track_event_range_of_interest = 90;
// Winscope traces
LayersSnapshotProto surfaceflinger_layers_snapshot = 93;
TransactionTraceEntry surfaceflinger_transactions = 94;
ShellTransition shell_transition = 96;
ShellHandlerMappings shell_handler_mappings = 97;
// Events from the Windows etw infrastructure.
EtwTraceEventBundle etw_events = 95;
// This field is only used for testing.
// In previous versions of this proto this field had the id 268435455
// This caused many problems:
// - protozero decoder does not handle field ids larger than 999.
// - old versions of protoc produce Java bindings with syntax errors when
// the field id is large enough.
TestEvent for_testing = 900;
}
// Trusted user id of the producer which generated this packet. Keep in sync
// with TrustedPacket.trusted_uid.
//
// TODO(eseckler): Emit this field in a PacketSequenceDescriptor message
// instead.
oneof optional_trusted_uid { int32 trusted_uid = 3; };
// Service-assigned identifier of the packet sequence this packet belongs to.
// Uniquely identifies a producer + writer pair within the tracing session. A
// value of zero denotes an invalid ID. Keep in sync with
// TrustedPacket.trusted_packet_sequence_id.
oneof optional_trusted_packet_sequence_id {
uint32 trusted_packet_sequence_id = 10;
}
// Trusted process id of the producer which generated this packet, written by
// the service.
optional int32 trusted_pid = 79;
// Incrementally emitted interned data, valid only on the packet's sequence
// (packets with the same |trusted_packet_sequence_id|). The writer will
// usually emit new interned data in the same TracePacket that first refers to
// it (since the last reset of interning state). It may also be emitted
// proactively in advance of referring to them in later packets.
optional InternedData interned_data = 12;
enum SequenceFlags {
SEQ_UNSPECIFIED = 0;
// Set by the writer to indicate that it will re-emit any incremental data
// for the packet's sequence before referring to it again. This includes
// interned data as well as periodically emitted data like
// Process/ThreadDescriptors. This flag only affects the current packet
// sequence (see |trusted_packet_sequence_id|).
//
// When set, this TracePacket and subsequent TracePackets on the same
// sequence will not refer to any incremental data emitted before this
// TracePacket. For example, previously emitted interned data will be
// re-emitted if it is referred to again.
//
// When the reader detects packet loss (|previous_packet_dropped|), it needs
// to skip packets in the sequence until the next one with this flag set, to
// ensure intact incremental data.
SEQ_INCREMENTAL_STATE_CLEARED = 1;
// This packet requires incremental state, such as TracePacketDefaults or
// InternedData, to be parsed correctly. The trace reader should skip this
// packet if incremental state is not valid on this sequence, i.e. if no
// packet with the SEQ_INCREMENTAL_STATE_CLEARED flag has been seen on the
// current |trusted_packet_sequence_id|.
SEQ_NEEDS_INCREMENTAL_STATE = 2;
};
optional uint32 sequence_flags = 13;
// DEPRECATED. Moved to SequenceFlags::SEQ_INCREMENTAL_STATE_CLEARED.
optional bool incremental_state_cleared = 41;
// Default values for fields of later TracePackets emitted on this packet's
// sequence (TracePackets with the same |trusted_packet_sequence_id|).
// It must be reemitted when incremental state is cleared (see
// |incremental_state_cleared|).
// Requires that any future packet emitted on the same sequence specifies
// the SEQ_NEEDS_INCREMENTAL_STATE flag.
// TracePacketDefaults always override the global defaults for any future
// packet on this sequence (regardless of SEQ_NEEDS_INCREMENTAL_STATE).
optional TracePacketDefaults trace_packet_defaults = 59;
// Flag set by the service if, for the current packet sequence (see
// |trusted_packet_sequence_id|), either:
// * this is the first packet, or
// * one or multiple packets were dropped since the last packet that the
// consumer read from the sequence. This can happen if chunks in the trace
// buffer are overridden before the consumer could read them when the trace
// is configured in ring buffer mode.
//
// When packet loss occurs, incrementally emitted data (including interned
// data) on the sequence should be considered invalid up until the next packet
// with SEQ_INCREMENTAL_STATE_CLEARED set.
optional bool previous_packet_dropped = 42;
// Flag set by a producer (starting from SDK v29) if, for the current packet
// sequence (see |trusted_packet_sequence_id|), this is the first packet.
//
// This flag can be used for distinguishing the two situations when
// processing the trace:
// 1. There are no prior events for the sequence because of data loss, e.g.
// due to ring buffer wrapping.
// 2. There are no prior events for the sequence because it didn't start
// before this packet (= there's definitely no preceding data loss).
//
// Given that older SDK versions do not support this flag, this flag not
// being present for a particular sequence does not necessarily imply data
// loss.
optional bool first_packet_on_sequence = 87;
}
// End of protos/perfetto/trace/trace_packet.proto
// Begin of protos/perfetto/trace/trace.proto
message Trace {
repeated TracePacket packet = 1;
// Do NOT add any other field here. This is just a convenience wrapper for
// the use case of a trace being saved to a file. There are other cases
// (streaming) where TracePacket are directly streamed without being wrapped
// in a Trace proto. Nothing should ever rely on the full trace, all the
// logic should be based on TracePacket(s).
}
// End of protos/perfetto/trace/trace.proto