Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(464)

Side by Side Diff: components/metrics/metrics_service.cc

Issue 1537743006: Persist setup metrics and have Chrome report them during UMA upload. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@shared-histograms
Patch Set: addressed final review comments by Alexei Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/metrics/metrics_provider.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 base::Bind(&MetricsService::StartScheduledUpload, 318 base::Bind(&MetricsService::StartScheduledUpload,
319 self_ptr_factory_.GetWeakPtr()); 319 self_ptr_factory_.GetWeakPtr());
320 scheduler_.reset( 320 scheduler_.reset(
321 new MetricsReportingScheduler( 321 new MetricsReportingScheduler(
322 upload_callback, 322 upload_callback,
323 // MetricsServiceClient outlives MetricsService, and 323 // MetricsServiceClient outlives MetricsService, and
324 // MetricsReportingScheduler is tied to the lifetime of |this|. 324 // MetricsReportingScheduler is tied to the lifetime of |this|.
325 base::Bind(&MetricsServiceClient::GetStandardUploadInterval, 325 base::Bind(&MetricsServiceClient::GetStandardUploadInterval,
326 base::Unretained(client_)))); 326 base::Unretained(client_))));
327 327
328 for (size_t i = 0; i < metrics_providers_.size(); ++i) 328 for (MetricsProvider* provider : metrics_providers_)
329 metrics_providers_[i]->Init(); 329 provider->Init();
330 } 330 }
331 331
332 void MetricsService::Start() { 332 void MetricsService::Start() {
333 HandleIdleSinceLastTransmission(false); 333 HandleIdleSinceLastTransmission(false);
334 EnableRecording(); 334 EnableRecording();
335 EnableReporting(); 335 EnableReporting();
336 } 336 }
337 337
338 void MetricsService::StartRecordingForTests() { 338 void MetricsService::StartRecordingForTests() {
339 test_mode_active_ = true; 339 test_mode_active_ = true;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 386
387 if (recording_state_ == ACTIVE) 387 if (recording_state_ == ACTIVE)
388 return; 388 return;
389 recording_state_ = ACTIVE; 389 recording_state_ = ACTIVE;
390 390
391 state_manager_->ForceClientIdCreation(); 391 state_manager_->ForceClientIdCreation();
392 client_->SetMetricsClientId(state_manager_->client_id()); 392 client_->SetMetricsClientId(state_manager_->client_id());
393 if (!log_manager_.current_log()) 393 if (!log_manager_.current_log())
394 OpenNewLog(); 394 OpenNewLog();
395 395
396 for (size_t i = 0; i < metrics_providers_.size(); ++i) 396 for (MetricsProvider* provider : metrics_providers_)
397 metrics_providers_[i]->OnRecordingEnabled(); 397 provider->OnRecordingEnabled();
398 398
399 base::RemoveActionCallback(action_callback_); 399 base::RemoveActionCallback(action_callback_);
400 action_callback_ = base::Bind(&MetricsService::OnUserAction, 400 action_callback_ = base::Bind(&MetricsService::OnUserAction,
401 base::Unretained(this)); 401 base::Unretained(this));
402 base::AddActionCallback(action_callback_); 402 base::AddActionCallback(action_callback_);
403 } 403 }
404 404
405 void MetricsService::DisableRecording() { 405 void MetricsService::DisableRecording() {
406 DCHECK(IsSingleThreaded()); 406 DCHECK(IsSingleThreaded());
407 407
408 if (recording_state_ == INACTIVE) 408 if (recording_state_ == INACTIVE)
409 return; 409 return;
410 recording_state_ = INACTIVE; 410 recording_state_ = INACTIVE;
411 411
412 client_->OnRecordingDisabled(); 412 client_->OnRecordingDisabled();
413 413
414 base::RemoveActionCallback(action_callback_); 414 base::RemoveActionCallback(action_callback_);
415 415
416 for (size_t i = 0; i < metrics_providers_.size(); ++i) 416 for (MetricsProvider* provider : metrics_providers_)
417 metrics_providers_[i]->OnRecordingDisabled(); 417 provider->OnRecordingDisabled();
418 418
419 PushPendingLogsToPersistentStorage(); 419 PushPendingLogsToPersistentStorage();
420 } 420 }
421 421
422 bool MetricsService::recording_active() const { 422 bool MetricsService::recording_active() const {
423 DCHECK(IsSingleThreaded()); 423 DCHECK(IsSingleThreaded());
424 return recording_state_ == ACTIVE; 424 return recording_state_ == ACTIVE;
425 } 425 }
426 426
427 bool MetricsService::reporting_active() const { 427 bool MetricsService::reporting_active() const {
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 } 522 }
523 523
524 void MetricsService::RecordBreakpadHasDebugger(bool has_debugger) { 524 void MetricsService::RecordBreakpadHasDebugger(bool has_debugger) {
525 if (!has_debugger) 525 if (!has_debugger)
526 IncrementPrefValue(prefs::kStabilityDebuggerNotPresent); 526 IncrementPrefValue(prefs::kStabilityDebuggerNotPresent);
527 else 527 else
528 IncrementPrefValue(prefs::kStabilityDebuggerPresent); 528 IncrementPrefValue(prefs::kStabilityDebuggerPresent);
529 } 529 }
530 530
531 void MetricsService::ClearSavedStabilityMetrics() { 531 void MetricsService::ClearSavedStabilityMetrics() {
532 for (size_t i = 0; i < metrics_providers_.size(); ++i) 532 for (MetricsProvider* provider : metrics_providers_)
533 metrics_providers_[i]->ClearSavedStabilityMetrics(); 533 provider->ClearSavedStabilityMetrics();
534 534
535 // Reset the prefs that are managed by MetricsService/MetricsLog directly. 535 // Reset the prefs that are managed by MetricsService/MetricsLog directly.
536 local_state_->SetInteger(prefs::kStabilityCrashCount, 0); 536 local_state_->SetInteger(prefs::kStabilityCrashCount, 0);
537 local_state_->SetInteger(prefs::kStabilityExecutionPhase, 537 local_state_->SetInteger(prefs::kStabilityExecutionPhase,
538 UNINITIALIZED_PHASE); 538 UNINITIALIZED_PHASE);
539 local_state_->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0); 539 local_state_->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0);
540 local_state_->SetInteger(prefs::kStabilityLaunchCount, 0); 540 local_state_->SetInteger(prefs::kStabilityLaunchCount, 0);
541 local_state_->SetBoolean(prefs::kStabilitySessionEndCompleted, true); 541 local_state_->SetBoolean(prefs::kStabilitySessionEndCompleted, true);
542 } 542 }
543 543
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 const int64_t incremental_time_secs = incremental_uptime->InSeconds(); 675 const int64_t incremental_time_secs = incremental_uptime->InSeconds();
676 if (incremental_time_secs > 0) { 676 if (incremental_time_secs > 0) {
677 int64_t metrics_uptime = pref->GetInt64(prefs::kUninstallMetricsUptimeSec); 677 int64_t metrics_uptime = pref->GetInt64(prefs::kUninstallMetricsUptimeSec);
678 metrics_uptime += incremental_time_secs; 678 metrics_uptime += incremental_time_secs;
679 pref->SetInt64(prefs::kUninstallMetricsUptimeSec, metrics_uptime); 679 pref->SetInt64(prefs::kUninstallMetricsUptimeSec, metrics_uptime);
680 } 680 }
681 } 681 }
682 682
683 void MetricsService::NotifyOnDidCreateMetricsLog() { 683 void MetricsService::NotifyOnDidCreateMetricsLog() {
684 DCHECK(IsSingleThreaded()); 684 DCHECK(IsSingleThreaded());
685 for (size_t i = 0; i < metrics_providers_.size(); ++i) 685 for (MetricsProvider* provider : metrics_providers_)
686 metrics_providers_[i]->OnDidCreateMetricsLog(); 686 provider->OnDidCreateMetricsLog();
687 } 687 }
688 688
689 //------------------------------------------------------------------------------ 689 //------------------------------------------------------------------------------
690 // State save methods 690 // State save methods
691 691
692 void MetricsService::ScheduleNextStateSave() { 692 void MetricsService::ScheduleNextStateSave() {
693 state_saver_factory_.InvalidateWeakPtrs(); 693 state_saver_factory_.InvalidateWeakPtrs();
694 694
695 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 695 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
696 FROM_HERE, base::Bind(&MetricsService::SaveLocalState, 696 FROM_HERE, base::Bind(&MetricsService::SaveLocalState,
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 scheduler_->UploadFinished(true, log_manager_.has_unsent_logs()); 864 scheduler_->UploadFinished(true, log_manager_.has_unsent_logs());
865 return; 865 return;
866 } 866 }
867 if (!log_manager_.has_staged_log()) 867 if (!log_manager_.has_staged_log())
868 log_manager_.StageNextLogForUpload(); 868 log_manager_.StageNextLogForUpload();
869 SendStagedLog(); 869 SendStagedLog();
870 } 870 }
871 871
872 bool MetricsService::ProvidersHaveInitialStabilityMetrics() { 872 bool MetricsService::ProvidersHaveInitialStabilityMetrics() {
873 // Check whether any metrics provider has initial stability metrics. 873 // Check whether any metrics provider has initial stability metrics.
874 for (size_t i = 0; i < metrics_providers_.size(); ++i) { 874 for (MetricsProvider* provider : metrics_providers_) {
875 if (metrics_providers_[i]->HasInitialStabilityMetrics()) 875 if (provider->HasInitialStabilityMetrics())
876 return true; 876 return true;
877 } 877 }
878 878
879 return false; 879 return false;
880 } 880 }
881 881
882 bool MetricsService::PrepareInitialStabilityLog() { 882 bool MetricsService::PrepareInitialStabilityLog() {
883 DCHECK_EQ(INITIALIZED, state_); 883 DCHECK_EQ(INITIALIZED, state_);
884 884
885 scoped_ptr<MetricsLog> initial_stability_log( 885 scoped_ptr<MetricsLog> initial_stability_log(
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1103 1103
1104 void MetricsService::RecordCurrentEnvironment(MetricsLog* log) { 1104 void MetricsService::RecordCurrentEnvironment(MetricsLog* log) {
1105 std::vector<variations::ActiveGroupId> synthetic_trials; 1105 std::vector<variations::ActiveGroupId> synthetic_trials;
1106 GetSyntheticFieldTrialsOlderThan(log->creation_time(), &synthetic_trials); 1106 GetSyntheticFieldTrialsOlderThan(log->creation_time(), &synthetic_trials);
1107 log->RecordEnvironment(metrics_providers_.get(), synthetic_trials, 1107 log->RecordEnvironment(metrics_providers_.get(), synthetic_trials,
1108 GetInstallDate(), GetMetricsReportingEnabledDate()); 1108 GetInstallDate(), GetMetricsReportingEnabledDate());
1109 } 1109 }
1110 1110
1111 void MetricsService::RecordCurrentHistograms() { 1111 void MetricsService::RecordCurrentHistograms() {
1112 DCHECK(log_manager_.current_log()); 1112 DCHECK(log_manager_.current_log());
1113 // "true" indicates that StatisticsRecorder should include histograms in 1113 histogram_snapshot_manager_.StartDeltas();
1114 // persistent storage. 1114 // "true" to the begin() call indicates that StatisticsRecorder should include
1115 histogram_snapshot_manager_.PrepareDeltas( 1115 // histograms held in persistent storage.
1116 base::StatisticsRecorder::begin(true), base::StatisticsRecorder::end(), 1116 auto end = base::StatisticsRecorder::end();
1117 base::Histogram::kNoFlags, base::Histogram::kUmaTargetedHistogramFlag); 1117 for (auto it = base::StatisticsRecorder::begin(true); it != end; ++it) {
1118 if ((*it)->flags() & base::Histogram::kUmaTargetedHistogramFlag)
1119 histogram_snapshot_manager_.PrepareDelta(*it);
1120 }
1121 for (MetricsProvider* provider : metrics_providers_)
1122 provider->RecordHistogramSnapshots(&histogram_snapshot_manager_);
1123 histogram_snapshot_manager_.FinishDeltas();
1118 } 1124 }
1119 1125
1120 void MetricsService::RecordCurrentStabilityHistograms() { 1126 void MetricsService::RecordCurrentStabilityHistograms() {
1121 DCHECK(log_manager_.current_log()); 1127 DCHECK(log_manager_.current_log());
1122 // "true" indicates that StatisticsRecorder should include histograms in 1128 // "true" indicates that StatisticsRecorder should include histograms in
1123 // persistent storage. 1129 // persistent storage.
1124 histogram_snapshot_manager_.PrepareDeltas( 1130 histogram_snapshot_manager_.PrepareDeltas(
1125 base::StatisticsRecorder::begin(true), base::StatisticsRecorder::end(), 1131 base::StatisticsRecorder::begin(true), base::StatisticsRecorder::end(),
1126 base::Histogram::kNoFlags, base::Histogram::kUmaStabilityHistogramFlag); 1132 base::Histogram::kNoFlags, base::Histogram::kUmaStabilityHistogramFlag);
1127 } 1133 }
(...skipping 27 matching lines...) Expand all
1155 base::Time::Now().ToTimeT()); 1161 base::Time::Now().ToTimeT());
1156 } 1162 }
1157 1163
1158 void MetricsService::SkipAndDiscardUpload() { 1164 void MetricsService::SkipAndDiscardUpload() {
1159 log_manager_.DiscardStagedLog(); 1165 log_manager_.DiscardStagedLog();
1160 scheduler_->UploadCancelled(); 1166 scheduler_->UploadCancelled();
1161 log_upload_in_progress_ = false; 1167 log_upload_in_progress_ = false;
1162 } 1168 }
1163 1169
1164 } // namespace metrics 1170 } // namespace metrics
OLDNEW
« no previous file with comments | « components/metrics/metrics_provider.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698