| 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 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 | 546 |
| 547 if (recording_active_) | 547 if (recording_active_) |
| 548 return; | 548 return; |
| 549 recording_active_ = true; | 549 recording_active_ = true; |
| 550 | 550 |
| 551 state_manager_->ForceClientIdCreation(); | 551 state_manager_->ForceClientIdCreation(); |
| 552 crash_keys::SetClientID(state_manager_->client_id()); | 552 crash_keys::SetClientID(state_manager_->client_id()); |
| 553 if (!log_manager_.current_log()) | 553 if (!log_manager_.current_log()) |
| 554 OpenNewLog(); | 554 OpenNewLog(); |
| 555 | 555 |
| 556 for (size_t i = 0; i < metrics_providers_.size(); ++i) |
| 557 metrics_providers_[i]->OnRecordingEnabled(); |
| 558 |
| 556 SetUpNotifications(®istrar_, this); | 559 SetUpNotifications(®istrar_, this); |
| 557 base::RemoveActionCallback(action_callback_); | 560 base::RemoveActionCallback(action_callback_); |
| 558 action_callback_ = base::Bind(&MetricsService::OnUserAction, | 561 action_callback_ = base::Bind(&MetricsService::OnUserAction, |
| 559 base::Unretained(this)); | 562 base::Unretained(this)); |
| 560 base::AddActionCallback(action_callback_); | 563 base::AddActionCallback(action_callback_); |
| 561 } | 564 } |
| 562 | 565 |
| 563 void MetricsService::DisableRecording() { | 566 void MetricsService::DisableRecording() { |
| 564 DCHECK(IsSingleThreaded()); | 567 DCHECK(IsSingleThreaded()); |
| 565 | 568 |
| 566 if (!recording_active_) | 569 if (!recording_active_) |
| 567 return; | 570 return; |
| 568 recording_active_ = false; | 571 recording_active_ = false; |
| 569 | 572 |
| 570 base::RemoveActionCallback(action_callback_); | 573 base::RemoveActionCallback(action_callback_); |
| 571 registrar_.RemoveAll(); | 574 registrar_.RemoveAll(); |
| 575 |
| 576 for (size_t i = 0; i < metrics_providers_.size(); ++i) |
| 577 metrics_providers_[i]->OnRecordingDisabled(); |
| 578 |
| 572 PushPendingLogsToPersistentStorage(); | 579 PushPendingLogsToPersistentStorage(); |
| 573 DCHECK(!log_manager_.has_staged_log()); | 580 DCHECK(!log_manager_.has_staged_log()); |
| 574 } | 581 } |
| 575 | 582 |
| 576 bool MetricsService::recording_active() const { | 583 bool MetricsService::recording_active() const { |
| 577 DCHECK(IsSingleThreaded()); | 584 DCHECK(IsSingleThreaded()); |
| 578 return recording_active_; | 585 return recording_active_; |
| 579 } | 586 } |
| 580 | 587 |
| 581 bool MetricsService::reporting_active() const { | 588 bool MetricsService::reporting_active() const { |
| (...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1160 | 1167 |
| 1161 // Put incremental data (histogram deltas, and realtime stats deltas) at the | 1168 // Put incremental data (histogram deltas, and realtime stats deltas) at the |
| 1162 // end of all log transmissions (initial log handles this separately). | 1169 // end of all log transmissions (initial log handles this separately). |
| 1163 // RecordIncrementalStabilityElements only exists on the derived | 1170 // RecordIncrementalStabilityElements only exists on the derived |
| 1164 // MetricsLog class. | 1171 // MetricsLog class. |
| 1165 MetricsLog* current_log = | 1172 MetricsLog* current_log = |
| 1166 static_cast<MetricsLog*>(log_manager_.current_log()); | 1173 static_cast<MetricsLog*>(log_manager_.current_log()); |
| 1167 DCHECK(current_log); | 1174 DCHECK(current_log); |
| 1168 std::vector<variations::ActiveGroupId> synthetic_trials; | 1175 std::vector<variations::ActiveGroupId> synthetic_trials; |
| 1169 GetCurrentSyntheticFieldTrials(&synthetic_trials); | 1176 GetCurrentSyntheticFieldTrials(&synthetic_trials); |
| 1170 current_log->RecordEnvironment(plugins_, google_update_metrics_, | 1177 current_log->RecordEnvironment(metrics_providers_.get(), plugins_, |
| 1171 synthetic_trials); | 1178 google_update_metrics_, synthetic_trials); |
| 1172 PrefService* pref = g_browser_process->local_state(); | 1179 PrefService* pref = g_browser_process->local_state(); |
| 1173 base::TimeDelta incremental_uptime; | 1180 base::TimeDelta incremental_uptime; |
| 1174 base::TimeDelta uptime; | 1181 base::TimeDelta uptime; |
| 1175 GetUptimes(pref, &incremental_uptime, &uptime); | 1182 GetUptimes(pref, &incremental_uptime, &uptime); |
| 1176 current_log->RecordStabilityMetrics(incremental_uptime, uptime); | 1183 current_log->RecordStabilityMetrics(metrics_providers_.get(), |
| 1184 incremental_uptime, uptime); |
| 1177 | 1185 |
| 1178 RecordCurrentHistograms(); | 1186 RecordCurrentHistograms(); |
| 1187 current_log->RecordGeneralMetrics(metrics_providers_.get()); |
| 1179 | 1188 |
| 1180 log_manager_.FinishCurrentLog(); | 1189 log_manager_.FinishCurrentLog(); |
| 1181 } | 1190 } |
| 1182 | 1191 |
| 1183 void MetricsService::PushPendingLogsToPersistentStorage() { | 1192 void MetricsService::PushPendingLogsToPersistentStorage() { |
| 1184 if (state_ < SENDING_INITIAL_STABILITY_LOG) | 1193 if (state_ < SENDING_INITIAL_STABILITY_LOG) |
| 1185 return; // We didn't and still don't have time to get plugin list etc. | 1194 return; // We didn't and still don't have time to get plugin list etc. |
| 1186 | 1195 |
| 1187 if (log_manager_.has_staged_log()) { | 1196 if (log_manager_.has_staged_log()) { |
| 1188 // We may race here, and send second copy of the log later. | 1197 // We may race here, and send second copy of the log later. |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1420 | 1429 |
| 1421 scoped_ptr<MetricsLog> initial_stability_log( | 1430 scoped_ptr<MetricsLog> initial_stability_log( |
| 1422 new MetricsLog(state_manager_->client_id(), session_id_, | 1431 new MetricsLog(state_manager_->client_id(), session_id_, |
| 1423 MetricsLog::INITIAL_STABILITY_LOG)); | 1432 MetricsLog::INITIAL_STABILITY_LOG)); |
| 1424 | 1433 |
| 1425 // Do not call NotifyOnDidCreateMetricsLog here because the stability | 1434 // Do not call NotifyOnDidCreateMetricsLog here because the stability |
| 1426 // log describes stats from the _previous_ session. | 1435 // log describes stats from the _previous_ session. |
| 1427 | 1436 |
| 1428 if (!initial_stability_log->LoadSavedEnvironmentFromPrefs()) | 1437 if (!initial_stability_log->LoadSavedEnvironmentFromPrefs()) |
| 1429 return; | 1438 return; |
| 1430 initial_stability_log->RecordStabilityMetrics(base::TimeDelta(), | 1439 |
| 1431 base::TimeDelta()); | |
| 1432 log_manager_.LoadPersistedUnsentLogs(); | 1440 log_manager_.LoadPersistedUnsentLogs(); |
| 1433 | 1441 |
| 1434 log_manager_.PauseCurrentLog(); | 1442 log_manager_.PauseCurrentLog(); |
| 1435 log_manager_.BeginLoggingWithLog(initial_stability_log.release()); | 1443 log_manager_.BeginLoggingWithLog(initial_stability_log.release()); |
| 1444 |
| 1445 // Note: Some stability providers may record stability stats via histograms, |
| 1446 // so this call has to be after BeginLoggingWithLog(). |
| 1447 MetricsLog* current_log = |
| 1448 static_cast<MetricsLog*>(log_manager_.current_log()); |
| 1449 current_log->RecordStabilityMetrics(metrics_providers_.get(), |
| 1450 base::TimeDelta(), base::TimeDelta()); |
| 1451 |
| 1436 #if defined(OS_ANDROID) | 1452 #if defined(OS_ANDROID) |
| 1437 ConvertAndroidStabilityPrefsToHistograms(pref); | 1453 ConvertAndroidStabilityPrefsToHistograms(pref); |
| 1438 RecordCurrentStabilityHistograms(); | 1454 RecordCurrentStabilityHistograms(); |
| 1439 #endif // defined(OS_ANDROID) | 1455 #endif // defined(OS_ANDROID) |
| 1456 |
| 1457 // Note: RecordGeneralMetrics() intentionally not called since this log is for |
| 1458 // stability stats from a previous session only. |
| 1459 |
| 1440 log_manager_.FinishCurrentLog(); | 1460 log_manager_.FinishCurrentLog(); |
| 1441 log_manager_.ResumePausedLog(); | 1461 log_manager_.ResumePausedLog(); |
| 1442 | 1462 |
| 1443 // Store unsent logs, including the stability log that was just saved, so | 1463 // Store unsent logs, including the stability log that was just saved, so |
| 1444 // that they're not lost in case of a crash before upload time. | 1464 // that they're not lost in case of a crash before upload time. |
| 1445 log_manager_.PersistUnsentLogs(); | 1465 log_manager_.PersistUnsentLogs(); |
| 1446 | 1466 |
| 1447 has_initial_stability_log_ = true; | 1467 has_initial_stability_log_ = true; |
| 1448 } | 1468 } |
| 1449 | 1469 |
| 1450 void MetricsService::PrepareInitialMetricsLog() { | 1470 void MetricsService::PrepareInitialMetricsLog() { |
| 1451 DCHECK(state_ == INIT_TASK_DONE || state_ == SENDING_INITIAL_STABILITY_LOG); | 1471 DCHECK(state_ == INIT_TASK_DONE || state_ == SENDING_INITIAL_STABILITY_LOG); |
| 1452 initial_metrics_log_->set_hardware_class(hardware_class_); | 1472 initial_metrics_log_->set_hardware_class(hardware_class_); |
| 1453 | 1473 |
| 1454 std::vector<variations::ActiveGroupId> synthetic_trials; | 1474 std::vector<variations::ActiveGroupId> synthetic_trials; |
| 1455 GetCurrentSyntheticFieldTrials(&synthetic_trials); | 1475 GetCurrentSyntheticFieldTrials(&synthetic_trials); |
| 1456 initial_metrics_log_->RecordEnvironment(plugins_, google_update_metrics_, | 1476 initial_metrics_log_->RecordEnvironment(metrics_providers_.get(), plugins_, |
| 1477 google_update_metrics_, |
| 1457 synthetic_trials); | 1478 synthetic_trials); |
| 1458 PrefService* pref = g_browser_process->local_state(); | 1479 PrefService* pref = g_browser_process->local_state(); |
| 1459 base::TimeDelta incremental_uptime; | 1480 base::TimeDelta incremental_uptime; |
| 1460 base::TimeDelta uptime; | 1481 base::TimeDelta uptime; |
| 1461 GetUptimes(pref, &incremental_uptime, &uptime); | 1482 GetUptimes(pref, &incremental_uptime, &uptime); |
| 1462 initial_metrics_log_->RecordStabilityMetrics(incremental_uptime, uptime); | |
| 1463 | 1483 |
| 1464 // Histograms only get written to the current log, so make the new log current | 1484 // Histograms only get written to the current log, so make the new log current |
| 1465 // before writing them. | 1485 // before writing them. |
| 1466 log_manager_.PauseCurrentLog(); | 1486 log_manager_.PauseCurrentLog(); |
| 1467 log_manager_.BeginLoggingWithLog(initial_metrics_log_.release()); | 1487 log_manager_.BeginLoggingWithLog(initial_metrics_log_.release()); |
| 1488 |
| 1489 // Note: Some stability providers may record stability stats via histograms, |
| 1490 // so this call has to be after BeginLoggingWithLog(). |
| 1491 MetricsLog* current_log = |
| 1492 static_cast<MetricsLog*>(log_manager_.current_log()); |
| 1493 current_log->RecordStabilityMetrics(metrics_providers_.get(), |
| 1494 base::TimeDelta(), base::TimeDelta()); |
| 1495 |
| 1468 #if defined(OS_ANDROID) | 1496 #if defined(OS_ANDROID) |
| 1469 ConvertAndroidStabilityPrefsToHistograms(pref); | 1497 ConvertAndroidStabilityPrefsToHistograms(pref); |
| 1470 #endif // defined(OS_ANDROID) | 1498 #endif // defined(OS_ANDROID) |
| 1471 RecordCurrentHistograms(); | 1499 RecordCurrentHistograms(); |
| 1500 |
| 1501 current_log->RecordGeneralMetrics(metrics_providers_.get()); |
| 1502 |
| 1472 log_manager_.FinishCurrentLog(); | 1503 log_manager_.FinishCurrentLog(); |
| 1473 log_manager_.ResumePausedLog(); | 1504 log_manager_.ResumePausedLog(); |
| 1474 | 1505 |
| 1475 DCHECK(!log_manager_.has_staged_log()); | 1506 DCHECK(!log_manager_.has_staged_log()); |
| 1476 log_manager_.StageNextLogForUpload(); | 1507 log_manager_.StageNextLogForUpload(); |
| 1477 } | 1508 } |
| 1478 | 1509 |
| 1479 void MetricsService::SendStagedLog() { | 1510 void MetricsService::SendStagedLog() { |
| 1480 DCHECK(log_manager_.has_staged_log()); | 1511 DCHECK(log_manager_.has_staged_log()); |
| 1481 | 1512 |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1714 } | 1745 } |
| 1715 return; | 1746 return; |
| 1716 } | 1747 } |
| 1717 } | 1748 } |
| 1718 | 1749 |
| 1719 SyntheticTrialGroup trial_group = trial; | 1750 SyntheticTrialGroup trial_group = trial; |
| 1720 trial_group.start_time = base::TimeTicks::Now(); | 1751 trial_group.start_time = base::TimeTicks::Now(); |
| 1721 synthetic_trial_groups_.push_back(trial_group); | 1752 synthetic_trial_groups_.push_back(trial_group); |
| 1722 } | 1753 } |
| 1723 | 1754 |
| 1755 void MetricsService::RegisterMetricsProvider( |
| 1756 scoped_ptr<metrics::MetricsProvider> provider) { |
| 1757 DCHECK_EQ(INITIALIZED, state_); |
| 1758 metrics_providers_.push_back(provider.release()); |
| 1759 } |
| 1760 |
| 1724 void MetricsService::CheckForClonedInstall( | 1761 void MetricsService::CheckForClonedInstall( |
| 1725 scoped_refptr<base::SingleThreadTaskRunner> task_runner) { | 1762 scoped_refptr<base::SingleThreadTaskRunner> task_runner) { |
| 1726 state_manager_->CheckForClonedInstall(task_runner); | 1763 state_manager_->CheckForClonedInstall(task_runner); |
| 1727 } | 1764 } |
| 1728 | 1765 |
| 1729 void MetricsService::GetCurrentSyntheticFieldTrials( | 1766 void MetricsService::GetCurrentSyntheticFieldTrials( |
| 1730 std::vector<variations::ActiveGroupId>* synthetic_trials) { | 1767 std::vector<variations::ActiveGroupId>* synthetic_trials) { |
| 1731 DCHECK(synthetic_trials); | 1768 DCHECK(synthetic_trials); |
| 1732 synthetic_trials->clear(); | 1769 synthetic_trials->clear(); |
| 1733 const MetricsLog* current_log = | 1770 const MetricsLog* current_log = |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1955 if (metrics_service) | 1992 if (metrics_service) |
| 1956 metrics_service->AddObserver(observer); | 1993 metrics_service->AddObserver(observer); |
| 1957 } | 1994 } |
| 1958 | 1995 |
| 1959 void MetricsServiceHelper::RemoveMetricsServiceObserver( | 1996 void MetricsServiceHelper::RemoveMetricsServiceObserver( |
| 1960 MetricsServiceObserver* observer) { | 1997 MetricsServiceObserver* observer) { |
| 1961 MetricsService* metrics_service = g_browser_process->metrics_service(); | 1998 MetricsService* metrics_service = g_browser_process->metrics_service(); |
| 1962 if (metrics_service) | 1999 if (metrics_service) |
| 1963 metrics_service->RemoveObserver(observer); | 2000 metrics_service->RemoveObserver(observer); |
| 1964 } | 2001 } |
| OLD | NEW |