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