blob: be9564a0c24bcaed132da556ea3ec47757d9c320 [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.
72#define RTC_HISTOGRAM_COUNTS(name, sample, min, max, bucket_count) \
73 RTC_HISTOGRAM_COMMON_BLOCK(name, sample, \
74 webrtc::metrics::HistogramFactoryGetCounts( \
75 name, min, max, bucket_count))
76
77// Histogram for enumerators.
78#define RTC_HISTOGRAM_ENUMERATION(name, sample, boundary) \
79 RTC_HISTOGRAM_COMMON_BLOCK(name, sample, \
80 webrtc::metrics::HistogramFactoryGetEnumeration(name, boundary))
81
82#define RTC_HISTOGRAM_COMMON_BLOCK(constant_name, sample, \
83 factory_get_invocation) \
84 do { \
85 webrtc::metrics::Histogram* histogram_pointer = factory_get_invocation; \
86 webrtc::metrics::HistogramAdd(histogram_pointer, constant_name, sample); \
87 } while (0)
88
89
90namespace webrtc {
91namespace metrics {
92
93class Histogram;
94
95// Functions for getting pointer to histogram (constructs or finds the named
96// histogram).
97
98// Get histogram for counters.
99Histogram* HistogramFactoryGetCounts(
100 const std::string& name, int min, int max, int bucket_count);
101
102// Get histogram for enumerators.
103// |boundary| should be above the max enumerator sample.
104Histogram* HistogramFactoryGetEnumeration(
105 const std::string& name, int boundary);
106
107// Function for adding a |sample| to a histogram.
108// |name| can be used to verify that it matches the histogram name.
109void HistogramAdd(
110 Histogram* histogram_pointer, const std::string& name, int sample);
111
112} // namespace metrics
113} // namespace webrtc
114
115#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_METRICS_H_
116