xref: /aosp_15_r20/external/cronet/base/metrics/histogram_macros.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 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_HISTOGRAM_MACROS_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_METRICS_HISTOGRAM_MACROS_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_macros_internal.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_macros_local.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker // Macros for efficient use of histograms.
16*6777b538SAndroid Build Coastguard Worker //
17*6777b538SAndroid Build Coastguard Worker // For best practices on deciding when to emit to a histogram and what form
18*6777b538SAndroid Build Coastguard Worker // the histogram should take, see
19*6777b538SAndroid Build Coastguard Worker // https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker // All of these macros must be called with |name| as a runtime constant - it
22*6777b538SAndroid Build Coastguard Worker // doesn't have to literally be a constant, but it must be the same string on
23*6777b538SAndroid Build Coastguard Worker // all calls from a particular call site. If this rule is violated, it is
24*6777b538SAndroid Build Coastguard Worker // possible the data will be written to the wrong histogram.
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------
27*6777b538SAndroid Build Coastguard Worker // Enumeration histograms.
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker // These macros create histograms for enumerated data. Ideally, the data should
30*6777b538SAndroid Build Coastguard Worker // be of the form of "event occurs, log the result". We recommended not putting
31*6777b538SAndroid Build Coastguard Worker // related but not directly connected data as enums within the same histogram.
32*6777b538SAndroid Build Coastguard Worker // You should be defining an associated Enum, and the input sample should be
33*6777b538SAndroid Build Coastguard Worker // an element of the Enum.
34*6777b538SAndroid Build Coastguard Worker // All of these macros must be called with |name| as a runtime constant.
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker // The first variant of UMA_HISTOGRAM_ENUMERATION accepts two arguments: the
37*6777b538SAndroid Build Coastguard Worker // histogram name and the enum sample. It deduces the correct boundary value to
38*6777b538SAndroid Build Coastguard Worker // use by looking for an enumerator with the name kMaxValue. kMaxValue should
39*6777b538SAndroid Build Coastguard Worker // share the value of the highest enumerator: this avoids switch statements
40*6777b538SAndroid Build Coastguard Worker // having to handle a sentinel no-op value.
41*6777b538SAndroid Build Coastguard Worker //
42*6777b538SAndroid Build Coastguard Worker // Sample usage:
43*6777b538SAndroid Build Coastguard Worker //   // These values are logged to UMA. Entries should not be renumbered and
44*6777b538SAndroid Build Coastguard Worker //   // numeric values should never be reused. Please keep in sync with "MyEnum"
45*6777b538SAndroid Build Coastguard Worker //   // in src/tools/metrics/histograms/enums.xml.
46*6777b538SAndroid Build Coastguard Worker //   enum class MyEnum {
47*6777b538SAndroid Build Coastguard Worker //     kFirstValue = 0,
48*6777b538SAndroid Build Coastguard Worker //     kSecondValue = 1,
49*6777b538SAndroid Build Coastguard Worker //     ...
50*6777b538SAndroid Build Coastguard Worker //     kFinalValue = N,
51*6777b538SAndroid Build Coastguard Worker //     kMaxValue = kFinalValue,
52*6777b538SAndroid Build Coastguard Worker //   };
53*6777b538SAndroid Build Coastguard Worker //   UMA_HISTOGRAM_ENUMERATION("My.Enumeration", MyEnum::kSomeValue);
54*6777b538SAndroid Build Coastguard Worker //
55*6777b538SAndroid Build Coastguard Worker // The second variant requires three arguments: the first two are the same as
56*6777b538SAndroid Build Coastguard Worker // before, and the third argument is the enum boundary: this must be strictly
57*6777b538SAndroid Build Coastguard Worker // greater than any other enumerator that will be sampled. This only works for
58*6777b538SAndroid Build Coastguard Worker // enums with a fixed underlying type.
59*6777b538SAndroid Build Coastguard Worker //
60*6777b538SAndroid Build Coastguard Worker // Sample usage:
61*6777b538SAndroid Build Coastguard Worker //   // These values are logged to UMA. Entries should not be renumbered and
62*6777b538SAndroid Build Coastguard Worker //   // numeric values should never be reused. Please keep in sync with "MyEnum"
63*6777b538SAndroid Build Coastguard Worker //   // in src/tools/metrics/histograms/enums.xml.
64*6777b538SAndroid Build Coastguard Worker //   enum class MyEnum : uint8_t {
65*6777b538SAndroid Build Coastguard Worker //     FIRST_VALUE = 0,
66*6777b538SAndroid Build Coastguard Worker //     SECOND_VALUE = 1,
67*6777b538SAndroid Build Coastguard Worker //     ...
68*6777b538SAndroid Build Coastguard Worker //     FINAL_VALUE = N,
69*6777b538SAndroid Build Coastguard Worker //     COUNT
70*6777b538SAndroid Build Coastguard Worker //   };
71*6777b538SAndroid Build Coastguard Worker //   UMA_HISTOGRAM_ENUMERATION("My.Enumeration",
72*6777b538SAndroid Build Coastguard Worker //                             MyEnum::SOME_VALUE, MyEnum::COUNT);
73*6777b538SAndroid Build Coastguard Worker //
74*6777b538SAndroid Build Coastguard Worker // Note: If the enum is used in a switch, it is often desirable to avoid writing
75*6777b538SAndroid Build Coastguard Worker // a case statement to handle an unused sentinel value (i.e. COUNT in the above
76*6777b538SAndroid Build Coastguard Worker // example). For scoped enums, this is awkward since it requires casting the
77*6777b538SAndroid Build Coastguard Worker // enum to an arithmetic type and adding one. Instead, prefer the two argument
78*6777b538SAndroid Build Coastguard Worker // version of the macro which automatically deduces the boundary from kMaxValue.
79*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_ENUMERATION(name, ...)                            \
80*6777b538SAndroid Build Coastguard Worker   INTERNAL_UMA_HISTOGRAM_ENUMERATION_GET_MACRO(                         \
81*6777b538SAndroid Build Coastguard Worker       __VA_ARGS__, INTERNAL_UMA_HISTOGRAM_ENUMERATION_SPECIFY_BOUNDARY, \
82*6777b538SAndroid Build Coastguard Worker       INTERNAL_UMA_HISTOGRAM_ENUMERATION_DEDUCE_BOUNDARY)               \
83*6777b538SAndroid Build Coastguard Worker   (name, __VA_ARGS__, base::HistogramBase::kUmaTargetedHistogramFlag)
84*6777b538SAndroid Build Coastguard Worker 
85*6777b538SAndroid Build Coastguard Worker // As above but "scaled" count to avoid overflows caused by increments of
86*6777b538SAndroid Build Coastguard Worker // large amounts. See UMA_HISTOGRAM_SCALED_EXACT_LINEAR for more information.
87*6777b538SAndroid Build Coastguard Worker // Only the new format utilizing an internal kMaxValue is supported.
88*6777b538SAndroid Build Coastguard Worker // It'll be necessary to #include "base/lazy_instance.h" to use this macro.
89*6777b538SAndroid Build Coastguard Worker //   name: Full constant name of the histogram (must not change between calls).
90*6777b538SAndroid Build Coastguard Worker //   sample: Bucket to be incremented.
91*6777b538SAndroid Build Coastguard Worker //   count: Amount by which to increment.
92*6777b538SAndroid Build Coastguard Worker //   scale: Amount by which |count| is divided.
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker // Sample usage:
95*6777b538SAndroid Build Coastguard Worker //    UMA_HISTOGRAM_SCALED_ENUMERATION("FooKiB", kEnumValue, byte_count, 1024)
96*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_SCALED_ENUMERATION(name, sample, count, scale) \
97*6777b538SAndroid Build Coastguard Worker   INTERNAL_HISTOGRAM_SCALED_ENUMERATION_WITH_FLAG(                   \
98*6777b538SAndroid Build Coastguard Worker       name, sample, count, scale,                                    \
99*6777b538SAndroid Build Coastguard Worker       base::HistogramBase::kUmaTargetedHistogramFlag)
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker // Histogram for boolean values.
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker // Sample usage:
104*6777b538SAndroid Build Coastguard Worker //   UMA_HISTOGRAM_BOOLEAN("Histogram.Boolean", bool);
105*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_BOOLEAN(name, sample)                                    \
106*6777b538SAndroid Build Coastguard Worker     STATIC_HISTOGRAM_POINTER_BLOCK(name, AddBoolean(sample),                   \
107*6777b538SAndroid Build Coastguard Worker         base::BooleanHistogram::FactoryGet(name,                               \
108*6777b538SAndroid Build Coastguard Worker             base::HistogramBase::kUmaTargetedHistogramFlag))
109*6777b538SAndroid Build Coastguard Worker 
110*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------
111*6777b538SAndroid Build Coastguard Worker // Linear histograms.
112*6777b538SAndroid Build Coastguard Worker 
113*6777b538SAndroid Build Coastguard Worker // All of these macros must be called with |name| as a runtime constant.
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker // For numeric measurements where you want exact integer values up to
116*6777b538SAndroid Build Coastguard Worker // |exclusive_max|. |exclusive_max| itself is included in the overflow bucket.
117*6777b538SAndroid Build Coastguard Worker // Therefore, if you want an accurate measure up to kMax, then |exclusive_max|
118*6777b538SAndroid Build Coastguard Worker // should be set to kMax + 1.
119*6777b538SAndroid Build Coastguard Worker //
120*6777b538SAndroid Build Coastguard Worker // |exclusive_max| should be 101 or less. If you need to capture a larger range,
121*6777b538SAndroid Build Coastguard Worker // we recommend the use of the COUNT histograms below.
122*6777b538SAndroid Build Coastguard Worker //
123*6777b538SAndroid Build Coastguard Worker // Sample usage:
124*6777b538SAndroid Build Coastguard Worker //   base::UmaHistogramExactLinear("Histogram.Linear", sample, kMax + 1);
125*6777b538SAndroid Build Coastguard Worker // In this case, buckets are 1, 2, .., kMax, kMax+1, where the kMax+1 bucket
126*6777b538SAndroid Build Coastguard Worker // captures everything kMax+1 and above.
127*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_EXACT_LINEAR(name, sample, exclusive_max) \
128*6777b538SAndroid Build Coastguard Worker   INTERNAL_HISTOGRAM_EXACT_LINEAR_WITH_FLAG(                    \
129*6777b538SAndroid Build Coastguard Worker       name, sample, exclusive_max,                              \
130*6777b538SAndroid Build Coastguard Worker       base::HistogramBase::kUmaTargetedHistogramFlag)
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker // Used for capturing basic percentages. This will be 100 buckets of size 1.
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker // Sample usage:
135*6777b538SAndroid Build Coastguard Worker //   UMA_HISTOGRAM_PERCENTAGE("Histogram.Percent", percent_as_int);
136*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_PERCENTAGE(name, percent_as_int) \
137*6777b538SAndroid Build Coastguard Worker   UMA_HISTOGRAM_EXACT_LINEAR(name, percent_as_int, 101)
138*6777b538SAndroid Build Coastguard Worker 
139*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------
140*6777b538SAndroid Build Coastguard Worker // Scaled linear histograms.
141*6777b538SAndroid Build Coastguard Worker 
142*6777b538SAndroid Build Coastguard Worker // These take |count| and |scale| parameters to allow cumulative reporting of
143*6777b538SAndroid Build Coastguard Worker // large numbers. For example, code might pass a count of 1825 bytes and a scale
144*6777b538SAndroid Build Coastguard Worker // of 1024 bytes to report values in kilobytes. Only the scaled count is
145*6777b538SAndroid Build Coastguard Worker // reported, but the remainder is tracked between calls, so that multiple calls
146*6777b538SAndroid Build Coastguard Worker // will accumulate correctly.
147*6777b538SAndroid Build Coastguard Worker // It'll be necessary to #include "base/lazy_instance.h" to use this macro.
148*6777b538SAndroid Build Coastguard Worker //   name: Full constant name of the histogram (must not change between calls).
149*6777b538SAndroid Build Coastguard Worker //   sample: Bucket to be incremented.
150*6777b538SAndroid Build Coastguard Worker //   count: Amount by which to increment.
151*6777b538SAndroid Build Coastguard Worker //   sample_max: Maximum (exclusive) allowed sample value.
152*6777b538SAndroid Build Coastguard Worker //   scale: Amount by which |count| is divided.
153*6777b538SAndroid Build Coastguard Worker 
154*6777b538SAndroid Build Coastguard Worker // Sample usage:
155*6777b538SAndroid Build Coastguard Worker //    UMA_HISTOGRAM_SCALED_EXACT_LINER("FooKiB", bucket_no, byte_count,
156*6777b538SAndroid Build Coastguard Worker //                                     kBucketsMax+1, 1024)
157*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_SCALED_EXACT_LINEAR(name, sample, count, sample_max, \
158*6777b538SAndroid Build Coastguard Worker                                           scale)                           \
159*6777b538SAndroid Build Coastguard Worker   INTERNAL_HISTOGRAM_SCALED_EXACT_LINEAR_WITH_FLAG(                        \
160*6777b538SAndroid Build Coastguard Worker       name, sample, count, sample_max, scale,                              \
161*6777b538SAndroid Build Coastguard Worker       base::HistogramBase::kUmaTargetedHistogramFlag)
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------
164*6777b538SAndroid Build Coastguard Worker // Count histograms. These are used for collecting numeric data. Note that we
165*6777b538SAndroid Build Coastguard Worker // have macros for more specialized use cases below (memory, time, percentages).
166*6777b538SAndroid Build Coastguard Worker 
167*6777b538SAndroid Build Coastguard Worker // The number suffixes here refer to the max size of the sample, i.e. COUNT_1000
168*6777b538SAndroid Build Coastguard Worker // will be able to collect samples of counts up to 1000. The default number of
169*6777b538SAndroid Build Coastguard Worker // buckets in all default macros is 50. We recommend erring on the side of too
170*6777b538SAndroid Build Coastguard Worker // large a range versus too short a range.
171*6777b538SAndroid Build Coastguard Worker // These macros default to exponential histograms - i.e. the lengths of the
172*6777b538SAndroid Build Coastguard Worker // bucket ranges exponentially increase as the sample range increases.
173*6777b538SAndroid Build Coastguard Worker // These should *not* be used if you are interested in exact counts, i.e. a
174*6777b538SAndroid Build Coastguard Worker // bucket range of 1. In these cases, you should use the ENUMERATION macros
175*6777b538SAndroid Build Coastguard Worker // defined later. These should also not be used to capture the number of some
176*6777b538SAndroid Build Coastguard Worker // event, i.e. "button X was clicked N times". In this cases, an enum should be
177*6777b538SAndroid Build Coastguard Worker // used, ideally with an appropriate baseline enum entry included.
178*6777b538SAndroid Build Coastguard Worker // All of these macros must be called with |name| as a runtime constant.
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker // Sample usage:
181*6777b538SAndroid Build Coastguard Worker //   UMA_HISTOGRAM_COUNTS_1M("My.Histogram", sample);
182*6777b538SAndroid Build Coastguard Worker 
183*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_COUNTS_100(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS(    \
184*6777b538SAndroid Build Coastguard Worker     name, sample, 1, 100, 50)
185*6777b538SAndroid Build Coastguard Worker 
186*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_COUNTS_1000(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS(   \
187*6777b538SAndroid Build Coastguard Worker     name, sample, 1, 1000, 50)
188*6777b538SAndroid Build Coastguard Worker 
189*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_COUNTS_10000(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS(  \
190*6777b538SAndroid Build Coastguard Worker     name, sample, 1, 10000, 50)
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_COUNTS_100000(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS( \
193*6777b538SAndroid Build Coastguard Worker     name, sample, 1, 100000, 50)
194*6777b538SAndroid Build Coastguard Worker 
195*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_COUNTS_1M(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS(     \
196*6777b538SAndroid Build Coastguard Worker     name, sample, 1, 1000000, 50)
197*6777b538SAndroid Build Coastguard Worker 
198*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_COUNTS_10M(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS(    \
199*6777b538SAndroid Build Coastguard Worker     name, sample, 1, 10000000, 50)
200*6777b538SAndroid Build Coastguard Worker 
201*6777b538SAndroid Build Coastguard Worker // This macro allows the min, max, and number of buckets to be customized. Any
202*6777b538SAndroid Build Coastguard Worker // samples whose values are outside of [min, exclusive_max-1] are put in the
203*6777b538SAndroid Build Coastguard Worker // underflow or overflow buckets. Note that |min| should be >=1 as emitted 0s go
204*6777b538SAndroid Build Coastguard Worker // into the underflow bucket.
205*6777b538SAndroid Build Coastguard Worker 
206*6777b538SAndroid Build Coastguard Worker // Sample usage:
207*6777b538SAndroid Build Coastguard Worker //   UMA_HISTOGRAM_CUSTOM_COUNTS("My.Histogram", sample, 1, 100000000, 50);
208*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, exclusive_max, \
209*6777b538SAndroid Build Coastguard Worker                                     bucket_count)                     \
210*6777b538SAndroid Build Coastguard Worker   INTERNAL_HISTOGRAM_CUSTOM_COUNTS_WITH_FLAG(                         \
211*6777b538SAndroid Build Coastguard Worker       name, sample, min, exclusive_max, bucket_count,                 \
212*6777b538SAndroid Build Coastguard Worker       base::HistogramBase::kUmaTargetedHistogramFlag)
213*6777b538SAndroid Build Coastguard Worker 
214*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------
215*6777b538SAndroid Build Coastguard Worker // Timing histograms. These are used for collecting timing data (generally
216*6777b538SAndroid Build Coastguard Worker // latencies).
217*6777b538SAndroid Build Coastguard Worker 
218*6777b538SAndroid Build Coastguard Worker // These macros create exponentially sized histograms (lengths of the bucket
219*6777b538SAndroid Build Coastguard Worker // ranges exponentially increase as the sample range increases). The input
220*6777b538SAndroid Build Coastguard Worker // sample is a base::TimeDelta. The output data is measured in ms granularity.
221*6777b538SAndroid Build Coastguard Worker // All of these macros must be called with |name| as a runtime constant.
222*6777b538SAndroid Build Coastguard Worker 
223*6777b538SAndroid Build Coastguard Worker // Sample usage:
224*6777b538SAndroid Build Coastguard Worker //   UMA_HISTOGRAM_TIMES("My.Timing.Histogram", time_delta);
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker // Short timings - up to 10 seconds. For high-resolution (microseconds) timings,
227*6777b538SAndroid Build Coastguard Worker // see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES.
228*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_TIMES(name, sample)                         \
229*6777b538SAndroid Build Coastguard Worker   UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, base::Milliseconds(1), \
230*6777b538SAndroid Build Coastguard Worker                              base::Seconds(10), 50)
231*6777b538SAndroid Build Coastguard Worker 
232*6777b538SAndroid Build Coastguard Worker // Medium timings - up to 3 minutes. Note this starts at 10ms (no good reason,
233*6777b538SAndroid Build Coastguard Worker // but not worth changing).
234*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_MEDIUM_TIMES(name, sample)                   \
235*6777b538SAndroid Build Coastguard Worker   UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, base::Milliseconds(10), \
236*6777b538SAndroid Build Coastguard Worker                              base::Minutes(3), 50)
237*6777b538SAndroid Build Coastguard Worker 
238*6777b538SAndroid Build Coastguard Worker // Long timings - up to an hour.
239*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_LONG_TIMES(name, sample)                    \
240*6777b538SAndroid Build Coastguard Worker   UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, base::Milliseconds(1), \
241*6777b538SAndroid Build Coastguard Worker                              base::Hours(1), 50)
242*6777b538SAndroid Build Coastguard Worker 
243*6777b538SAndroid Build Coastguard Worker // Long timings with higher granularity - up to an hour with 100 buckets.
244*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_LONG_TIMES_100(name, sample)                \
245*6777b538SAndroid Build Coastguard Worker   UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, base::Milliseconds(1), \
246*6777b538SAndroid Build Coastguard Worker                              base::Hours(1), 100)
247*6777b538SAndroid Build Coastguard Worker 
248*6777b538SAndroid Build Coastguard Worker // This can be used when the default ranges are not sufficient. This macro lets
249*6777b538SAndroid Build Coastguard Worker // the metric developer customize the min and max of the sampled range, as well
250*6777b538SAndroid Build Coastguard Worker // as the number of buckets recorded.
251*6777b538SAndroid Build Coastguard Worker 
252*6777b538SAndroid Build Coastguard Worker // Sample usage:
253*6777b538SAndroid Build Coastguard Worker //   UMA_HISTOGRAM_CUSTOM_TIMES("Very.Long.Timing.Histogram", time_delta,
254*6777b538SAndroid Build Coastguard Worker //       base::Seconds(1), base::Days(1), 100);
255*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) \
256*6777b538SAndroid Build Coastguard Worker   STATIC_HISTOGRAM_POINTER_BLOCK(                                        \
257*6777b538SAndroid Build Coastguard Worker       name, AddTimeMillisecondsGranularity(sample),                      \
258*6777b538SAndroid Build Coastguard Worker       base::Histogram::FactoryTimeGet(                                   \
259*6777b538SAndroid Build Coastguard Worker           name, min, max, bucket_count,                                  \
260*6777b538SAndroid Build Coastguard Worker           base::HistogramBase::kUmaTargetedHistogramFlag))
261*6777b538SAndroid Build Coastguard Worker 
262*6777b538SAndroid Build Coastguard Worker // Same as UMA_HISTOGRAM_CUSTOM_TIMES but reports |sample| in microseconds,
263*6777b538SAndroid Build Coastguard Worker // dropping the report if this client doesn't have a high-resolution clock.
264*6777b538SAndroid Build Coastguard Worker //
265*6777b538SAndroid Build Coastguard Worker // Note: dropping reports on clients with low-resolution clocks means these
266*6777b538SAndroid Build Coastguard Worker // reports will be biased to a portion of the population on Windows. See
267*6777b538SAndroid Build Coastguard Worker // Windows.HasHighResolutionTimeTicks for the affected sample.
268*6777b538SAndroid Build Coastguard Worker //
269*6777b538SAndroid Build Coastguard Worker // Sample usage:
270*6777b538SAndroid Build Coastguard Worker //  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
271*6777b538SAndroid Build Coastguard Worker //      "High.Resolution.TimingMicroseconds.Histogram", time_delta,
272*6777b538SAndroid Build Coastguard Worker //      base::Microseconds(1),
273*6777b538SAndroid Build Coastguard Worker //      base::Milliseconds(10), 100);
274*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(name, sample, min, max, \
275*6777b538SAndroid Build Coastguard Worker                                                 bucket_count)           \
276*6777b538SAndroid Build Coastguard Worker   STATIC_HISTOGRAM_POINTER_BLOCK(                                       \
277*6777b538SAndroid Build Coastguard Worker       name, AddTimeMicrosecondsGranularity(sample),                     \
278*6777b538SAndroid Build Coastguard Worker       base::Histogram::FactoryMicrosecondsTimeGet(                      \
279*6777b538SAndroid Build Coastguard Worker           name, min, max, bucket_count,                                 \
280*6777b538SAndroid Build Coastguard Worker           base::HistogramBase::kUmaTargetedHistogramFlag))
281*6777b538SAndroid Build Coastguard Worker 
282*6777b538SAndroid Build Coastguard Worker // Scoped class which logs its time on this earth in milliseconds as a UMA
283*6777b538SAndroid Build Coastguard Worker // statistic. This is recommended for when you want a histogram which measures
284*6777b538SAndroid Build Coastguard Worker // the time it takes for a method to execute. This measures up to 10 seconds. It
285*6777b538SAndroid Build Coastguard Worker // uses UMA_HISTOGRAM_TIMES under the hood.
286*6777b538SAndroid Build Coastguard Worker 
287*6777b538SAndroid Build Coastguard Worker // Sample usage:
288*6777b538SAndroid Build Coastguard Worker //   void Function() {
289*6777b538SAndroid Build Coastguard Worker //     SCOPED_UMA_HISTOGRAM_TIMER("Component.FunctionTime");
290*6777b538SAndroid Build Coastguard Worker //     ...
291*6777b538SAndroid Build Coastguard Worker //   }
292*6777b538SAndroid Build Coastguard Worker enum class ScopedHistogramTiming {
293*6777b538SAndroid Build Coastguard Worker   kMicrosecondTimes,
294*6777b538SAndroid Build Coastguard Worker   kMediumTimes,
295*6777b538SAndroid Build Coastguard Worker   kLongTimes
296*6777b538SAndroid Build Coastguard Worker };
297*6777b538SAndroid Build Coastguard Worker #define SCOPED_UMA_HISTOGRAM_TIMER(name)        \
298*6777b538SAndroid Build Coastguard Worker   INTERNAL_SCOPED_UMA_HISTOGRAM_TIMER_EXPANDER( \
299*6777b538SAndroid Build Coastguard Worker       name, ScopedHistogramTiming::kMediumTimes, __COUNTER__)
300*6777b538SAndroid Build Coastguard Worker 
301*6777b538SAndroid Build Coastguard Worker // Similar scoped histogram timer, but this uses UMA_HISTOGRAM_LONG_TIMES_100,
302*6777b538SAndroid Build Coastguard Worker // which measures up to an hour, and uses 100 buckets. This is more expensive
303*6777b538SAndroid Build Coastguard Worker // to store, so only use if this often takes >10 seconds.
304*6777b538SAndroid Build Coastguard Worker #define SCOPED_UMA_HISTOGRAM_LONG_TIMER(name)   \
305*6777b538SAndroid Build Coastguard Worker   INTERNAL_SCOPED_UMA_HISTOGRAM_TIMER_EXPANDER( \
306*6777b538SAndroid Build Coastguard Worker       name, ScopedHistogramTiming::kLongTimes, __COUNTER__)
307*6777b538SAndroid Build Coastguard Worker 
308*6777b538SAndroid Build Coastguard Worker // Similar scoped histogram timer, but this uses
309*6777b538SAndroid Build Coastguard Worker // UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES, measuring from 1 microseconds to 1
310*6777b538SAndroid Build Coastguard Worker // second, with 50 buckets.
311*6777b538SAndroid Build Coastguard Worker #define SCOPED_UMA_HISTOGRAM_TIMER_MICROS(name) \
312*6777b538SAndroid Build Coastguard Worker   INTERNAL_SCOPED_UMA_HISTOGRAM_TIMER_EXPANDER( \
313*6777b538SAndroid Build Coastguard Worker       name, ScopedHistogramTiming::kMicrosecondTimes, __COUNTER__)
314*6777b538SAndroid Build Coastguard Worker 
315*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------
316*6777b538SAndroid Build Coastguard Worker // Memory histograms.
317*6777b538SAndroid Build Coastguard Worker 
318*6777b538SAndroid Build Coastguard Worker // These macros create exponentially sized histograms (lengths of the bucket
319*6777b538SAndroid Build Coastguard Worker // ranges exponentially increase as the sample range increases). The input
320*6777b538SAndroid Build Coastguard Worker // sample must be a number measured in kilobytes.
321*6777b538SAndroid Build Coastguard Worker // All of these macros must be called with |name| as a runtime constant.
322*6777b538SAndroid Build Coastguard Worker 
323*6777b538SAndroid Build Coastguard Worker // Sample usage:
324*6777b538SAndroid Build Coastguard Worker //   UMA_HISTOGRAM_MEMORY_KB("My.Memory.Histogram", memory_in_kb);
325*6777b538SAndroid Build Coastguard Worker 
326*6777b538SAndroid Build Coastguard Worker // Used to measure common KB-granularity memory stats. Range is up to 500000KB -
327*6777b538SAndroid Build Coastguard Worker // approximately 500M.
328*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_MEMORY_KB(name, sample)                                  \
329*6777b538SAndroid Build Coastguard Worker     UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1000, 500000, 50)
330*6777b538SAndroid Build Coastguard Worker 
331*6777b538SAndroid Build Coastguard Worker // Used to measure common MB-granularity memory stats. Range is up to 4000MiB -
332*6777b538SAndroid Build Coastguard Worker // approximately 4GiB.
333*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_MEMORY_MEDIUM_MB(name, sample) \
334*6777b538SAndroid Build Coastguard Worker   UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 4000, 100)
335*6777b538SAndroid Build Coastguard Worker 
336*6777b538SAndroid Build Coastguard Worker // Used to measure common MB-granularity memory stats. Range is up to ~64G.
337*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_MEMORY_LARGE_MB(name, sample)                            \
338*6777b538SAndroid Build Coastguard Worker     UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 64000, 100)
339*6777b538SAndroid Build Coastguard Worker 
340*6777b538SAndroid Build Coastguard Worker 
341*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------
342*6777b538SAndroid Build Coastguard Worker // Stability-specific histograms.
343*6777b538SAndroid Build Coastguard Worker 
344*6777b538SAndroid Build Coastguard Worker // Histograms logged in as stability histograms will be included in the initial
345*6777b538SAndroid Build Coastguard Worker // stability log. See comments by declaration of
346*6777b538SAndroid Build Coastguard Worker // MetricsService::PrepareInitialStabilityLog().
347*6777b538SAndroid Build Coastguard Worker // All of these macros must be called with |name| as a runtime constant.
348*6777b538SAndroid Build Coastguard Worker 
349*6777b538SAndroid Build Coastguard Worker // For details on usage, see the documentation on the non-stability equivalents.
350*6777b538SAndroid Build Coastguard Worker 
351*6777b538SAndroid Build Coastguard Worker #define UMA_STABILITY_HISTOGRAM_BOOLEAN(name, sample) \
352*6777b538SAndroid Build Coastguard Worker   STATIC_HISTOGRAM_POINTER_BLOCK(                     \
353*6777b538SAndroid Build Coastguard Worker       name, AddBoolean(sample),                       \
354*6777b538SAndroid Build Coastguard Worker       base::BooleanHistogram::FactoryGet(             \
355*6777b538SAndroid Build Coastguard Worker           name, base::HistogramBase::kUmaStabilityHistogramFlag))
356*6777b538SAndroid Build Coastguard Worker 
357*6777b538SAndroid Build Coastguard Worker #define UMA_STABILITY_HISTOGRAM_COUNTS_100(name, sample)                       \
358*6777b538SAndroid Build Coastguard Worker     UMA_STABILITY_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 100, 50)
359*6777b538SAndroid Build Coastguard Worker 
360*6777b538SAndroid Build Coastguard Worker #define UMA_STABILITY_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max,          \
361*6777b538SAndroid Build Coastguard Worker                                               bucket_count)                    \
362*6777b538SAndroid Build Coastguard Worker     INTERNAL_HISTOGRAM_CUSTOM_COUNTS_WITH_FLAG(                                \
363*6777b538SAndroid Build Coastguard Worker         name, sample, min, max, bucket_count,                                  \
364*6777b538SAndroid Build Coastguard Worker         base::HistogramBase::kUmaStabilityHistogramFlag)
365*6777b538SAndroid Build Coastguard Worker 
366*6777b538SAndroid Build Coastguard Worker #define UMA_STABILITY_HISTOGRAM_ENUMERATION(name, ...)                  \
367*6777b538SAndroid Build Coastguard Worker   INTERNAL_UMA_HISTOGRAM_ENUMERATION_GET_MACRO(                         \
368*6777b538SAndroid Build Coastguard Worker       __VA_ARGS__, INTERNAL_UMA_HISTOGRAM_ENUMERATION_SPECIFY_BOUNDARY, \
369*6777b538SAndroid Build Coastguard Worker       INTERNAL_UMA_HISTOGRAM_ENUMERATION_DEDUCE_BOUNDARY)               \
370*6777b538SAndroid Build Coastguard Worker   (name, __VA_ARGS__, base::HistogramBase::kUmaStabilityHistogramFlag)
371*6777b538SAndroid Build Coastguard Worker 
372*6777b538SAndroid Build Coastguard Worker #define UMA_STABILITY_HISTOGRAM_LONG_TIMES(name, sample)   \
373*6777b538SAndroid Build Coastguard Worker   STATIC_HISTOGRAM_POINTER_BLOCK(                          \
374*6777b538SAndroid Build Coastguard Worker       name, AddTimeMillisecondsGranularity(sample),        \
375*6777b538SAndroid Build Coastguard Worker       base::Histogram::FactoryTimeGet(                     \
376*6777b538SAndroid Build Coastguard Worker           name, base::Milliseconds(1), base::Hours(1), 50, \
377*6777b538SAndroid Build Coastguard Worker           base::HistogramBase::kUmaStabilityHistogramFlag))
378*6777b538SAndroid Build Coastguard Worker 
379*6777b538SAndroid Build Coastguard Worker #define UMA_STABILITY_HISTOGRAM_PERCENTAGE(name, percent_as_int) \
380*6777b538SAndroid Build Coastguard Worker   INTERNAL_HISTOGRAM_EXACT_LINEAR_WITH_FLAG(                     \
381*6777b538SAndroid Build Coastguard Worker       name, percent_as_int, 101,                                 \
382*6777b538SAndroid Build Coastguard Worker       base::HistogramBase::kUmaStabilityHistogramFlag)
383*6777b538SAndroid Build Coastguard Worker 
384*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------
385*6777b538SAndroid Build Coastguard Worker // Sparse histograms.
386*6777b538SAndroid Build Coastguard Worker //
387*6777b538SAndroid Build Coastguard Worker // The |sample| can be a negative or non-negative number.
388*6777b538SAndroid Build Coastguard Worker //
389*6777b538SAndroid Build Coastguard Worker // Sparse histograms are well suited for recording counts of exact sample values
390*6777b538SAndroid Build Coastguard Worker // that are sparsely distributed over a relatively large range, in cases where
391*6777b538SAndroid Build Coastguard Worker // ultra-fast performance is not critical. For instance, Sqlite.Version.* are
392*6777b538SAndroid Build Coastguard Worker // sparse because for any given database, there's going to be exactly one
393*6777b538SAndroid Build Coastguard Worker // version logged.
394*6777b538SAndroid Build Coastguard Worker //
395*6777b538SAndroid Build Coastguard Worker // For important details on performance, data size, and usage, see the
396*6777b538SAndroid Build Coastguard Worker // documentation on the regular function equivalents (histogram_functions.h).
397*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_SPARSE(name, sample) \
398*6777b538SAndroid Build Coastguard Worker   STATIC_HISTOGRAM_POINTER_BLOCK(          \
399*6777b538SAndroid Build Coastguard Worker       name, Add(sample),                   \
400*6777b538SAndroid Build Coastguard Worker       base::SparseHistogram::FactoryGet(   \
401*6777b538SAndroid Build Coastguard Worker           name, base::HistogramBase::kUmaTargetedHistogramFlag))
402*6777b538SAndroid Build Coastguard Worker 
403*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------
404*6777b538SAndroid Build Coastguard Worker // Histogram instantiation helpers.
405*6777b538SAndroid Build Coastguard Worker 
406*6777b538SAndroid Build Coastguard Worker // Support a collection of histograms, perhaps one for each entry in an
407*6777b538SAndroid Build Coastguard Worker // enumeration. This macro manages a block of pointers, adding to a specific
408*6777b538SAndroid Build Coastguard Worker // one by its index.
409*6777b538SAndroid Build Coastguard Worker //
410*6777b538SAndroid Build Coastguard Worker // A typical instantiation looks something like this:
411*6777b538SAndroid Build Coastguard Worker //  STATIC_HISTOGRAM_POINTER_GROUP(
412*6777b538SAndroid Build Coastguard Worker //      GetHistogramNameForIndex(histogram_index),
413*6777b538SAndroid Build Coastguard Worker //      histogram_index, MAXIMUM_HISTOGRAM_INDEX, Add(some_delta),
414*6777b538SAndroid Build Coastguard Worker //      base::Histogram::FactoryGet(
415*6777b538SAndroid Build Coastguard Worker //          GetHistogramNameForIndex(histogram_index),
416*6777b538SAndroid Build Coastguard Worker //          MINIMUM_SAMPLE, MAXIMUM_SAMPLE, BUCKET_COUNT,
417*6777b538SAndroid Build Coastguard Worker //          base::HistogramBase::kUmaTargetedHistogramFlag));
418*6777b538SAndroid Build Coastguard Worker //
419*6777b538SAndroid Build Coastguard Worker // Though it seems inefficient to generate the name twice, the first
420*6777b538SAndroid Build Coastguard Worker // instance will be used only for DCHECK builds and the second will
421*6777b538SAndroid Build Coastguard Worker // execute only during the first access to the given index, after which
422*6777b538SAndroid Build Coastguard Worker // the pointer is cached and the name never needed again.
423*6777b538SAndroid Build Coastguard Worker #define STATIC_HISTOGRAM_POINTER_GROUP(                                     \
424*6777b538SAndroid Build Coastguard Worker     constant_histogram_name, index, constant_maximum,                       \
425*6777b538SAndroid Build Coastguard Worker     histogram_add_method_invocation, histogram_factory_get_invocation)      \
426*6777b538SAndroid Build Coastguard Worker   do {                                                                      \
427*6777b538SAndroid Build Coastguard Worker     static std::atomic_uintptr_t atomic_histograms[constant_maximum];       \
428*6777b538SAndroid Build Coastguard Worker     DCHECK_LE(0, index);                                                    \
429*6777b538SAndroid Build Coastguard Worker     DCHECK_LT(index, constant_maximum);                                     \
430*6777b538SAndroid Build Coastguard Worker     HISTOGRAM_POINTER_USE(                                                  \
431*6777b538SAndroid Build Coastguard Worker         std::addressof(atomic_histograms[index]), constant_histogram_name,  \
432*6777b538SAndroid Build Coastguard Worker         histogram_add_method_invocation, histogram_factory_get_invocation); \
433*6777b538SAndroid Build Coastguard Worker   } while (0)
434*6777b538SAndroid Build Coastguard Worker 
435*6777b538SAndroid Build Coastguard Worker //------------------------------------------------------------------------------
436*6777b538SAndroid Build Coastguard Worker // Deprecated histogram macros. Not recommended for current use.
437*6777b538SAndroid Build Coastguard Worker 
438*6777b538SAndroid Build Coastguard Worker // Legacy name for UMA_HISTOGRAM_COUNTS_1M. Suggest using explicit naming
439*6777b538SAndroid Build Coastguard Worker // and not using this macro going forward.
440*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_COUNTS(name, sample) UMA_HISTOGRAM_CUSTOM_COUNTS(        \
441*6777b538SAndroid Build Coastguard Worker     name, sample, 1, 1000000, 50)
442*6777b538SAndroid Build Coastguard Worker 
443*6777b538SAndroid Build Coastguard Worker // MB-granularity memory metric. This has a short max (1G).
444*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_MEMORY_MB(name, sample)                                  \
445*6777b538SAndroid Build Coastguard Worker     UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 1000, 50)
446*6777b538SAndroid Build Coastguard Worker 
447*6777b538SAndroid Build Coastguard Worker // For an enum with customized range. In general, sparse histograms should be
448*6777b538SAndroid Build Coastguard Worker // used instead.
449*6777b538SAndroid Build Coastguard Worker // Samples should be one of the std::vector<int> list provided via
450*6777b538SAndroid Build Coastguard Worker // |custom_ranges|. See comments above CustomRanges::FactoryGet about the
451*6777b538SAndroid Build Coastguard Worker // requirement of |custom_ranges|. You can use the helper function
452*6777b538SAndroid Build Coastguard Worker // CustomHistogram::ArrayToCustomEnumRanges to transform a C-style array of
453*6777b538SAndroid Build Coastguard Worker // valid sample values to a std::vector<int>.
454*6777b538SAndroid Build Coastguard Worker #define UMA_HISTOGRAM_CUSTOM_ENUMERATION(name, sample, custom_ranges)          \
455*6777b538SAndroid Build Coastguard Worker     STATIC_HISTOGRAM_POINTER_BLOCK(name, Add(sample),                          \
456*6777b538SAndroid Build Coastguard Worker         base::CustomHistogram::FactoryGet(name, custom_ranges,                 \
457*6777b538SAndroid Build Coastguard Worker             base::HistogramBase::kUmaTargetedHistogramFlag))
458*6777b538SAndroid Build Coastguard Worker 
459*6777b538SAndroid Build Coastguard Worker #endif  // BASE_METRICS_HISTOGRAM_MACROS_H_
460