| 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 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 } | 255 } |
| 256 | 256 |
| 257 bool NewInitialMetricsTimingEnabled() { | 257 bool NewInitialMetricsTimingEnabled() { |
| 258 return base::FieldTrialList::FindFullName("UMAInitialMetricsTiming") == | 258 return base::FieldTrialList::FindFullName("UMAInitialMetricsTiming") == |
| 259 "Enabled"; | 259 "Enabled"; |
| 260 } | 260 } |
| 261 | 261 |
| 262 void MarkAppCleanShutdownAndCommit(CleanExitBeacon* clean_exit_beacon, | 262 void MarkAppCleanShutdownAndCommit(CleanExitBeacon* clean_exit_beacon, |
| 263 PrefService* local_state) { | 263 PrefService* local_state) { |
| 264 clean_exit_beacon->WriteBeaconValue(true); | 264 clean_exit_beacon->WriteBeaconValue(true); |
| 265 local_state->SetInteger(metrics::prefs::kStabilityExecutionPhase, | 265 local_state->SetInteger(prefs::kStabilityExecutionPhase, |
| 266 MetricsService::SHUTDOWN_COMPLETE); | 266 MetricsService::SHUTDOWN_COMPLETE); |
| 267 // Start writing right away (write happens on a different thread). | 267 // Start writing right away (write happens on a different thread). |
| 268 local_state->CommitPendingWrite(); | 268 local_state->CommitPendingWrite(); |
| 269 } | 269 } |
| 270 | 270 |
| 271 } // namespace | 271 } // namespace |
| 272 | 272 |
| 273 | 273 |
| 274 SyntheticTrialGroup::SyntheticTrialGroup(uint32 trial, uint32 group) { | 274 SyntheticTrialGroup::SyntheticTrialGroup(uint32 trial, uint32 group) { |
| 275 id.name = trial; | 275 id.name = trial; |
| 276 id.group = group; | 276 id.group = group; |
| 277 } | 277 } |
| 278 | 278 |
| 279 SyntheticTrialGroup::~SyntheticTrialGroup() { | 279 SyntheticTrialGroup::~SyntheticTrialGroup() { |
| 280 } | 280 } |
| 281 | 281 |
| 282 // static | 282 // static |
| 283 MetricsService::ShutdownCleanliness MetricsService::clean_shutdown_status_ = | 283 MetricsService::ShutdownCleanliness MetricsService::clean_shutdown_status_ = |
| 284 MetricsService::CLEANLY_SHUTDOWN; | 284 MetricsService::CLEANLY_SHUTDOWN; |
| 285 | 285 |
| 286 MetricsService::ExecutionPhase MetricsService::execution_phase_ = | 286 MetricsService::ExecutionPhase MetricsService::execution_phase_ = |
| 287 MetricsService::UNINITIALIZED_PHASE; | 287 MetricsService::UNINITIALIZED_PHASE; |
| 288 | 288 |
| 289 // static | 289 // static |
| 290 void MetricsService::RegisterPrefs(PrefRegistrySimple* registry) { | 290 void MetricsService::RegisterPrefs(PrefRegistrySimple* registry) { |
| 291 DCHECK(IsSingleThreaded()); | 291 DCHECK(IsSingleThreaded()); |
| 292 metrics::MetricsStateManager::RegisterPrefs(registry); | 292 MetricsStateManager::RegisterPrefs(registry); |
| 293 MetricsLog::RegisterPrefs(registry); | 293 MetricsLog::RegisterPrefs(registry); |
| 294 | 294 |
| 295 registry->RegisterInt64Pref(metrics::prefs::kInstallDate, 0); | 295 registry->RegisterInt64Pref(prefs::kInstallDate, 0); |
| 296 | 296 |
| 297 registry->RegisterInt64Pref(metrics::prefs::kStabilityLaunchTimeSec, 0); | 297 registry->RegisterInt64Pref(prefs::kStabilityLaunchTimeSec, 0); |
| 298 registry->RegisterInt64Pref(metrics::prefs::kStabilityLastTimestampSec, 0); | 298 registry->RegisterInt64Pref(prefs::kStabilityLastTimestampSec, 0); |
| 299 registry->RegisterStringPref(metrics::prefs::kStabilityStatsVersion, | 299 registry->RegisterStringPref(prefs::kStabilityStatsVersion, std::string()); |
| 300 std::string()); | 300 registry->RegisterInt64Pref(prefs::kStabilityStatsBuildTime, 0); |
| 301 registry->RegisterInt64Pref(metrics::prefs::kStabilityStatsBuildTime, 0); | 301 registry->RegisterBooleanPref(prefs::kStabilityExitedCleanly, true); |
| 302 registry->RegisterBooleanPref(metrics::prefs::kStabilityExitedCleanly, true); | 302 registry->RegisterIntegerPref(prefs::kStabilityExecutionPhase, |
| 303 registry->RegisterIntegerPref(metrics::prefs::kStabilityExecutionPhase, | |
| 304 UNINITIALIZED_PHASE); | 303 UNINITIALIZED_PHASE); |
| 305 registry->RegisterBooleanPref(metrics::prefs::kStabilitySessionEndCompleted, | 304 registry->RegisterBooleanPref(prefs::kStabilitySessionEndCompleted, true); |
| 306 true); | 305 registry->RegisterIntegerPref(prefs::kMetricsSessionID, -1); |
| 307 registry->RegisterIntegerPref(metrics::prefs::kMetricsSessionID, -1); | |
| 308 | 306 |
| 309 registry->RegisterListPref(metrics::prefs::kMetricsInitialLogs); | 307 registry->RegisterListPref(prefs::kMetricsInitialLogs); |
| 310 registry->RegisterListPref(metrics::prefs::kMetricsOngoingLogs); | 308 registry->RegisterListPref(prefs::kMetricsOngoingLogs); |
| 311 | 309 |
| 312 registry->RegisterInt64Pref(metrics::prefs::kUninstallLaunchCount, 0); | 310 registry->RegisterInt64Pref(prefs::kUninstallLaunchCount, 0); |
| 313 registry->RegisterInt64Pref(metrics::prefs::kUninstallMetricsUptimeSec, 0); | 311 registry->RegisterInt64Pref(prefs::kUninstallMetricsUptimeSec, 0); |
| 314 } | 312 } |
| 315 | 313 |
| 316 MetricsService::MetricsService(metrics::MetricsStateManager* state_manager, | 314 MetricsService::MetricsService(MetricsStateManager* state_manager, |
| 317 metrics::MetricsServiceClient* client, | 315 MetricsServiceClient* client, |
| 318 PrefService* local_state) | 316 PrefService* local_state) |
| 319 : log_manager_(local_state, kUploadLogAvoidRetransmitSize), | 317 : log_manager_(local_state, kUploadLogAvoidRetransmitSize), |
| 320 histogram_snapshot_manager_(this), | 318 histogram_snapshot_manager_(this), |
| 321 state_manager_(state_manager), | 319 state_manager_(state_manager), |
| 322 client_(client), | 320 client_(client), |
| 323 local_state_(local_state), | 321 local_state_(local_state), |
| 324 clean_exit_beacon_(client->GetRegistryBackupKey(), local_state), | 322 clean_exit_beacon_(client->GetRegistryBackupKey(), local_state), |
| 325 recording_active_(false), | 323 recording_active_(false), |
| 326 reporting_active_(false), | 324 reporting_active_(false), |
| 327 test_mode_active_(false), | 325 test_mode_active_(false), |
| 328 state_(INITIALIZED), | 326 state_(INITIALIZED), |
| 329 has_initial_stability_log_(false), | 327 has_initial_stability_log_(false), |
| 330 log_upload_in_progress_(false), | 328 log_upload_in_progress_(false), |
| 331 idle_since_last_transmission_(false), | 329 idle_since_last_transmission_(false), |
| 332 session_id_(-1), | 330 session_id_(-1), |
| 333 self_ptr_factory_(this), | 331 self_ptr_factory_(this), |
| 334 state_saver_factory_(this) { | 332 state_saver_factory_(this) { |
| 335 DCHECK(IsSingleThreaded()); | 333 DCHECK(IsSingleThreaded()); |
| 336 DCHECK(state_manager_); | 334 DCHECK(state_manager_); |
| 337 DCHECK(client_); | 335 DCHECK(client_); |
| 338 DCHECK(local_state_); | 336 DCHECK(local_state_); |
| 339 | 337 |
| 340 // Set the install date if this is our first run. | 338 // Set the install date if this is our first run. |
| 341 int64 install_date = local_state_->GetInt64(metrics::prefs::kInstallDate); | 339 int64 install_date = local_state_->GetInt64(prefs::kInstallDate); |
| 342 if (install_date == 0) { | 340 if (install_date == 0) |
| 343 local_state_->SetInt64(metrics::prefs::kInstallDate, | 341 local_state_->SetInt64(prefs::kInstallDate, base::Time::Now().ToTimeT()); |
| 344 base::Time::Now().ToTimeT()); | |
| 345 } | |
| 346 } | 342 } |
| 347 | 343 |
| 348 MetricsService::~MetricsService() { | 344 MetricsService::~MetricsService() { |
| 349 DisableRecording(); | 345 DisableRecording(); |
| 350 } | 346 } |
| 351 | 347 |
| 352 void MetricsService::InitializeMetricsRecordingState() { | 348 void MetricsService::InitializeMetricsRecordingState() { |
| 353 InitializeMetricsState(); | 349 InitializeMetricsState(); |
| 354 | 350 |
| 355 base::Closure callback = base::Bind(&MetricsService::StartScheduledUpload, | 351 base::Closure callback = base::Bind(&MetricsService::StartScheduledUpload, |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 | 387 |
| 392 void MetricsService::DisableReporting() { | 388 void MetricsService::DisableReporting() { |
| 393 reporting_active_ = false; | 389 reporting_active_ = false; |
| 394 } | 390 } |
| 395 | 391 |
| 396 std::string MetricsService::GetClientId() { | 392 std::string MetricsService::GetClientId() { |
| 397 return state_manager_->client_id(); | 393 return state_manager_->client_id(); |
| 398 } | 394 } |
| 399 | 395 |
| 400 int64 MetricsService::GetInstallDate() { | 396 int64 MetricsService::GetInstallDate() { |
| 401 return local_state_->GetInt64(metrics::prefs::kInstallDate); | 397 return local_state_->GetInt64(prefs::kInstallDate); |
| 402 } | 398 } |
| 403 | 399 |
| 404 scoped_ptr<const base::FieldTrial::EntropyProvider> | 400 scoped_ptr<const base::FieldTrial::EntropyProvider> |
| 405 MetricsService::CreateEntropyProvider() { | 401 MetricsService::CreateEntropyProvider() { |
| 406 // TODO(asvitkine): Refactor the code so that MetricsService does not expose | 402 // TODO(asvitkine): Refactor the code so that MetricsService does not expose |
| 407 // this method. | 403 // this method. |
| 408 return state_manager_->CreateEntropyProvider(); | 404 return state_manager_->CreateEntropyProvider(); |
| 409 } | 405 } |
| 410 | 406 |
| 411 void MetricsService::EnableRecording() { | 407 void MetricsService::EnableRecording() { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 idle_since_last_transmission_ = in_idle; | 482 idle_since_last_transmission_ = in_idle; |
| 487 } | 483 } |
| 488 | 484 |
| 489 void MetricsService::OnApplicationNotIdle() { | 485 void MetricsService::OnApplicationNotIdle() { |
| 490 if (recording_active_) | 486 if (recording_active_) |
| 491 HandleIdleSinceLastTransmission(false); | 487 HandleIdleSinceLastTransmission(false); |
| 492 } | 488 } |
| 493 | 489 |
| 494 void MetricsService::RecordStartOfSessionEnd() { | 490 void MetricsService::RecordStartOfSessionEnd() { |
| 495 LogCleanShutdown(); | 491 LogCleanShutdown(); |
| 496 RecordBooleanPrefValue(metrics::prefs::kStabilitySessionEndCompleted, false); | 492 RecordBooleanPrefValue(prefs::kStabilitySessionEndCompleted, false); |
| 497 } | 493 } |
| 498 | 494 |
| 499 void MetricsService::RecordCompletedSessionEnd() { | 495 void MetricsService::RecordCompletedSessionEnd() { |
| 500 LogCleanShutdown(); | 496 LogCleanShutdown(); |
| 501 RecordBooleanPrefValue(metrics::prefs::kStabilitySessionEndCompleted, true); | 497 RecordBooleanPrefValue(prefs::kStabilitySessionEndCompleted, true); |
| 502 } | 498 } |
| 503 | 499 |
| 504 #if defined(OS_ANDROID) || defined(OS_IOS) | 500 #if defined(OS_ANDROID) || defined(OS_IOS) |
| 505 void MetricsService::OnAppEnterBackground() { | 501 void MetricsService::OnAppEnterBackground() { |
| 506 scheduler_->Stop(); | 502 scheduler_->Stop(); |
| 507 | 503 |
| 508 MarkAppCleanShutdownAndCommit(&clean_exit_beacon_, local_state_); | 504 MarkAppCleanShutdownAndCommit(&clean_exit_beacon_, local_state_); |
| 509 | 505 |
| 510 // At this point, there's no way of knowing when the process will be | 506 // At this point, there's no way of knowing when the process will be |
| 511 // killed, so this has to be treated similar to a shutdown, closing and | 507 // killed, so this has to be treated similar to a shutdown, closing and |
| (...skipping 17 matching lines...) Expand all Loading... |
| 529 clean_exit_beacon_.WriteBeaconValue(false); | 525 clean_exit_beacon_.WriteBeaconValue(false); |
| 530 // Redundant setting to be sure we call for a clean shutdown. | 526 // Redundant setting to be sure we call for a clean shutdown. |
| 531 clean_shutdown_status_ = NEED_TO_SHUTDOWN; | 527 clean_shutdown_status_ = NEED_TO_SHUTDOWN; |
| 532 } | 528 } |
| 533 #endif // defined(OS_ANDROID) || defined(OS_IOS) | 529 #endif // defined(OS_ANDROID) || defined(OS_IOS) |
| 534 | 530 |
| 535 // static | 531 // static |
| 536 void MetricsService::SetExecutionPhase(ExecutionPhase execution_phase, | 532 void MetricsService::SetExecutionPhase(ExecutionPhase execution_phase, |
| 537 PrefService* local_state) { | 533 PrefService* local_state) { |
| 538 execution_phase_ = execution_phase; | 534 execution_phase_ = execution_phase; |
| 539 local_state->SetInteger(metrics::prefs::kStabilityExecutionPhase, | 535 local_state->SetInteger(prefs::kStabilityExecutionPhase, execution_phase_); |
| 540 execution_phase_); | |
| 541 } | 536 } |
| 542 | 537 |
| 543 void MetricsService::RecordBreakpadRegistration(bool success) { | 538 void MetricsService::RecordBreakpadRegistration(bool success) { |
| 544 if (!success) | 539 if (!success) |
| 545 IncrementPrefValue(metrics::prefs::kStabilityBreakpadRegistrationFail); | 540 IncrementPrefValue(prefs::kStabilityBreakpadRegistrationFail); |
| 546 else | 541 else |
| 547 IncrementPrefValue(metrics::prefs::kStabilityBreakpadRegistrationSuccess); | 542 IncrementPrefValue(prefs::kStabilityBreakpadRegistrationSuccess); |
| 548 } | 543 } |
| 549 | 544 |
| 550 void MetricsService::RecordBreakpadHasDebugger(bool has_debugger) { | 545 void MetricsService::RecordBreakpadHasDebugger(bool has_debugger) { |
| 551 if (!has_debugger) | 546 if (!has_debugger) |
| 552 IncrementPrefValue(metrics::prefs::kStabilityDebuggerNotPresent); | 547 IncrementPrefValue(prefs::kStabilityDebuggerNotPresent); |
| 553 else | 548 else |
| 554 IncrementPrefValue(metrics::prefs::kStabilityDebuggerPresent); | 549 IncrementPrefValue(prefs::kStabilityDebuggerPresent); |
| 555 } | 550 } |
| 556 | 551 |
| 557 //------------------------------------------------------------------------------ | 552 //------------------------------------------------------------------------------ |
| 558 // private methods | 553 // private methods |
| 559 //------------------------------------------------------------------------------ | 554 //------------------------------------------------------------------------------ |
| 560 | 555 |
| 561 | 556 |
| 562 //------------------------------------------------------------------------------ | 557 //------------------------------------------------------------------------------ |
| 563 // Initialization methods | 558 // Initialization methods |
| 564 | 559 |
| 565 void MetricsService::InitializeMetricsState() { | 560 void MetricsService::InitializeMetricsState() { |
| 566 const int64 buildtime = MetricsLog::GetBuildTime(); | 561 const int64 buildtime = MetricsLog::GetBuildTime(); |
| 567 const std::string version = client_->GetVersionString(); | 562 const std::string version = client_->GetVersionString(); |
| 568 bool version_changed = false; | 563 bool version_changed = false; |
| 569 if (local_state_->GetInt64(prefs::kStabilityStatsBuildTime) != buildtime || | 564 if (local_state_->GetInt64(prefs::kStabilityStatsBuildTime) != buildtime || |
| 570 local_state_->GetString(prefs::kStabilityStatsVersion) != version) { | 565 local_state_->GetString(prefs::kStabilityStatsVersion) != version) { |
| 571 local_state_->SetString(metrics::prefs::kStabilityStatsVersion, version); | 566 local_state_->SetString(prefs::kStabilityStatsVersion, version); |
| 572 local_state_->SetInt64(metrics::prefs::kStabilityStatsBuildTime, buildtime); | 567 local_state_->SetInt64(prefs::kStabilityStatsBuildTime, buildtime); |
| 573 version_changed = true; | 568 version_changed = true; |
| 574 } | 569 } |
| 575 | 570 |
| 576 log_manager_.LoadPersistedUnsentLogs(); | 571 log_manager_.LoadPersistedUnsentLogs(); |
| 577 | 572 |
| 578 session_id_ = local_state_->GetInteger(metrics::prefs::kMetricsSessionID); | 573 session_id_ = local_state_->GetInteger(prefs::kMetricsSessionID); |
| 579 | 574 |
| 580 if (!clean_exit_beacon_.exited_cleanly()) { | 575 if (!clean_exit_beacon_.exited_cleanly()) { |
| 581 IncrementPrefValue(metrics::prefs::kStabilityCrashCount); | 576 IncrementPrefValue(prefs::kStabilityCrashCount); |
| 582 // Reset flag, and wait until we call LogNeedForCleanShutdown() before | 577 // Reset flag, and wait until we call LogNeedForCleanShutdown() before |
| 583 // monitoring. | 578 // monitoring. |
| 584 clean_exit_beacon_.WriteBeaconValue(true); | 579 clean_exit_beacon_.WriteBeaconValue(true); |
| 585 } | 580 } |
| 586 | 581 |
| 587 if (!clean_exit_beacon_.exited_cleanly() || ProvidersHaveStabilityMetrics()) { | 582 if (!clean_exit_beacon_.exited_cleanly() || ProvidersHaveStabilityMetrics()) { |
| 588 // TODO(rtenneti): On windows, consider saving/getting execution_phase from | 583 // TODO(rtenneti): On windows, consider saving/getting execution_phase from |
| 589 // the registry. | 584 // the registry. |
| 590 int execution_phase = | 585 int execution_phase = |
| 591 local_state_->GetInteger(metrics::prefs::kStabilityExecutionPhase); | 586 local_state_->GetInteger(prefs::kStabilityExecutionPhase); |
| 592 UMA_HISTOGRAM_SPARSE_SLOWLY("Chrome.Browser.CrashedExecutionPhase", | 587 UMA_HISTOGRAM_SPARSE_SLOWLY("Chrome.Browser.CrashedExecutionPhase", |
| 593 execution_phase); | 588 execution_phase); |
| 594 | 589 |
| 595 // If the previous session didn't exit cleanly, or if any provider | 590 // If the previous session didn't exit cleanly, or if any provider |
| 596 // explicitly requests it, prepare an initial stability log - | 591 // explicitly requests it, prepare an initial stability log - |
| 597 // provided UMA is enabled. | 592 // provided UMA is enabled. |
| 598 if (state_manager_->IsMetricsReportingEnabled()) | 593 if (state_manager_->IsMetricsReportingEnabled()) |
| 599 PrepareInitialStabilityLog(); | 594 PrepareInitialStabilityLog(); |
| 600 } | 595 } |
| 601 | 596 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 613 local_state_->SetInteger(prefs::kStabilityCrashCount, 0); | 608 local_state_->SetInteger(prefs::kStabilityCrashCount, 0); |
| 614 local_state_->SetInteger(prefs::kStabilityExecutionPhase, | 609 local_state_->SetInteger(prefs::kStabilityExecutionPhase, |
| 615 UNINITIALIZED_PHASE); | 610 UNINITIALIZED_PHASE); |
| 616 local_state_->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0); | 611 local_state_->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0); |
| 617 local_state_->SetInteger(prefs::kStabilityLaunchCount, 0); | 612 local_state_->SetInteger(prefs::kStabilityLaunchCount, 0); |
| 618 local_state_->SetBoolean(prefs::kStabilitySessionEndCompleted, true); | 613 local_state_->SetBoolean(prefs::kStabilitySessionEndCompleted, true); |
| 619 } | 614 } |
| 620 | 615 |
| 621 // Update session ID. | 616 // Update session ID. |
| 622 ++session_id_; | 617 ++session_id_; |
| 623 local_state_->SetInteger(metrics::prefs::kMetricsSessionID, session_id_); | 618 local_state_->SetInteger(prefs::kMetricsSessionID, session_id_); |
| 624 | 619 |
| 625 // Stability bookkeeping | 620 // Stability bookkeeping |
| 626 IncrementPrefValue(metrics::prefs::kStabilityLaunchCount); | 621 IncrementPrefValue(prefs::kStabilityLaunchCount); |
| 627 | 622 |
| 628 DCHECK_EQ(UNINITIALIZED_PHASE, execution_phase_); | 623 DCHECK_EQ(UNINITIALIZED_PHASE, execution_phase_); |
| 629 SetExecutionPhase(START_METRICS_RECORDING, local_state_); | 624 SetExecutionPhase(START_METRICS_RECORDING, local_state_); |
| 630 | 625 |
| 631 if (!local_state_->GetBoolean( | 626 if (!local_state_->GetBoolean(prefs::kStabilitySessionEndCompleted)) { |
| 632 metrics::prefs::kStabilitySessionEndCompleted)) { | 627 IncrementPrefValue(prefs::kStabilityIncompleteSessionEndCount); |
| 633 IncrementPrefValue(metrics::prefs::kStabilityIncompleteSessionEndCount); | |
| 634 // This is marked false when we get a WM_ENDSESSION. | 628 // This is marked false when we get a WM_ENDSESSION. |
| 635 local_state_->SetBoolean(metrics::prefs::kStabilitySessionEndCompleted, | 629 local_state_->SetBoolean(prefs::kStabilitySessionEndCompleted, true); |
| 636 true); | |
| 637 } | 630 } |
| 638 | 631 |
| 639 // Call GetUptimes() for the first time, thus allowing all later calls | 632 // Call GetUptimes() for the first time, thus allowing all later calls |
| 640 // to record incremental uptimes accurately. | 633 // to record incremental uptimes accurately. |
| 641 base::TimeDelta ignored_uptime_parameter; | 634 base::TimeDelta ignored_uptime_parameter; |
| 642 base::TimeDelta startup_uptime; | 635 base::TimeDelta startup_uptime; |
| 643 GetUptimes(local_state_, &startup_uptime, &ignored_uptime_parameter); | 636 GetUptimes(local_state_, &startup_uptime, &ignored_uptime_parameter); |
| 644 DCHECK_EQ(0, startup_uptime.InMicroseconds()); | 637 DCHECK_EQ(0, startup_uptime.InMicroseconds()); |
| 645 // For backwards compatibility, leave this intact in case Omaha is checking | 638 // For backwards compatibility, leave this intact in case Omaha is checking |
| 646 // them. metrics::prefs::kStabilityLastTimestampSec may also be useless now. | 639 // them. prefs::kStabilityLastTimestampSec may also be useless now. |
| 647 // TODO(jar): Delete these if they have no uses. | 640 // TODO(jar): Delete these if they have no uses. |
| 648 local_state_->SetInt64(metrics::prefs::kStabilityLaunchTimeSec, | 641 local_state_->SetInt64(prefs::kStabilityLaunchTimeSec, |
| 649 base::Time::Now().ToTimeT()); | 642 base::Time::Now().ToTimeT()); |
| 650 | 643 |
| 651 // Bookkeeping for the uninstall metrics. | 644 // Bookkeeping for the uninstall metrics. |
| 652 IncrementLongPrefsValue(metrics::prefs::kUninstallLaunchCount); | 645 IncrementLongPrefsValue(prefs::kUninstallLaunchCount); |
| 653 | 646 |
| 654 // Kick off the process of saving the state (so the uptime numbers keep | 647 // Kick off the process of saving the state (so the uptime numbers keep |
| 655 // getting updated) every n minutes. | 648 // getting updated) every n minutes. |
| 656 ScheduleNextStateSave(); | 649 ScheduleNextStateSave(); |
| 657 } | 650 } |
| 658 | 651 |
| 659 void MetricsService::OnUserAction(const std::string& action) { | 652 void MetricsService::OnUserAction(const std::string& action) { |
| 660 if (!ShouldLogEvents()) | 653 if (!ShouldLogEvents()) |
| 661 return; | 654 return; |
| 662 | 655 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 686 if (last_updated_time_.is_null()) { | 679 if (last_updated_time_.is_null()) { |
| 687 first_updated_time_ = now; | 680 first_updated_time_ = now; |
| 688 last_updated_time_ = now; | 681 last_updated_time_ = now; |
| 689 } | 682 } |
| 690 *incremental_uptime = now - last_updated_time_; | 683 *incremental_uptime = now - last_updated_time_; |
| 691 *uptime = now - first_updated_time_; | 684 *uptime = now - first_updated_time_; |
| 692 last_updated_time_ = now; | 685 last_updated_time_ = now; |
| 693 | 686 |
| 694 const int64 incremental_time_secs = incremental_uptime->InSeconds(); | 687 const int64 incremental_time_secs = incremental_uptime->InSeconds(); |
| 695 if (incremental_time_secs > 0) { | 688 if (incremental_time_secs > 0) { |
| 696 int64 metrics_uptime = | 689 int64 metrics_uptime = pref->GetInt64(prefs::kUninstallMetricsUptimeSec); |
| 697 pref->GetInt64(metrics::prefs::kUninstallMetricsUptimeSec); | |
| 698 metrics_uptime += incremental_time_secs; | 690 metrics_uptime += incremental_time_secs; |
| 699 pref->SetInt64(metrics::prefs::kUninstallMetricsUptimeSec, metrics_uptime); | 691 pref->SetInt64(prefs::kUninstallMetricsUptimeSec, metrics_uptime); |
| 700 } | 692 } |
| 701 } | 693 } |
| 702 | 694 |
| 703 void MetricsService::NotifyOnDidCreateMetricsLog() { | 695 void MetricsService::NotifyOnDidCreateMetricsLog() { |
| 704 DCHECK(IsSingleThreaded()); | 696 DCHECK(IsSingleThreaded()); |
| 705 for (size_t i = 0; i < metrics_providers_.size(); ++i) | 697 for (size_t i = 0; i < metrics_providers_.size(); ++i) |
| 706 metrics_providers_[i]->OnDidCreateMetricsLog(); | 698 metrics_providers_[i]->OnDidCreateMetricsLog(); |
| 707 } | 699 } |
| 708 | 700 |
| 709 //------------------------------------------------------------------------------ | 701 //------------------------------------------------------------------------------ |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1157 return; | 1149 return; |
| 1158 } | 1150 } |
| 1159 } | 1151 } |
| 1160 | 1152 |
| 1161 SyntheticTrialGroup trial_group = trial; | 1153 SyntheticTrialGroup trial_group = trial; |
| 1162 trial_group.start_time = base::TimeTicks::Now(); | 1154 trial_group.start_time = base::TimeTicks::Now(); |
| 1163 synthetic_trial_groups_.push_back(trial_group); | 1155 synthetic_trial_groups_.push_back(trial_group); |
| 1164 } | 1156 } |
| 1165 | 1157 |
| 1166 void MetricsService::RegisterMetricsProvider( | 1158 void MetricsService::RegisterMetricsProvider( |
| 1167 scoped_ptr<metrics::MetricsProvider> provider) { | 1159 scoped_ptr<MetricsProvider> provider) { |
| 1168 DCHECK_EQ(INITIALIZED, state_); | 1160 DCHECK_EQ(INITIALIZED, state_); |
| 1169 metrics_providers_.push_back(provider.release()); | 1161 metrics_providers_.push_back(provider.release()); |
| 1170 } | 1162 } |
| 1171 | 1163 |
| 1172 void MetricsService::CheckForClonedInstall( | 1164 void MetricsService::CheckForClonedInstall( |
| 1173 scoped_refptr<base::SingleThreadTaskRunner> task_runner) { | 1165 scoped_refptr<base::SingleThreadTaskRunner> task_runner) { |
| 1174 state_manager_->CheckForClonedInstall(task_runner); | 1166 state_manager_->CheckForClonedInstall(task_runner); |
| 1175 } | 1167 } |
| 1176 | 1168 |
| 1177 void MetricsService::GetCurrentSyntheticFieldTrials( | 1169 void MetricsService::GetCurrentSyntheticFieldTrials( |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1217 void MetricsService::LogCleanShutdown() { | 1209 void MetricsService::LogCleanShutdown() { |
| 1218 // Redundant hack to write pref ASAP. | 1210 // Redundant hack to write pref ASAP. |
| 1219 MarkAppCleanShutdownAndCommit(&clean_exit_beacon_, local_state_); | 1211 MarkAppCleanShutdownAndCommit(&clean_exit_beacon_, local_state_); |
| 1220 | 1212 |
| 1221 // Redundant setting to assure that we always reset this value at shutdown | 1213 // Redundant setting to assure that we always reset this value at shutdown |
| 1222 // (and that we don't use some alternate path, and not call LogCleanShutdown). | 1214 // (and that we don't use some alternate path, and not call LogCleanShutdown). |
| 1223 clean_shutdown_status_ = CLEANLY_SHUTDOWN; | 1215 clean_shutdown_status_ = CLEANLY_SHUTDOWN; |
| 1224 | 1216 |
| 1225 clean_exit_beacon_.WriteBeaconValue(true); | 1217 clean_exit_beacon_.WriteBeaconValue(true); |
| 1226 RecordCurrentState(local_state_); | 1218 RecordCurrentState(local_state_); |
| 1227 local_state_->SetInteger(metrics::prefs::kStabilityExecutionPhase, | 1219 local_state_->SetInteger(prefs::kStabilityExecutionPhase, |
| 1228 MetricsService::SHUTDOWN_COMPLETE); | 1220 MetricsService::SHUTDOWN_COMPLETE); |
| 1229 } | 1221 } |
| 1230 | 1222 |
| 1231 bool MetricsService::ShouldLogEvents() { | 1223 bool MetricsService::ShouldLogEvents() { |
| 1232 // We simply don't log events to UMA if there is a single incognito | 1224 // We simply don't log events to UMA if there is a single incognito |
| 1233 // session visible. The problem is that we always notify using the orginal | 1225 // session visible. The problem is that we always notify using the orginal |
| 1234 // profile in order to simplify notification processing. | 1226 // profile in order to simplify notification processing. |
| 1235 return !client_->IsOffTheRecordSessionActive(); | 1227 return !client_->IsOffTheRecordSessionActive(); |
| 1236 } | 1228 } |
| 1237 | 1229 |
| 1238 void MetricsService::RecordBooleanPrefValue(const char* path, bool value) { | 1230 void MetricsService::RecordBooleanPrefValue(const char* path, bool value) { |
| 1239 DCHECK(IsSingleThreaded()); | 1231 DCHECK(IsSingleThreaded()); |
| 1240 local_state_->SetBoolean(path, value); | 1232 local_state_->SetBoolean(path, value); |
| 1241 RecordCurrentState(local_state_); | 1233 RecordCurrentState(local_state_); |
| 1242 } | 1234 } |
| 1243 | 1235 |
| 1244 void MetricsService::RecordCurrentState(PrefService* pref) { | 1236 void MetricsService::RecordCurrentState(PrefService* pref) { |
| 1245 pref->SetInt64(metrics::prefs::kStabilityLastTimestampSec, | 1237 pref->SetInt64(prefs::kStabilityLastTimestampSec, |
| 1246 base::Time::Now().ToTimeT()); | 1238 base::Time::Now().ToTimeT()); |
| 1247 } | 1239 } |
| 1248 | 1240 |
| 1249 } // namespace metrics | 1241 } // namespace metrics |
| OLD | NEW |