OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" | 5 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 #include "chrome/installer/util/install_util.h" | 34 #include "chrome/installer/util/install_util.h" |
35 #include "components/browser_watcher/crash_reporting_metrics_win.h" | 35 #include "components/browser_watcher/crash_reporting_metrics_win.h" |
36 #endif | 36 #endif |
37 | 37 |
38 #if defined(OS_CHROMEOS) | 38 #if defined(OS_CHROMEOS) |
39 #include "chrome/browser/memory/system_memory_stats_recorder.h" | 39 #include "chrome/browser/memory/system_memory_stats_recorder.h" |
40 #endif | 40 #endif |
41 | 41 |
42 namespace { | 42 namespace { |
43 | 43 |
| 44 enum RendererType { |
| 45 RENDERER_TYPE_RENDERER, |
| 46 RENDERER_TYPE_EXTENSION, |
| 47 // NOTE: Add new action types only immediately above this line. Also, |
| 48 // make sure the enum list in tools/metrics/histograms/histograms.xml is |
| 49 // updated with any change in here. |
| 50 RENDERER_TYPE_COUNT |
| 51 }; |
| 52 |
44 // Converts an exit code into something that can be inserted into our | 53 // Converts an exit code into something that can be inserted into our |
45 // histograms (which expect non-negative numbers less than MAX_INT). | 54 // histograms (which expect non-negative numbers less than MAX_INT). |
46 int MapCrashExitCodeForHistogram(int exit_code) { | 55 int MapCrashExitCodeForHistogram(int exit_code) { |
47 #if defined(OS_WIN) | 56 #if defined(OS_WIN) |
48 // Since |abs(STATUS_GUARD_PAGE_VIOLATION) == MAX_INT| it causes problems in | 57 // Since |abs(STATUS_GUARD_PAGE_VIOLATION) == MAX_INT| it causes problems in |
49 // histograms.cc. Solve this by remapping it to a smaller value, which | 58 // histograms.cc. Solve this by remapping it to a smaller value, which |
50 // hopefully doesn't conflict with other codes. | 59 // hopefully doesn't conflict with other codes. |
51 if (exit_code == STATUS_GUARD_PAGE_VIOLATION) | 60 if (exit_code == STATUS_GUARD_PAGE_VIOLATION) |
52 return 0x1FCF7EC3; // Randomly picked number. | 61 return 0x1FCF7EC3; // Randomly picked number. |
53 #endif | 62 #endif |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 outcome = OUTCOME_FAILURE; | 100 outcome = OUTCOME_FAILURE; |
92 } | 101 } |
93 | 102 |
94 UMA_STABILITY_HISTOGRAM_ENUMERATION( | 103 UMA_STABILITY_HISTOGRAM_ENUMERATION( |
95 "CrashReport.BreakpadDumpWithoutCrashOutcome", outcome, | 104 "CrashReport.BreakpadDumpWithoutCrashOutcome", outcome, |
96 OUTCOME_MAX_VALUE); | 105 OUTCOME_MAX_VALUE); |
97 } | 106 } |
98 } | 107 } |
99 #endif // defined(OS_WIN) | 108 #endif // defined(OS_WIN) |
100 | 109 |
101 void RecordChildKills(bool was_extension_process) { | 110 void RecordChildKills(int histogram_type) { |
102 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKills", | 111 UMA_HISTOGRAM_ENUMERATION("BrowserRenderProcessHost.ChildKills", |
103 was_extension_process ? 2 : 1); | 112 histogram_type, RENDERER_TYPE_COUNT); |
104 } | 113 } |
105 | 114 |
106 } // namespace | 115 } // namespace |
107 | 116 |
108 ChromeStabilityMetricsProvider::ChromeStabilityMetricsProvider( | 117 ChromeStabilityMetricsProvider::ChromeStabilityMetricsProvider( |
109 PrefService* local_state) | 118 PrefService* local_state) |
110 : local_state_(local_state) { | 119 : local_state_(local_state) { |
111 DCHECK(local_state_); | 120 DCHECK(local_state_); |
112 BrowserChildProcessObserver::Add(this); | 121 BrowserChildProcessObserver::Add(this); |
113 } | 122 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 IncrementPrefValue(prefs::kStabilityPageLoadCount); | 260 IncrementPrefValue(prefs::kStabilityPageLoadCount); |
252 IncrementLongPrefsValue(prefs::kUninstallMetricsPageLoadCount); | 261 IncrementLongPrefsValue(prefs::kUninstallMetricsPageLoadCount); |
253 // We need to save the prefs, as page load count is a critical stat, and it | 262 // We need to save the prefs, as page load count is a critical stat, and it |
254 // might be lost due to a crash :-(. | 263 // might be lost due to a crash :-(. |
255 } | 264 } |
256 | 265 |
257 void ChromeStabilityMetricsProvider::LogRendererCrash( | 266 void ChromeStabilityMetricsProvider::LogRendererCrash( |
258 content::RenderProcessHost* host, | 267 content::RenderProcessHost* host, |
259 base::TerminationStatus status, | 268 base::TerminationStatus status, |
260 int exit_code) { | 269 int exit_code) { |
| 270 int histogram_type = RENDERER_TYPE_RENDERER; |
261 bool was_extension_process = false; | 271 bool was_extension_process = false; |
262 #if defined(ENABLE_EXTENSIONS) | 272 #if defined(ENABLE_EXTENSIONS) |
263 was_extension_process = | 273 if (extensions::ProcessMap::Get(host->GetBrowserContext()) |
264 extensions::ProcessMap::Get(host->GetBrowserContext())->Contains( | 274 ->Contains(host->GetID())) { |
265 host->GetID()); | 275 histogram_type = RENDERER_TYPE_EXTENSION; |
| 276 was_extension_process = true; |
| 277 } |
266 #endif | 278 #endif |
267 if (status == base::TERMINATION_STATUS_PROCESS_CRASHED || | 279 if (status == base::TERMINATION_STATUS_PROCESS_CRASHED || |
268 status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { | 280 status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { |
269 if (was_extension_process) { | 281 if (was_extension_process) { |
270 IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount); | 282 IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount); |
271 | 283 |
272 UMA_HISTOGRAM_SPARSE_SLOWLY("CrashExitCodes.Extension", | 284 UMA_HISTOGRAM_SPARSE_SLOWLY("CrashExitCodes.Extension", |
273 MapCrashExitCodeForHistogram(exit_code)); | 285 MapCrashExitCodeForHistogram(exit_code)); |
274 } else { | 286 } else { |
275 IncrementPrefValue(prefs::kStabilityRendererCrashCount); | 287 IncrementPrefValue(prefs::kStabilityRendererCrashCount); |
276 | 288 |
277 UMA_HISTOGRAM_SPARSE_SLOWLY("CrashExitCodes.Renderer", | 289 UMA_HISTOGRAM_SPARSE_SLOWLY("CrashExitCodes.Renderer", |
278 MapCrashExitCodeForHistogram(exit_code)); | 290 MapCrashExitCodeForHistogram(exit_code)); |
279 } | 291 } |
280 | 292 |
281 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashes", | 293 UMA_HISTOGRAM_ENUMERATION("BrowserRenderProcessHost.ChildCrashes", |
282 was_extension_process ? 2 : 1); | 294 histogram_type, RENDERER_TYPE_COUNT); |
283 } else if (status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED) { | 295 } else if (status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED) { |
284 RecordChildKills(was_extension_process); | 296 RecordChildKills(histogram_type); |
285 #if defined(OS_CHROMEOS) | 297 #if defined(OS_CHROMEOS) |
286 } else if (status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM) { | 298 } else if (status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM) { |
287 RecordChildKills(was_extension_process); | 299 RecordChildKills(histogram_type); |
288 UMA_HISTOGRAM_ENUMERATION("BrowserRenderProcessHost.ChildKills.OOM", | 300 UMA_HISTOGRAM_ENUMERATION("BrowserRenderProcessHost.ChildKills.OOM", |
289 was_extension_process ? 2 : 1, | 301 was_extension_process ? 2 : 1, |
290 3); | 302 3); |
291 memory::RecordMemoryStats( | 303 memory::RecordMemoryStats( |
292 was_extension_process | 304 was_extension_process |
293 ? memory::RECORD_MEMORY_STATS_EXTENSIONS_OOM_KILLED | 305 ? memory::RECORD_MEMORY_STATS_EXTENSIONS_OOM_KILLED |
294 : memory::RECORD_MEMORY_STATS_CONTENTS_OOM_KILLED); | 306 : memory::RECORD_MEMORY_STATS_CONTENTS_OOM_KILLED); |
295 #endif | 307 #endif |
296 } else if (status == base::TERMINATION_STATUS_STILL_RUNNING) { | 308 } else if (status == base::TERMINATION_STATUS_STILL_RUNNING) { |
297 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.DisconnectedAlive", | 309 UMA_HISTOGRAM_ENUMERATION("BrowserRenderProcessHost.DisconnectedAlive", |
298 was_extension_process ? 2 : 1); | 310 histogram_type, RENDERER_TYPE_COUNT); |
| 311 } else if (status == base::TERMINATION_STATUS_LAUNCH_FAILED) { |
| 312 UMA_HISTOGRAM_ENUMERATION("BrowserRenderProcessHost.ChildLaunchFailures", |
| 313 histogram_type, RENDERER_TYPE_COUNT); |
| 314 // Treat child process launch as a crash for now. |
| 315 if (was_extension_process) |
| 316 IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount); |
| 317 else |
| 318 IncrementPrefValue(prefs::kStabilityRendererCrashCount); |
299 } | 319 } |
300 } | 320 } |
301 | 321 |
302 void ChromeStabilityMetricsProvider::IncrementPrefValue(const char* path) { | 322 void ChromeStabilityMetricsProvider::IncrementPrefValue(const char* path) { |
303 int value = local_state_->GetInteger(path); | 323 int value = local_state_->GetInteger(path); |
304 local_state_->SetInteger(path, value + 1); | 324 local_state_->SetInteger(path, value + 1); |
305 } | 325 } |
306 | 326 |
307 void ChromeStabilityMetricsProvider::IncrementLongPrefsValue(const char* path) { | 327 void ChromeStabilityMetricsProvider::IncrementLongPrefsValue(const char* path) { |
308 int64 value = local_state_->GetInt64(path); | 328 int64 value = local_state_->GetInt64(path); |
309 local_state_->SetInt64(path, value + 1); | 329 local_state_->SetInt64(path, value + 1); |
310 } | 330 } |
311 | 331 |
312 void ChromeStabilityMetricsProvider::LogRendererHang() { | 332 void ChromeStabilityMetricsProvider::LogRendererHang() { |
313 IncrementPrefValue(prefs::kStabilityRendererHangCount); | 333 IncrementPrefValue(prefs::kStabilityRendererHangCount); |
314 } | 334 } |
OLD | NEW |