1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef SRC_TRACE_PROCESSOR_STATS_H_
18 #define SRC_TRACE_PROCESSOR_STATS_H_
19 
20 #include <stddef.h>
21 
22 namespace perfetto {
23 namespace trace_processor {
24 namespace stats {
25 
26 // Compile time list of parsing and processing stats.
27 // clang-format off
28 #define PERFETTO_TP_STATS(F)                                                  \
29   F(android_log_num_failed,                     kSingle,  kError, kTrace),    \
30   F(android_log_num_skipped,                    kSingle,  kError, kTrace),    \
31   F(android_log_num_total,                      kSingle,  kInfo,  kTrace),    \
32   F(atrace_tgid_mismatch,                       kSingle,  kError, kTrace),    \
33   F(clock_snapshot_not_monotonic,               kSingle,  kError, kTrace),    \
34   F(counter_events_out_of_order,                kSingle,  kError, kAnalysis), \
35   F(ftrace_bundle_tokenizer_errors,             kSingle,  kError, kAnalysis), \
36   F(ftrace_cpu_bytes_read_begin,                kIndexed, kInfo,  kTrace),    \
37   F(ftrace_cpu_bytes_read_end,                  kIndexed, kInfo,  kTrace),    \
38   F(ftrace_cpu_commit_overrun_begin,            kIndexed, kError, kTrace),    \
39   F(ftrace_cpu_commit_overrun_end,              kIndexed, kError, kTrace),    \
40   F(ftrace_cpu_dropped_events_begin,            kIndexed, kError, kTrace),    \
41   F(ftrace_cpu_dropped_events_end,              kIndexed, kError, kTrace),    \
42   F(ftrace_cpu_entries_begin,                   kIndexed, kInfo,  kTrace),    \
43   F(ftrace_cpu_entries_end,                     kIndexed, kInfo,  kTrace),    \
44   F(ftrace_cpu_now_ts_begin,                    kIndexed, kInfo,  kTrace),    \
45   F(ftrace_cpu_now_ts_end,                      kIndexed, kInfo,  kTrace),    \
46   F(ftrace_cpu_oldest_event_ts_begin,           kIndexed, kInfo,  kTrace),    \
47   F(ftrace_cpu_oldest_event_ts_end,             kIndexed, kInfo,  kTrace),    \
48   F(ftrace_cpu_overrun_begin,                   kIndexed, kError, kTrace),    \
49   F(ftrace_cpu_overrun_end,                     kIndexed, kError, kTrace),    \
50   F(ftrace_cpu_read_events_begin,               kIndexed, kInfo,  kTrace),    \
51   F(ftrace_cpu_read_events_end,                 kIndexed, kInfo,  kTrace),    \
52   F(guess_trace_type_duration_ns,               kSingle,  kInfo,  kAnalysis), \
53   F(interned_data_tokenizer_errors,             kSingle,  kInfo,  kAnalysis), \
54   F(invalid_clock_snapshots,                    kSingle,  kError, kAnalysis), \
55   F(invalid_cpu_times,                          kSingle,  kError, kAnalysis), \
56   F(meminfo_unknown_keys,                       kSingle,  kError, kAnalysis), \
57   F(mismatched_sched_switch_tids,               kSingle,  kError, kAnalysis), \
58   F(mm_unknown_type,                            kSingle,  kError, kAnalysis), \
59   F(parse_trace_duration_ns,                    kSingle,  kInfo,  kAnalysis), \
60   F(power_rail_unknown_index,                   kSingle,  kError, kTrace), \
61   F(proc_stat_unknown_counters,                 kSingle,  kError, kAnalysis), \
62   F(rss_stat_unknown_keys,                      kSingle,  kError, kAnalysis), \
63   F(rss_stat_negative_size,                     kSingle,  kInfo,  kAnalysis), \
64   F(sched_switch_out_of_order,                  kSingle,  kError, kAnalysis), \
65   F(systrace_parse_failure,                     kSingle,  kError, kAnalysis), \
66   F(traced_buf_buffer_size,                     kIndexed, kInfo,  kTrace),    \
67   F(traced_buf_bytes_overwritten,               kIndexed, kInfo,  kTrace),    \
68   F(traced_buf_bytes_read,                      kIndexed, kInfo,  kTrace),    \
69   F(traced_buf_bytes_written,                   kIndexed, kInfo,  kTrace),    \
70   F(traced_buf_chunks_discarded,                kIndexed, kInfo,  kTrace),    \
71   F(traced_buf_chunks_overwritten,              kIndexed, kInfo,  kTrace),    \
72   F(traced_buf_chunks_read,                     kIndexed, kInfo,  kTrace),    \
73   F(traced_buf_chunks_rewritten,                kIndexed, kInfo,  kTrace),    \
74   F(traced_buf_chunks_written,                  kIndexed, kInfo,  kTrace),    \
75   F(traced_buf_chunks_committed_out_of_order,   kIndexed, kInfo,  kTrace),    \
76   F(traced_buf_padding_bytes_cleared,           kIndexed, kInfo,  kTrace),    \
77   F(traced_buf_padding_bytes_written,           kIndexed, kInfo,  kTrace),    \
78   F(traced_buf_patches_failed,                  kIndexed, kInfo,  kTrace),    \
79   F(traced_buf_patches_succeeded,               kIndexed, kInfo,  kTrace),    \
80   F(traced_buf_readaheads_failed,               kIndexed, kInfo,  kTrace),    \
81   F(traced_buf_readaheads_succeeded,            kIndexed, kInfo,  kTrace),    \
82   F(traced_buf_write_wrap_count,                kIndexed, kInfo,  kTrace),    \
83   F(traced_chunks_discarded,                    kSingle,  kInfo,  kTrace),    \
84   F(traced_data_sources_registered,             kSingle,  kInfo,  kTrace),    \
85   F(traced_data_sources_seen,                   kSingle,  kInfo,  kTrace),    \
86   F(traced_patches_discarded,                   kSingle,  kInfo,  kTrace),    \
87   F(traced_producers_connected,                 kSingle,  kInfo,  kTrace),    \
88   F(traced_producers_seen,                      kSingle,  kInfo,  kTrace),    \
89   F(traced_total_buffers,                       kSingle,  kInfo,  kTrace),    \
90   F(traced_tracing_sessions,                    kSingle,  kInfo,  kTrace),    \
91   F(track_event_tokenizer_errors,               kSingle,  kInfo,  kAnalysis), \
92   F(track_event_tokenizer_skipped_packets,      kSingle,  kInfo,  kAnalysis), \
93   F(vmstat_unknown_keys,                        kSingle,  kError, kAnalysis), \
94   F(clock_sync_failure,                         kSingle,  kError, kAnalysis), \
95   F(process_tracker_errors,                     kSingle,  kError, kAnalysis), \
96   F(json_tokenizer_failure,                     kSingle,  kError, kTrace),    \
97   F(heapprofd_buffer_corrupted,                 kIndexed, kError, kTrace),    \
98   F(heapprofd_buffer_overran,                   kIndexed, kError, kTrace),    \
99   F(heapprofd_rejected_concurrent,              kIndexed, kError, kTrace),    \
100   F(heapprofd_invalid_string_id,                kSingle,  kError, kTrace),    \
101   F(heapprofd_invalid_mapping_id,               kSingle,  kError, kTrace),    \
102   F(heapprofd_invalid_frame_id,                 kSingle,  kError, kTrace),    \
103   F(heapprofd_invalid_callstack_id,             kSingle,  kError, kTrace)
104 // clang-format on
105 
106 enum Type {
107   kSingle,  // Single-value property, one value per key.
108   kIndexed  // Indexed property, multiple value per key (e.g. cpu_stats[1]).
109 };
110 
111 enum Severity {
112   kInfo,  // Diagnostic counters
113   kError  // If any kError counter is > 0 the UI will raise an error.
114 };
115 
116 enum Source {
117   // The counter is collected when recording the trace on-device and is just
118   // being reflected in the stats table.
119   kTrace,
120 
121   // The counter is genrated when importing / processing the trace in the trace
122   // processor.
123   kAnalysis
124 };
125 
126 // Declares an enum of literals (one for each stat). The enum values of each
127 // literal corresponds to the string index in the arrays below.
128 #define PERFETTO_TP_STATS_ENUM(name, ...) name
129 enum KeyIDs : size_t { PERFETTO_TP_STATS(PERFETTO_TP_STATS_ENUM), kNumKeys };
130 
131 // The code below declares an array for each property (name, type, ...).
132 
133 #define PERFETTO_TP_STATS_NAME(name, ...) #name
134 constexpr char const* kNames[] = {PERFETTO_TP_STATS(PERFETTO_TP_STATS_NAME)};
135 
136 #define PERFETTO_TP_STATS_TYPE(_, type, ...) type
137 constexpr Type kTypes[] = {PERFETTO_TP_STATS(PERFETTO_TP_STATS_TYPE)};
138 
139 #define PERFETTO_TP_STATS_SEVERITY(_, __, severity, ...) severity
140 constexpr Severity kSeverities[] = {
141     PERFETTO_TP_STATS(PERFETTO_TP_STATS_SEVERITY)};
142 
143 #define PERFETTO_TP_STATS_SOURCE(_, __, ___, source, ...) source
144 constexpr Source kSources[] = {PERFETTO_TP_STATS(PERFETTO_TP_STATS_SOURCE)};
145 
146 }  // namespace stats
147 }  // namespace trace_processor
148 }  // namespace perfetto
149 
150 #endif  // SRC_TRACE_PROCESSOR_STATS_H_
151