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