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/files/file_path.h" |
12 #include "base/logging.h" | 13 #include "base/logging.h" |
13 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
| 15 #include "base/prefs/pref_registry_simple.h" |
14 #include "base/prefs/pref_service.h" | 16 #include "base/prefs/pref_service.h" |
15 #include "base/strings/string16.h" | 17 #include "base/strings/string16.h" |
16 #include "base/strings/string_util.h" | 18 #include "base/strings/string_util.h" |
17 #include "base/strings/utf_string_conversions.h" | 19 #include "base/strings/utf_string_conversions.h" |
18 #include "base/threading/platform_thread.h" | 20 #include "base/threading/platform_thread.h" |
19 #include "base/time/time.h" | 21 #include "base/time/time.h" |
20 #include "chrome/browser/browser_process.h" | 22 #include "chrome/browser/browser_process.h" |
21 #include "chrome/browser/chrome_notification_types.h" | 23 #include "chrome/browser/chrome_notification_types.h" |
22 #include "chrome/browser/google/google_brand.h" | 24 #include "chrome/browser/google/google_brand.h" |
23 #include "chrome/browser/memory_details.h" | 25 #include "chrome/browser/memory_details.h" |
| 26 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" |
24 #include "chrome/browser/metrics/extensions_metrics_provider.h" | 27 #include "chrome/browser/metrics/extensions_metrics_provider.h" |
| 28 #include "chrome/browser/metrics/gpu_metrics_provider.h" |
25 #include "chrome/browser/metrics/metrics_service.h" | 29 #include "chrome/browser/metrics/metrics_service.h" |
| 30 #include "chrome/browser/metrics/network_metrics_provider.h" |
| 31 #include "chrome/browser/metrics/omnibox_metrics_provider.h" |
| 32 #include "chrome/browser/metrics/profiler_metrics_provider.h" |
| 33 #include "chrome/browser/metrics/tracking_synchronizer.h" |
26 #include "chrome/browser/ui/browser_otr_state.h" | 34 #include "chrome/browser/ui/browser_otr_state.h" |
27 #include "chrome/common/chrome_constants.h" | 35 #include "chrome/common/chrome_constants.h" |
28 #include "chrome/common/chrome_switches.h" | 36 #include "chrome/common/chrome_switches.h" |
29 #include "chrome/common/chrome_version_info.h" | 37 #include "chrome/common/chrome_version_info.h" |
30 #include "chrome/common/crash_keys.h" | 38 #include "chrome/common/crash_keys.h" |
31 #include "chrome/common/pref_names.h" | 39 #include "chrome/common/pref_names.h" |
32 #include "chrome/common/render_messages.h" | 40 #include "chrome/common/render_messages.h" |
33 #include "components/metrics/net/net_metrics_log_uploader.h" | 41 #include "components/metrics/net/net_metrics_log_uploader.h" |
34 #include "content/public/browser/browser_thread.h" | 42 #include "content/public/browser/browser_thread.h" |
35 #include "content/public/browser/histogram_fetcher.h" | 43 #include "content/public/browser/histogram_fetcher.h" |
36 #include "content/public/browser/notification_service.h" | 44 #include "content/public/browser/notification_service.h" |
37 #include "content/public/browser/render_process_host.h" | 45 #include "content/public/browser/render_process_host.h" |
38 | 46 |
39 #if !defined(OS_ANDROID) | 47 #if defined(OS_ANDROID) |
| 48 #include "chrome/browser/metrics/android_metrics_provider.h" |
| 49 #else |
40 #include "chrome/browser/service_process/service_process_control.h" | 50 #include "chrome/browser/service_process/service_process_control.h" |
41 #endif | 51 #endif |
42 | 52 |
| 53 #if defined(ENABLE_PLUGINS) |
| 54 #include "chrome/browser/metrics/plugin_metrics_provider.h" |
| 55 #endif |
| 56 |
43 #if defined(OS_CHROMEOS) | 57 #if defined(OS_CHROMEOS) |
44 #include "chrome/browser/metrics/chromeos_metrics_provider.h" | 58 #include "chrome/browser/metrics/chromeos_metrics_provider.h" |
45 #endif | 59 #endif |
46 | 60 |
47 #if defined(OS_WIN) | 61 #if defined(OS_WIN) |
48 #include <windows.h> | 62 #include <windows.h> |
49 #include "base/win/registry.h" | 63 #include "base/win/registry.h" |
50 #include "chrome/browser/metrics/google_update_metrics_provider_win.h" | 64 #include "chrome/browser/metrics/google_update_metrics_provider_win.h" |
51 #endif | 65 #endif |
52 | 66 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 PrefService* local_state) { | 135 PrefService* local_state) { |
122 // Perform two-phase initialization so that |client->metrics_service_| only | 136 // Perform two-phase initialization so that |client->metrics_service_| only |
123 // receives pointers to fully constructed objects. | 137 // receives pointers to fully constructed objects. |
124 scoped_ptr<ChromeMetricsServiceClient> client( | 138 scoped_ptr<ChromeMetricsServiceClient> client( |
125 new ChromeMetricsServiceClient(state_manager)); | 139 new ChromeMetricsServiceClient(state_manager)); |
126 client->Initialize(); | 140 client->Initialize(); |
127 | 141 |
128 return client.Pass(); | 142 return client.Pass(); |
129 } | 143 } |
130 | 144 |
131 void ChromeMetricsServiceClient::Initialize() { | 145 // static |
132 metrics_service_.reset(new MetricsService( | 146 void ChromeMetricsServiceClient::RegisterPrefs(PrefRegistrySimple* registry) { |
133 metrics_state_manager_, this, g_browser_process->local_state())); | 147 MetricsService::RegisterPrefs(registry); |
| 148 ChromeStabilityMetricsProvider::RegisterPrefs(registry); |
134 | 149 |
135 // Register metrics providers. | 150 #if defined(OS_ANDROID) |
136 metrics_service_->RegisterMetricsProvider( | 151 AndroidMetricsProvider::RegisterPrefs(registry); |
137 scoped_ptr<metrics::MetricsProvider>( | 152 #endif // defined(OS_ANDROID) |
138 new ExtensionsMetricsProvider(metrics_state_manager_))); | |
139 | 153 |
140 #if defined(OS_CHROMEOS) | 154 #if defined(ENABLE_PLUGINS) |
141 ChromeOSMetricsProvider* chromeos_metrics_provider = | 155 PluginMetricsProvider::RegisterPrefs(registry); |
142 new ChromeOSMetricsProvider; | 156 #endif // defined(ENABLE_PLUGINS) |
143 chromeos_metrics_provider_ = chromeos_metrics_provider; | |
144 metrics_service_->RegisterMetricsProvider( | |
145 scoped_ptr<metrics::MetricsProvider>(chromeos_metrics_provider)); | |
146 #endif | |
147 } | 157 } |
148 | 158 |
149 void ChromeMetricsServiceClient::SetClientID(const std::string& client_id) { | 159 void ChromeMetricsServiceClient::SetClientID(const std::string& client_id) { |
150 crash_keys::SetClientID(client_id); | 160 crash_keys::SetClientID(client_id); |
151 } | 161 } |
152 | 162 |
153 bool ChromeMetricsServiceClient::IsOffTheRecordSessionActive() { | 163 bool ChromeMetricsServiceClient::IsOffTheRecordSessionActive() { |
154 return !chrome::IsOffTheRecordSessionActive(); | 164 return !chrome::IsOffTheRecordSessionActive(); |
155 } | 165 } |
156 | 166 |
(...skipping 29 matching lines...) Expand all Loading... |
186 return g_browser_process->local_state()->GetInt64(prefs::kInstallDate); | 196 return g_browser_process->local_state()->GetInt64(prefs::kInstallDate); |
187 } | 197 } |
188 | 198 |
189 void ChromeMetricsServiceClient::OnLogUploadComplete() { | 199 void ChromeMetricsServiceClient::OnLogUploadComplete() { |
190 // Collect network stats after each UMA upload. | 200 // Collect network stats after each UMA upload. |
191 network_stats_uploader_.CollectAndReportNetworkStats(); | 201 network_stats_uploader_.CollectAndReportNetworkStats(); |
192 } | 202 } |
193 | 203 |
194 void ChromeMetricsServiceClient::StartGatheringMetrics( | 204 void ChromeMetricsServiceClient::StartGatheringMetrics( |
195 const base::Closure& done_callback) { | 205 const base::Closure& done_callback) { |
196 // TODO(blundell): Move all metrics gathering tasks from MetricsService to | 206 finished_gathering_initial_metrics_callback_ = done_callback; |
197 // here. | 207 base::Closure got_hardware_class_callback = |
| 208 base::Bind(&ChromeMetricsServiceClient::OnInitTaskGotHardwareClass, |
| 209 weak_ptr_factory_.GetWeakPtr()); |
198 #if defined(OS_CHROMEOS) | 210 #if defined(OS_CHROMEOS) |
199 chromeos_metrics_provider_->InitTaskGetHardwareClass(done_callback); | 211 chromeos_metrics_provider_->InitTaskGetHardwareClass( |
| 212 got_hardware_class_callback); |
200 #else | 213 #else |
201 done_callback.Run(); | 214 got_hardware_class_callback.Run(); |
202 #endif | 215 #endif // defined(OS_CHROMEOS) |
203 } | 216 } |
204 | 217 |
205 void ChromeMetricsServiceClient::CollectFinalMetrics( | 218 void ChromeMetricsServiceClient::CollectFinalMetrics( |
206 const base::Closure& done_callback) { | 219 const base::Closure& done_callback) { |
207 DCHECK(thread_checker_.CalledOnValidThread()); | 220 DCHECK(thread_checker_.CalledOnValidThread()); |
208 | 221 |
209 collect_final_metrics_done_callback_ = done_callback; | 222 collect_final_metrics_done_callback_ = done_callback; |
210 | 223 |
211 // Begin the multi-step process of collecting memory usage histograms: | 224 // Begin the multi-step process of collecting memory usage histograms: |
212 // First spawn a task to collect the memory details; when that task is | 225 // First spawn a task to collect the memory details; when that task is |
(...skipping 23 matching lines...) Expand all Loading... |
236 ChromeMetricsServiceClient::CreateUploader( | 249 ChromeMetricsServiceClient::CreateUploader( |
237 const std::string& server_url, | 250 const std::string& server_url, |
238 const std::string& mime_type, | 251 const std::string& mime_type, |
239 const base::Callback<void(int)>& on_upload_complete) { | 252 const base::Callback<void(int)>& on_upload_complete) { |
240 return scoped_ptr<metrics::MetricsLogUploader>( | 253 return scoped_ptr<metrics::MetricsLogUploader>( |
241 new metrics::NetMetricsLogUploader( | 254 new metrics::NetMetricsLogUploader( |
242 g_browser_process->system_request_context(), server_url, mime_type, | 255 g_browser_process->system_request_context(), server_url, mime_type, |
243 on_upload_complete)); | 256 on_upload_complete)); |
244 } | 257 } |
245 | 258 |
| 259 void ChromeMetricsServiceClient::LogPluginLoadingError( |
| 260 const base::FilePath& plugin_path) { |
| 261 #if defined(ENABLE_PLUGINS) |
| 262 plugin_metrics_provider_->LogPluginLoadingError(plugin_path); |
| 263 #else |
| 264 NOTREACHED(); |
| 265 #endif // defined(ENABLE_PLUGINS) |
| 266 } |
| 267 |
| 268 void ChromeMetricsServiceClient::Initialize() { |
| 269 metrics_service_.reset(new MetricsService( |
| 270 metrics_state_manager_, this, g_browser_process->local_state())); |
| 271 |
| 272 // Register metrics providers. |
| 273 metrics_service_->RegisterMetricsProvider( |
| 274 scoped_ptr<metrics::MetricsProvider>( |
| 275 new ExtensionsMetricsProvider(metrics_state_manager_))); |
| 276 metrics_service_->RegisterMetricsProvider( |
| 277 scoped_ptr<metrics::MetricsProvider>(new NetworkMetricsProvider)); |
| 278 metrics_service_->RegisterMetricsProvider( |
| 279 scoped_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider)); |
| 280 metrics_service_->RegisterMetricsProvider( |
| 281 scoped_ptr<metrics::MetricsProvider>(new ChromeStabilityMetricsProvider)); |
| 282 metrics_service_->RegisterMetricsProvider( |
| 283 scoped_ptr<metrics::MetricsProvider>(new GPUMetricsProvider())); |
| 284 profiler_metrics_provider_ = new ProfilerMetricsProvider; |
| 285 metrics_service_->RegisterMetricsProvider( |
| 286 scoped_ptr<metrics::MetricsProvider>(profiler_metrics_provider_)); |
| 287 |
| 288 #if defined(OS_ANDROID) |
| 289 metrics_service_->RegisterMetricsProvider( |
| 290 scoped_ptr<metrics::MetricsProvider>( |
| 291 new AndroidMetricsProvider(g_browser_process->local_state()))); |
| 292 #endif // defined(OS_ANDROID) |
| 293 |
| 294 #if defined(OS_WIN) |
| 295 google_update_metrics_provider_ = new GoogleUpdateMetricsProviderWin; |
| 296 metrics_service_->RegisterMetricsProvider( |
| 297 scoped_ptr<metrics::MetricsProvider>(google_update_metrics_provider_)); |
| 298 #endif // defined(OS_WIN) |
| 299 |
| 300 #if defined(ENABLE_PLUGINS) |
| 301 plugin_metrics_provider_ = |
| 302 new PluginMetricsProvider(g_browser_process->local_state()); |
| 303 metrics_service_->RegisterMetricsProvider( |
| 304 scoped_ptr<metrics::MetricsProvider>(plugin_metrics_provider_)); |
| 305 #endif // defined(ENABLE_PLUGINS) |
| 306 |
| 307 #if defined(OS_CHROMEOS) |
| 308 ChromeOSMetricsProvider* chromeos_metrics_provider = |
| 309 new ChromeOSMetricsProvider; |
| 310 chromeos_metrics_provider_ = chromeos_metrics_provider; |
| 311 metrics_service_->RegisterMetricsProvider( |
| 312 scoped_ptr<metrics::MetricsProvider>(chromeos_metrics_provider)); |
| 313 #endif // defined(OS_CHROMEOS) |
| 314 } |
| 315 |
| 316 void ChromeMetricsServiceClient::OnInitTaskGotHardwareClass() { |
| 317 const base::Closure got_plugin_info_callback = |
| 318 base::Bind(&ChromeMetricsServiceClient::OnInitTaskGotPluginInfo, |
| 319 weak_ptr_factory_.GetWeakPtr()); |
| 320 |
| 321 #if defined(ENABLE_PLUGINS) |
| 322 plugin_metrics_provider_->GetPluginInformation(got_plugin_info_callback); |
| 323 #else |
| 324 got_plugin_info_callback.Run(); |
| 325 #endif // defined(ENABLE_PLUGINS) |
| 326 } |
| 327 |
| 328 void ChromeMetricsServiceClient::OnInitTaskGotPluginInfo() { |
| 329 const base::Closure got_metrics_callback = |
| 330 base::Bind(&ChromeMetricsServiceClient::OnInitTaskGotGoogleUpdateData, |
| 331 weak_ptr_factory_.GetWeakPtr()); |
| 332 |
| 333 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) |
| 334 google_update_metrics_provider_->GetGoogleUpdateData(got_metrics_callback); |
| 335 #else |
| 336 got_metrics_callback.Run(); |
| 337 #endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) |
| 338 } |
| 339 |
| 340 void ChromeMetricsServiceClient::OnInitTaskGotGoogleUpdateData() { |
| 341 // Start the next part of the init task: fetching performance data. This will |
| 342 // call into |FinishedReceivingProfilerData()| when the task completes. |
| 343 chrome_browser_metrics::TrackingSynchronizer::FetchProfilerDataAsynchronously( |
| 344 weak_ptr_factory_.GetWeakPtr()); |
| 345 } |
| 346 |
| 347 void ChromeMetricsServiceClient::ReceivedProfilerData( |
| 348 const tracked_objects::ProcessDataSnapshot& process_data, |
| 349 int process_type) { |
| 350 profiler_metrics_provider_->RecordProfilerData(process_data, process_type); |
| 351 } |
| 352 |
| 353 void ChromeMetricsServiceClient::FinishedReceivingProfilerData() { |
| 354 finished_gathering_initial_metrics_callback_.Run(); |
| 355 } |
| 356 |
246 void ChromeMetricsServiceClient::OnMemoryDetailCollectionDone() { | 357 void ChromeMetricsServiceClient::OnMemoryDetailCollectionDone() { |
247 DCHECK(thread_checker_.CalledOnValidThread()); | 358 DCHECK(thread_checker_.CalledOnValidThread()); |
248 | 359 |
249 // This function should only be called as the callback from an ansynchronous | 360 // This function should only be called as the callback from an ansynchronous |
250 // step. | 361 // step. |
251 DCHECK(waiting_for_collect_final_metrics_step_); | 362 DCHECK(waiting_for_collect_final_metrics_step_); |
252 | 363 |
253 // Create a callback_task for OnHistogramSynchronizationDone. | 364 // Create a callback_task for OnHistogramSynchronizationDone. |
254 base::Closure callback = base::Bind( | 365 base::Closure callback = base::Bind( |
255 &ChromeMetricsServiceClient::OnHistogramSynchronizationDone, | 366 &ChromeMetricsServiceClient::OnHistogramSynchronizationDone, |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 // Capture the histogram samples. | 521 // Capture the histogram samples. |
411 if (dumps_with_crash != 0) | 522 if (dumps_with_crash != 0) |
412 UMA_HISTOGRAM_COUNTS("Chrome.BrowserDumpsWithCrash", dumps_with_crash); | 523 UMA_HISTOGRAM_COUNTS("Chrome.BrowserDumpsWithCrash", dumps_with_crash); |
413 if (dumps_with_no_crash != 0) | 524 if (dumps_with_no_crash != 0) |
414 UMA_HISTOGRAM_COUNTS("Chrome.BrowserDumpsWithNoCrash", dumps_with_no_crash); | 525 UMA_HISTOGRAM_COUNTS("Chrome.BrowserDumpsWithNoCrash", dumps_with_no_crash); |
415 int total_dumps = dumps_with_crash + dumps_with_no_crash; | 526 int total_dumps = dumps_with_crash + dumps_with_no_crash; |
416 if (total_dumps != 0) | 527 if (total_dumps != 0) |
417 UMA_HISTOGRAM_COUNTS("Chrome.BrowserCrashDumpAttempts", total_dumps); | 528 UMA_HISTOGRAM_COUNTS("Chrome.BrowserCrashDumpAttempts", total_dumps); |
418 } | 529 } |
419 #endif // defined(OS_WIN) | 530 #endif // defined(OS_WIN) |
OLD | NEW |