Home | History | Annotate | Download | only in disk_cache
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // This file contains macros to simplify histogram reporting from the disk
      6 // cache. The main issue is that we want to have separate histograms for each
      7 // type of cache (regular vs. media, etc), without adding the complexity of
      8 // keeping track of a potentially large number of histogram objects that have to
      9 // survive the backend object that created them.
     10 
     11 #ifndef NET_DISK_CACHE_HISTOGRAM_MACROS_H_
     12 #define NET_DISK_CACHE_HISTOGRAM_MACROS_H_
     13 
     14 // -----------------------------------------------------------------------------
     15 
     16 // These histograms follow the definition of UMA_HISTOGRAMN_XXX except that
     17 // whenever the name changes (the experiment group changes), the histrogram
     18 // object is re-created.
     19 // Note: These macros are only run on one thread, so the declarations of
     20 // |counter| was made static (i.e., there will be no race for reinitialization).
     21 
     22 #define CACHE_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) \
     23     do { \
     24       static base::HistogramBase* counter(NULL); \
     25       if (!counter || name != counter->histogram_name()) \
     26         counter = base::Histogram::FactoryGet( \
     27             name, min, max, bucket_count, \
     28             base::Histogram::kUmaTargetedHistogramFlag); \
     29       counter->Add(sample); \
     30     } while (0)
     31 
     32 #define CACHE_HISTOGRAM_COUNTS(name, sample) CACHE_HISTOGRAM_CUSTOM_COUNTS( \
     33     name, sample, 1, 1000000, 50)
     34 
     35 #define CACHE_HISTOGRAM_COUNTS_10000(name, sample) \
     36     CACHE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 10000, 50)
     37 
     38 #define CACHE_HISTOGRAM_COUNTS_50000(name, sample) \
     39     CACHE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 50000000, 50)
     40 
     41 #define CACHE_HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) \
     42     do { \
     43       static base::HistogramBase* counter(NULL); \
     44       if (!counter || name != counter->histogram_name()) \
     45         counter = base::Histogram::FactoryTimeGet( \
     46             name, min, max, bucket_count, \
     47             base::Histogram::kUmaTargetedHistogramFlag); \
     48       counter->AddTime(sample); \
     49     } while (0)
     50 
     51 #define CACHE_HISTOGRAM_TIMES(name, sample) CACHE_HISTOGRAM_CUSTOM_TIMES( \
     52     name, sample, base::TimeDelta::FromMilliseconds(1), \
     53     base::TimeDelta::FromSeconds(10), 50)
     54 
     55 #define CACHE_HISTOGRAM_ENUMERATION(name, sample, boundary_value) do { \
     56     static base::HistogramBase* counter(NULL); \
     57     if (!counter || name != counter->histogram_name()) \
     58       counter = base::LinearHistogram::FactoryGet( \
     59                     name, 1, boundary_value, boundary_value + 1, \
     60                     base::Histogram::kUmaTargetedHistogramFlag); \
     61     counter->Add(sample); \
     62   } while (0)
     63 
     64 #define CACHE_HISTOGRAM_PERCENTAGE(name, under_one_hundred) \
     65     CACHE_HISTOGRAM_ENUMERATION(name, under_one_hundred, 101)
     66 
     67 // -----------------------------------------------------------------------------
     68 
     69 // HISTOGRAM_HOURS will collect time related data with a granularity of hours
     70 // and normal values of a few months.
     71 #define CACHE_HISTOGRAM_HOURS CACHE_HISTOGRAM_COUNTS_10000
     72 
     73 // HISTOGRAM_AGE will collect time elapsed since |initial_time|, with a
     74 // granularity of hours and normal values of a few months.
     75 #define CACHE_HISTOGRAM_AGE(name, initial_time) \
     76     CACHE_HISTOGRAM_COUNTS_10000(name, \
     77                                  (base::Time::Now() - initial_time).InHours())
     78 
     79 // HISTOGRAM_AGE_MS will collect time elapsed since |initial_time|, with the
     80 // normal resolution of the UMA_HISTOGRAM_TIMES.
     81 #define CACHE_HISTOGRAM_AGE_MS(name, initial_time)\
     82     CACHE_HISTOGRAM_TIMES(name, base::TimeTicks::Now() - initial_time)
     83 
     84 #define CACHE_HISTOGRAM_CACHE_ERROR(name, sample) \
     85     CACHE_HISTOGRAM_ENUMERATION(name, sample, 50)
     86 
     87 #ifdef NET_DISK_CACHE_BACKEND_IMPL_CC_
     88 #define BACKEND_OBJ this
     89 #else
     90 #define BACKEND_OBJ backend_
     91 #endif
     92 
     93 // Generates a UMA histogram of the given type, generating the proper name for
     94 // it (asking backend_->HistogramName), and adding the provided sample.
     95 // For example, to generate a regualar UMA_HISTOGRAM_COUNTS, this macro would
     96 // be used as:
     97 //  CACHE_UMA(COUNTS, "MyName", 0, 20);
     98 //  CACHE_UMA(COUNTS, "MyExperiment", 530, 55);
     99 // which roughly translates to:
    100 //  UMA_HISTOGRAM_COUNTS("DiskCache.2.MyName", 20);  // "2" is the CacheType.
    101 //  UMA_HISTOGRAM_COUNTS("DiskCache.2.MyExperiment_530", 55);
    102 //
    103 #define CACHE_UMA(type, name, experiment, sample) {\
    104     const std::string my_name = BACKEND_OBJ->HistogramName(name, experiment);\
    105     switch (BACKEND_OBJ->cache_type()) {\
    106       case net::DISK_CACHE:\
    107         CACHE_HISTOGRAM_##type(my_name.data(), sample);\
    108         break;\
    109       case net::MEDIA_CACHE:\
    110         CACHE_HISTOGRAM_##type(my_name.data(), sample);\
    111         break;\
    112       case net::APP_CACHE:\
    113         CACHE_HISTOGRAM_##type(my_name.data(), sample);\
    114         break;\
    115       case net::SHADER_CACHE:\
    116         CACHE_HISTOGRAM_##type(my_name.data(), sample);\
    117         break;\
    118       case net::PNACL_CACHE:\
    119         CACHE_HISTOGRAM_##type(my_name.data(), sample);\
    120         break;\
    121       default:\
    122         NOTREACHED();\
    123         break;\
    124     }\
    125   }
    126 
    127 #endif  // NET_DISK_CACHE_HISTOGRAM_MACROS_H_
    128