1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
|
// Copyright 2018 Google Inc. All Rights Reserved.
//
// 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.
syntax = "proto2";
package soong_build_metrics;
option go_package = "android/soong/ui/metrics/metrics_proto";
message MetricsBase {
// Timestamp generated when the build starts.
optional int64 build_date_timestamp = 1;
// It is usually used to specify the branch name [and release candidate].
optional string build_id = 2;
// The platform version codename, eg. P, Q, REL.
optional string platform_version_codename = 3;
// The target product information, eg. aosp_arm.
optional string target_product = 4;
enum BuildVariant {
USER = 0;
USERDEBUG = 1;
ENG = 2;
}
// The target build variant information, eg. eng.
optional BuildVariant target_build_variant = 5 [default = ENG];
enum Arch {
UNKNOWN = 0;
ARM = 1;
ARM64 = 2;
X86 = 3;
X86_64 = 4;
}
// The target arch information, eg. arm.
optional Arch target_arch = 6 [default = UNKNOWN];
// The target arch variant information, eg. armv7-a-neon.
optional string target_arch_variant = 7;
// The target cpu variant information, eg. generic.
optional string target_cpu_variant = 8;
// The host arch information, eg. x86_64.
optional Arch host_arch = 9 [default = UNKNOWN];
// The host 2nd arch information, eg. x86.
optional Arch host_2nd_arch = 10 [default = UNKNOWN];
// The host os information, eg. linux.
optional string host_os = 11;
// The host os extra information, eg. Linux-4.17.0-3rodete2-amd64-x86_64-Debian-GNU.
optional string host_os_extra = 12;
// The host cross os information, eg. windows.
optional string host_cross_os = 13;
// The host cross arch information, eg. x86.
optional string host_cross_arch = 14;
// The host cross 2nd arch information, eg. x86_64.
optional string host_cross_2nd_arch = 15;
// The directory for generated built artifacts installation, eg. out.
optional string out_dir = 16;
// The metrics for calling various tools (microfactory) before Soong_UI starts.
repeated PerfInfo setup_tools = 17;
// The metrics for calling Kati by multiple times.
repeated PerfInfo kati_runs = 18;
// The metrics for calling Soong.
repeated PerfInfo soong_runs = 19;
// The metrics for calling Ninja.
repeated PerfInfo ninja_runs = 20;
// The metrics for the whole build
optional PerfInfo total = 21;
// Deprecated because instead of embedding in a MetricsBase, we keep
// SoongBuildMetrics in its own file
optional SoongBuildMetrics soong_build_metrics = 22 [deprecated=true];
optional BuildConfig build_config = 23;
// The hostname of the machine.
optional string hostname = 24;
// The system resource information such as total physical memory.
optional SystemResourceInfo system_resource_info = 25;
// The build command that the user entered to the build system.
optional string build_command = 26;
// The metrics for calling Bazel.
repeated PerfInfo bazel_runs = 27;
// The metrics of the experiment config fetcher
optional ExpConfigFetcher exp_config_fetcher = 28;
// Whether the build exited with a panic or non-zero exit code, includes both
// non-zero exits of recorded phases and non-recorded phases of the build.
optional bool non_zero_exit = 29;
// The error message due to a non-zero exit _only_ if it did not occur in a
// recorded phase of the build.
optional string error_message = 30;
// The Git Manifest for the user's branch.
optional string manifest_url = 31;
// The branch on which the build occurred.
// Example: refs/heads/master
optional string branch = 32;
// The metric of critical path in build
optional CriticalPathInfo critical_path_info = 33;
// Environment variables that have changed value since the previous build,
// which were responsible for retriggering build analysis.
// Note that not all changed environment variables result in analysis retriggering.
// If there was no previous build, this list will be empty.
repeated string changed_environment_variable = 34;
}
message BuildConfig {
enum NinjaWeightListSource {
NOT_USED = 0;
NINJA_LOG = 1;
EVENLY_DISTRIBUTED = 2;
EXTERNAL_FILE = 3;
HINT_FROM_SOONG = 4;
}
optional bool use_goma = 1;
optional bool use_rbe = 2;
optional bool force_use_goma = 3;
// Whether the Bazel is acting as the Ninja executor for this build.
optional bool bazel_as_ninja = 4;
// Whether build is occurring in a mixed build mode, where Bazel maintains the
// definition and build of some modules in cooperation with Soong.
optional bool bazel_mixed_build = 5;
// These are the targets soong passes to ninja, these targets include special
// targets such as droid as well as the regular build targets.
repeated string targets = 6;
// Whether the user explicitly disabled bazel mixed builds for this build.
optional bool force_disable_bazel_mixed_build = 7;
// NOT_USED - ninja doesn't use weight list.
// NINJA_LOG - ninja uses weight list based on previous builds by ninja log
// EVENLY_DISTRIBUTED - ninja thinks every task has the same weight.
// EXTERNAL_FILE - ninja uses an external custom weight list
// HINT_FROM_SOONG - ninja uses a prioritized module list from Soong
optional NinjaWeightListSource ninja_weight_list_source = 8 [default = NOT_USED];
}
message SystemResourceInfo {
// The total physical memory in bytes.
optional uint64 total_physical_memory = 1;
// The total of available cores for building
optional int32 available_cpus = 2;
}
message PerfInfo {
// The description for the phase/action/part while the tool running.
optional string description = 1;
// The name for the running phase/action/part.
optional string name = 2;
// The absolute start time.
// The number of nanoseconds elapsed since January 1, 1970 UTC.
optional uint64 start_time = 3;
// The real running time.
// The number of nanoseconds elapsed since start_time.
optional uint64 real_time = 4;
// The number of MB for memory use (deprecated as it is too generic).
optional uint64 memory_use = 5 [deprecated=true];
// The resource information of each executed process.
repeated ProcessResourceInfo processes_resource_info = 6;
// Whether the phase of tool running exited with a panic or non-zero exit
// code.
optional bool non_zero_exit = 7;
// The error message, if any, due to a non-zero exit.
optional string error_message = 8;
}
message PerfCounters {
// The timestamp of these counters in nanoseconds.
optional uint64 time = 1;
// A list of counter names and values.
repeated PerfCounterGroup groups = 2;
}
message PerfCounterGroup {
// The name of this counter group (e.g. "cpu" or "memory")
optional string name = 1;
// The counters in this group
repeated PerfCounter counters = 2;
}
message PerfCounter {
// The name of this counter.
optional string name = 1;
// The value of this counter.
optional int64 value = 2;
}
message ProcessResourceInfo {
// The name of the process for identification.
optional string name = 1;
// The amount of time spent executing in user space in microseconds.
optional uint64 user_time_micros = 2;
// The amount of time spent executing in kernel mode in microseconds.
optional uint64 system_time_micros = 3;
// The maximum resident set size memory used in kilobytes.
optional uint64 max_rss_kb = 4;
// The number of minor page faults serviced without any I/O activity.
optional uint64 minor_page_faults = 5;
// The number of major page faults serviced that required I/O activity.
optional uint64 major_page_faults = 6;
// Total IO input in kilobytes.
optional uint64 io_input_kb= 7;
// Total IO output in kilobytes.
optional uint64 io_output_kb = 8;
// The number of voluntary context switches
optional uint64 voluntary_context_switches = 9;
// The number of involuntary context switches
optional uint64 involuntary_context_switches = 10;
}
message ModuleTypeInfo {
enum BuildSystem {
UNKNOWN = 0;
SOONG = 1;
MAKE = 2;
}
// The build system, e.g. Soong or Make.
optional BuildSystem build_system = 1 [default = UNKNOWN];
// The module type, e.g. java_library, cc_binary, and etc.
optional string module_type = 2;
// The number of logical modules.
optional uint32 num_of_modules = 3;
}
message CriticalUserJourneyMetrics {
// The name of a critical user journey test.
optional string name = 1;
// The metrics produced when running the critical user journey test.
optional MetricsBase metrics = 2;
}
message CriticalUserJourneysMetrics {
// A set of metrics from a run of the critical user journey tests.
repeated CriticalUserJourneyMetrics cujs = 1;
}
message SoongBuildMetrics {
// The number of modules handled by soong_build.
optional uint32 modules = 1;
// The total number of variants handled by soong_build.
optional uint32 variants = 2;
// The total number of allocations in soong_build.
optional uint64 total_alloc_count = 3;
// The total size of allocations in soong_build in bytes.
optional uint64 total_alloc_size = 4;
// The approximate maximum size of the heap in soong_build in bytes.
optional uint64 max_heap_size = 5;
// Runtime metrics for soong_build execution.
repeated PerfInfo events = 6;
// Mixed Builds information
optional MixedBuildsInfo mixed_builds_info = 7;
// Performance during for soong_build execution.
repeated PerfCounters perf_counters = 8;
}
message ExpConfigFetcher {
enum ConfigStatus {
NO_CONFIG = 0;
CONFIG = 1;
ERROR = 2;
MISSING_GCERT = 3;
}
// The result of the call to expconfigfetcher
// NO_CONFIG - Not part of experiment
// CONFIG - Part of experiment, config copied successfully
// ERROR - expconfigfetcher failed
optional ConfigStatus status = 1;
// The output config filename
optional string filename = 2;
// Time, in microseconds, taken by the expconfigfetcher
optional uint64 micros = 3;
}
message MixedBuildsInfo{
// Modules may be listed below as both enabled for Mixed Builds
// and disabled for Mixed Builds. This implies that some variants
// of the module are handled by Bazel in a Mixed Build, and other
// variants of the same module are handled by Soong.
// Modules that are enabled for Mixed Builds.
repeated string mixed_build_enabled_modules = 1;
// Modules that are not currently eligible to be handled
// by Bazel in a Mixed Build.
// Note that not all modules exempt from Bazel handling are
// listed. This list includes only modules which are of a
// Mixed-Build supported module type but are nevertheless not
// handled by Bazel. This may occur due to being present in
// the mixed build denylist, or as part of an unsupported
// mixed build variant type such as Windows.
// Modules that are not enabled for MixedBuilds
repeated string mixed_build_disabled_modules = 2;
}
// CriticalPathInfo contains critical path nodes's information.
// A critical path is a path determining the minimum time needed for the whole build given perfect parallelism.
message CriticalPathInfo {
// Real time which the build system spent in microseconds
optional uint64 elapsed_time_micros = 1;
// The sum of execution time of the longest path from leave to the root in microseconds
optional uint64 critical_path_time_micros = 2;
// Detailed job information in a critical path.
repeated JobInfo critical_path = 4;
// Detailed job information for long running jobs (>30 seconds). These may or may not also be on a critical path.
repeated JobInfo long_running_jobs = 5;
}
message JobInfo {
// Real time which a job spent in microseconds
optional uint64 elapsed_time_micros = 1;
// Description of a job
optional string job_description = 2;
}
|