// 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; // 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 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; // Optional specification about available GPU counters. optional GpuCounterDescriptor gpu_counter_descriptor = 5 [lazy = true]; optional TrackEventDescriptor track_event_descriptor = 6 [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 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; } // Lists all the producers connected. repeated Producer producers = 1; // Lists the data sources available. repeated DataSource data_sources = 2; // 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; } // End of protos/perfetto/common/builtin_clock.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. 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/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/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 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; // 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; // 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. optional bool initialize_ksyms_synchronously_for_testing = 14; } // 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 [lazy = true]; } // 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; } 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; } // 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. // 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; // Whether to record /proc/tid/time_in_state. optional bool record_thread_time_in_state = 7; // Size of the cache for thread time_in_state cpu freq values. // If not specificed, the default is used. optional uint32 thread_time_in_state_cache_size = 8; } // 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: 27 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. 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. 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 go/heapprofd. 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; } // 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 = 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 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; } } enum Counter { UNKNOWN_COUNTER = 0; // software: SW_CPU_CLOCK = 1; SW_PAGE_FAULTS = 2; // hardware: HW_CPU_CYCLES = 10; HW_INSTRUCTIONS = 11; } 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; } } // 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//{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; // // 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; // 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 = 18; 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 userspace 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; } 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//cmdline (not the comm string), with both sides being // "normalized". 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. repeated string target_cmdline = 2; // List of excluded pids. repeated int32 exclude_pid = 3; // List of excluded cmdlines. Normalized in the same way as // |target_cmdline|. repeated string exclude_cmdline = 4; // 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; } } // End of protos/perfetto/config/profiling/perf_event_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; } // End of protos/perfetto/config/sys_stats/sys_stats_config.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; } // 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: 116 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; // 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.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]; // 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; // 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: 33. 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; } 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; } 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; // 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; } 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; // 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), will steal its contents, save the trace into // a known path and stop prematurely. // This field was introduced in Android S. 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; } optional TriggerMode trigger_mode = 1; 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. 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; // 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. // Alternative encoding of trace_uuid as two int64s. optional int64 trace_uuid_msb = 27; optional int64 trace_uuid_lsb = 28; // 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). // Introduced in Android S. See go/trace-filtering for design. message TraceFilter { optional bytes bytecode = 1; } optional TraceFilter trace_filter = 32; } // 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: 11. 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; // 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 FilterStats filter_stats = 11; } // End of protos/perfetto/common/trace_stats.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/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; }; // 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 // 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/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/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; } // 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; } // 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/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; } // 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; // 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; reserved 8; } // 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/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; } // 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; } 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; } message CgroupMkdirFtraceEvent { optional int32 root = 1; optional int32 id = 2; optional string cname = 3; } 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; } message CgroupTransferTasksFtraceEvent { optional int32 dst_root = 1; optional int32 dst_id = 2; optional int32 pid = 3; optional string comm = 4; optional string cname = 5; } 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; } message CgroupRenameFtraceEvent { optional int32 root = 1; optional int32 id = 2; optional string cname = 3; } 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/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; } 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; } message MmCompactionWakeupKcompactdFtraceEvent { optional int32 nid = 1; optional int32 order = 2; optional uint32 classzone_idx = 3; } // 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/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/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; } 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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; } 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; } message F2fsWriteEndFtraceEvent { optional uint64 dev = 1; optional uint64 ino = 2; optional int64 pos = 3; optional uint32 len = 4; optional uint32 copied = 5; } // 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; } // 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/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/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/mali.proto message MaliTracingMarkWriteFtraceEvent { optional string name = 1; optional int32 pid = 2; optional uint32 type = 3; optional int32 value = 4; } // 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/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/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; } // End of protos/perfetto/trace/ftrace/power.proto // Begin of protos/perfetto/trace/ftrace/raw_syscalls.proto message SysEnterFtraceEvent { optional int64 id = 1; } 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/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; } // 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/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/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/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/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; } message MmVmscanKswapdSleepFtraceEvent { optional int32 nid = 1; } // 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; } 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 { // Nanoseconds since an epoch. // Epoch is configurable by writing into trace_clock. // By default this timestamp is CPU local. // TODO: Figure out a story for reconciling the various clocks. optional uint64 timestamp = 1; // Kernel pid (do not confuse with userspace pid aka tgid) optional uint32 pid = 2; 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; } } // 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]; } optional CompactSched compact_sched = 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; } // 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 constructor, which gets inlined at 0xf00. We then get // both Foo and the std::vector 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 constructor, which gets inlined at 0xf00. We then get // both Foo and the std::vector 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: 13. 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; 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; // 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; } 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; } // 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; } // -------------------- // 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: // -------------------- message SourceLocation { optional uint64 iid = 1; // We intend to add a binary symbol version of this in the future. 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_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 // // TODO(nuskos): Update link once we've switched to writing this proto. // // 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 bool skipped_last_frame_to_reduce_latency = 6; 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; } // 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 skip_next_begin_main_frame_to_reduce_latency = 35; 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; } optional MinorState minor_state = 2; } // Next id: 12 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; } } // 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 wheter 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; } // 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; } // 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; } // 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; } // Next id: 2 message ChromeRendererSchedulerState { optional ChromeRAILMode rail_mode = 1; } // 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/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: 47. 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. repeated uint64 flow_ids = 36; // 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. repeated uint64 terminating_flow_ids = 42; // --------------------------------------------------------------------------- // 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; // 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 for future use. extensions 1000 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: 27. message InternedData { // TODO(eseckler): Replace iid fields inside interned messages with // map 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 SourceLocation source_locations = 4; 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; } // 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; string counter_name = 9; } message Arg { optional string key = 1; optional string value = 2; } // Only when using |event_id|. optional uint32 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; } // 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. 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/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; } // 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_field_id. This is used to // get more compact varint encoding. 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]; } 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 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; } 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; }; message StreamingFree { // TODO(fmayer): Add callstack. repeated uint64 address = 1; repeated uint32 heap_id = 2; repeated uint64 sequence_number = 3; }; // Message used to represent 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; } } // Individual performance sampling packet payload. Typically corresponds to a // stack sample on a configration-dependent counter overflow. // // Timestamps are within the root packet. This used to use the CLOCK_BOOTTIME // domain, but now the default is CLOCK_MONOTONIC_RAW which is compatible with // more event types. // // There are several distinct views of this message: // * completely processed sample (callstack_iid set) // * 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) 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; } // 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; // Pairs of frequency (represented as a (1-based) index to CpuInfo // frequencies) and time at that frequency (represented as a number of // ticks, see SystemInfo for the HZ (ticks / second) value to convert this // to time). Frequencies with zero ticks are never uploaded. Read from // /proc/tid/time_in_state. repeated uint32 cpu_freq_indices = 2; repeated uint64 cpu_freq_ticks = 3; // Whether all frequencies with non-zero ticks are present in // `cpu_freq_indices`. This marker is used to detect packets that describe // time_in_state exhaustively. optional bool cpu_freq_full = 4; } 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 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. // TODO(dancol): analysis might be improved by // time-bracketing each sample as well as the whole // ProcessStats, but doing that is probably gated on // a vdso for CLOCK_BOOTTIME. 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()) 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; } // Representation of a process. message Process { // The UNIX process ID, aka thread group ID (as per getpid()). 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; } // 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/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_ice_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; } // 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; } // 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; } 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/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: 8. 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; } // End of protos/perfetto/trace/track_event/process_descriptor.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; } 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_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: 9. 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; } // End of protos/perfetto/trace/track_event/track_descriptor.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 Perfeto 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: 79. 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. 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; // 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; // 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; } // 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; } // 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