1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_METRICS_SINGLE_SAMPLE_METRICS_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_METRICS_SINGLE_SAMPLE_METRICS_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <string> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_base.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace base { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker // See base/metrics/histograms.h for parameter definitions. Must only be used 18*6777b538SAndroid Build Coastguard Worker // and destroyed from the same thread as construction. 19*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT SingleSampleMetric { 20*6777b538SAndroid Build Coastguard Worker public: 21*6777b538SAndroid Build Coastguard Worker virtual ~SingleSampleMetric() = default; 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker virtual void SetSample(HistogramBase::Sample sample) = 0; 24*6777b538SAndroid Build Coastguard Worker }; 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker // Factory for creating single sample metrics. A single sample metric only 27*6777b538SAndroid Build Coastguard Worker // reports its sample once at destruction time. The sample may be changed prior 28*6777b538SAndroid Build Coastguard Worker // to destruction using the SetSample() method as many times as desired. 29*6777b538SAndroid Build Coastguard Worker // 30*6777b538SAndroid Build Coastguard Worker // The metric creation methods are safe to call from any thread, however the 31*6777b538SAndroid Build Coastguard Worker // returned class must only be used and destroyed from the same thread as 32*6777b538SAndroid Build Coastguard Worker // construction. 33*6777b538SAndroid Build Coastguard Worker // 34*6777b538SAndroid Build Coastguard Worker // See base/metrics/histogram_macros.h for usage recommendations and 35*6777b538SAndroid Build Coastguard Worker // base/metrics/histogram.h for full parameter definitions. 36*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT SingleSampleMetricsFactory { 37*6777b538SAndroid Build Coastguard Worker public: 38*6777b538SAndroid Build Coastguard Worker virtual ~SingleSampleMetricsFactory() = default; 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // Returns the factory provided by SetFactory(), or if no factory has been set 41*6777b538SAndroid Build Coastguard Worker // a default factory will be provided (future calls to SetFactory() will fail 42*6777b538SAndroid Build Coastguard Worker // if the default factory is ever vended). 43*6777b538SAndroid Build Coastguard Worker static SingleSampleMetricsFactory* Get(); 44*6777b538SAndroid Build Coastguard Worker static void SetFactory(std::unique_ptr<SingleSampleMetricsFactory> factory); 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker // The factory normally persists until process shutdown, but in testing we 47*6777b538SAndroid Build Coastguard Worker // should avoid leaking it since it sets a global. 48*6777b538SAndroid Build Coastguard Worker static void DeleteFactoryForTesting(); 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker // The methods below return a single sample metric for counts histograms; see 51*6777b538SAndroid Build Coastguard Worker // method comments for the corresponding histogram macro. 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker // UMA_HISTOGRAM_CUSTOM_COUNTS() 54*6777b538SAndroid Build Coastguard Worker virtual std::unique_ptr<SingleSampleMetric> CreateCustomCountsMetric( 55*6777b538SAndroid Build Coastguard Worker const std::string& histogram_name, 56*6777b538SAndroid Build Coastguard Worker HistogramBase::Sample min, 57*6777b538SAndroid Build Coastguard Worker HistogramBase::Sample max, 58*6777b538SAndroid Build Coastguard Worker uint32_t bucket_count) = 0; 59*6777b538SAndroid Build Coastguard Worker }; 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker // Default implementation for when no factory has been provided to the process. 62*6777b538SAndroid Build Coastguard Worker // Samples are only recorded within the current process in this case, so samples 63*6777b538SAndroid Build Coastguard Worker // will be lost in the event of sudden process termination. 64*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT DefaultSingleSampleMetricsFactory 65*6777b538SAndroid Build Coastguard Worker : public SingleSampleMetricsFactory { 66*6777b538SAndroid Build Coastguard Worker public: 67*6777b538SAndroid Build Coastguard Worker DefaultSingleSampleMetricsFactory() = default; 68*6777b538SAndroid Build Coastguard Worker DefaultSingleSampleMetricsFactory(const DefaultSingleSampleMetricsFactory&) = 69*6777b538SAndroid Build Coastguard Worker delete; 70*6777b538SAndroid Build Coastguard Worker DefaultSingleSampleMetricsFactory& operator=( 71*6777b538SAndroid Build Coastguard Worker const DefaultSingleSampleMetricsFactory&) = delete; 72*6777b538SAndroid Build Coastguard Worker ~DefaultSingleSampleMetricsFactory() override = default; 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker // SingleSampleMetricsFactory: 75*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SingleSampleMetric> CreateCustomCountsMetric( 76*6777b538SAndroid Build Coastguard Worker const std::string& histogram_name, 77*6777b538SAndroid Build Coastguard Worker HistogramBase::Sample min, 78*6777b538SAndroid Build Coastguard Worker HistogramBase::Sample max, 79*6777b538SAndroid Build Coastguard Worker uint32_t bucket_count) override; 80*6777b538SAndroid Build Coastguard Worker }; 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT DefaultSingleSampleMetric : public SingleSampleMetric { 83*6777b538SAndroid Build Coastguard Worker public: 84*6777b538SAndroid Build Coastguard Worker DefaultSingleSampleMetric(const std::string& histogram_name, 85*6777b538SAndroid Build Coastguard Worker HistogramBase::Sample min, 86*6777b538SAndroid Build Coastguard Worker HistogramBase::Sample max, 87*6777b538SAndroid Build Coastguard Worker uint32_t bucket_count, 88*6777b538SAndroid Build Coastguard Worker int32_t flags); 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker DefaultSingleSampleMetric(const DefaultSingleSampleMetric&) = delete; 91*6777b538SAndroid Build Coastguard Worker DefaultSingleSampleMetric& operator=(const DefaultSingleSampleMetric&) = 92*6777b538SAndroid Build Coastguard Worker delete; 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker ~DefaultSingleSampleMetric() override; 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker // SingleSampleMetric: 97*6777b538SAndroid Build Coastguard Worker void SetSample(HistogramBase::Sample sample) override; 98*6777b538SAndroid Build Coastguard Worker 99*6777b538SAndroid Build Coastguard Worker private: 100*6777b538SAndroid Build Coastguard Worker const raw_ptr<HistogramBase> histogram_; 101*6777b538SAndroid Build Coastguard Worker 102*6777b538SAndroid Build Coastguard Worker // The last sample provided to SetSample(). We use -1 as a sentinel value to 103*6777b538SAndroid Build Coastguard Worker // indicate no sample has been set. 104*6777b538SAndroid Build Coastguard Worker HistogramBase::Sample sample_ = -1; 105*6777b538SAndroid Build Coastguard Worker }; 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker } // namespace base 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker #endif // BASE_METRICS_SINGLE_SAMPLE_METRICS_H_ 110