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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 | 124 |
125 #include "components/metrics/metrics_service.h" | 125 #include "components/metrics/metrics_service.h" |
126 | 126 |
127 #include <algorithm> | 127 #include <algorithm> |
128 | 128 |
129 #include "base/bind.h" | 129 #include "base/bind.h" |
130 #include "base/callback.h" | 130 #include "base/callback.h" |
131 #include "base/location.h" | 131 #include "base/location.h" |
132 #include "base/metrics/histogram_base.h" | 132 #include "base/metrics/histogram_base.h" |
133 #include "base/metrics/histogram_macros.h" | 133 #include "base/metrics/histogram_macros.h" |
| 134 #include "base/metrics/histogram_persistence.h" |
134 #include "base/metrics/histogram_samples.h" | 135 #include "base/metrics/histogram_samples.h" |
135 #include "base/metrics/sparse_histogram.h" | 136 #include "base/metrics/sparse_histogram.h" |
136 #include "base/metrics/statistics_recorder.h" | 137 #include "base/metrics/statistics_recorder.h" |
137 #include "base/prefs/pref_registry_simple.h" | 138 #include "base/prefs/pref_registry_simple.h" |
138 #include "base/prefs/pref_service.h" | 139 #include "base/prefs/pref_service.h" |
139 #include "base/rand_util.h" | 140 #include "base/rand_util.h" |
140 #include "base/single_thread_task_runner.h" | 141 #include "base/single_thread_task_runner.h" |
141 #include "base/strings/string_number_conversions.h" | 142 #include "base/strings/string_number_conversions.h" |
142 #include "base/strings/utf_string_conversions.h" | 143 #include "base/strings/utf_string_conversions.h" |
143 #include "base/thread_task_runner_handle.h" | 144 #include "base/thread_task_runner_handle.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 | 236 |
236 int probability; | 237 int probability; |
237 // In case specified sampling rate is invalid. | 238 // In case specified sampling rate is invalid. |
238 if (!base::StringToInt(probability_str, &probability)) | 239 if (!base::StringToInt(probability_str, &probability)) |
239 return true; | 240 return true; |
240 return base::RandInt(1, 100) <= probability; | 241 return base::RandInt(1, 100) <= probability; |
241 } | 242 } |
242 | 243 |
243 } // namespace | 244 } // namespace |
244 | 245 |
| 246 MetricsService::PersistentHistogramIterator::PersistentHistogramIterator( |
| 247 AllocatorSet& allocators, |
| 248 AllocatorSet::iterator pos) |
| 249 : allocators_(allocators), |
| 250 allocator_iter_(pos) { |
| 251 if (pos != allocators_.end()) { |
| 252 (*allocator_iter_)->CreateIterator(&histogram_iter_); |
| 253 // Have to call ++ to advance iterator to the first persistent histogram. |
| 254 operator++(); |
| 255 } |
| 256 } |
| 257 |
| 258 MetricsService::PersistentHistogramIterator& |
| 259 MetricsService::PersistentHistogramIterator::operator++() { |
| 260 if (allocator_iter_ != allocators_.end()) { |
| 261 for (;;) { |
| 262 base::HistogramBase* h = base::GetNextPersistentHistogram( |
| 263 *allocator_iter_, &histogram_iter_); |
| 264 if (h) { |
| 265 current_histogram_ = new HistogramPointer(h); |
| 266 break; |
| 267 } |
| 268 allocator_iter_++; |
| 269 if (allocator_iter_ == allocators_.end()) { |
| 270 histogram_iter_.clear(); // Clear so it matches end() iterator. |
| 271 current_histogram_ = nullptr; |
| 272 break; |
| 273 } |
| 274 (*allocator_iter_)->CreateIterator(&histogram_iter_); |
| 275 } |
| 276 } |
| 277 return *this; |
| 278 } |
| 279 |
245 // static | 280 // static |
246 MetricsService::ShutdownCleanliness MetricsService::clean_shutdown_status_ = | 281 MetricsService::ShutdownCleanliness MetricsService::clean_shutdown_status_ = |
247 MetricsService::CLEANLY_SHUTDOWN; | 282 MetricsService::CLEANLY_SHUTDOWN; |
248 | 283 |
249 MetricsService::ExecutionPhase MetricsService::execution_phase_ = | 284 MetricsService::ExecutionPhase MetricsService::execution_phase_ = |
250 MetricsService::UNINITIALIZED_PHASE; | 285 MetricsService::UNINITIALIZED_PHASE; |
251 | 286 |
252 // static | 287 // static |
253 void MetricsService::RegisterPrefs(PrefRegistrySimple* registry) { | 288 void MetricsService::RegisterPrefs(PrefRegistrySimple* registry) { |
254 DCHECK(IsSingleThreaded()); | 289 DCHECK(IsSingleThreaded()); |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 UNINITIALIZED_PHASE); | 566 UNINITIALIZED_PHASE); |
532 local_state_->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0); | 567 local_state_->SetInteger(prefs::kStabilityIncompleteSessionEndCount, 0); |
533 local_state_->SetInteger(prefs::kStabilityLaunchCount, 0); | 568 local_state_->SetInteger(prefs::kStabilityLaunchCount, 0); |
534 local_state_->SetBoolean(prefs::kStabilitySessionEndCompleted, true); | 569 local_state_->SetBoolean(prefs::kStabilitySessionEndCompleted, true); |
535 } | 570 } |
536 | 571 |
537 void MetricsService::PushExternalLog(const std::string& log) { | 572 void MetricsService::PushExternalLog(const std::string& log) { |
538 log_manager_.StoreLog(log, MetricsLog::ONGOING_LOG); | 573 log_manager_.StoreLog(log, MetricsLog::ONGOING_LOG); |
539 } | 574 } |
540 | 575 |
| 576 void MetricsService::AddPersistentMemorySegment( |
| 577 base::PersistentMemoryAllocator* allocator) { |
| 578 DCHECK(allocators_.find(allocator) == allocators_.end()); |
| 579 allocators_.insert(allocator); |
| 580 } |
| 581 |
| 582 void MetricsService::RemovePersistentMemorySegment( |
| 583 base::PersistentMemoryAllocator* allocator) { |
| 584 DCHECK(allocators_.find(allocator) != allocators_.end()); |
| 585 allocators_.erase(allocator); |
| 586 } |
| 587 |
541 //------------------------------------------------------------------------------ | 588 //------------------------------------------------------------------------------ |
542 // private methods | 589 // private methods |
543 //------------------------------------------------------------------------------ | 590 //------------------------------------------------------------------------------ |
544 | 591 |
545 | 592 |
546 //------------------------------------------------------------------------------ | 593 //------------------------------------------------------------------------------ |
547 // Initialization methods | 594 // Initialization methods |
548 | 595 |
549 void MetricsService::InitializeMetricsState() { | 596 void MetricsService::InitializeMetricsState() { |
550 const int64 buildtime = MetricsLog::GetBuildTime(); | 597 const int64 buildtime = MetricsLog::GetBuildTime(); |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 | 777 |
731 // TODO(jar): Integrate bounds on log recording more consistently, so that we | 778 // TODO(jar): Integrate bounds on log recording more consistently, so that we |
732 // can stop recording logs that are too big much sooner. | 779 // can stop recording logs that are too big much sooner. |
733 if (log_manager_.current_log()->num_events() > kEventLimit) { | 780 if (log_manager_.current_log()->num_events() > kEventLimit) { |
734 UMA_HISTOGRAM_COUNTS("UMA.Discarded Log Events", | 781 UMA_HISTOGRAM_COUNTS("UMA.Discarded Log Events", |
735 log_manager_.current_log()->num_events()); | 782 log_manager_.current_log()->num_events()); |
736 log_manager_.DiscardCurrentLog(); | 783 log_manager_.DiscardCurrentLog(); |
737 OpenNewLog(); // Start trivial log to hold our histograms. | 784 OpenNewLog(); // Start trivial log to hold our histograms. |
738 } | 785 } |
739 | 786 |
| 787 base::PersistentMemoryAllocator* allocator = |
| 788 base::GetPersistentHistogramMemoryAllocator(); |
| 789 if (allocator) |
| 790 allocator->UpdateStaticHistograms(); |
| 791 |
740 // Put incremental data (histogram deltas, and realtime stats deltas) at the | 792 // Put incremental data (histogram deltas, and realtime stats deltas) at the |
741 // end of all log transmissions (initial log handles this separately). | 793 // end of all log transmissions (initial log handles this separately). |
742 // RecordIncrementalStabilityElements only exists on the derived | 794 // RecordIncrementalStabilityElements only exists on the derived |
743 // MetricsLog class. | 795 // MetricsLog class. |
744 MetricsLog* current_log = log_manager_.current_log(); | 796 MetricsLog* current_log = log_manager_.current_log(); |
745 DCHECK(current_log); | 797 DCHECK(current_log); |
746 RecordCurrentEnvironment(current_log); | 798 RecordCurrentEnvironment(current_log); |
747 base::TimeDelta incremental_uptime; | 799 base::TimeDelta incremental_uptime; |
748 base::TimeDelta uptime; | 800 base::TimeDelta uptime; |
749 GetUptimes(local_state_, &incremental_uptime, &uptime); | 801 GetUptimes(local_state_, &incremental_uptime, &uptime); |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1090 void MetricsService::RecordCurrentEnvironment(MetricsLog* log) { | 1142 void MetricsService::RecordCurrentEnvironment(MetricsLog* log) { |
1091 std::vector<variations::ActiveGroupId> synthetic_trials; | 1143 std::vector<variations::ActiveGroupId> synthetic_trials; |
1092 GetSyntheticFieldTrialsOlderThan(log->creation_time(), &synthetic_trials); | 1144 GetSyntheticFieldTrialsOlderThan(log->creation_time(), &synthetic_trials); |
1093 log->RecordEnvironment(metrics_providers_.get(), synthetic_trials, | 1145 log->RecordEnvironment(metrics_providers_.get(), synthetic_trials, |
1094 GetInstallDate(), GetMetricsReportingEnabledDate()); | 1146 GetInstallDate(), GetMetricsReportingEnabledDate()); |
1095 } | 1147 } |
1096 | 1148 |
1097 void MetricsService::RecordCurrentHistograms() { | 1149 void MetricsService::RecordCurrentHistograms() { |
1098 DCHECK(log_manager_.current_log()); | 1150 DCHECK(log_manager_.current_log()); |
1099 histogram_snapshot_manager_.PrepareDeltas( | 1151 histogram_snapshot_manager_.PrepareDeltas( |
| 1152 base::StatisticsRecorder::begin(true), base::StatisticsRecorder::end(), |
| 1153 base::Histogram::kNoFlags, base::Histogram::kUmaTargetedHistogramFlag); |
| 1154 histogram_snapshot_manager_.PrepareDeltas( |
| 1155 persistent_begin(), persistent_end(), |
1100 base::Histogram::kNoFlags, base::Histogram::kUmaTargetedHistogramFlag); | 1156 base::Histogram::kNoFlags, base::Histogram::kUmaTargetedHistogramFlag); |
1101 } | 1157 } |
1102 | 1158 |
1103 void MetricsService::RecordCurrentStabilityHistograms() { | 1159 void MetricsService::RecordCurrentStabilityHistograms() { |
1104 DCHECK(log_manager_.current_log()); | 1160 DCHECK(log_manager_.current_log()); |
1105 histogram_snapshot_manager_.PrepareDeltas( | 1161 histogram_snapshot_manager_.PrepareDeltas( |
| 1162 base::StatisticsRecorder::begin(true), base::StatisticsRecorder::end(), |
1106 base::Histogram::kNoFlags, base::Histogram::kUmaStabilityHistogramFlag); | 1163 base::Histogram::kNoFlags, base::Histogram::kUmaStabilityHistogramFlag); |
1107 } | 1164 } |
1108 | 1165 |
1109 void MetricsService::LogCleanShutdown() { | 1166 void MetricsService::LogCleanShutdown() { |
1110 // Redundant setting to assure that we always reset this value at shutdown | 1167 // Redundant setting to assure that we always reset this value at shutdown |
1111 // (and that we don't use some alternate path, and not call LogCleanShutdown). | 1168 // (and that we don't use some alternate path, and not call LogCleanShutdown). |
1112 clean_shutdown_status_ = CLEANLY_SHUTDOWN; | 1169 clean_shutdown_status_ = CLEANLY_SHUTDOWN; |
1113 | 1170 |
1114 clean_exit_beacon_.WriteBeaconValue(true); | 1171 clean_exit_beacon_.WriteBeaconValue(true); |
1115 RecordCurrentState(local_state_); | 1172 RecordCurrentState(local_state_); |
(...skipping 18 matching lines...) Expand all Loading... |
1134 pref->SetInt64(prefs::kStabilityLastTimestampSec, | 1191 pref->SetInt64(prefs::kStabilityLastTimestampSec, |
1135 base::Time::Now().ToTimeT()); | 1192 base::Time::Now().ToTimeT()); |
1136 } | 1193 } |
1137 | 1194 |
1138 void MetricsService::SkipAndDiscardUpload() { | 1195 void MetricsService::SkipAndDiscardUpload() { |
1139 log_manager_.DiscardStagedLog(); | 1196 log_manager_.DiscardStagedLog(); |
1140 scheduler_->UploadCancelled(); | 1197 scheduler_->UploadCancelled(); |
1141 log_upload_in_progress_ = false; | 1198 log_upload_in_progress_ = false; |
1142 } | 1199 } |
1143 | 1200 |
| 1201 MetricsService::PersistentHistogramIterator MetricsService::persistent_begin() { |
| 1202 return PersistentHistogramIterator(allocators_, allocators_.begin()); |
| 1203 } |
| 1204 |
| 1205 MetricsService::PersistentHistogramIterator MetricsService::persistent_end() { |
| 1206 return PersistentHistogramIterator(allocators_, allocators_.end()); |
| 1207 } |
| 1208 |
1144 } // namespace metrics | 1209 } // namespace metrics |
OLD | NEW |