1 /* 2 * Copyright (C) 2024 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_IMPORTERS_COMMON_TRACKS_COMMON_H_ 18 #define SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_TRACKS_COMMON_H_ 19 20 #include <cstdint> 21 22 #include "perfetto/ext/base/string_utils.h" 23 #include "perfetto/ext/base/string_view.h" 24 #include "src/trace_processor/importers/common/tracks.h" 25 26 namespace perfetto::trace_processor::tracks { 27 28 // This file acts as a shared source track, dimension and unit blueprints which 29 // are used from many places throughout the codebase. It's strongly recomended 30 // to use the shared blueprints from this file where possible. 31 32 // Begin dimension blueprints. 33 34 inline constexpr auto kGpuDimensionBlueprint = 35 tracks::UintDimensionBlueprint("gpu"); 36 37 inline constexpr auto kUidDimensionBlueprint = 38 tracks::UintDimensionBlueprint("uid"); 39 40 inline constexpr auto kCpuDimensionBlueprint = 41 tracks::UintDimensionBlueprint("cpu"); 42 43 inline constexpr auto kNameFromTraceDimensionBlueprint = 44 tracks::StringDimensionBlueprint("name"); 45 46 inline constexpr auto kLinuxDeviceDimensionBlueprint = 47 tracks::StringDimensionBlueprint("linux_device"); 48 49 inline constexpr auto kIrqDimensionBlueprint = 50 tracks::UintDimensionBlueprint("irq"); 51 52 inline constexpr auto kProcessDimensionBlueprint = 53 tracks::UintDimensionBlueprint("upid"); 54 55 inline constexpr auto kThreadDimensionBlueprint = 56 tracks::UintDimensionBlueprint("utid"); 57 58 inline constexpr auto kNetworkInterfaceDimensionBlueprint = 59 tracks::StringDimensionBlueprint("network_interface"); 60 61 inline constexpr auto kThermalZoneDimensionBlueprint = 62 tracks::StringDimensionBlueprint("thermal_zone"); 63 64 // End dimension blueprints. 65 66 // Begin of unit blueprints. 67 68 inline constexpr auto kBytesUnitBlueprint = 69 tracks::StaticUnitBlueprint("bytes"); 70 71 // Begin of shared unit blueprints. 72 73 // Begin slice blueprints 74 75 inline constexpr auto kLegacyGlobalInstantsBlueprint = 76 tracks::SliceBlueprint("legacy_chrome_global_instants"); 77 78 // End slice blueprints. 79 80 // Begin counter blueprints. 81 82 static constexpr auto kBatteryCounterBlueprint = tracks::CounterBlueprint( 83 "battery_counter", 84 tracks::UnknownUnitBlueprint(), 85 tracks::DimensionBlueprints( 86 tracks::StringDimensionBlueprint("battery_name"), 87 tracks::StringDimensionBlueprint("counter_name")), 88 tracks::FnNameBlueprint( 89 [](base::StringView battery_name, base::StringView counter_name) { 90 if (battery_name.size() > 0) { 91 return base::StackString<1024>( 92 "batt.%.*s.%.*s", int(battery_name.size()), battery_name.data(), 93 int(counter_name.size()), counter_name.data()); 94 } 95 return base::StackString<1024>("batt.%.*s", int(counter_name.size()), 96 counter_name.data()); 97 })); 98 99 static constexpr auto kClockFrequencyBlueprint = tracks::CounterBlueprint( 100 "clock_frequency", 101 tracks::UnknownUnitBlueprint(), 102 tracks::DimensionBlueprints(kLinuxDeviceDimensionBlueprint), 103 tracks::FnNameBlueprint([](base::StringView key) { 104 return base::StackString<255>("%.*s Frequency", int(key.size()), 105 key.data()); 106 })); 107 108 static constexpr auto kClockStateBlueprint = tracks::CounterBlueprint( 109 "clock_state", 110 tracks::UnknownUnitBlueprint(), 111 tracks::DimensionBlueprints(kLinuxDeviceDimensionBlueprint), 112 tracks::FnNameBlueprint([](base::StringView key) { 113 return base::StackString<255>("%.*s State", int(key.size()), key.data()); 114 })); 115 116 static constexpr auto kCpuFrequencyBlueprint = tracks::CounterBlueprint( 117 "cpu_frequency", 118 tracks::UnknownUnitBlueprint(), 119 tracks::DimensionBlueprints(kCpuDimensionBlueprint), 120 tracks::StaticNameBlueprint("cpufreq")); 121 122 static constexpr auto kGpuFrequencyBlueprint = tracks::CounterBlueprint( 123 "gpu_frequency", 124 tracks::StaticUnitBlueprint("MHz"), 125 tracks::DimensionBlueprints(kGpuDimensionBlueprint), 126 tracks::StaticNameBlueprint("gpufreq")); 127 128 static constexpr auto kCpuIdleBlueprint = tracks::CounterBlueprint( 129 "cpu_idle", 130 tracks::UnknownUnitBlueprint(), 131 tracks::DimensionBlueprints(kCpuDimensionBlueprint), 132 tracks::StaticNameBlueprint("cpuidle")); 133 134 static constexpr auto kThermalTemperatureBlueprint = tracks::CounterBlueprint( 135 "thermal_temperature", 136 tracks::UnknownUnitBlueprint(), 137 tracks::DimensionBlueprints(kThermalZoneDimensionBlueprint), 138 tracks::FnNameBlueprint([](base::StringView tz) { 139 return base::StackString<255>("%.*s Temperature", 140 static_cast<int>(tz.size()), tz.data()); 141 })); 142 143 static constexpr auto kCoolingDeviceCounterBlueprint = tracks::CounterBlueprint( 144 "cooling_device_counter", 145 tracks::UnknownUnitBlueprint(), 146 tracks::DimensionBlueprints(kLinuxDeviceDimensionBlueprint), 147 tracks::FnNameBlueprint([](base::StringView cdev) { 148 return base::StackString<255>("%.*s Cooling Device", 149 static_cast<int>(cdev.size()), cdev.data()); 150 })); 151 152 constexpr auto kChromeProcessStatsBlueprint = tracks::CounterBlueprint( 153 "chrome_process_stats", 154 tracks::UnknownUnitBlueprint(), 155 tracks::DimensionBlueprints(tracks::kProcessDimensionBlueprint, 156 tracks::StringDimensionBlueprint("key")), 157 tracks::FnNameBlueprint([](uint32_t, base::StringView name) { 158 return base::StackString<128>("chrome.%.*s", int(name.size()), 159 name.data()); 160 })); 161 162 constexpr auto kAndroidScreenStateBlueprint = 163 tracks::CounterBlueprint("screen_state", 164 tracks::UnknownUnitBlueprint(), 165 tracks::DimensionBlueprints(), 166 tracks::StaticNameBlueprint("ScreenState")); 167 168 constexpr auto kAndroidBatteryStatsBlueprint = tracks::CounterBlueprint( 169 "battery_stats", 170 tracks::UnknownUnitBlueprint(), 171 tracks::DimensionBlueprints( 172 tracks::StringDimensionBlueprint("counter_key")), 173 tracks::FnNameBlueprint([](base::StringView name) { 174 return base::StackString<1024>("%.*s", int(name.size()), name.data()); 175 })); 176 177 constexpr auto kAndroidAtraceCounterBlueprint = tracks::CounterBlueprint( 178 "atrace_counter", 179 tracks::UnknownUnitBlueprint(), 180 tracks::DimensionBlueprints(tracks::kProcessDimensionBlueprint, 181 tracks::kNameFromTraceDimensionBlueprint), 182 tracks::FnNameBlueprint([](uint32_t, base::StringView name) { 183 return base::StackString<1024>("%.*s", int(name.size()), name.data()); 184 })); 185 186 constexpr auto kOomScoreAdjBlueprint = tracks::CounterBlueprint( 187 "oom_score_adj", 188 tracks::UnknownUnitBlueprint(), 189 tracks::DimensionBlueprints(tracks::kProcessDimensionBlueprint), 190 tracks::StaticNameBlueprint("oom_score_adj")); 191 192 constexpr auto kOomScoreAdjThreadFallbackBlueprint = tracks::CounterBlueprint( 193 "oom_score_adj_thread_fallback", 194 tracks::UnknownUnitBlueprint(), 195 tracks::DimensionBlueprints(tracks::kThreadDimensionBlueprint), 196 tracks::StaticNameBlueprint("oom_score_adj")); 197 198 constexpr auto kMmEventFnNameBlueprint = tracks::FnNameBlueprint( 199 [](uint32_t, base::StringView type, base::StringView metric) { 200 return base::StackString<1024>("mem.mm.%.*s.%.*s", int(type.size()), 201 type.data(), int(metric.size()), 202 metric.data()); 203 }); 204 205 constexpr auto kMmEventBlueprint = tracks::CounterBlueprint( 206 "mm_event", 207 tracks::UnknownUnitBlueprint(), 208 tracks::DimensionBlueprints( 209 tracks::kProcessDimensionBlueprint, 210 tracks::StringDimensionBlueprint("mm_event_type"), 211 tracks::StringDimensionBlueprint("mm_event_metric")), 212 kMmEventFnNameBlueprint); 213 214 constexpr auto kMmEventThreadFallbackBlueprint = tracks::CounterBlueprint( 215 "mm_event_thread_fallback", 216 tracks::UnknownUnitBlueprint(), 217 tracks::DimensionBlueprints( 218 tracks::kThreadDimensionBlueprint, 219 tracks::StringDimensionBlueprint("mm_event_type"), 220 tracks::StringDimensionBlueprint("mm_event_metric")), 221 kMmEventFnNameBlueprint); 222 223 constexpr auto kPerfCounterBlueprint = tracks::CounterBlueprint( 224 "perf_counter", 225 tracks::UnknownUnitBlueprint(), 226 tracks::DimensionBlueprints( 227 tracks::kCpuDimensionBlueprint, 228 tracks::UintDimensionBlueprint("perf_session_id"), 229 tracks::kNameFromTraceDimensionBlueprint), 230 tracks::DynamicNameBlueprint()); 231 232 constexpr auto kGlobalGpuMemoryBlueprint = 233 tracks::CounterBlueprint("gpu_memory", 234 tracks::kBytesUnitBlueprint, 235 tracks::DimensionBlueprints(), 236 tracks::StaticNameBlueprint("GPU Memory")); 237 238 constexpr auto kProcessGpuMemoryBlueprint = tracks::CounterBlueprint( 239 "process_gpu_memory", 240 tracks::kBytesUnitBlueprint, 241 tracks::DimensionBlueprints(tracks::kProcessDimensionBlueprint), 242 tracks::StaticNameBlueprint("GPU Memory")); 243 244 static constexpr auto kProcessMemoryBlueprint = tracks::CounterBlueprint( 245 "process_memory", 246 tracks::UnknownUnitBlueprint(), 247 tracks::DimensionBlueprints( 248 tracks::kProcessDimensionBlueprint, 249 tracks::StringDimensionBlueprint("process_memory_key")), 250 tracks::FnNameBlueprint([](uint32_t, base::StringView key) { 251 return base::StackString<1024>("mem.%.*s", int(key.size()), key.data()); 252 })); 253 254 static constexpr auto kProcessMemoryThreadFallbackBlueprint = 255 tracks::CounterBlueprint( 256 "process_memory_thread_fallback", 257 tracks::UnknownUnitBlueprint(), 258 tracks::DimensionBlueprints( 259 tracks::kThreadDimensionBlueprint, 260 tracks::StringDimensionBlueprint("process_memory_key")), 261 tracks::FnNameBlueprint([](uint32_t, base::StringView key) { 262 return base::StackString<1024>("mem.%.*s", int(key.size()), 263 key.data()); 264 })); 265 266 static constexpr auto kJsonCounterBlueprint = tracks::CounterBlueprint( 267 "json_counter", 268 tracks::UnknownUnitBlueprint(), 269 tracks::DimensionBlueprints(tracks::kProcessDimensionBlueprint, 270 tracks::kNameFromTraceDimensionBlueprint), 271 tracks::DynamicNameBlueprint()); 272 273 static constexpr auto kJsonCounterThreadFallbackBlueprint = 274 tracks::CounterBlueprint( 275 "json_counter_thread_fallback", 276 tracks::UnknownUnitBlueprint(), 277 tracks::DimensionBlueprints(tracks::kThreadDimensionBlueprint, 278 tracks::kNameFromTraceDimensionBlueprint), 279 tracks::DynamicNameBlueprint()); 280 281 static constexpr auto kGpuCounterBlueprint = tracks::CounterBlueprint( 282 "gpu_counter", 283 tracks::DynamicUnitBlueprint(), 284 tracks::DimensionBlueprints(tracks::kGpuDimensionBlueprint, 285 tracks::kNameFromTraceDimensionBlueprint), 286 tracks::DynamicNameBlueprint()); 287 288 // End counter blueprints. 289 290 } // namespace perfetto::trace_processor::tracks 291 292 #endif // SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_TRACKS_COMMON_H_ 293