| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/callback.h" | 12 #include "base/callback.h" |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
| 15 #include "base/logging.h" | 15 #include "base/logging.h" |
| 16 #include "base/memory/ptr_util.h" |
| 16 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
| 17 #include "base/path_service.h" | 18 #include "base/path_service.h" |
| 18 #include "base/rand_util.h" | 19 #include "base/rand_util.h" |
| 19 #include "base/strings/string16.h" | 20 #include "base/strings/string16.h" |
| 20 #include "base/threading/platform_thread.h" | 21 #include "base/threading/platform_thread.h" |
| 21 #include "build/build_config.h" | 22 #include "build/build_config.h" |
| 22 #include "chrome/browser/browser_process.h" | 23 #include "chrome/browser/browser_process.h" |
| 23 #include "chrome/browser/chrome_notification_types.h" | 24 #include "chrome/browser/chrome_notification_types.h" |
| 24 #include "chrome/browser/google/google_brand.h" | 25 #include "chrome/browser/google/google_brand.h" |
| 25 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" | 26 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h" |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 void RegisterInstallerFileMetricsPreferences(PrefRegistrySimple* registry) { | 140 void RegisterInstallerFileMetricsPreferences(PrefRegistrySimple* registry) { |
| 140 #if defined(OS_WIN) | 141 #if defined(OS_WIN) |
| 141 metrics::FileMetricsProvider::RegisterPrefs( | 142 metrics::FileMetricsProvider::RegisterPrefs( |
| 142 registry, installer::kSetupHistogramAllocatorName); | 143 registry, installer::kSetupHistogramAllocatorName); |
| 143 #endif | 144 #endif |
| 144 } | 145 } |
| 145 | 146 |
| 146 void RegisterInstallerFileMetricsProvider( | 147 void RegisterInstallerFileMetricsProvider( |
| 147 metrics::MetricsService* metrics_service) { | 148 metrics::MetricsService* metrics_service) { |
| 148 #if defined(OS_WIN) | 149 #if defined(OS_WIN) |
| 149 scoped_ptr<metrics::FileMetricsProvider> file_metrics( | 150 std::unique_ptr<metrics::FileMetricsProvider> file_metrics( |
| 150 new metrics::FileMetricsProvider( | 151 new metrics::FileMetricsProvider( |
| 151 content::BrowserThread::GetBlockingPool() | 152 content::BrowserThread::GetBlockingPool() |
| 152 ->GetTaskRunnerWithShutdownBehavior( | 153 ->GetTaskRunnerWithShutdownBehavior( |
| 153 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN), | 154 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN), |
| 154 g_browser_process->local_state())); | 155 g_browser_process->local_state())); |
| 155 base::FilePath program_dir; | 156 base::FilePath program_dir; |
| 156 base::PathService::Get(base::DIR_EXE, &program_dir); | 157 base::PathService::Get(base::DIR_EXE, &program_dir); |
| 157 file_metrics->RegisterFile( | 158 file_metrics->RegisterFile( |
| 158 program_dir.AppendASCII(installer::kSetupHistogramAllocatorName) | 159 program_dir.AppendASCII(installer::kSetupHistogramAllocatorName) |
| 159 .AddExtension(L".pma"), | 160 .AddExtension(L".pma"), |
| 160 metrics::FileMetricsProvider::FILE_HISTOGRAMS_ATOMIC, | 161 metrics::FileMetricsProvider::FILE_HISTOGRAMS_ATOMIC, |
| 161 installer::kSetupHistogramAllocatorName); | 162 installer::kSetupHistogramAllocatorName); |
| 162 metrics_service->RegisterMetricsProvider(std::move(file_metrics)); | 163 metrics_service->RegisterMetricsProvider(std::move(file_metrics)); |
| 163 #endif | 164 #endif |
| 164 } | 165 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 188 DCHECK(thread_checker_.CalledOnValidThread()); | 189 DCHECK(thread_checker_.CalledOnValidThread()); |
| 189 RecordCommandLineMetrics(); | 190 RecordCommandLineMetrics(); |
| 190 RegisterForNotifications(); | 191 RegisterForNotifications(); |
| 191 } | 192 } |
| 192 | 193 |
| 193 ChromeMetricsServiceClient::~ChromeMetricsServiceClient() { | 194 ChromeMetricsServiceClient::~ChromeMetricsServiceClient() { |
| 194 DCHECK(thread_checker_.CalledOnValidThread()); | 195 DCHECK(thread_checker_.CalledOnValidThread()); |
| 195 } | 196 } |
| 196 | 197 |
| 197 // static | 198 // static |
| 198 scoped_ptr<ChromeMetricsServiceClient> ChromeMetricsServiceClient::Create( | 199 std::unique_ptr<ChromeMetricsServiceClient> ChromeMetricsServiceClient::Create( |
| 199 metrics::MetricsStateManager* state_manager, | 200 metrics::MetricsStateManager* state_manager, |
| 200 PrefService* local_state) { | 201 PrefService* local_state) { |
| 201 // Perform two-phase initialization so that |client->metrics_service_| only | 202 // Perform two-phase initialization so that |client->metrics_service_| only |
| 202 // receives pointers to fully constructed objects. | 203 // receives pointers to fully constructed objects. |
| 203 scoped_ptr<ChromeMetricsServiceClient> client( | 204 std::unique_ptr<ChromeMetricsServiceClient> client( |
| 204 new ChromeMetricsServiceClient(state_manager)); | 205 new ChromeMetricsServiceClient(state_manager)); |
| 205 client->Initialize(); | 206 client->Initialize(); |
| 206 | 207 |
| 207 return client; | 208 return client; |
| 208 } | 209 } |
| 209 | 210 |
| 210 // static | 211 // static |
| 211 void ChromeMetricsServiceClient::RegisterPrefs(PrefRegistrySimple* registry) { | 212 void ChromeMetricsServiceClient::RegisterPrefs(PrefRegistrySimple* registry) { |
| 212 metrics::MetricsService::RegisterPrefs(registry); | 213 metrics::MetricsService::RegisterPrefs(registry); |
| 213 metrics::StabilityMetricsHelper::RegisterPrefs(registry); | 214 metrics::StabilityMetricsHelper::RegisterPrefs(registry); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 if (ShouldIncludeProfilerDataInLog()) { | 293 if (ShouldIncludeProfilerDataInLog()) { |
| 293 // Fetch profiler data. This will call into | 294 // Fetch profiler data. This will call into |
| 294 // |FinishedReceivingProfilerData()| when the task completes. | 295 // |FinishedReceivingProfilerData()| when the task completes. |
| 295 metrics::TrackingSynchronizer::FetchProfilerDataAsynchronously( | 296 metrics::TrackingSynchronizer::FetchProfilerDataAsynchronously( |
| 296 weak_ptr_factory_.GetWeakPtr()); | 297 weak_ptr_factory_.GetWeakPtr()); |
| 297 } else { | 298 } else { |
| 298 CollectFinalHistograms(); | 299 CollectFinalHistograms(); |
| 299 } | 300 } |
| 300 } | 301 } |
| 301 | 302 |
| 302 scoped_ptr<metrics::MetricsLogUploader> | 303 std::unique_ptr<metrics::MetricsLogUploader> |
| 303 ChromeMetricsServiceClient::CreateUploader( | 304 ChromeMetricsServiceClient::CreateUploader( |
| 304 const base::Callback<void(int)>& on_upload_complete) { | 305 const base::Callback<void(int)>& on_upload_complete) { |
| 305 return scoped_ptr<metrics::MetricsLogUploader>( | 306 return std::unique_ptr<metrics::MetricsLogUploader>( |
| 306 new metrics::NetMetricsLogUploader( | 307 new metrics::NetMetricsLogUploader( |
| 307 g_browser_process->system_request_context(), | 308 g_browser_process->system_request_context(), |
| 308 metrics::kDefaultMetricsServerUrl, | 309 metrics::kDefaultMetricsServerUrl, metrics::kDefaultMetricsMimeType, |
| 309 metrics::kDefaultMetricsMimeType, | |
| 310 on_upload_complete)); | 310 on_upload_complete)); |
| 311 } | 311 } |
| 312 | 312 |
| 313 base::TimeDelta ChromeMetricsServiceClient::GetStandardUploadInterval() { | 313 base::TimeDelta ChromeMetricsServiceClient::GetStandardUploadInterval() { |
| 314 #if defined(OS_ANDROID) | 314 #if defined(OS_ANDROID) |
| 315 if (IsCellularLogicEnabled()) | 315 if (IsCellularLogicEnabled()) |
| 316 return base::TimeDelta::FromSeconds(kStandardUploadIntervalCellularSeconds); | 316 return base::TimeDelta::FromSeconds(kStandardUploadIntervalCellularSeconds); |
| 317 #endif | 317 #endif |
| 318 return base::TimeDelta::FromSeconds(kStandardUploadIntervalSeconds); | 318 return base::TimeDelta::FromSeconds(kStandardUploadIntervalSeconds); |
| 319 } | 319 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 PrefService* local_state = g_browser_process->local_state(); | 353 PrefService* local_state = g_browser_process->local_state(); |
| 354 local_state->ClearPref(metrics::prefs::kMetricsInitialLogs); | 354 local_state->ClearPref(metrics::prefs::kMetricsInitialLogs); |
| 355 local_state->ClearPref(metrics::prefs::kMetricsOngoingLogs); | 355 local_state->ClearPref(metrics::prefs::kMetricsOngoingLogs); |
| 356 } | 356 } |
| 357 | 357 |
| 358 metrics_service_.reset(new metrics::MetricsService( | 358 metrics_service_.reset(new metrics::MetricsService( |
| 359 metrics_state_manager_, this, g_browser_process->local_state())); | 359 metrics_state_manager_, this, g_browser_process->local_state())); |
| 360 | 360 |
| 361 // Gets access to persistent metrics shared by sub-processes. | 361 // Gets access to persistent metrics shared by sub-processes. |
| 362 metrics_service_->RegisterMetricsProvider( | 362 metrics_service_->RegisterMetricsProvider( |
| 363 scoped_ptr<metrics::MetricsProvider>(new SubprocessMetricsProvider())); | 363 std::unique_ptr<metrics::MetricsProvider>( |
| 364 new SubprocessMetricsProvider())); |
| 364 | 365 |
| 365 // Register metrics providers. | 366 // Register metrics providers. |
| 366 #if defined(ENABLE_EXTENSIONS) | 367 #if defined(ENABLE_EXTENSIONS) |
| 367 metrics_service_->RegisterMetricsProvider( | 368 metrics_service_->RegisterMetricsProvider( |
| 368 scoped_ptr<metrics::MetricsProvider>( | 369 std::unique_ptr<metrics::MetricsProvider>( |
| 369 new ExtensionsMetricsProvider(metrics_state_manager_))); | 370 new ExtensionsMetricsProvider(metrics_state_manager_))); |
| 370 #endif | 371 #endif |
| 371 metrics_service_->RegisterMetricsProvider( | 372 metrics_service_->RegisterMetricsProvider( |
| 372 scoped_ptr<metrics::MetricsProvider>(new metrics::NetworkMetricsProvider( | 373 std::unique_ptr<metrics::MetricsProvider>( |
| 373 content::BrowserThread::GetBlockingPool()))); | 374 new metrics::NetworkMetricsProvider( |
| 375 content::BrowserThread::GetBlockingPool()))); |
| 374 | 376 |
| 375 // Currently, we configure OmniboxMetricsProvider to not log events to UMA | 377 // Currently, we configure OmniboxMetricsProvider to not log events to UMA |
| 376 // if there is a single incognito session visible. In the future, it may | 378 // if there is a single incognito session visible. In the future, it may |
| 377 // be worth revisiting this to still log events from non-incognito sessions. | 379 // be worth revisiting this to still log events from non-incognito sessions. |
| 378 metrics_service_->RegisterMetricsProvider( | 380 metrics_service_->RegisterMetricsProvider( |
| 379 scoped_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider( | 381 std::unique_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider( |
| 380 base::Bind(&chrome::IsOffTheRecordSessionActive)))); | 382 base::Bind(&chrome::IsOffTheRecordSessionActive)))); |
| 381 metrics_service_->RegisterMetricsProvider( | 383 metrics_service_->RegisterMetricsProvider( |
| 382 scoped_ptr<metrics::MetricsProvider>(new ChromeStabilityMetricsProvider( | 384 std::unique_ptr<metrics::MetricsProvider>( |
| 383 g_browser_process->local_state()))); | 385 new ChromeStabilityMetricsProvider( |
| 386 g_browser_process->local_state()))); |
| 384 metrics_service_->RegisterMetricsProvider( | 387 metrics_service_->RegisterMetricsProvider( |
| 385 scoped_ptr<metrics::MetricsProvider>(new metrics::GPUMetricsProvider)); | 388 std::unique_ptr<metrics::MetricsProvider>( |
| 389 new metrics::GPUMetricsProvider)); |
| 386 metrics_service_->RegisterMetricsProvider( | 390 metrics_service_->RegisterMetricsProvider( |
| 387 scoped_ptr<metrics::MetricsProvider>( | 391 std::unique_ptr<metrics::MetricsProvider>( |
| 388 new metrics::ScreenInfoMetricsProvider)); | 392 new metrics::ScreenInfoMetricsProvider)); |
| 389 | 393 |
| 390 RegisterInstallerFileMetricsProvider(metrics_service_.get()); | 394 RegisterInstallerFileMetricsProvider(metrics_service_.get()); |
| 391 | 395 |
| 392 drive_metrics_provider_ = new metrics::DriveMetricsProvider( | 396 drive_metrics_provider_ = new metrics::DriveMetricsProvider( |
| 393 content::BrowserThread::GetMessageLoopProxyForThread( | 397 content::BrowserThread::GetMessageLoopProxyForThread( |
| 394 content::BrowserThread::FILE), | 398 content::BrowserThread::FILE), |
| 395 chrome::FILE_LOCAL_STATE); | 399 chrome::FILE_LOCAL_STATE); |
| 396 metrics_service_->RegisterMetricsProvider( | 400 metrics_service_->RegisterMetricsProvider( |
| 397 scoped_ptr<metrics::MetricsProvider>(drive_metrics_provider_)); | 401 std::unique_ptr<metrics::MetricsProvider>(drive_metrics_provider_)); |
| 398 | 402 |
| 399 profiler_metrics_provider_ = | 403 profiler_metrics_provider_ = |
| 400 new metrics::ProfilerMetricsProvider(base::Bind(&IsCellularLogicEnabled)); | 404 new metrics::ProfilerMetricsProvider(base::Bind(&IsCellularLogicEnabled)); |
| 401 metrics_service_->RegisterMetricsProvider( | 405 metrics_service_->RegisterMetricsProvider( |
| 402 scoped_ptr<metrics::MetricsProvider>(profiler_metrics_provider_)); | 406 std::unique_ptr<metrics::MetricsProvider>(profiler_metrics_provider_)); |
| 403 | 407 |
| 404 metrics_service_->RegisterMetricsProvider( | 408 metrics_service_->RegisterMetricsProvider( |
| 405 scoped_ptr<metrics::MetricsProvider>( | 409 std::unique_ptr<metrics::MetricsProvider>( |
| 406 new metrics::CallStackProfileMetricsProvider)); | 410 new metrics::CallStackProfileMetricsProvider)); |
| 407 | 411 |
| 408 #if BUILDFLAG(ANDROID_JAVA_UI) | 412 #if BUILDFLAG(ANDROID_JAVA_UI) |
| 409 metrics_service_->RegisterMetricsProvider( | 413 metrics_service_->RegisterMetricsProvider( |
| 410 scoped_ptr<metrics::MetricsProvider>( | 414 std::unique_ptr<metrics::MetricsProvider>( |
| 411 new AndroidMetricsProvider(g_browser_process->local_state()))); | 415 new AndroidMetricsProvider(g_browser_process->local_state()))); |
| 412 #endif // BUILDFLAG(ANDROID_JAVA_UI) | 416 #endif // BUILDFLAG(ANDROID_JAVA_UI) |
| 413 | 417 |
| 414 #if defined(OS_WIN) | 418 #if defined(OS_WIN) |
| 415 google_update_metrics_provider_ = new GoogleUpdateMetricsProviderWin; | 419 google_update_metrics_provider_ = new GoogleUpdateMetricsProviderWin; |
| 416 metrics_service_->RegisterMetricsProvider( | 420 metrics_service_->RegisterMetricsProvider( |
| 417 scoped_ptr<metrics::MetricsProvider>(google_update_metrics_provider_)); | 421 std::unique_ptr<metrics::MetricsProvider>( |
| 422 google_update_metrics_provider_)); |
| 418 | 423 |
| 419 metrics_service_->RegisterMetricsProvider( | 424 metrics_service_->RegisterMetricsProvider( |
| 420 scoped_ptr<metrics::MetricsProvider>( | 425 std::unique_ptr<metrics::MetricsProvider>( |
| 421 new browser_watcher::WatcherMetricsProviderWin( | 426 new browser_watcher::WatcherMetricsProviderWin( |
| 422 chrome::kBrowserExitCodesRegistryPath, | 427 chrome::kBrowserExitCodesRegistryPath, |
| 423 content::BrowserThread::GetBlockingPool()))); | 428 content::BrowserThread::GetBlockingPool()))); |
| 424 #endif // defined(OS_WIN) | 429 #endif // defined(OS_WIN) |
| 425 | 430 |
| 426 #if defined(ENABLE_PLUGINS) | 431 #if defined(ENABLE_PLUGINS) |
| 427 plugin_metrics_provider_ = | 432 plugin_metrics_provider_ = |
| 428 new PluginMetricsProvider(g_browser_process->local_state()); | 433 new PluginMetricsProvider(g_browser_process->local_state()); |
| 429 metrics_service_->RegisterMetricsProvider( | 434 metrics_service_->RegisterMetricsProvider( |
| 430 scoped_ptr<metrics::MetricsProvider>(plugin_metrics_provider_)); | 435 std::unique_ptr<metrics::MetricsProvider>(plugin_metrics_provider_)); |
| 431 #endif // defined(ENABLE_PLUGINS) | 436 #endif // defined(ENABLE_PLUGINS) |
| 432 | 437 |
| 433 #if defined(OS_CHROMEOS) | 438 #if defined(OS_CHROMEOS) |
| 434 ChromeOSMetricsProvider* chromeos_metrics_provider = | 439 ChromeOSMetricsProvider* chromeos_metrics_provider = |
| 435 new ChromeOSMetricsProvider; | 440 new ChromeOSMetricsProvider; |
| 436 chromeos_metrics_provider_ = chromeos_metrics_provider; | 441 chromeos_metrics_provider_ = chromeos_metrics_provider; |
| 437 metrics_service_->RegisterMetricsProvider( | 442 metrics_service_->RegisterMetricsProvider( |
| 438 scoped_ptr<metrics::MetricsProvider>(chromeos_metrics_provider)); | 443 std::unique_ptr<metrics::MetricsProvider>(chromeos_metrics_provider)); |
| 439 | 444 |
| 440 SigninStatusMetricsProviderChromeOS* signin_metrics_provider_cros = | 445 SigninStatusMetricsProviderChromeOS* signin_metrics_provider_cros = |
| 441 new SigninStatusMetricsProviderChromeOS; | 446 new SigninStatusMetricsProviderChromeOS; |
| 442 metrics_service_->RegisterMetricsProvider( | 447 metrics_service_->RegisterMetricsProvider( |
| 443 scoped_ptr<metrics::MetricsProvider>(signin_metrics_provider_cros)); | 448 std::unique_ptr<metrics::MetricsProvider>(signin_metrics_provider_cros)); |
| 444 #endif // defined(OS_CHROMEOS) | 449 #endif // defined(OS_CHROMEOS) |
| 445 | 450 |
| 446 #if !defined(OS_CHROMEOS) | 451 #if !defined(OS_CHROMEOS) |
| 447 metrics_service_->RegisterMetricsProvider( | 452 metrics_service_->RegisterMetricsProvider( |
| 448 scoped_ptr<metrics::MetricsProvider>( | 453 std::unique_ptr<metrics::MetricsProvider>( |
| 449 SigninStatusMetricsProvider::CreateInstance( | 454 SigninStatusMetricsProvider::CreateInstance(base::WrapUnique( |
| 450 make_scoped_ptr(new ChromeSigninStatusMetricsProviderDelegate)))); | 455 new ChromeSigninStatusMetricsProviderDelegate)))); |
| 451 #endif // !defined(OS_CHROMEOS) | 456 #endif // !defined(OS_CHROMEOS) |
| 452 | 457 |
| 453 metrics_service_->RegisterMetricsProvider( | 458 metrics_service_->RegisterMetricsProvider( |
| 454 scoped_ptr<metrics::MetricsProvider>( | 459 std::unique_ptr<metrics::MetricsProvider>( |
| 455 new sync_driver::DeviceCountMetricsProvider(base::Bind( | 460 new sync_driver::DeviceCountMetricsProvider(base::Bind( |
| 456 &browser_sync::ChromeSyncClient::GetDeviceInfoTrackers)))); | 461 &browser_sync::ChromeSyncClient::GetDeviceInfoTrackers)))); |
| 457 | 462 |
| 458 // Clear stability metrics if it is the first time cellular upload logic | 463 // Clear stability metrics if it is the first time cellular upload logic |
| 459 // should apply to avoid sudden bulk uploads. It needs to be done after all | 464 // should apply to avoid sudden bulk uploads. It needs to be done after all |
| 460 // providers are registered. | 465 // providers are registered. |
| 461 if (ShouldClearSavedMetrics()) | 466 if (ShouldClearSavedMetrics()) |
| 462 metrics_service_->ClearSavedStabilityMetrics(); | 467 metrics_service_->ClearSavedStabilityMetrics(); |
| 463 } | 468 } |
| 464 | 469 |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 } | 691 } |
| 687 } | 692 } |
| 688 | 693 |
| 689 void ChromeMetricsServiceClient::OnURLOpenedFromOmnibox(OmniboxLog* log) { | 694 void ChromeMetricsServiceClient::OnURLOpenedFromOmnibox(OmniboxLog* log) { |
| 690 metrics_service_->OnApplicationNotIdle(); | 695 metrics_service_->OnApplicationNotIdle(); |
| 691 } | 696 } |
| 692 | 697 |
| 693 bool ChromeMetricsServiceClient::IsUMACellularUploadLogicEnabled() { | 698 bool ChromeMetricsServiceClient::IsUMACellularUploadLogicEnabled() { |
| 694 return IsCellularLogicEnabled(); | 699 return IsCellularLogicEnabled(); |
| 695 } | 700 } |
| OLD | NEW |