xref: /aosp_15_r20/external/cronet/components/metrics/stability_metrics_helper.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "components/metrics/stability_metrics_helper.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/containers/contains.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_functions.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_macros.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/strings/strcat.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/system/sys_info.h"
18*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
19*6777b538SAndroid Build Coastguard Worker #include "build/buildflag.h"
20*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_pref_names.h"
21*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_registry_simple.h"
22*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_service.h"
23*6777b538SAndroid Build Coastguard Worker #include "components/variations/hashing.h"
24*6777b538SAndroid Build Coastguard Worker #include "extensions/buildflags/buildflags.h"
25*6777b538SAndroid Build Coastguard Worker #include "third_party/metrics_proto/system_profile.pb.h"
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
28*6777b538SAndroid Build Coastguard Worker #include <windows.h>  // Needed for STATUS_* codes
29*6777b538SAndroid Build Coastguard Worker #endif
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
32*6777b538SAndroid Build Coastguard Worker #include "base/android/application_status_listener.h"
33*6777b538SAndroid Build Coastguard Worker #endif
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker namespace metrics {
36*6777b538SAndroid Build Coastguard Worker namespace {
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID)
39*6777b538SAndroid Build Coastguard Worker // Converts an exit code into something that can be inserted into our
40*6777b538SAndroid Build Coastguard Worker // histograms (which expect non-negative numbers less than MAX_INT).
MapCrashExitCodeForHistogram(int exit_code)41*6777b538SAndroid Build Coastguard Worker int MapCrashExitCodeForHistogram(int exit_code) {
42*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
43*6777b538SAndroid Build Coastguard Worker   // Since |abs(STATUS_GUARD_PAGE_VIOLATION) == MAX_INT| it causes problems in
44*6777b538SAndroid Build Coastguard Worker   // histograms.cc. Solve this by remapping it to a smaller value, which
45*6777b538SAndroid Build Coastguard Worker   // hopefully doesn't conflict with other codes.
46*6777b538SAndroid Build Coastguard Worker   if (static_cast<DWORD>(exit_code) == STATUS_GUARD_PAGE_VIOLATION)
47*6777b538SAndroid Build Coastguard Worker     return 0x1FCF7EC3;  // Randomly picked number.
48*6777b538SAndroid Build Coastguard Worker #endif
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker   return std::abs(exit_code);
51*6777b538SAndroid Build Coastguard Worker }
52*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_ANDROID)
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
HostedContentTypeToString(RendererHostedContentType hosted_content_type)55*6777b538SAndroid Build Coastguard Worker const char* HostedContentTypeToString(
56*6777b538SAndroid Build Coastguard Worker     RendererHostedContentType hosted_content_type) {
57*6777b538SAndroid Build Coastguard Worker   switch (hosted_content_type) {
58*6777b538SAndroid Build Coastguard Worker     case metrics::RendererHostedContentType::kExtension:
59*6777b538SAndroid Build Coastguard Worker       return "Extension";
60*6777b538SAndroid Build Coastguard Worker     case metrics::RendererHostedContentType::kForegroundMainFrame:
61*6777b538SAndroid Build Coastguard Worker       return "ForegroundMainFrame";
62*6777b538SAndroid Build Coastguard Worker     case metrics::RendererHostedContentType::kForegroundSubframe:
63*6777b538SAndroid Build Coastguard Worker       return "ForegroundSubframe";
64*6777b538SAndroid Build Coastguard Worker     case metrics::RendererHostedContentType::kBackgroundFrame:
65*6777b538SAndroid Build Coastguard Worker       return "BackgroundFrame";
66*6777b538SAndroid Build Coastguard Worker     case metrics::RendererHostedContentType::kInactiveFrame:
67*6777b538SAndroid Build Coastguard Worker       return "InactiveFrame";
68*6777b538SAndroid Build Coastguard Worker     case metrics::RendererHostedContentType::kNoFrameOrExtension:
69*6777b538SAndroid Build Coastguard Worker       return "NoFrameOrExtension";
70*6777b538SAndroid Build Coastguard Worker   }
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker 
RecordRendererAbnormalTerminationByHostedContentType(RendererHostedContentType hosted_content_type,base::TerminationStatus status)73*6777b538SAndroid Build Coastguard Worker void RecordRendererAbnormalTerminationByHostedContentType(
74*6777b538SAndroid Build Coastguard Worker     RendererHostedContentType hosted_content_type,
75*6777b538SAndroid Build Coastguard Worker     base::TerminationStatus status) {
76*6777b538SAndroid Build Coastguard Worker   if (status == base::TERMINATION_STATUS_NORMAL_TERMINATION) {
77*6777b538SAndroid Build Coastguard Worker     return;
78*6777b538SAndroid Build Coastguard Worker   }
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker   base::UmaHistogramEnumeration(
81*6777b538SAndroid Build Coastguard Worker       "Stability.RendererAbnormalTermination2.HostedContentType",
82*6777b538SAndroid Build Coastguard Worker       hosted_content_type);
83*6777b538SAndroid Build Coastguard Worker   base::UmaHistogramEnumeration(
84*6777b538SAndroid Build Coastguard Worker       base::StrCat({"Stability.RendererAbnormalTermination2.",
85*6777b538SAndroid Build Coastguard Worker                     HostedContentTypeToString(hosted_content_type)}),
86*6777b538SAndroid Build Coastguard Worker       status, base::TERMINATION_STATUS_MAX_ENUM);
87*6777b538SAndroid Build Coastguard Worker }
88*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker }  // namespace
91*6777b538SAndroid Build Coastguard Worker 
StabilityMetricsHelper(PrefService * local_state)92*6777b538SAndroid Build Coastguard Worker StabilityMetricsHelper::StabilityMetricsHelper(PrefService* local_state)
93*6777b538SAndroid Build Coastguard Worker     : local_state_(local_state) {
94*6777b538SAndroid Build Coastguard Worker   DCHECK(local_state_);
95*6777b538SAndroid Build Coastguard Worker }
96*6777b538SAndroid Build Coastguard Worker 
~StabilityMetricsHelper()97*6777b538SAndroid Build Coastguard Worker StabilityMetricsHelper::~StabilityMetricsHelper() {}
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
ProvideStabilityMetrics(SystemProfileProto * system_profile_proto)100*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::ProvideStabilityMetrics(
101*6777b538SAndroid Build Coastguard Worker     SystemProfileProto* system_profile_proto) {
102*6777b538SAndroid Build Coastguard Worker   SystemProfileProto_Stability* stability_proto =
103*6777b538SAndroid Build Coastguard Worker       system_profile_proto->mutable_stability();
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   int count = local_state_->GetInteger(prefs::kStabilityPageLoadCount);
106*6777b538SAndroid Build Coastguard Worker   if (count) {
107*6777b538SAndroid Build Coastguard Worker     stability_proto->set_page_load_count(count);
108*6777b538SAndroid Build Coastguard Worker     local_state_->SetInteger(prefs::kStabilityPageLoadCount, 0);
109*6777b538SAndroid Build Coastguard Worker   }
110*6777b538SAndroid Build Coastguard Worker   count = local_state_->GetInteger(prefs::kStabilityRendererLaunchCount);
111*6777b538SAndroid Build Coastguard Worker   if (count) {
112*6777b538SAndroid Build Coastguard Worker     stability_proto->set_renderer_launch_count(count);
113*6777b538SAndroid Build Coastguard Worker     local_state_->SetInteger(prefs::kStabilityRendererLaunchCount, 0);
114*6777b538SAndroid Build Coastguard Worker   }
115*6777b538SAndroid Build Coastguard Worker }
116*6777b538SAndroid Build Coastguard Worker 
ClearSavedStabilityMetrics()117*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::ClearSavedStabilityMetrics() {
118*6777b538SAndroid Build Coastguard Worker   local_state_->SetInteger(prefs::kStabilityPageLoadCount, 0);
119*6777b538SAndroid Build Coastguard Worker   local_state_->SetInteger(prefs::kStabilityRendererLaunchCount, 0);
120*6777b538SAndroid Build Coastguard Worker }
121*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID)
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker // static
RegisterPrefs(PrefRegistrySimple * registry)124*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::RegisterPrefs(PrefRegistrySimple* registry) {
125*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
126*6777b538SAndroid Build Coastguard Worker   registry->RegisterIntegerPref(prefs::kStabilityPageLoadCount, 0);
127*6777b538SAndroid Build Coastguard Worker   registry->RegisterIntegerPref(prefs::kStabilityRendererLaunchCount, 0);
128*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID)
129*6777b538SAndroid Build Coastguard Worker }
130*6777b538SAndroid Build Coastguard Worker 
IncreaseRendererCrashCount()131*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::IncreaseRendererCrashCount() {
132*6777b538SAndroid Build Coastguard Worker   RecordStabilityEvent(StabilityEventType::kRendererCrash);
133*6777b538SAndroid Build Coastguard Worker }
134*6777b538SAndroid Build Coastguard Worker 
IncreaseGpuCrashCount()135*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::IncreaseGpuCrashCount() {
136*6777b538SAndroid Build Coastguard Worker   RecordStabilityEvent(StabilityEventType::kGpuCrash);
137*6777b538SAndroid Build Coastguard Worker }
138*6777b538SAndroid Build Coastguard Worker 
BrowserUtilityProcessLaunched(const std::string & metrics_name)139*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::BrowserUtilityProcessLaunched(
140*6777b538SAndroid Build Coastguard Worker     const std::string& metrics_name) {
141*6777b538SAndroid Build Coastguard Worker   uint32_t hash = variations::HashName(metrics_name);
142*6777b538SAndroid Build Coastguard Worker   base::UmaHistogramSparse("ChildProcess.Launched.UtilityProcessHash", hash);
143*6777b538SAndroid Build Coastguard Worker   RecordStabilityEvent(StabilityEventType::kUtilityLaunch);
144*6777b538SAndroid Build Coastguard Worker }
145*6777b538SAndroid Build Coastguard Worker 
BrowserUtilityProcessCrashed(const std::string & metrics_name,int exit_code)146*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::BrowserUtilityProcessCrashed(
147*6777b538SAndroid Build Coastguard Worker     const std::string& metrics_name,
148*6777b538SAndroid Build Coastguard Worker     int exit_code) {
149*6777b538SAndroid Build Coastguard Worker   uint32_t hash = variations::HashName(metrics_name);
150*6777b538SAndroid Build Coastguard Worker   base::UmaHistogramSparse("ChildProcess.Crashed.UtilityProcessHash", hash);
151*6777b538SAndroid Build Coastguard Worker   base::UmaHistogramSparse("ChildProcess.Crashed.UtilityProcessExitCode",
152*6777b538SAndroid Build Coastguard Worker                            exit_code);
153*6777b538SAndroid Build Coastguard Worker   RecordStabilityEvent(StabilityEventType::kUtilityCrash);
154*6777b538SAndroid Build Coastguard Worker }
155*6777b538SAndroid Build Coastguard Worker 
BrowserUtilityProcessLaunchFailed(const std::string & metrics_name,int launch_error_code,DWORD last_error)156*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::BrowserUtilityProcessLaunchFailed(
157*6777b538SAndroid Build Coastguard Worker     const std::string& metrics_name,
158*6777b538SAndroid Build Coastguard Worker     int launch_error_code
159*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
160*6777b538SAndroid Build Coastguard Worker     ,
161*6777b538SAndroid Build Coastguard Worker     DWORD last_error
162*6777b538SAndroid Build Coastguard Worker #endif
163*6777b538SAndroid Build Coastguard Worker ) {
164*6777b538SAndroid Build Coastguard Worker   uint32_t hash = variations::HashName(metrics_name);
165*6777b538SAndroid Build Coastguard Worker   base::UmaHistogramSparse("ChildProcess.LaunchFailed.UtilityProcessHash",
166*6777b538SAndroid Build Coastguard Worker                            hash);
167*6777b538SAndroid Build Coastguard Worker   base::UmaHistogramSparse("ChildProcess.LaunchFailed.UtilityProcessErrorCode",
168*6777b538SAndroid Build Coastguard Worker                            launch_error_code);
169*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
170*6777b538SAndroid Build Coastguard Worker   base::UmaHistogramSparse("ChildProcess.LaunchFailed.WinLastError",
171*6777b538SAndroid Build Coastguard Worker                            last_error);
172*6777b538SAndroid Build Coastguard Worker #endif
173*6777b538SAndroid Build Coastguard Worker   // TODO(wfh): Decide if this utility process launch failure should also
174*6777b538SAndroid Build Coastguard Worker   // trigger a Stability Event.
175*6777b538SAndroid Build Coastguard Worker }
176*6777b538SAndroid Build Coastguard Worker 
LogLoadStarted()177*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::LogLoadStarted() {
178*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
179*6777b538SAndroid Build Coastguard Worker   IncrementPrefValue(prefs::kStabilityPageLoadCount);
180*6777b538SAndroid Build Coastguard Worker #endif
181*6777b538SAndroid Build Coastguard Worker   RecordStabilityEvent(StabilityEventType::kPageLoad);
182*6777b538SAndroid Build Coastguard Worker }
183*6777b538SAndroid Build Coastguard Worker 
184*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS)
LogRendererCrash()185*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::LogRendererCrash() {
186*6777b538SAndroid Build Coastguard Worker   // The actual exit code isn't provided on iOS; use a dummy value.
187*6777b538SAndroid Build Coastguard Worker   constexpr int kDummyExitCode = 105;
188*6777b538SAndroid Build Coastguard Worker   LogRendererCrashImpl(CoarseRendererType::kRenderer, kDummyExitCode);
189*6777b538SAndroid Build Coastguard Worker }
190*6777b538SAndroid Build Coastguard Worker #elif !BUILDFLAG(IS_ANDROID)
LogRendererCrash(RendererHostedContentType hosted_content_type,base::TerminationStatus status,int exit_code)191*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::LogRendererCrash(
192*6777b538SAndroid Build Coastguard Worker     RendererHostedContentType hosted_content_type,
193*6777b538SAndroid Build Coastguard Worker     base::TerminationStatus status,
194*6777b538SAndroid Build Coastguard Worker     int exit_code) {
195*6777b538SAndroid Build Coastguard Worker   RecordRendererAbnormalTerminationByHostedContentType(hosted_content_type,
196*6777b538SAndroid Build Coastguard Worker                                                        status);
197*6777b538SAndroid Build Coastguard Worker 
198*6777b538SAndroid Build Coastguard Worker   CoarseRendererType coarse_renderer_type =
199*6777b538SAndroid Build Coastguard Worker       hosted_content_type == RendererHostedContentType::kExtension
200*6777b538SAndroid Build Coastguard Worker           ? CoarseRendererType::kExtension
201*6777b538SAndroid Build Coastguard Worker           : CoarseRendererType::kRenderer;
202*6777b538SAndroid Build Coastguard Worker 
203*6777b538SAndroid Build Coastguard Worker   switch (status) {
204*6777b538SAndroid Build Coastguard Worker     case base::TERMINATION_STATUS_NORMAL_TERMINATION:
205*6777b538SAndroid Build Coastguard Worker       break;
206*6777b538SAndroid Build Coastguard Worker     case base::TERMINATION_STATUS_PROCESS_CRASHED:
207*6777b538SAndroid Build Coastguard Worker     case base::TERMINATION_STATUS_ABNORMAL_TERMINATION:
208*6777b538SAndroid Build Coastguard Worker     case base::TERMINATION_STATUS_OOM:
209*6777b538SAndroid Build Coastguard Worker       LogRendererCrashImpl(coarse_renderer_type, exit_code);
210*6777b538SAndroid Build Coastguard Worker       break;
211*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS)
212*6777b538SAndroid Build Coastguard Worker     case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM:
213*6777b538SAndroid Build Coastguard Worker       base::UmaHistogramEnumeration("BrowserRenderProcessHost.ChildKills.OOM",
214*6777b538SAndroid Build Coastguard Worker                                     coarse_renderer_type);
215*6777b538SAndroid Build Coastguard Worker       [[fallthrough]];
216*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_CHROMEOS)
217*6777b538SAndroid Build Coastguard Worker     case base::TERMINATION_STATUS_PROCESS_WAS_KILLED:
218*6777b538SAndroid Build Coastguard Worker       base::UmaHistogramEnumeration("BrowserRenderProcessHost.ChildKills",
219*6777b538SAndroid Build Coastguard Worker                                     coarse_renderer_type);
220*6777b538SAndroid Build Coastguard Worker       break;
221*6777b538SAndroid Build Coastguard Worker     case base::TERMINATION_STATUS_STILL_RUNNING:
222*6777b538SAndroid Build Coastguard Worker       base::UmaHistogramEnumeration(
223*6777b538SAndroid Build Coastguard Worker           "BrowserRenderProcessHost.DisconnectedAlive", coarse_renderer_type);
224*6777b538SAndroid Build Coastguard Worker       break;
225*6777b538SAndroid Build Coastguard Worker     case base::TERMINATION_STATUS_LAUNCH_FAILED:
226*6777b538SAndroid Build Coastguard Worker       // TODO(rkaplow): See if we can remove this histogram as we have
227*6777b538SAndroid Build Coastguard Worker       // Stability.Counts2 which has the same metrics.
228*6777b538SAndroid Build Coastguard Worker       base::UmaHistogramEnumeration(
229*6777b538SAndroid Build Coastguard Worker           "BrowserRenderProcessHost.ChildLaunchFailures", coarse_renderer_type);
230*6777b538SAndroid Build Coastguard Worker       base::UmaHistogramSparse(
231*6777b538SAndroid Build Coastguard Worker           "BrowserRenderProcessHost.ChildLaunchFailureCodes", exit_code);
232*6777b538SAndroid Build Coastguard Worker       RecordStabilityEvent(
233*6777b538SAndroid Build Coastguard Worker           hosted_content_type == RendererHostedContentType::kExtension
234*6777b538SAndroid Build Coastguard Worker               ? StabilityEventType::kExtensionRendererFailedLaunch
235*6777b538SAndroid Build Coastguard Worker               : StabilityEventType::kRendererFailedLaunch);
236*6777b538SAndroid Build Coastguard Worker       break;
237*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
238*6777b538SAndroid Build Coastguard Worker     case base::TERMINATION_STATUS_INTEGRITY_FAILURE:
239*6777b538SAndroid Build Coastguard Worker       base::UmaHistogramEnumeration(
240*6777b538SAndroid Build Coastguard Worker           "BrowserRenderProcessHost.ChildCodeIntegrityFailures",
241*6777b538SAndroid Build Coastguard Worker           coarse_renderer_type);
242*6777b538SAndroid Build Coastguard Worker       break;
243*6777b538SAndroid Build Coastguard Worker #endif
244*6777b538SAndroid Build Coastguard Worker     case base::TERMINATION_STATUS_MAX_ENUM:
245*6777b538SAndroid Build Coastguard Worker       NOTREACHED();
246*6777b538SAndroid Build Coastguard Worker       break;
247*6777b538SAndroid Build Coastguard Worker   }
248*6777b538SAndroid Build Coastguard Worker }
249*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_ANDROID)
250*6777b538SAndroid Build Coastguard Worker 
LogRendererLaunched(bool was_extension_process)251*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::LogRendererLaunched(bool was_extension_process) {
252*6777b538SAndroid Build Coastguard Worker   auto metric = was_extension_process
253*6777b538SAndroid Build Coastguard Worker                     ? StabilityEventType::kExtensionRendererLaunch
254*6777b538SAndroid Build Coastguard Worker                     : StabilityEventType::kRendererLaunch;
255*6777b538SAndroid Build Coastguard Worker   RecordStabilityEvent(metric);
256*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
257*6777b538SAndroid Build Coastguard Worker   if (!was_extension_process)
258*6777b538SAndroid Build Coastguard Worker     IncrementPrefValue(prefs::kStabilityRendererLaunchCount);
259*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID)
260*6777b538SAndroid Build Coastguard Worker }
261*6777b538SAndroid Build Coastguard Worker 
IncrementPrefValue(const char * path)262*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::IncrementPrefValue(const char* path) {
263*6777b538SAndroid Build Coastguard Worker   int value = local_state_->GetInteger(path);
264*6777b538SAndroid Build Coastguard Worker   local_state_->SetInteger(path, value + 1);
265*6777b538SAndroid Build Coastguard Worker }
266*6777b538SAndroid Build Coastguard Worker 
267*6777b538SAndroid Build Coastguard Worker // static
RecordStabilityEvent(StabilityEventType stability_event_type)268*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::RecordStabilityEvent(
269*6777b538SAndroid Build Coastguard Worker     StabilityEventType stability_event_type) {
270*6777b538SAndroid Build Coastguard Worker   UMA_STABILITY_HISTOGRAM_ENUMERATION("Stability.Counts2",
271*6777b538SAndroid Build Coastguard Worker                                       stability_event_type);
272*6777b538SAndroid Build Coastguard Worker }
273*6777b538SAndroid Build Coastguard Worker 
274*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID)
LogRendererCrashImpl(CoarseRendererType renderer_type,int exit_code)275*6777b538SAndroid Build Coastguard Worker void StabilityMetricsHelper::LogRendererCrashImpl(
276*6777b538SAndroid Build Coastguard Worker     CoarseRendererType renderer_type,
277*6777b538SAndroid Build Coastguard Worker     int exit_code) {
278*6777b538SAndroid Build Coastguard Worker   if (renderer_type == CoarseRendererType::kExtension) {
279*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(ENABLE_EXTENSIONS)
280*6777b538SAndroid Build Coastguard Worker     NOTREACHED();
281*6777b538SAndroid Build Coastguard Worker #endif
282*6777b538SAndroid Build Coastguard Worker     RecordStabilityEvent(StabilityEventType::kExtensionCrash);
283*6777b538SAndroid Build Coastguard Worker     base::UmaHistogramSparse("CrashExitCodes.Extension",
284*6777b538SAndroid Build Coastguard Worker                              MapCrashExitCodeForHistogram(exit_code));
285*6777b538SAndroid Build Coastguard Worker   } else {
286*6777b538SAndroid Build Coastguard Worker     IncreaseRendererCrashCount();
287*6777b538SAndroid Build Coastguard Worker     base::UmaHistogramSparse("CrashExitCodes.Renderer",
288*6777b538SAndroid Build Coastguard Worker                              MapCrashExitCodeForHistogram(exit_code));
289*6777b538SAndroid Build Coastguard Worker   }
290*6777b538SAndroid Build Coastguard Worker 
291*6777b538SAndroid Build Coastguard Worker   base::UmaHistogramEnumeration("BrowserRenderProcessHost.ChildCrashes",
292*6777b538SAndroid Build Coastguard Worker                                 renderer_type);
293*6777b538SAndroid Build Coastguard Worker }
294*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_ANDROID)
295*6777b538SAndroid Build Coastguard Worker 
296*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
297