blob: 1b9426eb2499525b9664f55b7f64aa71844d32a9 [file] [log] [blame]
asapersson@webrtc.org580d3672014-10-23 12:57:56 +00001//
2// Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3//
4// Use of this source code is governed by a BSD-style license
5// that can be found in the LICENSE file in the root of the source
6// tree. An additional intellectual property rights grant can be found
7// in the file PATENTS. All contributing project authors may
8// be found in the AUTHORS file in the root of the source tree.
9//
10
11#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_METRICS_H_
12#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_METRICS_H_
13
14#include <string>
15
16#include "webrtc/common_types.h"
17
18// Macros for allowing WebRTC clients (e.g. Chrome) to gather and aggregate
19// statistics.
20//
21// Histogram for counters.
22// RTC_HISTOGRAM_COUNTS(name, sample, min, max, bucket_count);
23//
24// Histogram for enumerators.
25// The boundary should be above the max enumerator sample.
26// RTC_HISTOGRAM_ENUMERATION(name, sample, boundary);
27//
28//
29// The macros use the methods HistogramFactoryGetCounts,
30// HistogramFactoryGetEnumeration and HistogramAdd.
31//
32// Therefore, WebRTC clients must either:
33//
34// - provide implementations of
35// Histogram* webrtc::metrics::HistogramFactoryGetCounts(
36// const std::string& name, int sample, int min, int max,
37// int bucket_count);
38// Histogram* webrtc::metrics::HistogramFactoryGetEnumeration(
39// const std::string& name, int sample, int boundary);
40// void webrtc::metrics::HistogramAdd(
41// Histogram* histogram_pointer, const std::string& name, int sample);
42//
43// - or link with the default implementations (i.e.
44// system_wrappers/source/system_wrappers.gyp:metrics_default).
45//
46//
47// Example usage:
48//
49// RTC_HISTOGRAM_COUNTS("WebRTC.Video.NacksSent", nacks_sent, 1, 100000, 100);
50//
51// enum Types {
52// kTypeX,
53// kTypeY,
54// kBoundary,
55// };
56//
57// RTC_HISTOGRAM_ENUMERATION("WebRTC.Types", kTypeX, kBoundary);
58
59
60// Macros for adding samples to a named histogram.
61//
62// NOTE: this is a temporary solution.
63// The aim is to mimic the behaviour in Chromium's src/base/metrics/histograms.h
64// However as atomics are not supported in webrtc, this is for now a modified
65// and temporary solution. Note that the histogram is constructed/found for
66// each call. Therefore, for now only use this implementation for metrics
67// that do not need to be updated frequently.
68// TODO(asapersson): Change implementation when atomics are supported.
69// Also consider changing string to const char* when switching to atomics.
70
71// Histogram for counters.
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +000072#define RTC_HISTOGRAM_COUNTS_100(name, sample) RTC_HISTOGRAM_COUNTS( \
73 name, sample, 1, 100, 50)
74
75#define RTC_HISTOGRAM_COUNTS_1000(name, sample) RTC_HISTOGRAM_COUNTS( \
76 name, sample, 1, 1000, 50)
77
78#define RTC_HISTOGRAM_COUNTS_10000(name, sample) RTC_HISTOGRAM_COUNTS( \
79 name, sample, 1, 10000, 50)
80
asapersson@webrtc.org97d04892014-12-09 09:47:53 +000081#define RTC_HISTOGRAM_COUNTS_100000(name, sample) RTC_HISTOGRAM_COUNTS( \
82 name, sample, 1, 100000, 50)
83
asapersson@webrtc.org580d3672014-10-23 12:57:56 +000084#define RTC_HISTOGRAM_COUNTS(name, sample, min, max, bucket_count) \
85 RTC_HISTOGRAM_COMMON_BLOCK(name, sample, \
86 webrtc::metrics::HistogramFactoryGetCounts( \
87 name, min, max, bucket_count))
88
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +000089// Histogram for percentage.
90#define RTC_HISTOGRAM_PERCENTAGE(name, sample) \
91 RTC_HISTOGRAM_ENUMERATION(name, sample, 101)
92
asapersson@webrtc.org580d3672014-10-23 12:57:56 +000093// Histogram for enumerators.
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +000094// |boundary| should be above the max enumerator sample.
asapersson@webrtc.org580d3672014-10-23 12:57:56 +000095#define RTC_HISTOGRAM_ENUMERATION(name, sample, boundary) \
96 RTC_HISTOGRAM_COMMON_BLOCK(name, sample, \
97 webrtc::metrics::HistogramFactoryGetEnumeration(name, boundary))
98
99#define RTC_HISTOGRAM_COMMON_BLOCK(constant_name, sample, \
100 factory_get_invocation) \
101 do { \
102 webrtc::metrics::Histogram* histogram_pointer = factory_get_invocation; \
103 webrtc::metrics::HistogramAdd(histogram_pointer, constant_name, sample); \
104 } while (0)
105
106
107namespace webrtc {
108namespace metrics {
109
asapersson@webrtc.org83b52002014-11-28 10:17:13 +0000110// Time that should have elapsed for stats that are gathered once per call.
111enum { kMinRunTimeInSeconds = 10 };
112
asapersson@webrtc.org580d3672014-10-23 12:57:56 +0000113class Histogram;
114
115// Functions for getting pointer to histogram (constructs or finds the named
116// histogram).
117
118// Get histogram for counters.
119Histogram* HistogramFactoryGetCounts(
120 const std::string& name, int min, int max, int bucket_count);
121
122// Get histogram for enumerators.
123// |boundary| should be above the max enumerator sample.
124Histogram* HistogramFactoryGetEnumeration(
125 const std::string& name, int boundary);
126
127// Function for adding a |sample| to a histogram.
128// |name| can be used to verify that it matches the histogram name.
129void HistogramAdd(
130 Histogram* histogram_pointer, const std::string& name, int sample);
131
132} // namespace metrics
133} // namespace webrtc
134
135#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_METRICS_H_
136