blob: 5366de42fa8981207de57d679bf2410be7f321ab [file]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef SRC_TRACE_PROCESSOR_STORAGE_STATS_H_
#define SRC_TRACE_PROCESSOR_STORAGE_STATS_H_
#include <cstddef>
namespace perfetto::trace_processor::stats {
// Compile time list of parsing and processing stats.
// clang-format off
#define PERFETTO_TP_STATS(F) \
/* TODO(b/512786856): Restore severity to kError after flag rollout. */ \
F(android_aflags_errors, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"Errors occurred during the collection of Android aconfig flags by the "\
"android.aflags data source. This typically happens if the aflags tool "\
"fails or its output is malformed."), \
F(android_br_parse_errors, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(android_log_num_failed, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(android_log_format_invalid, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(android_log_num_skipped, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(android_log_num_total, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(deobfuscate_location_parse_error, kSingle, kError, kAnalysis, Scope::kGlobal, ""), \
F(energy_breakdown_missing_values, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(energy_descriptor_invalid, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(entity_state_descriptor_invalid, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(entity_state_residency_invalid, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(entity_state_residency_lookup_failed, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(energy_uid_breakdown_missing_values, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(frame_timeline_event_parser_errors, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(frame_timeline_unpaired_end_event, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(ftrace_bundle_tokenizer_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_bytes_begin, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_bytes_end, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_bytes_delta, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_commit_overrun_begin, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_commit_overrun_end, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_commit_overrun_delta, kIndexed, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_dropped_events_begin, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_dropped_events_end, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_dropped_events_delta, kIndexed, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_entries_begin, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_entries_end, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_entries_delta, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_now_ts_begin, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_now_ts_end, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_oldest_event_ts_begin, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_oldest_event_ts_end, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_overrun_begin, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_overrun_end, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_overrun_delta, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_read_events_begin, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_read_events_end, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_read_events_delta, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(ftrace_cpu_has_data_loss, kIndexed, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"Ftrace data for the given cpu has data losses and is therefore " \
"unreliable. The kernel buffer overwrote events between our reads " \
"in userspace. Try re-recording the trace with a bigger buffer " \
"(ftrace_config.buffer_size_kb), or with fewer enabled ftrace events."),\
F(ftrace_kprobe_hits_begin, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"The number of kretprobe hits at the beginning of the trace."), \
F(ftrace_kprobe_hits_end, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"The number of kretprobe hits at the end of the trace."), \
F(ftrace_kprobe_hits_delta, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"The number of kprobe hits encountered during the collection of the" \
"trace."), \
F(ftrace_kprobe_misses_begin, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"The number of kretprobe missed events at the beginning of the trace."),\
F(ftrace_kprobe_misses_end, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"The number of kretprobe missed events at the end of the trace."), \
F(ftrace_kprobe_misses_delta, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"The number of kretprobe missed events encountered during the " \
"collection of the trace. A value greater than zero is due to the " \
"maxactive parameter for the kretprobe being too small"), \
F(ftrace_setup_errors, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"One or more atrace/ftrace categories were not found or failed to " \
"enable. See ftrace_setup_errors in the metadata table for details."), \
F(ftrace_abi_errors_skipped_zero_data_length, \
kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(ftrace_generic_descriptor_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"The config is setting denser_generic_event_encoding, but there are " \
"issues with parsing or matching up the in-trace proto descriptors."), \
F(ftrace_thermal_exynos_acpm_unknown_tz_id, \
kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(fuchsia_non_numeric_counters, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(fuchsia_timestamp_overflow, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(fuchsia_record_read_error, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(fuchsia_invalid_event, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(fuchsia_invalid_event_arg_type, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(fuchsia_invalid_event_arg_name, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(fuchsia_unknown_event_arg, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(fuchsia_invalid_string_ref, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(generic_task_state_invalid_order, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Invalid order of generic task state events. Should never happen."), \
F(gpu_counters_invalid_spec, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(gpu_counters_missing_spec, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(gpu_render_stage_parser_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(graphics_frame_event_parser_errors, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(guess_trace_type_duration_ns, kSingle, kInfo, kAnalysis, Scope::kGlobal, ""), \
F(interned_data_tokenizer_errors, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(invalid_clock_snapshots, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(invalid_cpu_times, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(kernel_wakelock_reused_id, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Duplicated interning ID seen. Should never happen."), \
F(kernel_wakelock_unknown_id, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Interning ID not found. Should never happen."), \
F(kernel_wakelock_zero_value_reported, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"Zero value received from SuspendControlService. Indicates a transient "\
"error in SuspendControlService."), \
F(kernel_wakelock_non_monotonic_value_reported, \
kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"Decreased value received from SuspendControlService. Indicates a " \
"transient error in SuspendControlService."), \
F(kernel_wakelock_implausibly_large_value_reported, \
kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"Implausibly large increment to value received from " \
"SuspendControlService. Indicates a transient error in " \
"SuspendControlService."), \
F(kernel_trackevent_format_error, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Ftrace event payloads did not match the format file while being " \
"parsed as kernel track events."), \
F(app_wakelock_parse_error, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Parsing packed repeated field. Should never happen."), \
F(app_wakelock_unknown_id, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Interning ID not found. Should never happen."), \
F(meminfo_unknown_keys, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(mismatched_sched_switch_tids, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(mm_unknown_type, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(parse_trace_duration_ns, kSingle, kInfo, kAnalysis, Scope::kGlobal, ""), \
F(power_rail_empty_packet, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(power_rail_unknown_index, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(proc_stat_unknown_counters, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(rss_stat_unknown_keys, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(rss_stat_negative_size, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(rss_stat_unknown_thread_for_mm_id, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(filter_input_bytes, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"Number of bytes pre-TraceFilter. The trace file would have been this " \
"many bytes big if the TraceConfig didn't specify any TraceFilter. " \
"This affects the actual buffer usage, as filtering happens only " \
"when writing into the trace file (or over IPC)."), \
F(filter_input_packets, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"Number of packets pre-TraceFilter. The trace file would have had so " \
"many packets if the TraceConfig didn't specify any TraceFilter."), \
F(filter_output_bytes, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"Number of bytes that made it through the TraceFilter, before the " \
"(optional) Zlib compression stage."), \
F(filter_time_taken_ns, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"Time cumulatively spent running the TraceFilter throughout the " \
"tracing session by MaybeFilterPackets()."), \
F(filter_errors, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(flow_duplicate_id, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(flow_no_enclosing_slice, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(flow_step_without_start, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(flow_end_without_start, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(flow_invalid_id, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(flow_without_direction, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(stackprofile_empty_callstack, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"Callstack had no frames. Ignored"), \
F(stackprofile_invalid_string_id, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(stackprofile_invalid_mapping_id, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(stackprofile_invalid_frame_id, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(stackprofile_invalid_callstack_id, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(stackprofile_parser_error, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(systrace_parse_failure, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(task_state_invalid, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(traced_buf_abi_violations, kIndexed, kDataLoss, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_buffer_size, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_bytes_overwritten, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_bytes_read, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_bytes_filtered_out, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Number of bytes discarded (input - output) by the TraceFilter for " \
"each buffer. It is a subset of, but does not add up perfectly to, " \
"(filter_input_bytes - filter_output_bytes) because of the synthetic " \
"metadata and stats packets generated by the tracing service itself."), \
F(traced_buf_bytes_written, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_clone_done_timestamp_ns, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"The timestamp when the clone snapshot operation for this buffer " \
"finished"), \
F(traced_buf_chunks_discarded, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_chunks_overwritten, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_chunks_read, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_chunks_rewritten, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_chunks_written, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_chunks_committed_out_of_order, \
kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_padding_bytes_cleared, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_padding_bytes_written, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_patches_failed, kIndexed, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"The tracing service potentially lost data from one of the data sources "\
"writing into the given target_buffer. This entry can be ignored " \
"if you're using DISCARD buffers and traced_buf_chunks_discarded is " \
"nonzero, meaning that the buffer was filled."), \
F(traced_buf_patches_succeeded, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_readaheads_failed, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_readaheads_succeeded, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_trace_writer_packet_loss, kIndexed, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"The tracing service observed packet loss for this buffer during this " \
"tracing session. This also counts packet loss that happened before " \
"the RING_BUFFER start or after the DISCARD buffer end."), \
F(traced_buf_sequence_packet_loss, kIndexed, kDataLoss, kAnalysis, Scope::kMachineAndTrace, \
"The number of groups of consecutive packets lost in each sequence for " \
"this buffer"), \
F(traced_buf_incremental_sequences_dropped, kIndexed, kDataLoss, kAnalysis, Scope::kMachineAndTrace, \
"For a given buffer, indicates the number of sequences where all the " \
"packets on that sequence were dropped due to lack of a valid " \
"incremental state (i.e. interned data). This is usually a strong sign " \
"that either: " \
"1) incremental state invalidation is disabled. " \
"2) the incremental state invalidation interval is too low. " \
"In either case, see " \
"https://perfetto.dev/docs/concepts/buffers" \
"#incremental-state-in-trace-packets"), \
F(traced_buf_write_wrap_count, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_buf_v2s_packets_seen, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Shadow mode: total packets read."), \
F(traced_buf_v2s_packets_in_both, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Shadow mode: packets found in both V1 and V2 buffers."), \
F(traced_buf_v2s_packets_only_v1, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Shadow mode: packets found only in V1 buffer."), \
F(traced_buf_v2s_packets_only_v2, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Shadow mode: packets found only in V2 buffer."), \
F(traced_buf_v2s_patches_attempted, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Shadow mode: patch operations attempted."), \
F(traced_buf_v2s_v1_patches_succeeded, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Shadow mode: patches that succeeded on V1 buffer."), \
F(traced_buf_v2s_v2_patches_succeeded, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Shadow mode: patches that succeeded on V2 buffer."), \
F(traced_buf_v2s_stats_version, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Shadow mode: version of the comparison stats."), \
F(traced_clone_started_timestamp_ns, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"The timestamp when the clone snapshot operation for this trace started"), \
F(traced_clone_trigger_timestamp_ns, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"The timestamp when trigger for the clone snapshot operation for this " \
"trace was received"), \
F(traced_chunks_discarded, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_data_sources_registered, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_data_sources_seen, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_final_flush_failed, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_final_flush_succeeded, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_flushes_failed, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_flushes_requested, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_flushes_succeeded, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_patches_discarded, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_producers_connected, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_producers_seen, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_total_buffers, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(traced_tracing_sessions, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(track_event_parser_errors, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(track_event_dropped_packets_outside_of_range_of_interest, \
kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"The number of TrackEvent packets dropped by trace processor due to " \
"being outside of the range of interest. This happens if a trace has a " \
"TrackEventRangeOfInterest packet, and track event dropping is " \
"enabled."), \
F(track_event_tokenizer_errors, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(track_hierarchy_missing_uuid, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Upper bound on the number of events dropped due to track hierarchy " \
"validation failures where a parent UUID was not found. This stat is " \
"incremented each time trace processor attempts to resolve a track " \
"with an invalid hierarchy, which can happen in multiple contexts, " \
"making it an upper bound rather than an exact count of dropped events. "\
"This is a bug in the trace producer."), \
F(track_event_thread_invalid_end, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"The end event for a thread track does not match a track event " \
"begin event. This can happen on mixed atrace/track_event traces " \
"and is usually caused by data loss or bugs when the events are " \
"emitted. The outcome of this is that slices can appear to be closed " \
"before they were closed in reality"), \
F(tokenizer_skipped_packets, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(vmstat_unknown_keys, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(psi_unknown_resource, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(vulkan_allocations_invalid_string_id, \
kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(clock_sync_failure, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(clock_sync_failure_unknown_source_clock, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A packet with a timestamp could not be converted to trace time " \
"because the source clock ID has never appeared in any ClockSnapshot. " \
"This indicates the trace producer emitted packets with a clock_id but " \
"never provided a ClockSnapshot for that clock. Check that " \
"ClockSnapshots are emitted before any packets using that clock_id. " \
"For sequence-scoped clocks (64-128), ensure each packet sequence " \
"emits its own ClockSnapshot."), \
F(clock_sync_failure_unknown_target_clock, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A packet timestamp could not be converted because the target trace " \
"time clock has never appeared in any ClockSnapshot. This is an " \
"internal error that should not occur."), \
F(clock_sync_failure_no_path, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A packet timestamp could not be converted to trace time because no " \
"ClockSnapshot path exists connecting the source clock to the trace " \
"time clock. Both clocks exist in snapshots, but never together or " \
"via a common intermediate clock. Ensure ClockSnapshots link all used " \
"clocks to the trace time clock."), \
F(clock_sync_mixed_clock_sources, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A non-primary trace file used both the primary trace's clock " \
"snapshots and its own for timestamp conversion. Timestamps " \
"converted before the first own clock snapshot used the primary " \
"trace's clocks which may differ."), \
F(clock_sync_failure_undeferrable_packet_loss, kSingle, kDataLoss, \
kAnalysis, Scope::kMachineAndTrace, \
"A packet had a timestamp with a clock ID that could not be resolved " \
"to trace time and the packet could not be deferred for later " \
"resolution (the trace sorter was unable to switch to full-sort mode). " \
"The packet was dropped and its data will be missing from query " \
"results. This can happen when a sequence-scoped clock (64-127) is " \
"used before the ClockSnapshot defining it arrives, and the sorter " \
"has already started flushing."), \
F(clock_sync_cache_miss, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(process_tracker_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(namespaced_thread_missing_process, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A namespaced thread association was received but the corresponding " \
"process association was not found. This can happen due to data losses " \
"during trace collection. The trace will be missing namespace " \
"associations for some threads, which may affect analysis. To address " \
"this issue, address the underlying data losses."), \
F(json_tokenizer_failure, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(json_parser_failure, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(json_display_time_unit, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"The displayTimeUnit key was set in the JSON trace. In some prior " \
"versions of trace processor this key could effect how the trace " \
"processor parsed timestamps and durations. In this version the key is " \
"ignored which more closely matches the bavahiour of catapult."), \
/* HeapGraphTracker is owned globally (one instance shared across all \
machines/traces), so it can't trivially attribute its writes to a \
specific (machine, trace). Until the tracker itself is reworked to be \
per-context, the heap_graph_* stats below are kGlobal — heap-graph \
errors are aggregated rather than broken out per machine. */ \
F(heap_graph_invalid_string_id, kIndexed, kError, kTrace, Scope::kGlobal, ""), \
F(heap_graph_malformed_packet, kIndexed, kError, kTrace, Scope::kGlobal, ""), \
F(heap_graph_missing_packet, kIndexed, kError, kTrace, Scope::kGlobal, ""), \
F(heapprofd_buffer_corrupted, kIndexed, kError, kTrace, Scope::kMachineAndTrace, \
"Shared memory buffer corrupted. This is a bug or memory corruption " \
"in the target. Indexed by target upid."), \
F(heapprofd_hit_guardrail, kIndexed, kError, kTrace, Scope::kMachineAndTrace, \
"HeapprofdConfig specified a CPU or Memory Guardrail that was hit. " \
"Indexed by target upid."), \
F(heapprofd_buffer_overran, kIndexed, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"The shared memory buffer between the target and heapprofd overran. " \
"The profile was truncated early. Indexed by target upid."), \
F(heapprofd_client_error, kIndexed, kError, kTrace, Scope::kMachineAndTrace, \
"The heapprofd client ran into a problem and disconnected. " \
"See profile_packet.proto for error codes."), \
F(heapprofd_client_disconnected, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(heapprofd_malformed_packet, kIndexed, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(heapprofd_missing_packet, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(heapprofd_rejected_concurrent, kIndexed, kError, kTrace, Scope::kMachineAndTrace, \
"The target was already profiled by another tracing session, so the " \
"profile was not taken. Indexed by target upid."), \
F(heapprofd_non_finalized_profile, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(heapprofd_sampling_interval_adjusted, \
kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"By how many byes the interval for PID was increased " \
"by adaptive sampling."), \
F(heapprofd_unwind_time_us, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Time spent unwinding callstacks."), \
F(heapprofd_unwind_samples, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Number of samples unwound."), \
F(heapprofd_client_spinlock_blocked, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"Time (us) the heapprofd client was blocked on the spinlock."), \
F(heapprofd_last_profile_timestamp, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, \
"The timestamp (in trace time) for the last dump for a process"), \
F(symbolization_tmp_build_id_not_found, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Number of file mappings in /data/local/tmp without a build id. " \
"Symbolization doesn't work for executables in /data/local/tmp " \
"because of SELinux. Please use /data/local/tests"), \
F(metatrace_overruns, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(packages_list_has_parse_errors, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(packages_list_has_read_errors, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(user_list_errors, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"Errors occurred while reading or parsing the user.list file."), \
F(game_intervention_has_parse_errors, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"One or more parsing errors occurred. This could result from " \
"unknown game more or intervention added to the file to be parsed."), \
F(game_intervention_has_read_errors, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"The file to be parsed can't be opened. This can happend when " \
"the file name is not found or no permission to access the file"), \
F(compact_sched_has_parse_errors, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(misplaced_end_event, kSingle, kDataLoss, kAnalysis, Scope::kMachineAndTrace, ""), \
F(truncated_sys_write_duration, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Count of sys_write slices that have a truncated duration to resolve " \
"nesting incompatibilities with atrace slices. Real durations " \
"can be recovered via the |raw| table."), \
F(compact_sched_switch_skipped, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(compact_sched_waking_skipped, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(empty_chrome_metadata, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(ninja_parse_errors, kSingle, kError, kTrace, Scope::kMachineAndTrace, ""), \
F(perf_cpu_lost_records, kIndexed, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"Count of perf samples lost due to kernel buffer overruns. The trace " \
"is missing information, but it's not known which processes are " \
"affected. Consider lowering the sampling frequency or raising " \
"the ring_buffer_pages config option."), \
F(perf_process_shard_count, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(perf_chosen_process_shard, kIndexed, kInfo, kTrace, Scope::kMachineAndTrace, ""), \
F(perf_guardrail_stop_ts, kIndexed, kDataLoss, kTrace, Scope::kMachineAndTrace, ""), \
F(perf_unknown_record_type, kIndexed, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(perf_record_skipped, kIndexed, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(perf_samples_skipped, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Count of skipped perf samples that otherwise matched the tracing " \
"config. This will cause a process to be completely absent from the " \
"trace, but does *not* imply data loss for processes that do have " \
"samples in this trace."), \
F(perf_features_skipped, kIndexed, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(perf_samples_cpu_mode_unknown, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(perf_samples_skipped_dataloss, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"Count of perf samples lost within the profiler (traced_perf), likely " \
"due to load shedding. This may impact any traced processes. The trace " \
"protobuf needs to be inspected manually to confirm which processes " \
"are affected."), \
F(perf_dummy_mapping_used, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(perf_aux_missing, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"Number of bytes missing in AUX data streams due to missing " \
"PREF_RECORD_AUX messages."), \
F(perf_aux_ignored, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"AUX data was ignored because the proper parser is not implemented."), \
F(perf_aux_lost, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"Gaps in the AUX data stream pased to the tokenizer."), \
F(perf_aux_truncated, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"Data was truncated when being written to the AUX stream at the " \
"source."),\
F(perf_aux_partial, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"The PERF_RECORD_AUX contained partial data."), \
F(perf_aux_collision, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"The collection of a sample colliden with another. You should reduce " \
"the rate at which samples are collected."), \
F(perf_auxtrace_missing, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"Number of bytes missing in AUX data streams due to missing " \
"PREF_RECORD_AUXTRACE messages."), \
F(perf_unknown_aux_data, kIndexed, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"AUX data type encountered for which there is no known parser."), \
F(perf_no_tsc_data, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"TSC data unavailable. Will be unable to translate HW clocks."), \
F(spe_no_timestamp, kSingle, kInfo, kTrace, Scope::kMachineAndTrace, \
"SPE record with no timestamp. Will try our best to assign a " \
"timestamp."), \
F(etm_no_importer, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Unable to parse ETM data because TraceProcessor was not compiled to " \
" support it. Make sure you enable the `enable_perfetto_etm_importer` " \
" GN flag."), \
F(memory_snapshot_parser_failure, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(thread_time_in_state_unknown_cpu_freq, \
kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(ftrace_packet_before_tracing_start, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"An ftrace packet was seen before the tracing start timestamp from " \
"the tracing service. This happens if the ftrace buffers were not " \
"cleared properly. These packets are silently dropped by trace " \
"processor."), \
F(sorter_push_event_out_of_order, kSingle, kError, kTrace, Scope::kGlobal, \
"Trace events are out of order event after sorting. This can happen " \
"due to many factors including clock sync drift, producers emitting " \
"events out of order or a bug in trace processor's logic of sorting."), \
F(unknown_extension_fields, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"TraceEvent had unknown extension fields, which might result in " \
"missing some arguments. You may need a newer version of trace " \
"processor to parse them."), \
F(network_trace_intern_errors, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(network_trace_parse_errors, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, ""), \
F(atom_timestamp_missing, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"The corresponding timestamp_nanos entry for a StatsdAtom was " \
"missing. Defaulted to inaccurate packet timestamp."), \
F(atom_unknown, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Unknown statsd atom. Atom descriptor may need to be updated"), \
F(v8_intern_errors, \
kSingle, kDataLoss, kAnalysis, Scope::kMachineAndTrace, \
"Failed to resolve V8 interned data."), \
F(v8_isolate_has_no_code_range, \
kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"V8 isolate had no code range. THis is currently no supported and means" \
"we will be unable to parse JS code events for this isolate."), \
F(v8_no_defaults, \
kSingle, kDataLoss, kAnalysis, Scope::kMachineAndTrace, \
"Failed to resolve V8 default data."), \
F(v8_no_code_range, \
kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"V8 isolate had no code range."), \
F(v8_unknown_code_type, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, ""), \
F(v8_code_load_missing_code_range, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"V8 load had no code range or an empty one. Event ignored."), \
F(winscope_inputmethod_clients_parse_errors, \
kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"InputMethod clients packet has unknown fields, which results in " \
"some arguments missing. You may need a newer version of trace " \
"processor to parse them."), \
F(winscope_inputmethod_manager_service_parse_errors, \
kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"InputMethod manager service packet has unknown fields, which results " \
"in some arguments missing. You may need a newer version of trace " \
"processor to parse them."), \
F(winscope_inputmethod_service_parse_errors, \
kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"InputMethod service packet has unknown fields, which results in " \
"some arguments missing. You may need a newer version of trace " \
"processor to parse them."), \
F(winscope_sf_layers_parse_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"SurfaceFlinger layers snapshot has unknown fields, which results in " \
"some arguments missing. You may need a newer version of trace " \
"processor to parse them."), \
F(winscope_sf_transactions_parse_errors, \
kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"SurfaceFlinger transactions packet has unknown fields, which results " \
"in some arguments missing. You may need a newer version of trace " \
"processor to parse them."), \
F(winscope_shell_transitions_parse_errors, \
kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Shell transition packet has unknown fields, which results " \
"in some arguments missing. You may need a newer version of trace " \
"processor to parse them."), \
F(winscope_protolog_invalid_interpolation_parse_errors, \
kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"ProtoLog message string has invalid interplation parameter."), \
F(winscope_protolog_missing_interned_arg_parse_errors, \
kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Failed to find interned ProtoLog argument."), \
F(winscope_protolog_missing_interned_stacktrace_parse_errors, \
kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Failed to find interned ProtoLog stacktrace."), \
F(winscope_protolog_message_decoding_failed, \
kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Failed to decode ProtoLog message."), \
F(winscope_protolog_message_collision, \
kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Got a ProtoLog message collision!"), \
F(winscope_protolog_message_collision_resolved, \
kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Got a ProtoLog message collision resolved!"), \
F(winscope_protolog_group_tag_collision, \
kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Got a ProtoLog group tag collision!"), \
F(winscope_protolog_group_tag_missing, \
kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Got a ProtoLog group tag missing!"), \
F(winscope_protolog_param_mismatch, \
kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Message had mismatching parameters!"), \
F(winscope_viewcapture_parse_errors, \
kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"ViewCapture packet has unknown fields, which results in some " \
"arguments missing. You may need a newer version of trace processor " \
"to parse them."), \
F(winscope_viewcapture_missing_interned_string_parse_errors, \
kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Failed to find interned ViewCapture string."), \
F(winscope_windowmanager_parse_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"WindowManager state packet has unknown fields, which results " \
"in some arguments missing. You may need a newer version of trace " \
"processor to parse them."), \
F(jit_unknown_frame, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"Indicates that we were unable to determine the function for a frame in "\
"a jitted memory region"), \
F(ftrace_missing_event_id, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Indicates that the ftrace event was dropped because the event id was " \
"missing. This is an 'info' stat rather than an error stat because " \
"this can be legitimately missing due to proto filtering."), \
F(android_input_event_parse_errors, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Android input event packet has unknown fields, which results " \
"in some arguments missing. You may need a newer version of trace " \
"processor to parse them."), \
F(mali_unknown_mcu_state_id, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"An invalid Mali GPU MCU state ID was detected."), \
F(pixel_modem_negative_timestamp, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A negative timestamp was received from a Pixel modem event."), \
F(legacy_v8_cpu_profile_invalid_callsite, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"Indicates a callsite in legacy v8 CPU profiling is invalid. This is " \
"a sign that the trace is malformed."), \
F(legacy_v8_cpu_profile_invalid_sample, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"Indicates a sample in legacy v8 CPU profile is invalid. This will " \
"cause CPU samples to be missing in the UI. This is a sign that the " \
"trace is malformed."), \
F(config_write_into_file_no_flush, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"The trace was collected with the `write_into_file` option set but " \
"*without* `flush_period_ms` being set. This will cause the trace to " \
"be fully loaded into memory and use significantly more memory than " \
"necessary."), \
F(config_write_into_file_discard, kIndexed, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"The trace was collected with the `write_into_file` option set but " \
"uses a `DISCARD` buffer. This configuration is strongly discouraged " \
"and can cause mysterious data loss in the trace. Please use " \
"`RING_BUFFER` buffers instead."), \
F(hprof_string_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Number of strings encountered."), \
F(hprof_class_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Number of classes encountered."), \
F(hprof_heap_dump_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Number of heap dumps encountered."), \
F(hprof_instance_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Number of instances encountered."), \
F(hprof_object_array_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Number of object arrays encountered."), \
F(hprof_primitive_array_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Number of primitive arrays encountered."), \
F(hprof_root_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Number of roots encountered."), \
F(hprof_reference_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Number of references encountered."), \
F(hprof_record_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Total number of records parsed."), \
F(hprof_segment_overshoot_counter, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"Number of HEAP_DUMP_SEGMENTs whose last sub-record extended past " \
"the declared segment end. Benign: the sub-record's own length is " \
"authoritative and the parser keeps going. Reported for visibility " \
"into how a producer framed the dump."), \
F(hprof_field_value_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Number of field value parsing errors. This indicates a malformed " \
"hprof file. Check if the hprof opens correctly in a tool like " \
"AHAT. Missing values could yield incorrect native object sizes."), \
F(hprof_class_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Number of class parsing errors encountered. This indicates a " \
"malformed hprof file. Check if the hprof opens correctly in a tool " \
"like AHAT. Missing classes could cause missing references, thus " \
"affecting the overall size of the heap graph."), \
F(hprof_header_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Number of header parsing errors. This indicates a malformed hprof " \
"file with invalid or missing header information. The file may be " \
"corrupted or might not be a valid hprof file. There may not be any " \
"heap graph data parsed."), \
F(hprof_heap_dump_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Number of heap dump parsing errors. This indicates a malformed " \
"hprof file with corrupted heap segments. Check if the hprof opens " \
"correctly in a tool like AHAT. Missing heap dump sections can lead to " \
"huge clusters of the heap graph missing, thus affecting the overall " \
"size of the graph"), \
F(hprof_primitive_array_parsing_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Number of primitive array parsing errors. This indicates a " \
"malformed hprof file. Check if the hprof opens correctly in a tool " \
"like AHAT. Primitive arrays like bytes[] missing can dramatically " \
"affect the overall size of the heap graph."), \
F(hprof_reference_errors, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Number of object reference errors encountered. This indicates a " \
"malformed hprof file. Check if the hprof opens correctly in a tool " \
"like AHAT. Missing references will affect the overall size of the " \
"heap graph."), \
F(trace_sorter_negative_timestamp_dropped, kSingle, kError, kTrace, Scope::kGlobal, \
"A negative timestamp was received by the TraceSorter and was dropped. " \
"Negative timestamps are not supported by trace processor and " \
"the presence of one is usually a sign that something went wrong while " \
"recording a trace. Common causes of this include incorrect " \
"incremental timestamps, bad clock synchronization or kernel bugs in " \
"drivers emitting timestamps"), \
F(slice_drop_overlapping_complete_event, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"A complete slice was dropped because it overlaps with another " \
"slice. This can happen e.g. in JSON traces using X events or in other " \
"cases where a duration is part of the trace. To solve this problem " \
"make sure that your X events do not overlap on the same track (e.g. " \
"thread/process)"), \
F(perf_text_importer_sample_no_frames, kSingle, kError, kTrace, Scope::kMachineAndTrace, \
"A perf sample was encountered that has no frames. This can happen " \
"if the kernel is unable to unwind the stack while sampling. Check " \
"Linux kernel documentation for causes of this and potential fixes."), \
F(simpleperf_missing_file_mapping, kSingle, kDataLoss, kTrace, Scope::kMachineAndTrace, \
"One or more simpleperf samples were dropped because their callchain " \
"entries referenced a file_id that has no corresponding File record in " \
"the simpleperf proto. This typically happens when the simpleperf data " \
"is incomplete or truncated, or due to a bug in simpleperf. Try " \
"re-recording the profile and ensure the file is not truncated. If " \
"this occurs consistently, please report it to the simpleperf team."), \
F(slice_negative_duration, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Number of slices dropped due to negative duration. This usually " \
"indicates incorrect timestamps in the trace data."), \
F(gpu_work_period_negative_duration, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Number of GPU work period events with negative duration (end < start). "\
"Check the GPU driver for timestamp bugs."), \
F(track_descriptor_missing_uuid, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackDescriptor packet was received without a uuid field. The uuid " \
"is required to uniquely identify tracks and associate events with " \
"them. Without it, the track cannot be created and any events " \
"referencing this track will be dropped. This indicates a bug in the " \
"trace producer or trace conversion tool. Ensure your trace producer " \
"or conversion tool assigns a unique uuid to each TrackDescriptor."), \
F(track_descriptor_thread_missing_pid_tid, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A ThreadDescriptor within a TrackDescriptor packet is missing " \
"required pid or tid fields. Both fields are necessary to associate " \
"the track with a specific thread. The track will be ignored and any " \
"events on it will be dropped. This indicates a bug in the trace " \
"producer or trace conversion tool. Ensure ThreadDescriptor packets " \
"include both pid and tid fields."), \
F(track_descriptor_process_missing_pid, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A ProcessDescriptor within a TrackDescriptor packet is missing the " \
"required pid field. The pid is necessary to associate the track with " \
"a specific process. The track will be ignored and any events on it " \
"will be dropped. This indicates a bug in the trace producer or trace " \
"conversion tool. Ensure ProcessDescriptor packets include a valid " \
"pid field."), \
F(track_event_missing_sequence_id, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent packet was received without a trusted_packet_sequence_id " \
"field. This field is required for tracking incremental state (interned "\
"data like strings, track associations, etc.). Without it, the event " \
"cannot be properly decoded and will be dropped. This indicates a bug " \
"in the trace producer or trace conversion tool. Ensure each packet " \
"sequence has a unique trusted_packet_sequence_id."), \
F(track_event_missing_timestamp, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent packet was received without a valid timestamp. Events " \
"must have either a timestamp_delta_us, timestamp_absolute_us, or the " \
"containing TracePacket must have a timestamp field. Without a " \
"timestamp, the event cannot be placed in the trace timeline and will " \
"be dropped. This indicates a bug in the trace producer or trace " \
"conversion tool, or data corruption. Ensure all events have valid " \
"timestamps."), \
F(thread_descriptor_missing_sequence_id, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A ThreadDescriptor packet was received without a " \
"trusted_packet_sequence_id field. This field is required to associate " \
"the thread descriptor with the correct packet sequence for incremental "\
"state tracking. Without it, delta-encoded timestamps and other " \
"incremental data cannot be properly decoded. The descriptor will be " \
"ignored. This indicates a bug in the trace producer or trace " \
"conversion tool. Ensure ThreadDescriptor packets include " \
"trusted_packet_sequence_id on all packets."), \
F(incremental_state_cleared_missing_sequence_id, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A packet with incremental_state_cleared set was received without " \
"trusted_packet_sequence_id. This field is required to identify which " \
"packet sequence's incremental state should be cleared. Without it, " \
"incremental state cannot be properly managed and subsequent packets " \
"may fail to decode. This indicates a bug in the trace producer or " \
"trace conversion tool."), \
F(previous_packet_dropped_missing_sequence_id, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A packet with previous_packet_dropped set was received without " \
"trusted_packet_sequence_id. This field is required to identify which " \
"packet sequence experienced packet loss. Without it, packet loss " \
"cannot be properly tracked and incremental state may become " \
"corrupted. This indicates a bug in the trace producer or trace " \
"conversion tool."), \
F(trace_packet_defaults_missing_sequence_id, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TracePacketDefaults packet was received without " \
"trusted_packet_sequence_id. This field is required to associate the " \
"defaults with the correct packet sequence. Without it, the defaults " \
"cannot be applied and subsequent packets may not decode correctly. " \
"This indicates a bug in the trace producer or trace conversion tool."), \
F(interned_data_missing_sequence_id, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"An InternedData packet was received without " \
"trusted_packet_sequence_id. This field is required to associate " \
"interned data (strings, tracks, etc.) with the correct packet " \
"sequence. Without it, the interned data cannot be used and subsequent " \
"packets will fail to decode. This indicates a bug in the trace " \
"producer or trace conversion tool."), \
F(track_event_track_hierarchy_loop, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A track hierarchy loop was detected where a track is its own ancestor " \
"through parent_uuid references. This creates a circular dependency " \
"that cannot be resolved. The track will not be properly associated " \
"with its ancestors. This indicates corrupted or malformed track " \
"descriptors in the trace. Check that parent_uuid references form a " \
"valid tree structure."), \
F(track_event_track_hierarchy_too_deep, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A track hierarchy exceeds the maximum depth of 100 ancestors. This " \
"either indicates an extremely deep (and likely incorrect) track " \
"structure, or a loop that wasn't detected. The track will not be " \
"properly resolved. This indicates corrupted or malformed track " \
"descriptors. Review the track parent_uuid relationships."), \
F(track_descriptor_default_track_with_parent, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackDescriptor for the default track (uuid=0) specified a " \
"parent_uuid. The default track is the root of the track hierarchy and " \
"cannot have a parent. The descriptor is ignored. This is a bug in the " \
"trace producer."), \
F(track_descriptor_conflicting_reservation, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackDescriptor was received that conflicts with an earlier " \
"descriptor for the same uuid. Track descriptors for the same uuid " \
"must be consistent (same type, same parent, etc.). The conflicting " \
"descriptor is ignored. This is a bug in the trace producer."), \
F(track_event_range_of_interest_missing_start_us, kSingle, kError, kAnalysis, Scope::kMachineAndTrace,\
"A TrackEventRangeOfInterest packet was received without the required " \
"start_us field. The packet is ignored. This is a bug in the trace " \
"producer."), \
F(track_descriptor_invalid_child_ordering, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackDescriptor specified an invalid or unrecognized value for " \
"child_tracks_ordering. The descriptor is ignored. This is a bug in " \
"the trace producer."), \
F(track_event_counter_missing_track_uuid, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent with TYPE_COUNTER was received without a track_uuid " \
"(neither in the event nor in TrackEventDefaults). Counter events " \
"require a track_uuid to identify which counter track to use. The " \
"event is dropped. This is a bug in the trace producer."), \
F(track_event_counter_missing_value, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent with TYPE_COUNTER was received without a counter value " \
"(neither counter_value nor double_counter_value). Counter events " \
"must specify a value. The event is dropped. This is a bug in the " \
"trace producer."), \
F(track_event_counter_invalid_track_uuid, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent with TYPE_COUNTER specified a track_uuid that could not " \
"be resolved or converted to an absolute counter value. The event is " \
"dropped. This is a bug in the trace producer."), \
F(track_event_extra_counter_missing_track_uuids, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent specified extra counter values but did not provide the " \
"corresponding extra_counter_track_uuids (neither in the event nor in " \
"TrackEventDefaults). The event is dropped. This is a bug in the trace " \
"producer."), \
F(track_event_extra_counter_track_uuid_mismatch, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent provided more extra counter values than " \
"extra_counter_track_uuids. Arrays must have matching lengths. The " \
"event is dropped. This is a bug in the trace producer."), \
F(track_event_extra_counter_exceeds_max, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent provided more extra counter values than the maximum " \
"supported (TrackEventData::kMaxNumExtraCounters). Excess counters are " \
"ignored. This is a bug in the trace producer."), \
F(track_event_extra_counter_invalid_track, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent specified an invalid track_uuid in " \
"extra_counter_track_uuids that could not be resolved. The event is " \
"dropped. This is a bug in the trace producer."), \
F(thread_descriptor_skipped_incremental_state_invalid, kSingle, kError, \
kAnalysis, Scope::kMachineAndTrace, \
"A ThreadDescriptor packet was skipped because incremental state is " \
"invalid. ThreadDescriptors are ignored until incremental state is " \
"cleared to prevent incorrect delta-encoded timestamp calculations. " \
"Root cause: packet loss in the trace (check packet loss stats) or a " \
"bug in the trace producer (missing incremental_state_cleared)."), \
F(track_event_skipped_timestamp_delta_without_valid_state, kSingle, kError, \
kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent with timestamp_delta_us was skipped because no valid " \
"ThreadDescriptor baseline was available. Delta timestamps require a " \
"ThreadDescriptor to establish a baseline. Root cause: packet loss in " \
"the trace (check packet loss stats) or a bug in the trace producer " \
"(missing ThreadDescriptor)."), \
F(track_event_skipped_thread_time_delta_without_valid_state, kSingle, \
kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent with thread_time_delta_us was skipped because no valid " \
"ThreadDescriptor baseline was available. Delta timestamps require a " \
"ThreadDescriptor to establish a baseline. Root cause: packet loss in " \
"the trace (check packet loss stats) or a bug in the trace producer " \
"(missing ThreadDescriptor)."), \
F(track_event_skipped_thread_instruction_delta_without_valid_state, kSingle, \
kError, kAnalysis, Scope::kMachineAndTrace, \
"A TrackEvent with thread_instruction_count_delta was skipped because " \
"no valid ThreadDescriptor baseline was available. Delta counts " \
"require a ThreadDescriptor to establish a baseline. Root cause: " \
"packet loss in the trace (check packet loss stats) or a bug in the " \
"trace producer (missing ThreadDescriptor)."), \
F(packet_skipped_seq_needs_incremental_state_invalid, kSingle, kInfo, \
kAnalysis, Scope::kMachineAndTrace, \
"A packet with SEQ_NEEDS_INCREMENTAL_STATE flag was skipped because " \
"incremental state is invalid. Packets that depend on incremental " \
"state cannot be processed until state is reestablished. Root cause: " \
"packet loss in the trace (check packet loss stats) or a bug in the " \
"trace producer (missing incremental_state_cleared packet)."), \
F(interned_data_skipped_incremental_state_invalid, kSingle, kInfo, \
kAnalysis, Scope::kMachineAndTrace, \
"An InternedData packet was skipped because incremental state is " \
"invalid. InternedData must be associated with the correct state " \
"generation, so it's ignored until incremental state is cleared. Root " \
"cause: packet loss in the trace (check packet loss stats) or a bug " \
"in the trace producer (missing incremental_state_cleared packet)."), \
F(heap_graph_non_finalized_graph, kSingle, kDataLoss, kTrace, Scope::kGlobal, \
"Heap graph profile was not finalized before the trace ended. Packet " \
"loss was detected (missing packet indices) which means the profile is " \
"incomplete. Some objects and references may be missing from the heap " \
"graph. This typically occurs when the profiled process crashes or is " \
"killed before completing the profile. To get complete profiles, ensure "\
"the process finishes cleanly or increase the profiling timeout."), \
F(primes_unknown_edge_type, kSingle, kDataLoss, kAnalysis, Scope::kMachineAndTrace, \
"A Primes TraceEdge was received which did not contain a known slice type "\
"(Begin, End, Mark)."), \
F(primes_executor_not_found, kSingle, kDataLoss, kAnalysis, Scope::kMachineAndTrace, \
"A valid executor_id was not found for the given edge's parent_id, so the "\
"slice was dropped."), \
F(primes_end_without_matching_begin, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"A SliceEnd event was seen without its corresponding SliceBegin."), \
F(primes_missing_entity_details, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"The entity_details field was missing from an edge that requires it."), \
F(primes_missing_parent_id, kSingle, kInfo, kAnalysis, Scope::kMachineAndTrace, \
"The parent_id field was missing from an edge that requires it."), \
F(primes_malformed_timestamp, kSingle, kDataLoss, kAnalysis, Scope::kMachineAndTrace, \
"The timestamp for an edge or trace was not able to be parsed"), \
F(protovm_abort, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"A ProtoVM instance aborted the execution while applying the patch. " \
"This might be due to inconsistencies between VM program logic and " \
"actual patch format."), \
F(protovm_registration_error, kSingle, kError, kAnalysis, Scope::kMachineAndTrace, \
"Failed to find the sequence IDs corresponding to a ProtoVM's producer " \
"ID. Such mapping should be provided by the TraceProvenance packet.")
// clang-format on
enum Type {
kSingle, // Single-value property, one value per key.
kIndexed // Indexed property, multiple value per key (e.g. cpu_stats[1]).
};
enum Severity {
kInfo, // Diagnostic counters
kDataLoss, // Correct operation that still resulted in data loss
kError, // If any kError counter is > 0 trace_processor_shell will
// raise an error. This is also surfaced in the web UI.
kNumSeverities,
};
enum Source {
// The counter is collected when recording the trace on-device and is just
// being reflected in the stats table.
kTrace,
// The counter is generated when importing / processing the trace in the trace
// processor.
kAnalysis,
kNumSources,
};
// Scope of a stat defines its association within a potentially
// multi-machine/multi-trace merged session.
//
// Classification Reasoning:
// - kGlobal: Properties intrinsic to the TP process (e.g. parse timing).
// - kTrace: Properties of a recording session or trace file, not tied to a
// specific machine (e.g. traced service stats, buffer stats).
// - kMachine: Static properties of a device. Currently unused for stats.
// - kMachineAndTrace: Per-machine execution data within a specific session
// (e.g. ftrace stats, parser errors, clock sync).
#define PERFETTO_TP_STATS_SCOPES(F) \
F(kGlobal, "global"), F(kTrace, "trace"), F(kMachine, "machine"), \
F(kMachineAndTrace, "machine_and_trace")
#define PERFETTO_TP_STATS_SCOPE_ENUM(varname, name) varname
enum class Scope : size_t {
PERFETTO_TP_STATS_SCOPES(PERFETTO_TP_STATS_SCOPE_ENUM),
kNumScopes,
};
#define PERFETTO_TP_STATS_SCOPE_NAME(varname, name) name
constexpr char const* kScopeNames[] = {
PERFETTO_TP_STATS_SCOPES(PERFETTO_TP_STATS_SCOPE_NAME)};
#if defined(__GNUC__) || defined(__clang__)
#if defined(__clang__)
#pragma clang diagnostic push
// Fix 'error: #pragma system_header ignored in main file' for clang in Google3.
#pragma clang diagnostic ignored "-Wpragma-system-header-outside-header"
#endif
// Ignore GCC warning about a missing argument for a variadic macro parameter.
#pragma GCC system_header
#if defined(__clang__)
#pragma clang diagnostic pop
#endif
#endif
// Declares an enum of literals (one for each stat). The enum values of each
// literal corresponds to the string index in the arrays below.
#define PERFETTO_TP_STATS_ENUM(name, ...) name
enum KeyIDs : size_t { PERFETTO_TP_STATS(PERFETTO_TP_STATS_ENUM), kNumKeys };
// The code below declares an array for each property (name, type, ...).
#define PERFETTO_TP_STATS_NAME(name, ...) #name
constexpr char const* kNames[] = {PERFETTO_TP_STATS(PERFETTO_TP_STATS_NAME)};
#define PERFETTO_TP_STATS_TYPE(_, type, ...) type
constexpr Type kTypes[] = {PERFETTO_TP_STATS(PERFETTO_TP_STATS_TYPE)};
#define PERFETTO_TP_STATS_SEVERITY(_, __, severity, ...) severity
constexpr Severity kSeverities[] = {
PERFETTO_TP_STATS(PERFETTO_TP_STATS_SEVERITY)};
#define PERFETTO_TP_STATS_SOURCE(_, __, ___, source, ...) source
constexpr Source kSources[] = {PERFETTO_TP_STATS(PERFETTO_TP_STATS_SOURCE)};
#define PERFETTO_TP_STATS_SCOPE(_, __, ___, ____, scope, ...) scope
constexpr Scope kScopes[] = {PERFETTO_TP_STATS(PERFETTO_TP_STATS_SCOPE)};
#define PERFETTO_TP_STATS_DESCRIPTION(_, __, ___, ____, _____, descr, ...) descr
constexpr char const* kDescriptions[] = {
PERFETTO_TP_STATS(PERFETTO_TP_STATS_DESCRIPTION)};
} // namespace perfetto::trace_processor::stats
#endif // SRC_TRACE_PROCESSOR_STORAGE_STATS_H_