| 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 //------------------------------------------------------------------------------ | 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 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 577 | 577 |
| 578 session_id_ = local_state_->GetInteger(prefs::kMetricsSessionID); | 578 session_id_ = local_state_->GetInteger(prefs::kMetricsSessionID); |
| 579 | 579 |
| 580 if (!clean_exit_beacon_.exited_cleanly()) { | 580 if (!clean_exit_beacon_.exited_cleanly()) { |
| 581 IncrementPrefValue(prefs::kStabilityCrashCount); | 581 IncrementPrefValue(prefs::kStabilityCrashCount); |
| 582 // Reset flag, and wait until we call LogNeedForCleanShutdown() before | 582 // Reset flag, and wait until we call LogNeedForCleanShutdown() before |
| 583 // monitoring. | 583 // monitoring. |
| 584 clean_exit_beacon_.WriteBeaconValue(true); | 584 clean_exit_beacon_.WriteBeaconValue(true); |
| 585 } | 585 } |
| 586 | 586 |
| 587 // ProvidersHaveInitialStabilityMetrics is called first to ensure it is never |
| 588 // bypassed. |
| 589 const bool is_initial_stability_log_required = |
| 590 ProvidersHaveInitialStabilityMetrics() || |
| 591 !clean_exit_beacon_.exited_cleanly(); |
| 587 bool has_initial_stability_log = false; | 592 bool has_initial_stability_log = false; |
| 588 bool providers_have_initial_stability_metrics = | 593 if (is_initial_stability_log_required) { |
| 589 ProvidersHaveInitialStabilityMetrics(); | |
| 590 if (!clean_exit_beacon_.exited_cleanly() || | |
| 591 providers_have_initial_stability_metrics) { | |
| 592 // TODO(rtenneti): On windows, consider saving/getting execution_phase from | 594 // TODO(rtenneti): On windows, consider saving/getting execution_phase from |
| 593 // the registry. | 595 // the registry. |
| 594 int execution_phase = | 596 int execution_phase = |
| 595 local_state_->GetInteger(prefs::kStabilityExecutionPhase); | 597 local_state_->GetInteger(prefs::kStabilityExecutionPhase); |
| 596 UMA_HISTOGRAM_SPARSE_SLOWLY("Chrome.Browser.CrashedExecutionPhase", | 598 UMA_HISTOGRAM_SPARSE_SLOWLY("Chrome.Browser.CrashedExecutionPhase", |
| 597 execution_phase); | 599 execution_phase); |
| 598 | 600 |
| 599 // If the previous session didn't exit cleanly, or if any provider | 601 // If the previous session didn't exit cleanly, or if any provider |
| 600 // explicitly requests it, prepare an initial stability log - | 602 // explicitly requests it, prepare an initial stability log - |
| 601 // provided UMA is enabled. | 603 // provided UMA is enabled. |
| 602 if (state_manager_->IsMetricsReportingEnabled()) { | 604 if (state_manager_->IsMetricsReportingEnabled()) { |
| 603 has_initial_stability_log = PrepareInitialStabilityLog(previous_version); | 605 has_initial_stability_log = PrepareInitialStabilityLog(previous_version); |
| 604 if (!has_initial_stability_log) | 606 if (!has_initial_stability_log) |
| 605 IncrementPrefValue(prefs::kStabilityDeferredCount); | 607 IncrementPrefValue(prefs::kStabilityDeferredCount); |
| 606 } | 608 } |
| 607 } | 609 } |
| 608 | 610 |
| 609 // If no initial stability log was generated and there was a version upgrade, | 611 // If the version changed, but no initial stability log was generated, clear |
| 610 // clear the stability stats from the previous version (so that they don't get | 612 // the stability stats from the previous version (so that they don't get |
| 611 // attributed to the current version). This could otherwise happen due to a | 613 // attributed to the current version). This could otherwise happen due to a |
| 612 // number of different edge cases, such as if the last version crashed before | 614 // number of different edge cases, such as if the last version crashed before |
| 613 // it could save off a system profile or if UMA reporting is disabled (which | 615 // it could save off a system profile or if UMA reporting is disabled (which |
| 614 // normally results in stats being accumulated). | 616 // normally results in stats being accumulated). |
| 615 if (!has_initial_stability_log && version_changed) { | 617 if (version_changed && !has_initial_stability_log) { |
| 616 ClearSavedStabilityMetrics(); | 618 ClearSavedStabilityMetrics(); |
| 617 IncrementPrefValue(prefs::kStabilityDiscardCount); | 619 IncrementPrefValue(prefs::kStabilityDiscardCount); |
| 618 } | 620 } |
| 619 | 621 |
| 622 // If the version changed, the system profile is obsolete and needs to be |
| 623 // cleared. This is to avoid the stability data misattribution that could |
| 624 // occur if the current version crashed before saving its own system profile. |
| 625 // Note however this clearing occurs only after preparing the initial |
| 626 // stability log, an operation that requires the previous version's system |
| 627 // profile. At this point, stability metrics pertaining to the previous |
| 628 // version have been cleared. |
| 629 if (version_changed) { |
| 630 local_state_->ClearPref(prefs::kStabilitySavedSystemProfile); |
| 631 local_state_->ClearPref(prefs::kStabilitySavedSystemProfileHash); |
| 632 } |
| 633 |
| 620 // Update session ID. | 634 // Update session ID. |
| 621 ++session_id_; | 635 ++session_id_; |
| 622 local_state_->SetInteger(prefs::kMetricsSessionID, session_id_); | 636 local_state_->SetInteger(prefs::kMetricsSessionID, session_id_); |
| 623 | 637 |
| 624 // Stability bookkeeping | 638 // Stability bookkeeping |
| 625 IncrementPrefValue(prefs::kStabilityLaunchCount); | 639 IncrementPrefValue(prefs::kStabilityLaunchCount); |
| 626 | 640 |
| 627 DCHECK_EQ(UNINITIALIZED_PHASE, execution_phase_); | 641 DCHECK_EQ(UNINITIALIZED_PHASE, execution_phase_); |
| 628 SetExecutionPhase(START_METRICS_RECORDING, local_state_); | 642 SetExecutionPhase(START_METRICS_RECORDING, local_state_); |
| 629 | 643 |
| (...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1208 base::Time::Now().ToTimeT()); | 1222 base::Time::Now().ToTimeT()); |
| 1209 } | 1223 } |
| 1210 | 1224 |
| 1211 void MetricsService::SkipAndDiscardUpload() { | 1225 void MetricsService::SkipAndDiscardUpload() { |
| 1212 log_manager_.DiscardStagedLog(); | 1226 log_manager_.DiscardStagedLog(); |
| 1213 scheduler_->UploadCancelled(); | 1227 scheduler_->UploadCancelled(); |
| 1214 log_upload_in_progress_ = false; | 1228 log_upload_in_progress_ = false; |
| 1215 } | 1229 } |
| 1216 | 1230 |
| 1217 } // namespace metrics | 1231 } // namespace metrics |
| OLD | NEW |