xref: /aosp_15_r20/external/cronet/base/metrics/single_sample_metrics.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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