Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(92)

Side by Side Diff: chrome/browser/metrics/chrome_stability_metrics_provider.cc

Issue 1323703002: Add tests for Chrome Stability Metrics. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nits Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
11 #include "base/metrics/sparse_histogram.h" 11 #include "base/metrics/sparse_histogram.h"
12 #include "base/prefs/pref_registry_simple.h" 12 #include "base/prefs/pref_registry_simple.h"
13 #include "base/prefs/pref_service.h" 13 #include "base/prefs/pref_service.h"
14 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/chrome_notification_types.h" 14 #include "chrome/browser/chrome_notification_types.h"
16 #include "chrome/common/chrome_constants.h" 15 #include "chrome/common/chrome_constants.h"
17 #include "chrome/common/pref_names.h" 16 #include "chrome/common/pref_names.h"
18 #include "components/metrics/proto/system_profile.pb.h" 17 #include "components/metrics/proto/system_profile.pb.h"
19 #include "content/public/browser/child_process_data.h" 18 #include "content/public/browser/child_process_data.h"
20 #include "content/public/browser/notification_service.h" 19 #include "content/public/browser/notification_service.h"
21 #include "content/public/browser/render_process_host.h" 20 #include "content/public/browser/render_process_host.h"
22 #include "content/public/browser/user_metrics.h" 21 #include "content/public/browser/user_metrics.h"
23 #include "content/public/browser/web_contents.h" 22 #include "content/public/browser/web_contents.h"
24 23
(...skipping 10 matching lines...) Expand all
35 #include "chrome/installer/util/install_util.h" 34 #include "chrome/installer/util/install_util.h"
36 #include "components/browser_watcher/crash_reporting_metrics_win.h" 35 #include "components/browser_watcher/crash_reporting_metrics_win.h"
37 #endif 36 #endif
38 37
39 #if defined(OS_CHROMEOS) 38 #if defined(OS_CHROMEOS)
40 #include "chrome/browser/memory/system_memory_stats_recorder.h" 39 #include "chrome/browser/memory/system_memory_stats_recorder.h"
41 #endif 40 #endif
42 41
43 namespace { 42 namespace {
44 43
45 void IncrementPrefValue(const char* path) {
46 PrefService* pref = g_browser_process->local_state();
47 DCHECK(pref);
48 int value = pref->GetInteger(path);
49 pref->SetInteger(path, value + 1);
50 }
51
52 void IncrementLongPrefsValue(const char* path) {
53 PrefService* pref = g_browser_process->local_state();
54 DCHECK(pref);
55 int64 value = pref->GetInt64(path);
56 pref->SetInt64(path, value + 1);
57 }
58
59 // Converts an exit code into something that can be inserted into our 44 // Converts an exit code into something that can be inserted into our
60 // histograms (which expect non-negative numbers less than MAX_INT). 45 // histograms (which expect non-negative numbers less than MAX_INT).
61 int MapCrashExitCodeForHistogram(int exit_code) { 46 int MapCrashExitCodeForHistogram(int exit_code) {
62 #if defined(OS_WIN) 47 #if defined(OS_WIN)
63 // Since |abs(STATUS_GUARD_PAGE_VIOLATION) == MAX_INT| it causes problems in 48 // Since |abs(STATUS_GUARD_PAGE_VIOLATION) == MAX_INT| it causes problems in
64 // histograms.cc. Solve this by remapping it to a smaller value, which 49 // histograms.cc. Solve this by remapping it to a smaller value, which
65 // hopefully doesn't conflict with other codes. 50 // hopefully doesn't conflict with other codes.
66 if (exit_code == STATUS_GUARD_PAGE_VIOLATION) 51 if (exit_code == STATUS_GUARD_PAGE_VIOLATION)
67 return 0x1FCF7EC3; // Randomly picked number. 52 return 0x1FCF7EC3; // Randomly picked number.
68 #endif 53 #endif
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 } 98 }
114 #endif // defined(OS_WIN) 99 #endif // defined(OS_WIN)
115 100
116 void RecordChildKills(bool was_extension_process) { 101 void RecordChildKills(bool was_extension_process) {
117 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKills", 102 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKills",
118 was_extension_process ? 2 : 1); 103 was_extension_process ? 2 : 1);
119 } 104 }
120 105
121 } // namespace 106 } // namespace
122 107
123 ChromeStabilityMetricsProvider::ChromeStabilityMetricsProvider() { 108 ChromeStabilityMetricsProvider::ChromeStabilityMetricsProvider(
109 PrefService* local_state)
110 : local_state_(local_state) {
111 DCHECK(local_state_);
124 BrowserChildProcessObserver::Add(this); 112 BrowserChildProcessObserver::Add(this);
125 } 113 }
126 114
127 ChromeStabilityMetricsProvider::~ChromeStabilityMetricsProvider() { 115 ChromeStabilityMetricsProvider::~ChromeStabilityMetricsProvider() {
128 BrowserChildProcessObserver::Remove(this); 116 BrowserChildProcessObserver::Remove(this);
129 } 117 }
130 118
131 void ChromeStabilityMetricsProvider::OnRecordingEnabled() { 119 void ChromeStabilityMetricsProvider::OnRecordingEnabled() {
132 registrar_.Add(this, 120 registrar_.Add(this,
133 content::NOTIFICATION_LOAD_START, 121 content::NOTIFICATION_LOAD_START,
134 content::NotificationService::AllSources()); 122 content::NotificationService::AllSources());
135 registrar_.Add(this, 123 registrar_.Add(this,
136 content::NOTIFICATION_RENDERER_PROCESS_CLOSED, 124 content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
137 content::NotificationService::AllSources()); 125 content::NotificationService::AllSources());
138 registrar_.Add(this, 126 registrar_.Add(this,
139 content::NOTIFICATION_RENDER_WIDGET_HOST_HANG, 127 content::NOTIFICATION_RENDER_WIDGET_HOST_HANG,
140 content::NotificationService::AllSources()); 128 content::NotificationService::AllSources());
141 } 129 }
142 130
143 void ChromeStabilityMetricsProvider::OnRecordingDisabled() { 131 void ChromeStabilityMetricsProvider::OnRecordingDisabled() {
144 registrar_.RemoveAll(); 132 registrar_.RemoveAll();
145 } 133 }
146 134
147 void ChromeStabilityMetricsProvider::ProvideStabilityMetrics( 135 void ChromeStabilityMetricsProvider::ProvideStabilityMetrics(
148 metrics::SystemProfileProto* system_profile_proto) { 136 metrics::SystemProfileProto* system_profile_proto) {
149 PrefService* pref = g_browser_process->local_state();
150 metrics::SystemProfileProto_Stability* stability_proto = 137 metrics::SystemProfileProto_Stability* stability_proto =
151 system_profile_proto->mutable_stability(); 138 system_profile_proto->mutable_stability();
152 139
153 int count = pref->GetInteger(prefs::kStabilityPageLoadCount); 140 int count = local_state_->GetInteger(prefs::kStabilityPageLoadCount);
154 if (count) { 141 if (count) {
155 stability_proto->set_page_load_count(count); 142 stability_proto->set_page_load_count(count);
156 pref->SetInteger(prefs::kStabilityPageLoadCount, 0); 143 local_state_->SetInteger(prefs::kStabilityPageLoadCount, 0);
157 } 144 }
158 145
159 count = pref->GetInteger(prefs::kStabilityChildProcessCrashCount); 146 count = local_state_->GetInteger(prefs::kStabilityChildProcessCrashCount);
160 if (count) { 147 if (count) {
161 stability_proto->set_child_process_crash_count(count); 148 stability_proto->set_child_process_crash_count(count);
162 pref->SetInteger(prefs::kStabilityChildProcessCrashCount, 0); 149 local_state_->SetInteger(prefs::kStabilityChildProcessCrashCount, 0);
163 } 150 }
164 151
165 count = pref->GetInteger(prefs::kStabilityRendererCrashCount); 152 count = local_state_->GetInteger(prefs::kStabilityRendererCrashCount);
166 if (count) { 153 if (count) {
167 stability_proto->set_renderer_crash_count(count); 154 stability_proto->set_renderer_crash_count(count);
168 pref->SetInteger(prefs::kStabilityRendererCrashCount, 0); 155 local_state_->SetInteger(prefs::kStabilityRendererCrashCount, 0);
169 } 156 }
170 157
171 count = pref->GetInteger(prefs::kStabilityExtensionRendererCrashCount); 158 count =
159 local_state_->GetInteger(prefs::kStabilityExtensionRendererCrashCount);
172 if (count) { 160 if (count) {
173 stability_proto->set_extension_renderer_crash_count(count); 161 stability_proto->set_extension_renderer_crash_count(count);
174 pref->SetInteger(prefs::kStabilityExtensionRendererCrashCount, 0); 162 local_state_->SetInteger(prefs::kStabilityExtensionRendererCrashCount, 0);
175 } 163 }
176 164
177 count = pref->GetInteger(prefs::kStabilityRendererHangCount); 165 count = local_state_->GetInteger(prefs::kStabilityRendererHangCount);
178 if (count) { 166 if (count) {
179 stability_proto->set_renderer_hang_count(count); 167 stability_proto->set_renderer_hang_count(count);
180 pref->SetInteger(prefs::kStabilityRendererHangCount, 0); 168 local_state_->SetInteger(prefs::kStabilityRendererHangCount, 0);
181 } 169 }
182 170
183 #if defined(OS_WIN) 171 #if defined(OS_WIN)
184 CountBrowserCrashDumpAttempts(); 172 CountBrowserCrashDumpAttempts();
185 #endif // defined(OS_WIN) 173 #endif // defined(OS_WIN)
186 } 174 }
187 175
188 void ChromeStabilityMetricsProvider::ClearSavedStabilityMetrics() { 176 void ChromeStabilityMetricsProvider::ClearSavedStabilityMetrics() {
189 PrefService* local_state = g_browser_process->local_state();
190
191 // Clear all the prefs used in this class in UMA reports (which doesn't 177 // Clear all the prefs used in this class in UMA reports (which doesn't
192 // include |kUninstallMetricsPageLoadCount| as it's not sent up by UMA). 178 // include |kUninstallMetricsPageLoadCount| as it's not sent up by UMA).
193 local_state->SetInteger(prefs::kStabilityChildProcessCrashCount, 0); 179 local_state_->SetInteger(prefs::kStabilityChildProcessCrashCount, 0);
194 local_state->SetInteger(prefs::kStabilityExtensionRendererCrashCount, 0); 180 local_state_->SetInteger(prefs::kStabilityExtensionRendererCrashCount, 0);
195 local_state->SetInteger(prefs::kStabilityPageLoadCount, 0); 181 local_state_->SetInteger(prefs::kStabilityPageLoadCount, 0);
196 local_state->SetInteger(prefs::kStabilityRendererCrashCount, 0); 182 local_state_->SetInteger(prefs::kStabilityRendererCrashCount, 0);
197 local_state->SetInteger(prefs::kStabilityRendererHangCount, 0); 183 local_state_->SetInteger(prefs::kStabilityRendererHangCount, 0);
198 } 184 }
199 185
200 // static 186 // static
201 void ChromeStabilityMetricsProvider::RegisterPrefs( 187 void ChromeStabilityMetricsProvider::RegisterPrefs(
202 PrefRegistrySimple* registry) { 188 PrefRegistrySimple* registry) {
203 registry->RegisterIntegerPref(prefs::kStabilityChildProcessCrashCount, 0); 189 registry->RegisterIntegerPref(prefs::kStabilityChildProcessCrashCount, 0);
204 registry->RegisterIntegerPref(prefs::kStabilityExtensionRendererCrashCount, 190 registry->RegisterIntegerPref(prefs::kStabilityExtensionRendererCrashCount,
205 0); 191 0);
206 registry->RegisterIntegerPref(prefs::kStabilityPageLoadCount, 0); 192 registry->RegisterIntegerPref(prefs::kStabilityPageLoadCount, 0);
207 registry->RegisterIntegerPref(prefs::kStabilityRendererCrashCount, 0); 193 registry->RegisterIntegerPref(prefs::kStabilityRendererCrashCount, 0);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 was_extension_process 292 was_extension_process
307 ? memory::RECORD_MEMORY_STATS_EXTENSIONS_OOM_KILLED 293 ? memory::RECORD_MEMORY_STATS_EXTENSIONS_OOM_KILLED
308 : memory::RECORD_MEMORY_STATS_CONTENTS_OOM_KILLED); 294 : memory::RECORD_MEMORY_STATS_CONTENTS_OOM_KILLED);
309 #endif 295 #endif
310 } else if (status == base::TERMINATION_STATUS_STILL_RUNNING) { 296 } else if (status == base::TERMINATION_STATUS_STILL_RUNNING) {
311 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.DisconnectedAlive", 297 UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.DisconnectedAlive",
312 was_extension_process ? 2 : 1); 298 was_extension_process ? 2 : 1);
313 } 299 }
314 } 300 }
315 301
302 void ChromeStabilityMetricsProvider::IncrementPrefValue(const char* path) {
303 int value = local_state_->GetInteger(path);
304 local_state_->SetInteger(path, value + 1);
305 }
306
307 void ChromeStabilityMetricsProvider::IncrementLongPrefsValue(const char* path) {
308 int64 value = local_state_->GetInt64(path);
309 local_state_->SetInt64(path, value + 1);
310 }
311
316 void ChromeStabilityMetricsProvider::LogRendererHang() { 312 void ChromeStabilityMetricsProvider::LogRendererHang() {
317 IncrementPrefValue(prefs::kStabilityRendererHangCount); 313 IncrementPrefValue(prefs::kStabilityRendererHangCount);
318 } 314 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698