16
16
#include " base/files/memory_mapped_file.h"
17
17
#include " base/logging.h"
18
18
#include " base/metrics/histogram_base.h"
19
+ #include " base/metrics/histogram_functions.h"
19
20
#include " base/metrics/histogram_macros.h"
20
21
#include " base/metrics/persistent_histogram_allocator.h"
21
22
#include " base/metrics/persistent_memory_allocator.h"
26
27
#include " base/task/thread_pool.h"
27
28
#include " base/task_runner.h"
28
29
#include " base/task_runner_util.h"
30
+ #include " base/threading/thread_task_runner_handle.h"
29
31
#include " base/time/time.h"
30
32
#include " components/metrics/metrics_pref_names.h"
31
33
#include " components/metrics/metrics_service.h"
34
+ #include " components/metrics/persistent_histograms.h"
32
35
#include " components/metrics/persistent_system_profile.h"
33
36
#include " components/prefs/pref_registry_simple.h"
34
37
#include " components/prefs/pref_service.h"
38
+ #include " components/prefs/scoped_user_pref_update.h"
35
39
36
40
namespace metrics {
37
41
@@ -191,7 +195,10 @@ FileMetricsProvider::Params::Params(const base::FilePath& path,
191
195
FileMetricsProvider::Params::~Params () {}
192
196
193
197
FileMetricsProvider::FileMetricsProvider (PrefService* local_state)
194
- : task_runner_(CreateBackgroundTaskRunner()), pref_service_(local_state) {
198
+ : task_runner_(CreateBackgroundTaskRunner()),
199
+ pref_service_ (local_state),
200
+ main_task_runner_(base::ThreadTaskRunnerHandle::Get()) {
201
+ DCHECK (main_task_runner_);
195
202
base::StatisticsRecorder::RegisterHistogramProvider (
196
203
weak_factory_.GetWeakPtr ());
197
204
}
@@ -216,6 +223,7 @@ void FileMetricsProvider::RegisterSource(const Params& params) {
216
223
switch (params.association ) {
217
224
case ASSOCIATE_CURRENT_RUN:
218
225
case ASSOCIATE_INTERNAL_PROFILE:
226
+ case ASSOCIATE_INTERNAL_PROFILE_SAMPLES_COUNTER:
219
227
sources_to_check_.push_back (std::move (source));
220
228
break ;
221
229
case ASSOCIATE_PREVIOUS_RUN:
@@ -227,12 +235,18 @@ void FileMetricsProvider::RegisterSource(const Params& params) {
227
235
}
228
236
229
237
// static
230
- void FileMetricsProvider::RegisterPrefs (PrefRegistrySimple* prefs,
231
- const base::StringPiece prefs_key) {
238
+ void FileMetricsProvider::RegisterSourcePrefs (
239
+ PrefRegistrySimple* prefs,
240
+ const base::StringPiece prefs_key) {
232
241
prefs->RegisterInt64Pref (metrics::prefs::kMetricsLastSeenPrefix +
233
242
prefs_key.as_string (), 0 );
234
243
}
235
244
245
+ // static
246
+ void FileMetricsProvider::RegisterPrefs (PrefRegistrySimple* prefs) {
247
+ prefs->RegisterListPref (metrics::prefs::kMetricsFileMetricsMetadata );
248
+ }
249
+
236
250
// static
237
251
void FileMetricsProvider::SetTaskRunnerForTesting (
238
252
const scoped_refptr<base::TaskRunner>& task_runner) {
@@ -373,7 +387,6 @@ void FileMetricsProvider::FinishedWithSource(SourceInfo* source,
373
387
}
374
388
}
375
389
376
- // static
377
390
void FileMetricsProvider::CheckAndMergeMetricSourcesOnTaskRunner (
378
391
SourceInfoList* sources) {
379
392
// This method has all state information passed in |sources| and is intended
@@ -401,7 +414,11 @@ void FileMetricsProvider::CheckAndMergeMetricSourcesOnTaskRunner(
401
414
if (source->association == ASSOCIATE_INTERNAL_PROFILE)
402
415
break ;
403
416
404
- MergeHistogramDeltasFromSource (source.get ());
417
+ if (source->association == ASSOCIATE_INTERNAL_PROFILE_SAMPLES_COUNTER) {
418
+ RecordFileMetadataOnTaskRunner (source.get ());
419
+ } else {
420
+ MergeHistogramDeltasFromSource (source.get ());
421
+ }
405
422
DCHECK (source->read_complete );
406
423
}
407
424
@@ -627,6 +644,25 @@ bool FileMetricsProvider::ProvideIndependentMetricsOnTaskRunner(
627
644
return false ;
628
645
}
629
646
647
+ void FileMetricsProvider::AppendToSamplesCountPref (size_t samples_count) {
648
+ ListPrefUpdate update (pref_service_,
649
+ metrics::prefs::kMetricsFileMetricsMetadata );
650
+ update->Append (static_cast <int >(samples_count));
651
+ }
652
+
653
+ void FileMetricsProvider::RecordFileMetadataOnTaskRunner (SourceInfo* source) {
654
+ base::HistogramBase::Count samples_count = 0 ;
655
+ base::PersistentHistogramAllocator::Iterator it{source->allocator .get ()};
656
+ std::unique_ptr<base::HistogramBase> histogram;
657
+ while ((histogram = it.GetNext ()) != nullptr ) {
658
+ samples_count += histogram->SnapshotFinalDelta ()->TotalCount ();
659
+ }
660
+ main_task_runner_->PostTask (
661
+ FROM_HERE, base::BindOnce (&FileMetricsProvider::AppendToSamplesCountPref,
662
+ base::Unretained (this ), samples_count));
663
+ source->read_complete = true ;
664
+ }
665
+
630
666
void FileMetricsProvider::ScheduleSourcesCheck () {
631
667
DCHECK_CALLED_ON_VALID_SEQUENCE (sequence_checker_);
632
668
@@ -643,7 +679,7 @@ void FileMetricsProvider::ScheduleSourcesCheck() {
643
679
FROM_HERE,
644
680
base::BindOnce (
645
681
&FileMetricsProvider::CheckAndMergeMetricSourcesOnTaskRunner,
646
- base::Unretained (check_list)),
682
+ base::Unretained (this ), base::Unretained ( check_list)),
647
683
base::BindOnce (&FileMetricsProvider::RecordSourcesChecked,
648
684
weak_factory_.GetWeakPtr (), base::Owned (check_list)));
649
685
}
@@ -723,7 +759,7 @@ void FileMetricsProvider::OnDidCreateMetricsLog() {
723
759
724
760
bool FileMetricsProvider::HasIndependentMetrics () {
725
761
DCHECK_CALLED_ON_VALID_SEQUENCE (sequence_checker_);
726
- return !sources_with_profile_.empty ();
762
+ return !sources_with_profile_.empty () || SimulateIndependentMetrics () ;
727
763
}
728
764
729
765
void FileMetricsProvider::ProvideIndependentMetrics (
@@ -844,4 +880,29 @@ void FileMetricsProvider::MergeHistogramDeltas() {
844
880
}
845
881
}
846
882
883
+ bool FileMetricsProvider::SimulateIndependentMetrics () {
884
+ if (!pref_service_->HasPrefPath (
885
+ metrics::prefs::kMetricsFileMetricsMetadata )) {
886
+ return false ;
887
+ }
888
+
889
+ ListPrefUpdate list_value (pref_service_,
890
+ metrics::prefs::kMetricsFileMetricsMetadata );
891
+ if (list_value->empty ())
892
+ return false ;
893
+
894
+ base::Value::ListView mutable_list = list_value->GetList ();
895
+ size_t count = pref_service_->GetInteger (
896
+ metrics::prefs::kStabilityFileMetricsUnsentSamplesCount );
897
+ pref_service_->SetInteger (
898
+ metrics::prefs::kStabilityFileMetricsUnsentSamplesCount ,
899
+ mutable_list[0 ].GetInt () + count);
900
+ pref_service_->SetInteger (
901
+ metrics::prefs::kStabilityFileMetricsUnsentFilesCount ,
902
+ list_value->GetSize () - 1 );
903
+ list_value->EraseListIter (mutable_list.begin ());
904
+
905
+ return true ;
906
+ }
907
+
847
908
} // namespace metrics
0 commit comments