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 static constexpr auto kAndroidDeviceStateBlueprint = 79 tracks::SliceBlueprint("android_device_state", 80 tracks::DimensionBlueprints(), 81 tracks::StaticNameBlueprint("DeviceStateChanged")); 82 83 static constexpr auto kAndroidLmkBlueprint = tracks::SliceBlueprint( 84 "android_lmk", 85 tracks::DimensionBlueprints(tracks::kProcessDimensionBlueprint), 86 tracks::StaticNameBlueprint("LMK")); 87 88 static constexpr auto kChromeProcessInstantBlueprint = tracks::SliceBlueprint( 89 "chrome_process_instant", 90 tracks::Dimensions(tracks::kProcessDimensionBlueprint)); 91 92 // End slice blueprints. 93 94 // Begin counter blueprints. 95 96 inline constexpr auto kBatteryCounterBlueprint = tracks::CounterBlueprint( 97 "battery_counter", 98 tracks::UnknownUnitBlueprint(), 99 tracks::DimensionBlueprints( 100 tracks::StringDimensionBlueprint("battery_name"), 101 tracks::StringDimensionBlueprint("counter_name")), 102 tracks::FnNameBlueprint( 103 [](base::StringView battery_name, base::StringView counter_name) { 104 if (battery_name.size() > 0) { 105 return base::StackString<1024>( 106 "batt.%.*s.%.*s", int(battery_name.size()), battery_name.data(), 107 int(counter_name.size()), counter_name.data()); 108 } 109 return base::StackString<1024>("batt.%.*s", int(counter_name.size()), 110 counter_name.data()); 111 })); 112 113 inline constexpr auto kClockFrequencyBlueprint = tracks::CounterBlueprint( 114 "clock_frequency", 115 tracks::UnknownUnitBlueprint(), 116 tracks::DimensionBlueprints(kLinuxDeviceDimensionBlueprint), 117 tracks::FnNameBlueprint([](base::StringView key) { 118 return base::StackString<255>("%.*s Frequency", int(key.size()), 119 key.data()); 120 })); 121 122 inline constexpr auto kClockStateBlueprint = tracks::CounterBlueprint( 123 "clock_state", 124 tracks::UnknownUnitBlueprint(), 125 tracks::DimensionBlueprints(kLinuxDeviceDimensionBlueprint), 126 tracks::FnNameBlueprint([](base::StringView key) { 127 return base::StackString<255>("%.*s State", int(key.size()), key.data()); 128 })); 129 130 inline constexpr auto kCpuFrequencyBlueprint = tracks::CounterBlueprint( 131 "cpu_frequency", 132 tracks::UnknownUnitBlueprint(), 133 tracks::DimensionBlueprints(kCpuDimensionBlueprint), 134 tracks::StaticNameBlueprint("cpufreq")); 135 136 inline constexpr auto kGpuFrequencyBlueprint = tracks::CounterBlueprint( 137 "gpu_frequency", 138 tracks::StaticUnitBlueprint("MHz"), 139 tracks::DimensionBlueprints(kGpuDimensionBlueprint), 140 tracks::StaticNameBlueprint("gpufreq")); 141 142 inline constexpr auto kCpuIdleBlueprint = tracks::CounterBlueprint( 143 "cpu_idle", 144 tracks::UnknownUnitBlueprint(), 145 tracks::DimensionBlueprints(kCpuDimensionBlueprint), 146 tracks::StaticNameBlueprint("cpuidle")); 147 148 inline constexpr auto kThermalTemperatureBlueprint = tracks::CounterBlueprint( 149 "thermal_temperature", 150 tracks::UnknownUnitBlueprint(), 151 tracks::DimensionBlueprints(kThermalZoneDimensionBlueprint), 152 tracks::FnNameBlueprint([](base::StringView tz) { 153 return base::StackString<255>("%.*s Temperature", 154 static_cast<int>(tz.size()), tz.data()); 155 })); 156 157 inline constexpr auto kCoolingDeviceCounterBlueprint = tracks::CounterBlueprint( 158 "cooling_device_counter", 159 tracks::UnknownUnitBlueprint(), 160 tracks::DimensionBlueprints(kLinuxDeviceDimensionBlueprint), 161 tracks::FnNameBlueprint([](base::StringView cdev) { 162 return base::StackString<255>("%.*s Cooling Device", 163 static_cast<int>(cdev.size()), cdev.data()); 164 })); 165 166 inline constexpr auto kChromeProcessStatsBlueprint = tracks::CounterBlueprint( 167 "chrome_process_stats", 168 tracks::UnknownUnitBlueprint(), 169 tracks::DimensionBlueprints(tracks::kProcessDimensionBlueprint, 170 tracks::StringDimensionBlueprint("key")), 171 tracks::FnNameBlueprint([](uint32_t, base::StringView name) { 172 return base::StackString<128>("chrome.%.*s", int(name.size()), 173 name.data()); 174 })); 175 176 inline constexpr auto kAndroidScreenStateBlueprint = 177 tracks::CounterBlueprint("screen_state", 178 tracks::UnknownUnitBlueprint(), 179 tracks::DimensionBlueprints(), 180 tracks::StaticNameBlueprint("ScreenState")); 181 182 inline constexpr auto kAndroidBatteryStatsBlueprint = tracks::CounterBlueprint( 183 "battery_stats", 184 tracks::UnknownUnitBlueprint(), 185 tracks::DimensionBlueprints( 186 tracks::StringDimensionBlueprint("counter_key")), 187 tracks::FnNameBlueprint([](base::StringView name) { 188 return base::StackString<1024>("%.*s", int(name.size()), name.data()); 189 })); 190 191 inline constexpr auto kAndroidAtraceCounterBlueprint = tracks::CounterBlueprint( 192 "atrace_counter", 193 tracks::UnknownUnitBlueprint(), 194 tracks::DimensionBlueprints(tracks::kProcessDimensionBlueprint, 195 tracks::kNameFromTraceDimensionBlueprint), 196 tracks::FnNameBlueprint([](uint32_t, base::StringView name) { 197 return base::StackString<1024>("%.*s", int(name.size()), name.data()); 198 })); 199 200 inline constexpr auto kOomScoreAdjBlueprint = tracks::CounterBlueprint( 201 "oom_score_adj", 202 tracks::UnknownUnitBlueprint(), 203 tracks::DimensionBlueprints(tracks::kProcessDimensionBlueprint), 204 tracks::StaticNameBlueprint("oom_score_adj")); 205 206 inline constexpr auto kOomScoreAdjThreadFallbackBlueprint = 207 tracks::CounterBlueprint( 208 "oom_score_adj_thread_fallback", 209 tracks::UnknownUnitBlueprint(), 210 tracks::DimensionBlueprints(tracks::kThreadDimensionBlueprint), 211 tracks::StaticNameBlueprint("oom_score_adj")); 212 213 inline constexpr auto kMmEventFnNameBlueprint = tracks::FnNameBlueprint( 214 [](uint32_t, base::StringView type, base::StringView metric) { 215 return base::StackString<1024>("mem.mm.%.*s.%.*s", int(type.size()), 216 type.data(), int(metric.size()), 217 metric.data()); 218 }); 219 220 inline constexpr auto kMmEventBlueprint = tracks::CounterBlueprint( 221 "mm_event", 222 tracks::UnknownUnitBlueprint(), 223 tracks::DimensionBlueprints( 224 tracks::kProcessDimensionBlueprint, 225 tracks::StringDimensionBlueprint("mm_event_type"), 226 tracks::StringDimensionBlueprint("mm_event_metric")), 227 kMmEventFnNameBlueprint); 228 229 inline constexpr auto kMmEventThreadFallbackBlueprint = 230 tracks::CounterBlueprint( 231 "mm_event_thread_fallback", 232 tracks::UnknownUnitBlueprint(), 233 tracks::DimensionBlueprints( 234 tracks::kThreadDimensionBlueprint, 235 tracks::StringDimensionBlueprint("mm_event_type"), 236 tracks::StringDimensionBlueprint("mm_event_metric")), 237 kMmEventFnNameBlueprint); 238 239 inline constexpr auto kPerfCounterBlueprint = tracks::CounterBlueprint( 240 "perf_counter", 241 tracks::UnknownUnitBlueprint(), 242 tracks::DimensionBlueprints( 243 tracks::kCpuDimensionBlueprint, 244 tracks::UintDimensionBlueprint("perf_session_id"), 245 tracks::kNameFromTraceDimensionBlueprint), 246 tracks::DynamicNameBlueprint()); 247 248 inline constexpr auto kGlobalGpuMemoryBlueprint = 249 tracks::CounterBlueprint("gpu_memory", 250 tracks::kBytesUnitBlueprint, 251 tracks::DimensionBlueprints(), 252 tracks::StaticNameBlueprint("GPU Memory")); 253 254 inline constexpr auto kProcessGpuMemoryBlueprint = tracks::CounterBlueprint( 255 "process_gpu_memory", 256 tracks::kBytesUnitBlueprint, 257 tracks::DimensionBlueprints(tracks::kProcessDimensionBlueprint), 258 tracks::StaticNameBlueprint("GPU Memory")); 259 260 inline constexpr auto kProcessMemoryBlueprint = tracks::CounterBlueprint( 261 "process_memory", 262 tracks::UnknownUnitBlueprint(), 263 tracks::DimensionBlueprints( 264 tracks::kProcessDimensionBlueprint, 265 tracks::StringDimensionBlueprint("process_memory_key")), 266 tracks::FnNameBlueprint([](uint32_t, base::StringView key) { 267 return base::StackString<1024>("mem.%.*s", int(key.size()), key.data()); 268 })); 269 270 inline constexpr auto kProcessMemoryThreadFallbackBlueprint = 271 tracks::CounterBlueprint( 272 "process_memory_thread_fallback", 273 tracks::UnknownUnitBlueprint(), 274 tracks::DimensionBlueprints( 275 tracks::kThreadDimensionBlueprint, 276 tracks::StringDimensionBlueprint("process_memory_key")), 277 tracks::FnNameBlueprint([](uint32_t, base::StringView key) { 278 return base::StackString<1024>("mem.%.*s", int(key.size()), 279 key.data()); 280 })); 281 282 static constexpr auto kJsonCounterBlueprint = tracks::CounterBlueprint( 283 "json_counter", 284 tracks::UnknownUnitBlueprint(), 285 tracks::DimensionBlueprints(tracks::kProcessDimensionBlueprint, 286 tracks::kNameFromTraceDimensionBlueprint), 287 tracks::DynamicNameBlueprint()); 288 289 inline constexpr auto kJsonCounterThreadFallbackBlueprint = 290 tracks::CounterBlueprint( 291 "json_counter_thread_fallback", 292 tracks::UnknownUnitBlueprint(), 293 tracks::DimensionBlueprints(tracks::kThreadDimensionBlueprint, 294 tracks::kNameFromTraceDimensionBlueprint), 295 tracks::DynamicNameBlueprint()); 296 297 inline constexpr auto kGpuCounterBlueprint = tracks::CounterBlueprint( 298 "gpu_counter", 299 tracks::DynamicUnitBlueprint(), 300 tracks::DimensionBlueprints(tracks::kGpuDimensionBlueprint, 301 tracks::kNameFromTraceDimensionBlueprint), 302 tracks::DynamicNameBlueprint()); 303 304 // End counter blueprints. 305 306 } // namespace perfetto::trace_processor::tracks 307 308 #endif // SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_TRACKS_COMMON_H_ 309