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_metrics_service_client.h" | 5 #include "chrome/browser/metrics/chrome_metrics_service_client.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
14 #include "base/prefs/pref_registry_simple.h" | |
14 #include "base/strings/string16.h" | 15 #include "base/strings/string16.h" |
15 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
16 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
17 #include "base/threading/platform_thread.h" | 18 #include "base/threading/platform_thread.h" |
18 #include "base/time/time.h" | 19 #include "base/time/time.h" |
19 #include "chrome/browser/browser_process.h" | 20 #include "chrome/browser/browser_process.h" |
20 #include "chrome/browser/chrome_notification_types.h" | 21 #include "chrome/browser/chrome_notification_types.h" |
21 #include "chrome/browser/google/google_util.h" | 22 #include "chrome/browser/google/google_util.h" |
22 #include "chrome/browser/memory_details.h" | 23 #include "chrome/browser/memory_details.h" |
24 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" | |
23 #include "chrome/browser/metrics/extensions_metrics_provider.h" | 25 #include "chrome/browser/metrics/extensions_metrics_provider.h" |
26 #include "chrome/browser/metrics/gpu_metrics_provider.h" | |
24 #include "chrome/browser/metrics/metrics_service.h" | 27 #include "chrome/browser/metrics/metrics_service.h" |
28 #include "chrome/browser/metrics/network_metrics_provider.h" | |
29 #include "chrome/browser/metrics/omnibox_metrics_provider.h" | |
30 #include "chrome/browser/metrics/profiler_metrics_provider.h" | |
31 #include "chrome/browser/metrics/tracking_synchronizer.h" | |
25 #include "chrome/browser/ui/browser_otr_state.h" | 32 #include "chrome/browser/ui/browser_otr_state.h" |
26 #include "chrome/common/chrome_constants.h" | 33 #include "chrome/common/chrome_constants.h" |
27 #include "chrome/common/chrome_switches.h" | 34 #include "chrome/common/chrome_switches.h" |
28 #include "chrome/common/chrome_version_info.h" | 35 #include "chrome/common/chrome_version_info.h" |
29 #include "chrome/common/crash_keys.h" | 36 #include "chrome/common/crash_keys.h" |
30 #include "chrome/common/render_messages.h" | 37 #include "chrome/common/render_messages.h" |
31 #include "components/metrics/net/net_metrics_log_uploader.h" | 38 #include "components/metrics/net/net_metrics_log_uploader.h" |
32 #include "content/public/browser/browser_thread.h" | 39 #include "content/public/browser/browser_thread.h" |
33 #include "content/public/browser/histogram_fetcher.h" | 40 #include "content/public/browser/histogram_fetcher.h" |
34 #include "content/public/browser/notification_service.h" | 41 #include "content/public/browser/notification_service.h" |
35 #include "content/public/browser/render_process_host.h" | 42 #include "content/public/browser/render_process_host.h" |
36 | 43 |
37 #if !defined(OS_ANDROID) | 44 #if defined(OS_ANDROID) |
45 #include "chrome/browser/metrics/android_metrics_provider.h" | |
46 #else | |
38 #include "chrome/browser/service_process/service_process_control.h" | 47 #include "chrome/browser/service_process/service_process_control.h" |
39 #endif | 48 #endif |
40 | 49 |
50 #if defined(ENABLE_PLUGINS) | |
51 #include "chrome/browser/metrics/plugin_metrics_provider.h" | |
52 #endif | |
53 | |
41 #if defined(OS_CHROMEOS) | 54 #if defined(OS_CHROMEOS) |
42 #include "chrome/browser/metrics/chromeos_metrics_provider.h" | 55 #include "chrome/browser/metrics/chromeos_metrics_provider.h" |
43 #endif | 56 #endif |
44 | 57 |
45 #if defined(OS_WIN) | 58 #if defined(OS_WIN) |
46 #include <windows.h> | 59 #include <windows.h> |
47 #include "base/win/registry.h" | 60 #include "base/win/registry.h" |
48 #include "chrome/browser/metrics/google_update_metrics_provider_win.h" | 61 #include "chrome/browser/metrics/google_update_metrics_provider_win.h" |
49 #endif | 62 #endif |
50 | 63 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
119 PrefService* local_state) { | 132 PrefService* local_state) { |
120 // Perform two-phase initialization so that |client->metrics_service_| only | 133 // Perform two-phase initialization so that |client->metrics_service_| only |
121 // receives pointers to fully constructed objects. | 134 // receives pointers to fully constructed objects. |
122 scoped_ptr<ChromeMetricsServiceClient> client( | 135 scoped_ptr<ChromeMetricsServiceClient> client( |
123 new ChromeMetricsServiceClient(state_manager)); | 136 new ChromeMetricsServiceClient(state_manager)); |
124 client->Initialize(); | 137 client->Initialize(); |
125 | 138 |
126 return client.Pass(); | 139 return client.Pass(); |
127 } | 140 } |
128 | 141 |
142 // static | |
143 void ChromeMetricsServiceClient::RegisterPrefs(PrefRegistrySimple* registry) { | |
144 MetricsService::RegisterPrefs(registry); | |
145 ChromeStabilityMetricsProvider::RegisterPrefs(registry); | |
146 | |
147 #if defined(OS_ANDROID) | |
148 AndroidMetricsProvider::RegisterPrefs(registry); | |
149 #endif // defined(OS_ANDROID) | |
150 | |
151 #if defined(ENABLE_PLUGINS) | |
152 PluginMetricsProvider::RegisterPrefs(registry); | |
153 #endif | |
Ilya Sherman
2014/06/02 21:52:37
nit: "// defined(ENABLE_PLUGINS)"
blundell
2014/06/06 13:06:28
Done.
| |
154 } | |
155 | |
129 void ChromeMetricsServiceClient::Initialize() { | 156 void ChromeMetricsServiceClient::Initialize() { |
130 metrics_service_.reset(new MetricsService( | 157 metrics_service_.reset(new MetricsService( |
131 metrics_state_manager_, this, g_browser_process->local_state())); | 158 metrics_state_manager_, this, g_browser_process->local_state())); |
132 | 159 |
133 // Register metrics providers. | 160 // Register metrics providers. |
134 metrics_service_->RegisterMetricsProvider( | 161 metrics_service_->RegisterMetricsProvider( |
135 scoped_ptr<metrics::MetricsProvider>( | 162 scoped_ptr<metrics::MetricsProvider>( |
136 new ExtensionsMetricsProvider(metrics_state_manager_))); | 163 new ExtensionsMetricsProvider(metrics_state_manager_))); |
Ilya Sherman
2014/06/02 21:52:37
Huh. Was this being doubly registered before?
blundell
2014/06/06 13:06:28
Yep.
On 2014/06/02 21:52:37, Ilya Sherman wrote:
| |
137 | 164 |
165 #if defined(OS_ANDROID) | |
166 metrics_service_->RegisterMetricsProvider( | |
167 scoped_ptr<metrics::MetricsProvider>( | |
168 new AndroidMetricsProvider(g_browser_process->local_state()))); | |
169 #endif | |
Ilya Sherman
2014/06/02 21:52:37
nit: I'd move this past line 181, so that all of t
Ilya Sherman
2014/06/02 21:52:37
nit: "// defined(OS_ANDROID)"
blundell
2014/06/06 13:06:28
Done.
blundell
2014/06/06 13:06:28
Done.
| |
170 | |
171 metrics_service_->RegisterMetricsProvider( | |
172 scoped_ptr<metrics::MetricsProvider>(new NetworkMetricsProvider)); | |
173 metrics_service_->RegisterMetricsProvider( | |
174 scoped_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider)); | |
175 metrics_service_->RegisterMetricsProvider( | |
176 scoped_ptr<metrics::MetricsProvider>(new ChromeStabilityMetricsProvider)); | |
177 metrics_service_->RegisterMetricsProvider( | |
178 scoped_ptr<metrics::MetricsProvider>(new GPUMetricsProvider())); | |
179 profiler_metrics_provider_ = new ProfilerMetricsProvider; | |
180 metrics_service_->RegisterMetricsProvider( | |
181 scoped_ptr<metrics::MetricsProvider>(profiler_metrics_provider_)); | |
182 | |
183 #if defined(OS_WIN) | |
184 google_update_metrics_provider_ = new GoogleUpdateMetricsProviderWin; | |
185 metrics_service_->RegisterMetricsProvider( | |
186 scoped_ptr<metrics::MetricsProvider>(google_update_metrics_provider_)); | |
187 #endif | |
Ilya Sherman
2014/06/02 21:52:37
nit: "// defined(OS_WIN)"
blundell
2014/06/06 13:06:28
Done.
| |
188 | |
189 #if defined(ENABLE_PLUGINS) | |
190 plugin_metrics_provider_ = | |
191 new PluginMetricsProvider(g_browser_process->local_state()); | |
192 metrics_service_->RegisterMetricsProvider( | |
193 scoped_ptr<metrics::MetricsProvider>(plugin_metrics_provider_)); | |
194 #endif | |
Ilya Sherman
2014/06/02 21:52:37
nit: "// defined(ENABLE_PLUGINS)"
blundell
2014/06/06 13:06:28
Done.
| |
195 | |
138 #if defined(OS_CHROMEOS) | 196 #if defined(OS_CHROMEOS) |
139 ChromeOSMetricsProvider* chromeos_metrics_provider = | 197 ChromeOSMetricsProvider* chromeos_metrics_provider = |
140 new ChromeOSMetricsProvider; | 198 new ChromeOSMetricsProvider; |
141 chromeos_metrics_provider_ = chromeos_metrics_provider; | 199 chromeos_metrics_provider_ = chromeos_metrics_provider; |
142 metrics_service_->RegisterMetricsProvider( | 200 metrics_service_->RegisterMetricsProvider( |
143 scoped_ptr<metrics::MetricsProvider>(chromeos_metrics_provider)); | 201 scoped_ptr<metrics::MetricsProvider>(chromeos_metrics_provider)); |
144 #endif | 202 #endif |
145 } | 203 } |
146 | 204 |
147 void ChromeMetricsServiceClient::SetClientID(const std::string& client_id) { | 205 void ChromeMetricsServiceClient::SetClientID(const std::string& client_id) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
180 return version; | 238 return version; |
181 } | 239 } |
182 | 240 |
183 void ChromeMetricsServiceClient::OnLogUploadComplete() { | 241 void ChromeMetricsServiceClient::OnLogUploadComplete() { |
184 // Collect network stats after each UMA upload. | 242 // Collect network stats after each UMA upload. |
185 network_stats_uploader_.CollectAndReportNetworkStats(); | 243 network_stats_uploader_.CollectAndReportNetworkStats(); |
186 } | 244 } |
187 | 245 |
188 void ChromeMetricsServiceClient::StartGatheringMetrics( | 246 void ChromeMetricsServiceClient::StartGatheringMetrics( |
189 const base::Closure& done_callback) { | 247 const base::Closure& done_callback) { |
190 // TODO(blundell): Move all metrics gathering tasks from MetricsService to | 248 finished_gathering_initial_metrics_callback_ = done_callback; |
191 // here. | 249 base::Closure got_hardware_class_callback = |
250 base::Bind(&ChromeMetricsServiceClient::OnInitTaskGotHardwareClass, | |
251 weak_ptr_factory_.GetWeakPtr()); | |
192 #if defined(OS_CHROMEOS) | 252 #if defined(OS_CHROMEOS) |
193 chromeos_metrics_provider_->InitTaskGetHardwareClass(done_callback); | 253 chromeos_metrics_provider_->InitTaskGetHardwareClass( |
254 got_hardware_class_callback); | |
194 #else | 255 #else |
195 done_callback.Run(); | 256 got_hardware_class_callback.Run(); |
196 #endif | 257 #endif |
197 } | 258 } |
198 | 259 |
260 void ChromeMetricsServiceClient::LogPluginLoadingError( | |
261 const base::FilePath& plugin_path) { | |
262 #if defined(ENABLE_PLUGINS) | |
263 plugin_metrics_provider_->LogPluginLoadingError(plugin_path); | |
264 #else | |
265 NOTREACHED(); | |
266 #endif | |
Ilya Sherman
2014/06/02 21:52:37
nit: trailing comment
blundell
2014/06/06 13:06:28
Done.
| |
267 } | |
268 | |
269 void ChromeMetricsServiceClient::OnInitTaskGotHardwareClass() { | |
270 const base::Closure got_plugin_info_callback = | |
271 base::Bind(&ChromeMetricsServiceClient::OnInitTaskGotPluginInfo, | |
272 weak_ptr_factory_.GetWeakPtr()); | |
273 | |
274 #if defined(ENABLE_PLUGINS) | |
275 plugin_metrics_provider_->GetPluginInformation(got_plugin_info_callback); | |
276 #else | |
277 got_plugin_info_callback.Run(); | |
278 #endif | |
279 } | |
280 | |
281 void ChromeMetricsServiceClient::OnInitTaskGotPluginInfo() { | |
282 const base::Closure got_metrics_callback = | |
283 base::Bind(&ChromeMetricsServiceClient::OnInitTaskGotGoogleUpdateData, | |
284 weak_ptr_factory_.GetWeakPtr()); | |
285 | |
286 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) | |
287 google_update_metrics_provider_->GetGoogleUpdateData(got_metrics_callback); | |
288 #else | |
289 got_metrics_callback.Run(); | |
290 #endif | |
291 } | |
292 | |
293 void ChromeMetricsServiceClient::OnInitTaskGotGoogleUpdateData() { | |
294 // Start the next part of the init task: fetching performance data. This will | |
295 // call into |FinishedReceivingProfilerData()| when the task completes. | |
296 chrome_browser_metrics::TrackingSynchronizer::FetchProfilerDataAsynchronously( | |
297 weak_ptr_factory_.GetWeakPtr()); | |
298 } | |
299 | |
300 void ChromeMetricsServiceClient::ReceivedProfilerData( | |
301 const tracked_objects::ProcessDataSnapshot& process_data, | |
302 int process_type) { | |
303 profiler_metrics_provider_->RecordProfilerData(process_data, process_type); | |
304 } | |
305 | |
306 void ChromeMetricsServiceClient::FinishedReceivingProfilerData() { | |
307 finished_gathering_initial_metrics_callback_.Run(); | |
308 } | |
309 | |
199 void ChromeMetricsServiceClient::CollectFinalMetrics( | 310 void ChromeMetricsServiceClient::CollectFinalMetrics( |
200 const base::Closure& done_callback) { | 311 const base::Closure& done_callback) { |
201 DCHECK(thread_checker_.CalledOnValidThread()); | 312 DCHECK(thread_checker_.CalledOnValidThread()); |
202 | 313 |
203 collect_final_metrics_done_callback_ = done_callback; | 314 collect_final_metrics_done_callback_ = done_callback; |
204 | 315 |
205 // Begin the multi-step process of collecting memory usage histograms: | 316 // Begin the multi-step process of collecting memory usage histograms: |
206 // First spawn a task to collect the memory details; when that task is | 317 // First spawn a task to collect the memory details; when that task is |
207 // finished, it will call OnMemoryDetailCollectionDone. That will in turn | 318 // finished, it will call OnMemoryDetailCollectionDone. That will in turn |
208 // call HistogramSynchronization to collect histograms from all renderers and | 319 // call HistogramSynchronization to collect histograms from all renderers and |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
404 // Capture the histogram samples. | 515 // Capture the histogram samples. |
405 if (dumps_with_crash != 0) | 516 if (dumps_with_crash != 0) |
406 UMA_HISTOGRAM_COUNTS("Chrome.BrowserDumpsWithCrash", dumps_with_crash); | 517 UMA_HISTOGRAM_COUNTS("Chrome.BrowserDumpsWithCrash", dumps_with_crash); |
407 if (dumps_with_no_crash != 0) | 518 if (dumps_with_no_crash != 0) |
408 UMA_HISTOGRAM_COUNTS("Chrome.BrowserDumpsWithNoCrash", dumps_with_no_crash); | 519 UMA_HISTOGRAM_COUNTS("Chrome.BrowserDumpsWithNoCrash", dumps_with_no_crash); |
409 int total_dumps = dumps_with_crash + dumps_with_no_crash; | 520 int total_dumps = dumps_with_crash + dumps_with_no_crash; |
410 if (total_dumps != 0) | 521 if (total_dumps != 0) |
411 UMA_HISTOGRAM_COUNTS("Chrome.BrowserCrashDumpAttempts", total_dumps); | 522 UMA_HISTOGRAM_COUNTS("Chrome.BrowserCrashDumpAttempts", total_dumps); |
412 } | 523 } |
413 #endif // defined(OS_WIN) | 524 #endif // defined(OS_WIN) |
OLD | NEW |