xref: /aosp_15_r20/external/libchrome/base/metrics/histogram_functions.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2016 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_METRICS_HISTOGRAM_FUNCTIONS_H_
6*635a8641SAndroid Build Coastguard Worker #define BASE_METRICS_HISTOGRAM_FUNCTIONS_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include "base/metrics/histogram.h"
9*635a8641SAndroid Build Coastguard Worker #include "base/metrics/histogram_base.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/time/time.h"
11*635a8641SAndroid Build Coastguard Worker 
12*635a8641SAndroid Build Coastguard Worker // Functions for recording metrics.
13*635a8641SAndroid Build Coastguard Worker //
14*635a8641SAndroid Build Coastguard Worker // For best practices on deciding when to emit to a histogram and what form
15*635a8641SAndroid Build Coastguard Worker // the histogram should take, see
16*635a8641SAndroid Build Coastguard Worker // https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker // Functions for recording UMA histograms. These can be used for cases
19*635a8641SAndroid Build Coastguard Worker // when the histogram name is generated at runtime. The functionality is
20*635a8641SAndroid Build Coastguard Worker // equivalent to macros defined in histogram_macros.h but allowing non-constant
21*635a8641SAndroid Build Coastguard Worker // histogram names. These functions are slower compared to their macro
22*635a8641SAndroid Build Coastguard Worker // equivalent because the histogram objects are not cached between calls.
23*635a8641SAndroid Build Coastguard Worker // So, these shouldn't be used in performance critical code.
24*635a8641SAndroid Build Coastguard Worker namespace base {
25*635a8641SAndroid Build Coastguard Worker 
26*635a8641SAndroid Build Coastguard Worker // For histograms with linear buckets.
27*635a8641SAndroid Build Coastguard Worker // Used for capturing integer data with a linear bucketing scheme. This can be
28*635a8641SAndroid Build Coastguard Worker // used when you want the exact value of some small numeric count, with a max of
29*635a8641SAndroid Build Coastguard Worker // 100 or less. If you need to capture a range of greater than 100, we recommend
30*635a8641SAndroid Build Coastguard Worker // the use of the COUNT histograms below.
31*635a8641SAndroid Build Coastguard Worker // Sample usage:
32*635a8641SAndroid Build Coastguard Worker //   base::UmaHistogramExactLinear("Histogram.Linear", some_value, 10);
33*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramExactLinear(const std::string& name,
34*635a8641SAndroid Build Coastguard Worker                                          int sample,
35*635a8641SAndroid Build Coastguard Worker                                          int value_max);
36*635a8641SAndroid Build Coastguard Worker 
37*635a8641SAndroid Build Coastguard Worker // For adding a sample to an enumerated histogram.
38*635a8641SAndroid Build Coastguard Worker // Sample usage:
39*635a8641SAndroid Build Coastguard Worker //   // These values are persisted to logs. Entries should not be renumbered and
40*635a8641SAndroid Build Coastguard Worker //   // numeric values should never be reused.
41*635a8641SAndroid Build Coastguard Worker //   enum class MyEnum {
42*635a8641SAndroid Build Coastguard Worker //     FIRST_VALUE = 0,
43*635a8641SAndroid Build Coastguard Worker //     SECOND_VALUE = 1,
44*635a8641SAndroid Build Coastguard Worker //     ...
45*635a8641SAndroid Build Coastguard Worker //     FINAL_VALUE = N,
46*635a8641SAndroid Build Coastguard Worker //     COUNT
47*635a8641SAndroid Build Coastguard Worker //   };
48*635a8641SAndroid Build Coastguard Worker //   base::UmaHistogramEnumeration("My.Enumeration",
49*635a8641SAndroid Build Coastguard Worker //                                 MyEnum::SOME_VALUE, MyEnum::COUNT);
50*635a8641SAndroid Build Coastguard Worker //
51*635a8641SAndroid Build Coastguard Worker // Note: The value in |sample| must be strictly less than |enum_size|.
52*635a8641SAndroid Build Coastguard Worker template <typename T>
UmaHistogramEnumeration(const std::string & name,T sample,T enum_size)53*635a8641SAndroid Build Coastguard Worker void UmaHistogramEnumeration(const std::string& name, T sample, T enum_size) {
54*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_enum<T>::value,
55*635a8641SAndroid Build Coastguard Worker                 "Non enum passed to UmaHistogramEnumeration");
56*635a8641SAndroid Build Coastguard Worker   DCHECK_LE(static_cast<uintmax_t>(enum_size), static_cast<uintmax_t>(INT_MAX));
57*635a8641SAndroid Build Coastguard Worker   DCHECK_LT(static_cast<uintmax_t>(sample), static_cast<uintmax_t>(enum_size));
58*635a8641SAndroid Build Coastguard Worker   return UmaHistogramExactLinear(name, static_cast<int>(sample),
59*635a8641SAndroid Build Coastguard Worker                                  static_cast<int>(enum_size));
60*635a8641SAndroid Build Coastguard Worker }
61*635a8641SAndroid Build Coastguard Worker 
62*635a8641SAndroid Build Coastguard Worker // Same as above, but uses T::kMaxValue as the inclusive maximum value of the
63*635a8641SAndroid Build Coastguard Worker // enum.
64*635a8641SAndroid Build Coastguard Worker template <typename T>
UmaHistogramEnumeration(const std::string & name,T sample)65*635a8641SAndroid Build Coastguard Worker void UmaHistogramEnumeration(const std::string& name, T sample) {
66*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_enum<T>::value,
67*635a8641SAndroid Build Coastguard Worker                 "Non enum passed to UmaHistogramEnumeration");
68*635a8641SAndroid Build Coastguard Worker   DCHECK_LE(static_cast<uintmax_t>(T::kMaxValue),
69*635a8641SAndroid Build Coastguard Worker             static_cast<uintmax_t>(INT_MAX) - 1);
70*635a8641SAndroid Build Coastguard Worker   DCHECK_LE(static_cast<uintmax_t>(sample),
71*635a8641SAndroid Build Coastguard Worker             static_cast<uintmax_t>(T::kMaxValue));
72*635a8641SAndroid Build Coastguard Worker   return UmaHistogramExactLinear(name, static_cast<int>(sample),
73*635a8641SAndroid Build Coastguard Worker                                  static_cast<int>(T::kMaxValue) + 1);
74*635a8641SAndroid Build Coastguard Worker }
75*635a8641SAndroid Build Coastguard Worker 
76*635a8641SAndroid Build Coastguard Worker // For adding boolean sample to histogram.
77*635a8641SAndroid Build Coastguard Worker // Sample usage:
78*635a8641SAndroid Build Coastguard Worker //   base::UmaHistogramBoolean("My.Boolean", true)
79*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramBoolean(const std::string& name, bool sample);
80*635a8641SAndroid Build Coastguard Worker 
81*635a8641SAndroid Build Coastguard Worker // For adding histogram with percent.
82*635a8641SAndroid Build Coastguard Worker // Percents are integer between 1 and 100.
83*635a8641SAndroid Build Coastguard Worker // Sample usage:
84*635a8641SAndroid Build Coastguard Worker //   base::UmaHistogramPercentage("My.Percent", 69)
85*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramPercentage(const std::string& name, int percent);
86*635a8641SAndroid Build Coastguard Worker 
87*635a8641SAndroid Build Coastguard Worker // For adding counts histogram.
88*635a8641SAndroid Build Coastguard Worker // Sample usage:
89*635a8641SAndroid Build Coastguard Worker //   base::UmaHistogramCustomCounts("My.Counts", some_value, 1, 600, 30)
90*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramCustomCounts(const std::string& name,
91*635a8641SAndroid Build Coastguard Worker                                           int sample,
92*635a8641SAndroid Build Coastguard Worker                                           int min,
93*635a8641SAndroid Build Coastguard Worker                                           int max,
94*635a8641SAndroid Build Coastguard Worker                                           int buckets);
95*635a8641SAndroid Build Coastguard Worker 
96*635a8641SAndroid Build Coastguard Worker // Counts specialization for maximum counts 100, 1000, 10k, 100k, 1M and 10M.
97*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramCounts100(const std::string& name, int sample);
98*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramCounts1000(const std::string& name, int sample);
99*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramCounts10000(const std::string& name, int sample);
100*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramCounts100000(const std::string& name, int sample);
101*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramCounts1M(const std::string& name, int sample);
102*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramCounts10M(const std::string& name, int sample);
103*635a8641SAndroid Build Coastguard Worker 
104*635a8641SAndroid Build Coastguard Worker // For histograms storing times.
105*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramCustomTimes(const std::string& name,
106*635a8641SAndroid Build Coastguard Worker                                          TimeDelta sample,
107*635a8641SAndroid Build Coastguard Worker                                          TimeDelta min,
108*635a8641SAndroid Build Coastguard Worker                                          TimeDelta max,
109*635a8641SAndroid Build Coastguard Worker                                          int buckets);
110*635a8641SAndroid Build Coastguard Worker // For short timings from 1 ms up to 10 seconds (50 buckets).
111*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramTimes(const std::string& name, TimeDelta sample);
112*635a8641SAndroid Build Coastguard Worker // For medium timings up to 3 minutes (50 buckets).
113*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramMediumTimes(const std::string& name,
114*635a8641SAndroid Build Coastguard Worker                                          TimeDelta sample);
115*635a8641SAndroid Build Coastguard Worker // For time intervals up to 1 hr (50 buckets).
116*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramLongTimes(const std::string& name,
117*635a8641SAndroid Build Coastguard Worker                                        TimeDelta sample);
118*635a8641SAndroid Build Coastguard Worker 
119*635a8641SAndroid Build Coastguard Worker // For recording memory related histograms.
120*635a8641SAndroid Build Coastguard Worker // Used to measure common KB-granularity memory stats. Range is up to 500M.
121*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramMemoryKB(const std::string& name, int sample);
122*635a8641SAndroid Build Coastguard Worker // Used to measure common MB-granularity memory stats. Range is up to ~1G.
123*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramMemoryMB(const std::string& name, int sample);
124*635a8641SAndroid Build Coastguard Worker // Used to measure common MB-granularity memory stats. Range is up to ~64G.
125*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramMemoryLargeMB(const std::string& name, int sample);
126*635a8641SAndroid Build Coastguard Worker 
127*635a8641SAndroid Build Coastguard Worker // For recording sparse histograms.
128*635a8641SAndroid Build Coastguard Worker // The |sample| can be a negative or non-negative number.
129*635a8641SAndroid Build Coastguard Worker //
130*635a8641SAndroid Build Coastguard Worker // Sparse histograms are well suited for recording counts of exact sample values
131*635a8641SAndroid Build Coastguard Worker // that are sparsely distributed over a relatively large range, in cases where
132*635a8641SAndroid Build Coastguard Worker // ultra-fast performance is not critical. For instance, Sqlite.Version.* are
133*635a8641SAndroid Build Coastguard Worker // sparse because for any given database, there's going to be exactly one
134*635a8641SAndroid Build Coastguard Worker // version logged.
135*635a8641SAndroid Build Coastguard Worker //
136*635a8641SAndroid Build Coastguard Worker // Performance:
137*635a8641SAndroid Build Coastguard Worker // ------------
138*635a8641SAndroid Build Coastguard Worker // Sparse histograms are typically more memory-efficient but less time-efficient
139*635a8641SAndroid Build Coastguard Worker // than other histograms. Essentially, they sparse histograms use a map rather
140*635a8641SAndroid Build Coastguard Worker // than a vector for their backing storage; they also require lock acquisition
141*635a8641SAndroid Build Coastguard Worker // to increment a sample, whereas other histogram do not. Hence, each increment
142*635a8641SAndroid Build Coastguard Worker // operation is a bit slower than for other histograms. But, if the data is
143*635a8641SAndroid Build Coastguard Worker // sparse, then they use less memory client-side, because they allocate buckets
144*635a8641SAndroid Build Coastguard Worker // on demand rather than preallocating.
145*635a8641SAndroid Build Coastguard Worker //
146*635a8641SAndroid Build Coastguard Worker // Data size:
147*635a8641SAndroid Build Coastguard Worker // ----------
148*635a8641SAndroid Build Coastguard Worker // Note that server-side, we still need to load all buckets, across all users,
149*635a8641SAndroid Build Coastguard Worker // at once. Thus, please avoid exploding such histograms, i.e. uploading many
150*635a8641SAndroid Build Coastguard Worker // many distinct values to the server (across all users). Concretely, keep the
151*635a8641SAndroid Build Coastguard Worker // number of distinct values <= 100 ideally, definitely <= 1000. If you have no
152*635a8641SAndroid Build Coastguard Worker // guarantees on the range of your data, use clamping, e.g.:
153*635a8641SAndroid Build Coastguard Worker //   UmaHistogramSparse("MyHistogram", ClampToRange(value, 0, 200));
154*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UmaHistogramSparse(const std::string& name, int sample);
155*635a8641SAndroid Build Coastguard Worker 
156*635a8641SAndroid Build Coastguard Worker }  // namespace base
157*635a8641SAndroid Build Coastguard Worker 
158*635a8641SAndroid Build Coastguard Worker #endif  // BASE_METRICS_HISTOGRAM_FUNCTIONS_H_
159