1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker *
4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker *
8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker *
10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker */
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker #include "statsd.h"
18*795d594fSAndroid Build Coastguard Worker
19*795d594fSAndroid Build Coastguard Worker #include "arch/instruction_set.h"
20*795d594fSAndroid Build Coastguard Worker #include "base/compiler_filter.h"
21*795d594fSAndroid Build Coastguard Worker #include "base/metrics/metrics.h"
22*795d594fSAndroid Build Coastguard Worker #include "gc/collector/mark_compact.h"
23*795d594fSAndroid Build Coastguard Worker #include "gc/heap.h"
24*795d594fSAndroid Build Coastguard Worker #include "gc/space/image_space.h"
25*795d594fSAndroid Build Coastguard Worker #include "runtime.h"
26*795d594fSAndroid Build Coastguard Worker #include "statslog_art.h"
27*795d594fSAndroid Build Coastguard Worker
28*795d594fSAndroid Build Coastguard Worker #pragma clang diagnostic push
29*795d594fSAndroid Build Coastguard Worker #pragma clang diagnostic error "-Wconversion"
30*795d594fSAndroid Build Coastguard Worker
31*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
32*795d594fSAndroid Build Coastguard Worker namespace metrics {
33*795d594fSAndroid Build Coastguard Worker
34*795d594fSAndroid Build Coastguard Worker namespace {
35*795d594fSAndroid Build Coastguard Worker
36*795d594fSAndroid Build Coastguard Worker // EncodeDatumId returns a std::optional that provides a enum value from atoms.proto if the datum is
37*795d594fSAndroid Build Coastguard Worker // one that we support logging to statsd. The list of datums that ART collects is a superset of what
38*795d594fSAndroid Build Coastguard Worker // we report to statsd. Therefore, we only have mappings for the DatumIds that statsd recognizes.
39*795d594fSAndroid Build Coastguard Worker // Also it must be noted that histograms are not handled yet by statsd yet.
40*795d594fSAndroid Build Coastguard Worker //
41*795d594fSAndroid Build Coastguard Worker // Other code can use whether the result of this function has a value to decide whether to report
42*795d594fSAndroid Build Coastguard Worker // the atom to statsd.
43*795d594fSAndroid Build Coastguard Worker //
44*795d594fSAndroid Build Coastguard Worker // To report additional measurements to statsd, first add an entry in atoms.proto and then add an
45*795d594fSAndroid Build Coastguard Worker // entry to this function as well.
EncodeDatumId(DatumId datum_id)46*795d594fSAndroid Build Coastguard Worker constexpr std::optional<int32_t> EncodeDatumId(DatumId datum_id) {
47*795d594fSAndroid Build Coastguard Worker switch (datum_id) {
48*795d594fSAndroid Build Coastguard Worker case DatumId::kClassVerificationTotalTime:
49*795d594fSAndroid Build Coastguard Worker return std::make_optional(
50*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_CLASS_VERIFICATION_TIME_COUNTER_MICROS);
51*795d594fSAndroid Build Coastguard Worker case DatumId::kClassVerificationTotalTimeDelta:
52*795d594fSAndroid Build Coastguard Worker return std::make_optional(
53*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_CLASS_VERIFICATION_TIME_MICROS);
54*795d594fSAndroid Build Coastguard Worker case DatumId::kJitMethodCompileTotalTime:
55*795d594fSAndroid Build Coastguard Worker return std::make_optional(
56*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_JIT_METHOD_COMPILE_TIME_MICROS);
57*795d594fSAndroid Build Coastguard Worker case DatumId::kJitMethodCompileTotalTimeDelta:
58*795d594fSAndroid Build Coastguard Worker return std::make_optional(
59*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_JIT_METHOD_COMPILE_TIME_MICROS);
60*795d594fSAndroid Build Coastguard Worker case DatumId::kClassLoadingTotalTime:
61*795d594fSAndroid Build Coastguard Worker return std::make_optional(
62*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_CLASS_LOADING_TIME_COUNTER_MICROS);
63*795d594fSAndroid Build Coastguard Worker case DatumId::kClassLoadingTotalTimeDelta:
64*795d594fSAndroid Build Coastguard Worker return std::make_optional(
65*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_CLASS_LOADING_TIME_MICROS);
66*795d594fSAndroid Build Coastguard Worker case DatumId::kClassVerificationCount:
67*795d594fSAndroid Build Coastguard Worker return std::make_optional(
68*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_CLASS_VERIFICATION_COUNT);
69*795d594fSAndroid Build Coastguard Worker case DatumId::kClassVerificationCountDelta:
70*795d594fSAndroid Build Coastguard Worker return std::make_optional(
71*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_CLASS_VERIFICATION_COUNT);
72*795d594fSAndroid Build Coastguard Worker case DatumId::kWorldStopTimeDuringGCAvg:
73*795d594fSAndroid Build Coastguard Worker return std::make_optional(
74*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_WORLD_STOP_TIME_AVG_MICROS);
75*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcCount:
76*795d594fSAndroid Build Coastguard Worker return std::make_optional(
77*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_YOUNG_GENERATION_COLLECTION_COUNT);
78*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcCountDelta:
79*795d594fSAndroid Build Coastguard Worker return std::make_optional(
80*795d594fSAndroid Build Coastguard Worker statsd::
81*795d594fSAndroid Build Coastguard Worker ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_YOUNG_GENERATION_COLLECTION_COUNT);
82*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcCount:
83*795d594fSAndroid Build Coastguard Worker return std::make_optional(
84*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_FULL_HEAP_COLLECTION_COUNT);
85*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcCountDelta:
86*795d594fSAndroid Build Coastguard Worker return std::make_optional(
87*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_FULL_HEAP_COLLECTION_COUNT);
88*795d594fSAndroid Build Coastguard Worker case DatumId::kTotalBytesAllocated:
89*795d594fSAndroid Build Coastguard Worker return std::make_optional(
90*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_TOTAL_BYTES_ALLOCATED);
91*795d594fSAndroid Build Coastguard Worker case DatumId::kTotalBytesAllocatedDelta:
92*795d594fSAndroid Build Coastguard Worker return std::make_optional(
93*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_TOTAL_BYTES_ALLOCATED);
94*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcCollectionTime:
95*795d594fSAndroid Build Coastguard Worker return std::make_optional(
96*795d594fSAndroid Build Coastguard Worker statsd::
97*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__KIND__ART_DATUM_GC_YOUNG_GENERATION_COLLECTION_TIME_HISTO_MILLIS);
98*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcCollectionTime:
99*795d594fSAndroid Build Coastguard Worker return std::make_optional(
100*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_FULL_HEAP_COLLECTION_TIME_HISTO_MILLIS);
101*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcThroughput:
102*795d594fSAndroid Build Coastguard Worker return std::make_optional(
103*795d594fSAndroid Build Coastguard Worker statsd::
104*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__KIND__ART_DATUM_GC_YOUNG_GENERATION_COLLECTION_THROUGHPUT_HISTO_MB_PER_SEC);
105*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcThroughput:
106*795d594fSAndroid Build Coastguard Worker return std::make_optional(
107*795d594fSAndroid Build Coastguard Worker statsd::
108*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__KIND__ART_DATUM_GC_FULL_HEAP_COLLECTION_THROUGHPUT_HISTO_MB_PER_SEC);
109*795d594fSAndroid Build Coastguard Worker case DatumId::kJitMethodCompileCount:
110*795d594fSAndroid Build Coastguard Worker return std::make_optional(
111*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_JIT_METHOD_COMPILE_COUNT);
112*795d594fSAndroid Build Coastguard Worker case DatumId::kJitMethodCompileCountDelta:
113*795d594fSAndroid Build Coastguard Worker return std::make_optional(
114*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_JIT_METHOD_COMPILE_COUNT);
115*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcTracingThroughput:
116*795d594fSAndroid Build Coastguard Worker return std::make_optional(
117*795d594fSAndroid Build Coastguard Worker statsd::
118*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__KIND__ART_DATUM_GC_YOUNG_GENERATION_TRACING_THROUGHPUT_HISTO_MB_PER_SEC);
119*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcTracingThroughput:
120*795d594fSAndroid Build Coastguard Worker return std::make_optional(
121*795d594fSAndroid Build Coastguard Worker statsd::
122*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__KIND__ART_DATUM_GC_FULL_HEAP_TRACING_THROUGHPUT_HISTO_MB_PER_SEC);
123*795d594fSAndroid Build Coastguard Worker case DatumId::kTotalGcCollectionTime:
124*795d594fSAndroid Build Coastguard Worker return std::make_optional(
125*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_TOTAL_COLLECTION_TIME_MS);
126*795d594fSAndroid Build Coastguard Worker case DatumId::kTotalGcCollectionTimeDelta:
127*795d594fSAndroid Build Coastguard Worker return std::make_optional(
128*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_TOTAL_COLLECTION_TIME_MS);
129*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcThroughputAvg:
130*795d594fSAndroid Build Coastguard Worker return std::make_optional(
131*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_YOUNG_GENERATION_COLLECTION_THROUGHPUT_AVG_MB_PER_SEC);
132*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcThroughputAvg:
133*795d594fSAndroid Build Coastguard Worker return std::make_optional(
134*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_FULL_HEAP_COLLECTION_THROUGHPUT_AVG_MB_PER_SEC);
135*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcTracingThroughputAvg:
136*795d594fSAndroid Build Coastguard Worker return std::make_optional(
137*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_YOUNG_GENERATION_TRACING_THROUGHPUT_AVG_MB_PER_SEC);
138*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcTracingThroughputAvg:
139*795d594fSAndroid Build Coastguard Worker return std::make_optional(
140*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_FULL_HEAP_TRACING_THROUGHPUT_AVG_MB_PER_SEC);
141*795d594fSAndroid Build Coastguard Worker case DatumId::kGcWorldStopTime:
142*795d594fSAndroid Build Coastguard Worker return std::make_optional(
143*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_WORLD_STOP_TIME_US);
144*795d594fSAndroid Build Coastguard Worker case DatumId::kGcWorldStopTimeDelta:
145*795d594fSAndroid Build Coastguard Worker return std::make_optional(
146*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_WORLD_STOP_TIME_US);
147*795d594fSAndroid Build Coastguard Worker case DatumId::kGcWorldStopCount:
148*795d594fSAndroid Build Coastguard Worker return std::make_optional(
149*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_WORLD_STOP_COUNT);
150*795d594fSAndroid Build Coastguard Worker case DatumId::kGcWorldStopCountDelta:
151*795d594fSAndroid Build Coastguard Worker return std::make_optional(
152*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_WORLD_STOP_COUNT);
153*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcScannedBytes:
154*795d594fSAndroid Build Coastguard Worker return std::make_optional(
155*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_YOUNG_GENERATION_COLLECTION_SCANNED_BYTES);
156*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcScannedBytesDelta:
157*795d594fSAndroid Build Coastguard Worker return std::make_optional(
158*795d594fSAndroid Build Coastguard Worker statsd::
159*795d594fSAndroid Build Coastguard Worker ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_YOUNG_GENERATION_COLLECTION_SCANNED_BYTES);
160*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcFreedBytes:
161*795d594fSAndroid Build Coastguard Worker return std::make_optional(
162*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_YOUNG_GENERATION_COLLECTION_FREED_BYTES);
163*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcFreedBytesDelta:
164*795d594fSAndroid Build Coastguard Worker return std::make_optional(
165*795d594fSAndroid Build Coastguard Worker statsd::
166*795d594fSAndroid Build Coastguard Worker ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_YOUNG_GENERATION_COLLECTION_FREED_BYTES);
167*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcDuration:
168*795d594fSAndroid Build Coastguard Worker return std::make_optional(
169*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_YOUNG_GENERATION_COLLECTION_DURATION_MS);
170*795d594fSAndroid Build Coastguard Worker case DatumId::kYoungGcDurationDelta:
171*795d594fSAndroid Build Coastguard Worker return std::make_optional(
172*795d594fSAndroid Build Coastguard Worker statsd::
173*795d594fSAndroid Build Coastguard Worker ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_YOUNG_GENERATION_COLLECTION_DURATION_MS);
174*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcScannedBytes:
175*795d594fSAndroid Build Coastguard Worker return std::make_optional(
176*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_FULL_HEAP_COLLECTION_SCANNED_BYTES);
177*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcScannedBytesDelta:
178*795d594fSAndroid Build Coastguard Worker return std::make_optional(
179*795d594fSAndroid Build Coastguard Worker statsd::
180*795d594fSAndroid Build Coastguard Worker ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_FULL_HEAP_COLLECTION_SCANNED_BYTES);
181*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcFreedBytes:
182*795d594fSAndroid Build Coastguard Worker return std::make_optional(
183*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_FULL_HEAP_COLLECTION_FREED_BYTES);
184*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcFreedBytesDelta:
185*795d594fSAndroid Build Coastguard Worker return std::make_optional(
186*795d594fSAndroid Build Coastguard Worker statsd::
187*795d594fSAndroid Build Coastguard Worker ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_FULL_HEAP_COLLECTION_FREED_BYTES);
188*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcDuration:
189*795d594fSAndroid Build Coastguard Worker return std::make_optional(
190*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_REPORTED__KIND__ART_DATUM_GC_FULL_HEAP_COLLECTION_DURATION_MS);
191*795d594fSAndroid Build Coastguard Worker case DatumId::kFullGcDurationDelta:
192*795d594fSAndroid Build Coastguard Worker return std::make_optional(
193*795d594fSAndroid Build Coastguard Worker statsd::
194*795d594fSAndroid Build Coastguard Worker ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_GC_FULL_HEAP_COLLECTION_DURATION_MS);
195*795d594fSAndroid Build Coastguard Worker case DatumId::kTimeElapsedDelta:
196*795d594fSAndroid Build Coastguard Worker return std::make_optional(
197*795d594fSAndroid Build Coastguard Worker statsd::ART_DATUM_DELTA_REPORTED__KIND__ART_DATUM_DELTA_TIME_ELAPSED_MS);
198*795d594fSAndroid Build Coastguard Worker }
199*795d594fSAndroid Build Coastguard Worker }
200*795d594fSAndroid Build Coastguard Worker
EncodeCompileFilter(CompilerFilterReporting filter)201*795d594fSAndroid Build Coastguard Worker constexpr int32_t EncodeCompileFilter(CompilerFilterReporting filter) {
202*795d594fSAndroid Build Coastguard Worker switch (filter) {
203*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kAssumeVerified:
204*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_ASSUMED_VERIFIED;
205*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kExtract:
206*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_EXTRACT;
207*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kVerify:
208*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_VERIFY;
209*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kSpaceProfile:
210*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_SPACE_PROFILE;
211*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kSpace:
212*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_SPACE;
213*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kSpeedProfile:
214*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_SPEED_PROFILE;
215*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kSpeed:
216*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_SPEED;
217*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kEverythingProfile:
218*795d594fSAndroid Build Coastguard Worker return statsd::
219*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_EVERYTHING_PROFILE;
220*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kEverything:
221*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_EVERYTHING;
222*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kError:
223*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_ERROR;
224*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kUnknown:
225*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_UNKNOWN;
226*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kRunFromApk:
227*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_FAKE_RUN_FROM_APK;
228*795d594fSAndroid Build Coastguard Worker case CompilerFilterReporting::kRunFromApkFallback:
229*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILE_FILTER__ART_COMPILATION_FILTER_FAKE_RUN_FROM_APK_FALLBACK;
230*795d594fSAndroid Build Coastguard Worker }
231*795d594fSAndroid Build Coastguard Worker }
232*795d594fSAndroid Build Coastguard Worker
EncodeCompilationReason(CompilationReason reason)233*795d594fSAndroid Build Coastguard Worker constexpr int32_t EncodeCompilationReason(CompilationReason reason) {
234*795d594fSAndroid Build Coastguard Worker switch (reason) {
235*795d594fSAndroid Build Coastguard Worker case CompilationReason::kUnknown:
236*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_UNKNOWN;
237*795d594fSAndroid Build Coastguard Worker case CompilationReason::kABOTA:
238*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_AB_OTA;
239*795d594fSAndroid Build Coastguard Worker case CompilationReason::kBgDexopt:
240*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_BG_DEXOPT;
241*795d594fSAndroid Build Coastguard Worker case CompilationReason::kError:
242*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_ERROR;
243*795d594fSAndroid Build Coastguard Worker case CompilationReason::kFirstBoot:
244*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_FIRST_BOOT;
245*795d594fSAndroid Build Coastguard Worker case CompilationReason::kInactive:
246*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INACTIVE;
247*795d594fSAndroid Build Coastguard Worker case CompilationReason::kInstall:
248*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL;
249*795d594fSAndroid Build Coastguard Worker case CompilationReason::kInstallWithDexMetadata:
250*795d594fSAndroid Build Coastguard Worker return statsd::
251*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_WITH_DEX_METADATA;
252*795d594fSAndroid Build Coastguard Worker case CompilationReason::kShared:
253*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_SHARED;
254*795d594fSAndroid Build Coastguard Worker case CompilationReason::kPostBoot:
255*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_POST_BOOT;
256*795d594fSAndroid Build Coastguard Worker case CompilationReason::kInstallBulk:
257*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_BULK;
258*795d594fSAndroid Build Coastguard Worker case CompilationReason::kInstallBulkSecondary:
259*795d594fSAndroid Build Coastguard Worker return statsd::
260*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_BULK_SECONDARY;
261*795d594fSAndroid Build Coastguard Worker case CompilationReason::kInstallBulkDowngraded:
262*795d594fSAndroid Build Coastguard Worker return statsd::
263*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_BULK_DOWNGRADED;
264*795d594fSAndroid Build Coastguard Worker case CompilationReason::kInstallBulkSecondaryDowngraded:
265*795d594fSAndroid Build Coastguard Worker return statsd::
266*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_BULK_SECONDARY_DOWNGRADED;
267*795d594fSAndroid Build Coastguard Worker case CompilationReason::kBootAfterOTA:
268*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_BOOT_AFTER_OTA;
269*795d594fSAndroid Build Coastguard Worker case CompilationReason::kInstallFast:
270*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_INSTALL_FAST;
271*795d594fSAndroid Build Coastguard Worker case CompilationReason::kPrebuilt:
272*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_PREBUILT;
273*795d594fSAndroid Build Coastguard Worker case CompilationReason::kCmdLine:
274*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_CMDLINE;
275*795d594fSAndroid Build Coastguard Worker case CompilationReason::kVdex:
276*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_VDEX;
277*795d594fSAndroid Build Coastguard Worker case CompilationReason::kBootAfterMainlineUpdate:
278*795d594fSAndroid Build Coastguard Worker return statsd::
279*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__COMPILATION_REASON__ART_COMPILATION_REASON_BOOT_AFTER_MAINLINE_UPDATE;
280*795d594fSAndroid Build Coastguard Worker }
281*795d594fSAndroid Build Coastguard Worker }
282*795d594fSAndroid Build Coastguard Worker
EncodeInstructionSet(InstructionSet isa)283*795d594fSAndroid Build Coastguard Worker constexpr int32_t EncodeInstructionSet(InstructionSet isa) {
284*795d594fSAndroid Build Coastguard Worker switch (isa) {
285*795d594fSAndroid Build Coastguard Worker case InstructionSet::kArm:
286*795d594fSAndroid Build Coastguard Worker // Fall-through.
287*795d594fSAndroid Build Coastguard Worker case InstructionSet::kThumb2:
288*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__ISA__ART_ISA_ARM;
289*795d594fSAndroid Build Coastguard Worker case InstructionSet::kArm64:
290*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__ISA__ART_ISA_ARM64;
291*795d594fSAndroid Build Coastguard Worker case InstructionSet::kRiscv64:
292*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__ISA__ART_ISA_RISCV64;
293*795d594fSAndroid Build Coastguard Worker case InstructionSet::kX86:
294*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__ISA__ART_ISA_X86;
295*795d594fSAndroid Build Coastguard Worker case InstructionSet::kX86_64:
296*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__ISA__ART_ISA_X86_64;
297*795d594fSAndroid Build Coastguard Worker case InstructionSet::kNone:
298*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__ISA__ART_ISA_UNKNOWN;
299*795d594fSAndroid Build Coastguard Worker }
300*795d594fSAndroid Build Coastguard Worker }
301*795d594fSAndroid Build Coastguard Worker
EncodeGcCollectorType(gc::CollectorType collector_type)302*795d594fSAndroid Build Coastguard Worker constexpr int32_t EncodeGcCollectorType(gc::CollectorType collector_type) {
303*795d594fSAndroid Build Coastguard Worker switch (collector_type) {
304*795d594fSAndroid Build Coastguard Worker case gc::CollectorType::kCollectorTypeMS:
305*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__GC__ART_GC_COLLECTOR_TYPE_MARK_SWEEP;
306*795d594fSAndroid Build Coastguard Worker case gc::CollectorType::kCollectorTypeCMS:
307*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__GC__ART_GC_COLLECTOR_TYPE_CONCURRENT_MARK_SWEEP;
308*795d594fSAndroid Build Coastguard Worker case gc::CollectorType::kCollectorTypeCMC:
309*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__GC__ART_GC_COLLECTOR_TYPE_CONCURRENT_MARK_COMPACT;
310*795d594fSAndroid Build Coastguard Worker case gc::CollectorType::kCollectorTypeCMCBackground:
311*795d594fSAndroid Build Coastguard Worker return statsd::
312*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__GC__ART_GC_COLLECTOR_TYPE_CONCURRENT_MARK_COMPACT_BACKGROUND;
313*795d594fSAndroid Build Coastguard Worker case gc::CollectorType::kCollectorTypeSS:
314*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__GC__ART_GC_COLLECTOR_TYPE_SEMI_SPACE;
315*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeCC:
316*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__GC__ART_GC_COLLECTOR_TYPE_CONCURRENT_COPYING;
317*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeCCBackground:
318*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__GC__ART_GC_COLLECTOR_TYPE_CONCURRENT_COPYING_BACKGROUND;
319*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeNone:
320*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeInstrumentation:
321*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeAddRemoveAppImageSpace:
322*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeDebugger:
323*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeHomogeneousSpaceCompact:
324*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeClassLinker:
325*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeJitCodeCache:
326*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeHprof:
327*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeAddRemoveSystemWeakHolder:
328*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeGetObjectsAllocated:
329*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeCriticalSection:
330*795d594fSAndroid Build Coastguard Worker case gc::kCollectorTypeHeapTrim:
331*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__GC__ART_GC_COLLECTOR_TYPE_UNKNOWN;
332*795d594fSAndroid Build Coastguard Worker }
333*795d594fSAndroid Build Coastguard Worker }
334*795d594fSAndroid Build Coastguard Worker
EncodeUffdMinorFaultSupport()335*795d594fSAndroid Build Coastguard Worker int32_t EncodeUffdMinorFaultSupport() {
336*795d594fSAndroid Build Coastguard Worker auto [uffd_supported, minor_fault_supported] = gc::collector::MarkCompact::GetUffdAndMinorFault();
337*795d594fSAndroid Build Coastguard Worker
338*795d594fSAndroid Build Coastguard Worker if (uffd_supported) {
339*795d594fSAndroid Build Coastguard Worker if (minor_fault_supported) {
340*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__UFFD_SUPPORT__ART_UFFD_SUPPORT_MINOR_FAULT_MODE_SUPPORTED;
341*795d594fSAndroid Build Coastguard Worker } else {
342*795d594fSAndroid Build Coastguard Worker return statsd::
343*795d594fSAndroid Build Coastguard Worker ART_DATUM_REPORTED__UFFD_SUPPORT__ART_UFFD_SUPPORT_MINOR_FAULT_MODE_NOT_SUPPORTED;
344*795d594fSAndroid Build Coastguard Worker }
345*795d594fSAndroid Build Coastguard Worker } else {
346*795d594fSAndroid Build Coastguard Worker return statsd::ART_DATUM_REPORTED__UFFD_SUPPORT__ART_UFFD_SUPPORT_UFFD_NOT_SUPPORTED;
347*795d594fSAndroid Build Coastguard Worker }
348*795d594fSAndroid Build Coastguard Worker }
349*795d594fSAndroid Build Coastguard Worker
350*795d594fSAndroid Build Coastguard Worker class StatsdBackend : public MetricsBackend {
351*795d594fSAndroid Build Coastguard Worker public:
BeginOrUpdateSession(const SessionData & session_data)352*795d594fSAndroid Build Coastguard Worker void BeginOrUpdateSession(const SessionData& session_data) override {
353*795d594fSAndroid Build Coastguard Worker session_data_ = session_data;
354*795d594fSAndroid Build Coastguard Worker }
355*795d594fSAndroid Build Coastguard Worker
356*795d594fSAndroid Build Coastguard Worker protected:
BeginReport(uint64_t timestamp_since_start_ms)357*795d594fSAndroid Build Coastguard Worker void BeginReport(uint64_t timestamp_since_start_ms) override {
358*795d594fSAndroid Build Coastguard Worker current_timestamp_ = static_cast<int64_t>(timestamp_since_start_ms);
359*795d594fSAndroid Build Coastguard Worker }
360*795d594fSAndroid Build Coastguard Worker
ReportCounter(DatumId counter_type,uint64_t value)361*795d594fSAndroid Build Coastguard Worker void ReportCounter(DatumId counter_type, uint64_t value) override {
362*795d594fSAndroid Build Coastguard Worker std::optional<int32_t> datum_id = EncodeDatumId(counter_type);
363*795d594fSAndroid Build Coastguard Worker if (!datum_id.has_value()) {
364*795d594fSAndroid Build Coastguard Worker return;
365*795d594fSAndroid Build Coastguard Worker }
366*795d594fSAndroid Build Coastguard Worker
367*795d594fSAndroid Build Coastguard Worker int32_t atom;
368*795d594fSAndroid Build Coastguard Worker switch (counter_type) {
369*795d594fSAndroid Build Coastguard Worker #define EVENT_METRIC_CASE(name, ...) case DatumId::k##name:
370*795d594fSAndroid Build Coastguard Worker ART_EVENT_METRICS(EVENT_METRIC_CASE)
371*795d594fSAndroid Build Coastguard Worker #undef EVENT_METRIC_CASE
372*795d594fSAndroid Build Coastguard Worker atom = statsd::ART_DATUM_REPORTED;
373*795d594fSAndroid Build Coastguard Worker break;
374*795d594fSAndroid Build Coastguard Worker
375*795d594fSAndroid Build Coastguard Worker #define VALUE_METRIC_CASE(name, type, ...) case DatumId::k##name:
376*795d594fSAndroid Build Coastguard Worker ART_VALUE_METRICS(VALUE_METRIC_CASE)
377*795d594fSAndroid Build Coastguard Worker #undef VALUE_METRIC_CASE
378*795d594fSAndroid Build Coastguard Worker atom = statsd::ART_DATUM_DELTA_REPORTED;
379*795d594fSAndroid Build Coastguard Worker break;
380*795d594fSAndroid Build Coastguard Worker }
381*795d594fSAndroid Build Coastguard Worker
382*795d594fSAndroid Build Coastguard Worker statsd::stats_write(
383*795d594fSAndroid Build Coastguard Worker atom,
384*795d594fSAndroid Build Coastguard Worker session_data_.session_id,
385*795d594fSAndroid Build Coastguard Worker session_data_.uid,
386*795d594fSAndroid Build Coastguard Worker EncodeCompileFilter(session_data_.compiler_filter),
387*795d594fSAndroid Build Coastguard Worker EncodeCompilationReason(session_data_.compilation_reason),
388*795d594fSAndroid Build Coastguard Worker current_timestamp_,
389*795d594fSAndroid Build Coastguard Worker 0, // deprecated - was ArtThreadType
390*795d594fSAndroid Build Coastguard Worker datum_id.value(),
391*795d594fSAndroid Build Coastguard Worker static_cast<int64_t>(value),
392*795d594fSAndroid Build Coastguard Worker 0, // deprecated - was ArtDexMetadataType
393*795d594fSAndroid Build Coastguard Worker 0, // deprecated - was ArtApkType
394*795d594fSAndroid Build Coastguard Worker EncodeInstructionSet(kRuntimeISA),
395*795d594fSAndroid Build Coastguard Worker EncodeGcCollectorType(Runtime::Current()->GetHeap()->GetForegroundCollectorType()),
396*795d594fSAndroid Build Coastguard Worker EncodeUffdMinorFaultSupport());
397*795d594fSAndroid Build Coastguard Worker }
398*795d594fSAndroid Build Coastguard Worker
ReportHistogram(DatumId,int64_t,int64_t,const std::vector<uint32_t> &)399*795d594fSAndroid Build Coastguard Worker void ReportHistogram(DatumId /*histogram_type*/,
400*795d594fSAndroid Build Coastguard Worker int64_t /*low_value*/,
401*795d594fSAndroid Build Coastguard Worker int64_t /*high_value*/,
402*795d594fSAndroid Build Coastguard Worker const std::vector<uint32_t>& /*buckets*/) override {
403*795d594fSAndroid Build Coastguard Worker // TODO: implement this once ArtDatumReported in atoms.proto supports histograms.
404*795d594fSAndroid Build Coastguard Worker LOG_STREAM(DEBUG) << "Attempting to write histogram to statsd. This is not supported yet.";
405*795d594fSAndroid Build Coastguard Worker }
406*795d594fSAndroid Build Coastguard Worker
EndReport()407*795d594fSAndroid Build Coastguard Worker void EndReport() override {}
408*795d594fSAndroid Build Coastguard Worker
409*795d594fSAndroid Build Coastguard Worker private:
410*795d594fSAndroid Build Coastguard Worker SessionData session_data_;
411*795d594fSAndroid Build Coastguard Worker // The timestamp provided to the last call to BeginReport
412*795d594fSAndroid Build Coastguard Worker int64_t current_timestamp_;
413*795d594fSAndroid Build Coastguard Worker };
414*795d594fSAndroid Build Coastguard Worker
415*795d594fSAndroid Build Coastguard Worker } // namespace
416*795d594fSAndroid Build Coastguard Worker
CreateStatsdBackend()417*795d594fSAndroid Build Coastguard Worker std::unique_ptr<MetricsBackend> CreateStatsdBackend() { return std::make_unique<StatsdBackend>(); }
418*795d594fSAndroid Build Coastguard Worker
DeviceStatusCallback(int32_t atom_tag,AStatsEventList * data,void * cookie)419*795d594fSAndroid Build Coastguard Worker AStatsManager_PullAtomCallbackReturn DeviceStatusCallback(int32_t atom_tag,
420*795d594fSAndroid Build Coastguard Worker AStatsEventList* data,
421*795d594fSAndroid Build Coastguard Worker [[maybe_unused]] void* cookie) {
422*795d594fSAndroid Build Coastguard Worker if (atom_tag == statsd::ART_DEVICE_STATUS) {
423*795d594fSAndroid Build Coastguard Worker Runtime* runtime = Runtime::Current();
424*795d594fSAndroid Build Coastguard Worker int32_t boot_image_status;
425*795d594fSAndroid Build Coastguard Worker if (runtime->GetHeap()->HasBootImageSpace() && !runtime->HasImageWithProfile()) {
426*795d594fSAndroid Build Coastguard Worker boot_image_status = statsd::ART_DEVICE_DATUM_REPORTED__BOOT_IMAGE_STATUS__STATUS_FULL;
427*795d594fSAndroid Build Coastguard Worker } else if (runtime->GetHeap()->HasBootImageSpace() &&
428*795d594fSAndroid Build Coastguard Worker runtime->GetHeap()->GetBootImageSpaces()[0]->GetProfileFiles().empty()) {
429*795d594fSAndroid Build Coastguard Worker boot_image_status = statsd::ART_DEVICE_DATUM_REPORTED__BOOT_IMAGE_STATUS__STATUS_MINIMAL;
430*795d594fSAndroid Build Coastguard Worker } else {
431*795d594fSAndroid Build Coastguard Worker boot_image_status = statsd::ART_DEVICE_DATUM_REPORTED__BOOT_IMAGE_STATUS__STATUS_NONE;
432*795d594fSAndroid Build Coastguard Worker }
433*795d594fSAndroid Build Coastguard Worker statsd::addAStatsEvent(data, atom_tag, boot_image_status);
434*795d594fSAndroid Build Coastguard Worker return AStatsManager_PULL_SUCCESS;
435*795d594fSAndroid Build Coastguard Worker }
436*795d594fSAndroid Build Coastguard Worker
437*795d594fSAndroid Build Coastguard Worker return AStatsManager_PULL_SKIP;
438*795d594fSAndroid Build Coastguard Worker }
439*795d594fSAndroid Build Coastguard Worker
SetupCallbackForDeviceStatus()440*795d594fSAndroid Build Coastguard Worker void SetupCallbackForDeviceStatus() {
441*795d594fSAndroid Build Coastguard Worker AStatsManager_setPullAtomCallback(
442*795d594fSAndroid Build Coastguard Worker statsd::ART_DEVICE_STATUS, /*metadata=*/nullptr, DeviceStatusCallback, /*cookie=*/nullptr);
443*795d594fSAndroid Build Coastguard Worker }
444*795d594fSAndroid Build Coastguard Worker
ReportDeviceMetrics()445*795d594fSAndroid Build Coastguard Worker void ReportDeviceMetrics() {
446*795d594fSAndroid Build Coastguard Worker Runtime* runtime = Runtime::Current();
447*795d594fSAndroid Build Coastguard Worker int32_t boot_image_status;
448*795d594fSAndroid Build Coastguard Worker if (runtime->GetHeap()->HasBootImageSpace() && !runtime->HasImageWithProfile()) {
449*795d594fSAndroid Build Coastguard Worker boot_image_status = statsd::ART_DEVICE_DATUM_REPORTED__BOOT_IMAGE_STATUS__STATUS_FULL;
450*795d594fSAndroid Build Coastguard Worker } else if (runtime->GetHeap()->HasBootImageSpace() &&
451*795d594fSAndroid Build Coastguard Worker runtime->GetHeap()->GetBootImageSpaces()[0]->GetProfileFiles().empty()) {
452*795d594fSAndroid Build Coastguard Worker boot_image_status = statsd::ART_DEVICE_DATUM_REPORTED__BOOT_IMAGE_STATUS__STATUS_MINIMAL;
453*795d594fSAndroid Build Coastguard Worker } else {
454*795d594fSAndroid Build Coastguard Worker boot_image_status = statsd::ART_DEVICE_DATUM_REPORTED__BOOT_IMAGE_STATUS__STATUS_NONE;
455*795d594fSAndroid Build Coastguard Worker }
456*795d594fSAndroid Build Coastguard Worker statsd::stats_write(statsd::ART_DEVICE_DATUM_REPORTED, boot_image_status);
457*795d594fSAndroid Build Coastguard Worker }
458*795d594fSAndroid Build Coastguard Worker
459*795d594fSAndroid Build Coastguard Worker } // namespace metrics
460*795d594fSAndroid Build Coastguard Worker } // namespace art
461*795d594fSAndroid Build Coastguard Worker
462*795d594fSAndroid Build Coastguard Worker #pragma clang diagnostic pop // -Wconversion
463