| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 //------------------------------------------------------------------------------ | 5 //------------------------------------------------------------------------------ |
| 6 // Description of the life cycle of a instance of MetricsService. | 6 // Description of the life cycle of a instance of MetricsService. |
| 7 // | 7 // |
| 8 // OVERVIEW | 8 // OVERVIEW |
| 9 // | 9 // |
| 10 // A MetricsService instance is typically created at application startup. It is | 10 // A MetricsService instance is typically created at application startup. It is |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 #if defined(OS_CHROMEOS) | 228 #if defined(OS_CHROMEOS) |
| 229 #include "chrome/browser/chromeos/settings/cros_settings.h" | 229 #include "chrome/browser/chromeos/settings/cros_settings.h" |
| 230 #include "chromeos/system/statistics_provider.h" | 230 #include "chromeos/system/statistics_provider.h" |
| 231 #endif | 231 #endif |
| 232 | 232 |
| 233 #if defined(OS_WIN) | 233 #if defined(OS_WIN) |
| 234 #include <windows.h> // Needed for STATUS_* codes | 234 #include <windows.h> // Needed for STATUS_* codes |
| 235 #include "base/win/registry.h" | 235 #include "base/win/registry.h" |
| 236 #endif | 236 #endif |
| 237 | 237 |
| 238 #if !defined(OS_ANDROID) | 238 #if defined(OS_ANDROID) |
| 239 // TODO(asvitkine): Move this out of MetricsService. |
| 240 #include "chrome/browser/metrics/android_metrics_provider.h" |
| 241 #else |
| 239 #include "chrome/browser/service_process/service_process_control.h" | 242 #include "chrome/browser/service_process/service_process_control.h" |
| 240 #endif | 243 #endif |
| 241 | 244 |
| 242 using base::Time; | 245 using base::Time; |
| 243 using content::BrowserThread; | 246 using content::BrowserThread; |
| 244 using content::ChildProcessData; | 247 using content::ChildProcessData; |
| 245 using content::LoadNotificationDetails; | 248 using content::LoadNotificationDetails; |
| 246 using content::PluginService; | 249 using content::PluginService; |
| 247 using metrics::MetricsLogManager; | 250 using metrics::MetricsLogManager; |
| 248 | 251 |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 registry->RegisterListPref(metrics::prefs::kMetricsOngoingLogs); | 450 registry->RegisterListPref(metrics::prefs::kMetricsOngoingLogs); |
| 448 | 451 |
| 449 registry->RegisterInt64Pref(prefs::kInstallDate, 0); | 452 registry->RegisterInt64Pref(prefs::kInstallDate, 0); |
| 450 registry->RegisterInt64Pref(prefs::kUninstallMetricsPageLoadCount, 0); | 453 registry->RegisterInt64Pref(prefs::kUninstallMetricsPageLoadCount, 0); |
| 451 registry->RegisterInt64Pref(prefs::kUninstallLaunchCount, 0); | 454 registry->RegisterInt64Pref(prefs::kUninstallLaunchCount, 0); |
| 452 registry->RegisterInt64Pref(prefs::kUninstallMetricsUptimeSec, 0); | 455 registry->RegisterInt64Pref(prefs::kUninstallMetricsUptimeSec, 0); |
| 453 registry->RegisterInt64Pref(prefs::kUninstallLastLaunchTimeSec, 0); | 456 registry->RegisterInt64Pref(prefs::kUninstallLastLaunchTimeSec, 0); |
| 454 registry->RegisterInt64Pref(prefs::kUninstallLastObservedRunTimeSec, 0); | 457 registry->RegisterInt64Pref(prefs::kUninstallLastObservedRunTimeSec, 0); |
| 455 | 458 |
| 456 #if defined(OS_ANDROID) | 459 #if defined(OS_ANDROID) |
| 457 RegisterPrefsAndroid(registry); | 460 // TODO(asvitkine): Move this out of here. |
| 461 AndroidMetricsProvider::RegisterPrefs(registry); |
| 458 #endif // defined(OS_ANDROID) | 462 #endif // defined(OS_ANDROID) |
| 459 } | 463 } |
| 460 | 464 |
| 461 MetricsService::MetricsService(metrics::MetricsStateManager* state_manager, | 465 MetricsService::MetricsService(metrics::MetricsStateManager* state_manager, |
| 462 metrics::MetricsServiceClient* client) | 466 metrics::MetricsServiceClient* client) |
| 463 : MetricsServiceBase(g_browser_process->local_state(), | 467 : MetricsServiceBase(g_browser_process->local_state(), |
| 464 kUploadLogAvoidRetransmitSize), | 468 kUploadLogAvoidRetransmitSize), |
| 465 state_manager_(state_manager), | 469 state_manager_(state_manager), |
| 466 client_(client), | 470 client_(client), |
| 467 recording_active_(false), | 471 recording_active_(false), |
| 468 reporting_active_(false), | 472 reporting_active_(false), |
| 469 test_mode_active_(false), | 473 test_mode_active_(false), |
| 470 state_(INITIALIZED), | 474 state_(INITIALIZED), |
| 471 has_initial_stability_log_(false), | 475 has_initial_stability_log_(false), |
| 472 idle_since_last_transmission_(false), | 476 idle_since_last_transmission_(false), |
| 473 session_id_(-1), | 477 session_id_(-1), |
| 474 next_window_id_(0), | 478 next_window_id_(0), |
| 475 self_ptr_factory_(this), | 479 self_ptr_factory_(this), |
| 476 state_saver_factory_(this), | 480 state_saver_factory_(this), |
| 477 waiting_for_asynchronous_reporting_step_(false), | 481 waiting_for_asynchronous_reporting_step_(false), |
| 478 num_async_histogram_fetches_in_progress_(0) { | 482 num_async_histogram_fetches_in_progress_(0) { |
| 479 DCHECK(IsSingleThreaded()); | 483 DCHECK(IsSingleThreaded()); |
| 480 DCHECK(state_manager_); | 484 DCHECK(state_manager_); |
| 481 DCHECK(client_); | 485 DCHECK(client_); |
| 482 | 486 |
| 487 #if defined(OS_ANDROID) |
| 488 // TODO(asvitkine): Move this out of MetricsService. |
| 489 RegisterMetricsProvider( |
| 490 scoped_ptr<metrics::MetricsProvider>(new AndroidMetricsProvider( |
| 491 g_browser_process->local_state()))); |
| 492 #endif // defined(OS_ANDROID) |
| 493 |
| 483 // TODO(asvitkine): Move this out of MetricsService. | 494 // TODO(asvitkine): Move this out of MetricsService. |
| 484 RegisterMetricsProvider( | 495 RegisterMetricsProvider( |
| 485 scoped_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider)); | 496 scoped_ptr<metrics::MetricsProvider>(new OmniboxMetricsProvider)); |
| 486 | 497 |
| 487 BrowserChildProcessObserver::Add(this); | 498 BrowserChildProcessObserver::Add(this); |
| 488 } | 499 } |
| 489 | 500 |
| 490 MetricsService::~MetricsService() { | 501 MetricsService::~MetricsService() { |
| 491 DisableRecording(); | 502 DisableRecording(); |
| 492 | 503 |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 815 | 826 |
| 816 PrefService* pref = g_browser_process->local_state(); | 827 PrefService* pref = g_browser_process->local_state(); |
| 817 DCHECK(pref); | 828 DCHECK(pref); |
| 818 | 829 |
| 819 pref->SetString(prefs::kStabilityStatsVersion, | 830 pref->SetString(prefs::kStabilityStatsVersion, |
| 820 MetricsLog::GetVersionString()); | 831 MetricsLog::GetVersionString()); |
| 821 pref->SetInt64(prefs::kStabilityStatsBuildTime, MetricsLog::GetBuildTime()); | 832 pref->SetInt64(prefs::kStabilityStatsBuildTime, MetricsLog::GetBuildTime()); |
| 822 | 833 |
| 823 session_id_ = pref->GetInteger(prefs::kMetricsSessionID); | 834 session_id_ = pref->GetInteger(prefs::kMetricsSessionID); |
| 824 | 835 |
| 825 #if defined(OS_ANDROID) | |
| 826 LogAndroidStabilityToPrefs(pref); | |
| 827 #endif // defined(OS_ANDROID) | |
| 828 | |
| 829 if (!pref->GetBoolean(prefs::kStabilityExitedCleanly)) { | 836 if (!pref->GetBoolean(prefs::kStabilityExitedCleanly)) { |
| 830 IncrementPrefValue(prefs::kStabilityCrashCount); | 837 IncrementPrefValue(prefs::kStabilityCrashCount); |
| 831 // Reset flag, and wait until we call LogNeedForCleanShutdown() before | 838 // Reset flag, and wait until we call LogNeedForCleanShutdown() before |
| 832 // monitoring. | 839 // monitoring. |
| 833 pref->SetBoolean(prefs::kStabilityExitedCleanly, true); | 840 pref->SetBoolean(prefs::kStabilityExitedCleanly, true); |
| 834 | 841 |
| 835 // TODO(rtenneti): On windows, consider saving/getting execution_phase from | 842 // TODO(rtenneti): On windows, consider saving/getting execution_phase from |
| 836 // the registry. | 843 // the registry. |
| 837 int execution_phase = pref->GetInteger(prefs::kStabilityExecutionPhase); | 844 int execution_phase = pref->GetInteger(prefs::kStabilityExecutionPhase); |
| 838 UMA_HISTOGRAM_SPARSE_SLOWLY("Chrome.Browser.CrashedExecutionPhase", | 845 UMA_HISTOGRAM_SPARSE_SLOWLY("Chrome.Browser.CrashedExecutionPhase", |
| (...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1402 | 1409 |
| 1403 log_manager_.PauseCurrentLog(); | 1410 log_manager_.PauseCurrentLog(); |
| 1404 log_manager_.BeginLoggingWithLog(initial_stability_log.release()); | 1411 log_manager_.BeginLoggingWithLog(initial_stability_log.release()); |
| 1405 | 1412 |
| 1406 // Note: Some stability providers may record stability stats via histograms, | 1413 // Note: Some stability providers may record stability stats via histograms, |
| 1407 // so this call has to be after BeginLoggingWithLog(). | 1414 // so this call has to be after BeginLoggingWithLog(). |
| 1408 MetricsLog* current_log = | 1415 MetricsLog* current_log = |
| 1409 static_cast<MetricsLog*>(log_manager_.current_log()); | 1416 static_cast<MetricsLog*>(log_manager_.current_log()); |
| 1410 current_log->RecordStabilityMetrics(metrics_providers_.get(), | 1417 current_log->RecordStabilityMetrics(metrics_providers_.get(), |
| 1411 base::TimeDelta(), base::TimeDelta()); | 1418 base::TimeDelta(), base::TimeDelta()); |
| 1412 | |
| 1413 #if defined(OS_ANDROID) | |
| 1414 ConvertAndroidStabilityPrefsToHistograms(pref); | |
| 1415 RecordCurrentStabilityHistograms(); | 1419 RecordCurrentStabilityHistograms(); |
| 1416 #endif // defined(OS_ANDROID) | |
| 1417 | 1420 |
| 1418 // Note: RecordGeneralMetrics() intentionally not called since this log is for | 1421 // Note: RecordGeneralMetrics() intentionally not called since this log is for |
| 1419 // stability stats from a previous session only. | 1422 // stability stats from a previous session only. |
| 1420 | 1423 |
| 1421 log_manager_.FinishCurrentLog(); | 1424 log_manager_.FinishCurrentLog(); |
| 1422 log_manager_.ResumePausedLog(); | 1425 log_manager_.ResumePausedLog(); |
| 1423 | 1426 |
| 1424 // Store unsent logs, including the stability log that was just saved, so | 1427 // Store unsent logs, including the stability log that was just saved, so |
| 1425 // that they're not lost in case of a crash before upload time. | 1428 // that they're not lost in case of a crash before upload time. |
| 1426 log_manager_.PersistUnsentLogs(); | 1429 log_manager_.PersistUnsentLogs(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1446 // before writing them. | 1449 // before writing them. |
| 1447 log_manager_.PauseCurrentLog(); | 1450 log_manager_.PauseCurrentLog(); |
| 1448 log_manager_.BeginLoggingWithLog(initial_metrics_log_.release()); | 1451 log_manager_.BeginLoggingWithLog(initial_metrics_log_.release()); |
| 1449 | 1452 |
| 1450 // Note: Some stability providers may record stability stats via histograms, | 1453 // Note: Some stability providers may record stability stats via histograms, |
| 1451 // so this call has to be after BeginLoggingWithLog(). | 1454 // so this call has to be after BeginLoggingWithLog(). |
| 1452 MetricsLog* current_log = | 1455 MetricsLog* current_log = |
| 1453 static_cast<MetricsLog*>(log_manager_.current_log()); | 1456 static_cast<MetricsLog*>(log_manager_.current_log()); |
| 1454 current_log->RecordStabilityMetrics(metrics_providers_.get(), | 1457 current_log->RecordStabilityMetrics(metrics_providers_.get(), |
| 1455 base::TimeDelta(), base::TimeDelta()); | 1458 base::TimeDelta(), base::TimeDelta()); |
| 1456 | |
| 1457 #if defined(OS_ANDROID) | |
| 1458 ConvertAndroidStabilityPrefsToHistograms(pref); | |
| 1459 #endif // defined(OS_ANDROID) | |
| 1460 RecordCurrentHistograms(); | 1459 RecordCurrentHistograms(); |
| 1461 | 1460 |
| 1462 current_log->RecordGeneralMetrics(metrics_providers_.get()); | 1461 current_log->RecordGeneralMetrics(metrics_providers_.get()); |
| 1463 | 1462 |
| 1464 log_manager_.FinishCurrentLog(); | 1463 log_manager_.FinishCurrentLog(); |
| 1465 log_manager_.ResumePausedLog(); | 1464 log_manager_.ResumePausedLog(); |
| 1466 | 1465 |
| 1467 DCHECK(!log_manager_.has_staged_log()); | 1466 DCHECK(!log_manager_.has_staged_log()); |
| 1468 log_manager_.StageNextLogForUpload(); | 1467 log_manager_.StageNextLogForUpload(); |
| 1469 } | 1468 } |
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1953 if (metrics_service) | 1952 if (metrics_service) |
| 1954 metrics_service->AddObserver(observer); | 1953 metrics_service->AddObserver(observer); |
| 1955 } | 1954 } |
| 1956 | 1955 |
| 1957 void MetricsServiceHelper::RemoveMetricsServiceObserver( | 1956 void MetricsServiceHelper::RemoveMetricsServiceObserver( |
| 1958 MetricsServiceObserver* observer) { | 1957 MetricsServiceObserver* observer) { |
| 1959 MetricsService* metrics_service = g_browser_process->metrics_service(); | 1958 MetricsService* metrics_service = g_browser_process->metrics_service(); |
| 1960 if (metrics_service) | 1959 if (metrics_service) |
| 1961 metrics_service->RemoveObserver(observer); | 1960 metrics_service->RemoveObserver(observer); |
| 1962 } | 1961 } |
| OLD | NEW |