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