blob: 5e8ca11e9184ef85c4b1777b7d9650c0a342c835 [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
kjellanderd56d68c2015-11-02 02:12:41 -080011#ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_METRICS_H_
12#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_METRICS_H_
asapersson@webrtc.org580d3672014-10-23 12:57:56 +000013
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.
andresp@webrtc.org86e1e482015-01-14 09:30:52 +000044// system_wrappers/system_wrappers.gyp:metrics_default).
asapersson@webrtc.org580d3672014-10-23 12:57:56 +000045//
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.
asapersson53805322015-12-21 01:46:20 -080072#define RTC_HISTOGRAM_COUNTS_SPARSE_100(name, sample) \
73 RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, 1, 100, 50)
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +000074
asapersson53805322015-12-21 01:46:20 -080075#define RTC_HISTOGRAM_COUNTS_SPARSE_200(name, sample) \
76 RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, 1, 200, 50)
asapersson86b01602015-10-20 23:55:26 -070077
asapersson53805322015-12-21 01:46:20 -080078#define RTC_HISTOGRAM_COUNTS_SPARSE_1000(name, sample) \
79 RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, 1, 1000, 50)
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +000080
asapersson53805322015-12-21 01:46:20 -080081#define RTC_HISTOGRAM_COUNTS_SPARSE_10000(name, sample) \
82 RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, 1, 10000, 50)
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +000083
asapersson53805322015-12-21 01:46:20 -080084#define RTC_HISTOGRAM_COUNTS_SPARSE_100000(name, sample) \
85 RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, 1, 100000, 50)
asapersson@webrtc.org97d04892014-12-09 09:47:53 +000086
asapersson53805322015-12-21 01:46:20 -080087#define RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, min, max, bucket_count) \
88 RTC_HISTOGRAM_COMMON_BLOCK_SLOW(name, sample, \
89 webrtc::metrics::HistogramFactoryGetCounts( \
90 name, min, max, bucket_count))
asapersson@webrtc.org580d3672014-10-23 12:57:56 +000091
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +000092// Histogram for percentage.
asapersson53805322015-12-21 01:46:20 -080093#define RTC_HISTOGRAM_PERCENTAGE_SPARSE(name, sample) \
94 RTC_HISTOGRAM_ENUMERATION_SPARSE(name, sample, 101)
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +000095
asapersson@webrtc.org580d3672014-10-23 12:57:56 +000096// Histogram for enumerators.
asapersson@webrtc.org96dc6852014-11-03 14:40:38 +000097// |boundary| should be above the max enumerator sample.
asapersson53805322015-12-21 01:46:20 -080098#define RTC_HISTOGRAM_ENUMERATION_SPARSE(name, sample, boundary) \
99 RTC_HISTOGRAM_COMMON_BLOCK_SLOW(name, sample, \
100 webrtc::metrics::HistogramFactoryGetEnumeration(name, boundary))
asapersson@webrtc.org580d3672014-10-23 12:57:56 +0000101
asapersson53805322015-12-21 01:46:20 -0800102#define RTC_HISTOGRAM_COMMON_BLOCK_SLOW(constant_name, sample, \
103 factory_get_invocation) \
asapersson@webrtc.org580d3672014-10-23 12:57:56 +0000104 do { \
105 webrtc::metrics::Histogram* histogram_pointer = factory_get_invocation; \
106 webrtc::metrics::HistogramAdd(histogram_pointer, constant_name, sample); \
107 } while (0)
108
asapersson@webrtc.org580d3672014-10-23 12:57:56 +0000109namespace webrtc {
110namespace metrics {
111
asapersson@webrtc.org83b52002014-11-28 10:17:13 +0000112// Time that should have elapsed for stats that are gathered once per call.
113enum { kMinRunTimeInSeconds = 10 };
114
asapersson@webrtc.org580d3672014-10-23 12:57:56 +0000115class Histogram;
116
117// Functions for getting pointer to histogram (constructs or finds the named
118// histogram).
119
120// Get histogram for counters.
121Histogram* HistogramFactoryGetCounts(
122 const std::string& name, int min, int max, int bucket_count);
123
124// Get histogram for enumerators.
125// |boundary| should be above the max enumerator sample.
126Histogram* HistogramFactoryGetEnumeration(
127 const std::string& name, int boundary);
128
129// Function for adding a |sample| to a histogram.
130// |name| can be used to verify that it matches the histogram name.
131void HistogramAdd(
132 Histogram* histogram_pointer, const std::string& name, int sample);
133
134} // namespace metrics
135} // namespace webrtc
136
kjellanderd56d68c2015-11-02 02:12:41 -0800137#endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_METRICS_H_
asapersson@webrtc.org580d3672014-10-23 12:57:56 +0000138