15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains macros to simplify histogram reporting from the disk
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cache. The main issue is that we want to have separate histograms for each
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type of cache (regular vs. media, etc), without adding the complexity of
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// keeping track of a potentially large number of histogram objects that have to
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// survive the backend object that created them.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef NET_DISK_CACHE_BLOCKFILE_HISTOGRAM_MACROS_H_
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define NET_DISK_CACHE_BLOCKFILE_HISTOGRAM_MACROS_H_
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/metrics/histogram.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -----------------------------------------------------------------------------
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These histograms follow the definition of UMA_HISTOGRAMN_XXX except that
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// the counter is not cached locally.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count) \
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do { \
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::HistogramBase* counter = base::Histogram::FactoryGet( \
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name, min, max, bucket_count, \
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Histogram::kUmaTargetedHistogramFlag); \
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      counter->Add(sample); \
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (0)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_COUNTS(name, sample) CACHE_HISTOGRAM_CUSTOM_COUNTS( \
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name, sample, 1, 1000000, 50)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_COUNTS_10000(name, sample) \
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CACHE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 10000, 50)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_COUNTS_50000(name, sample) \
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CACHE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 50000000, 50)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) \
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do { \
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::HistogramBase* counter = base::Histogram::FactoryTimeGet( \
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name, min, max, bucket_count, \
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Histogram::kUmaTargetedHistogramFlag); \
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      counter->AddTime(sample); \
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (0)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_TIMES(name, sample) CACHE_HISTOGRAM_CUSTOM_TIMES( \
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name, sample, base::TimeDelta::FromMilliseconds(1), \
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta::FromSeconds(10), 50)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_ENUMERATION(name, sample, boundary_value) do { \
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    base::HistogramBase* counter = base::LinearHistogram::FactoryGet( \
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    name, 1, boundary_value, boundary_value + 1, \
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base::Histogram::kUmaTargetedHistogramFlag); \
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    counter->Add(sample); \
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (0)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_PERCENTAGE(name, under_one_hundred) \
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CACHE_HISTOGRAM_ENUMERATION(name, under_one_hundred, 101)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -----------------------------------------------------------------------------
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HISTOGRAM_HOURS will collect time related data with a granularity of hours
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and normal values of a few months.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_HOURS CACHE_HISTOGRAM_COUNTS_10000
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HISTOGRAM_AGE will collect time elapsed since |initial_time|, with a
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// granularity of hours and normal values of a few months.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_AGE(name, initial_time) \
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CACHE_HISTOGRAM_COUNTS_10000(name, \
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 (base::Time::Now() - initial_time).InHours())
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HISTOGRAM_AGE_MS will collect time elapsed since |initial_time|, with the
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// normal resolution of the UMA_HISTOGRAM_TIMES.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_AGE_MS(name, initial_time)\
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CACHE_HISTOGRAM_TIMES(name, base::TimeTicks::Now() - initial_time)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_HISTOGRAM_CACHE_ERROR(name, sample) \
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CACHE_HISTOGRAM_ENUMERATION(name, sample, 50)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generates a UMA histogram of the given type, generating the proper name for
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it (asking backend_->HistogramName), and adding the provided sample.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For example, to generate a regualar UMA_HISTOGRAM_COUNTS, this macro would
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be used as:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  CACHE_UMA(COUNTS, "MyName", 0, 20);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  CACHE_UMA(COUNTS, "MyExperiment", 530, 55);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which roughly translates to:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  UMA_HISTOGRAM_COUNTS("DiskCache.2.MyName", 20);  // "2" is the CacheType.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  UMA_HISTOGRAM_COUNTS("DiskCache.2.MyExperiment_530", 55);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_UMA(type, name, experiment, sample) {\
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string my_name =\
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CACHE_UMA_BACKEND_IMPL_OBJ->HistogramName(name, experiment);\
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (CACHE_UMA_BACKEND_IMPL_OBJ->cache_type()) {\
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      default:\
9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        NOTREACHED();\
9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        /* Fall-through. */\
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case net::DISK_CACHE:\
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case net::MEDIA_CACHE:\
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case net::APP_CACHE:\
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case net::SHADER_CACHE:\
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case net::PNACL_CACHE:\
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        CACHE_HISTOGRAM_##type(my_name.data(), sample);\
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;\
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }\
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // NET_DISK_CACHE_BLOCKFILE_HISTOGRAM_MACROS_H_
108