aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/monlib/metrics/histogram_collector.h
blob: b1d628ce9ef6525dd213aef89f62a51baf707b3c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#pragma once 
 
#include "histogram_snapshot.h" 
 
namespace NMonitoring { 
 
    /////////////////////////////////////////////////////////////////////////// 
    // IHistogramCollector 
    /////////////////////////////////////////////////////////////////////////// 
    class IHistogramCollector { 
    public: 
        virtual ~IHistogramCollector() = default; 
 
        /** 
         * Store {@code count} times given {@code value} in this collector. 
         */ 
        virtual void Collect(double value, ui32 count) = 0;
 
        /** 
         * Store given {@code value} in this collector. 
         */ 
        void Collect(double value) { 
            Collect(value, 1); 
        } 
 
        /** 
         * Add counts from snapshot into this collector 
         */ 
        void Collect(const IHistogramSnapshot& snapshot) { 
            for (ui32 i = 0; i < snapshot.Count(); i++) { 
                Collect(snapshot.UpperBound(i), snapshot.Value(i)); 
            } 
        } 
 
        /** 
         * Reset collector values
         */
        virtual void Reset() = 0;

        /**
         * @return snapshot of the state of this collector. 
         */ 
        virtual IHistogramSnapshotPtr Snapshot() const = 0; 
    }; 
 
    using IHistogramCollectorPtr = THolder<IHistogramCollector>; 
 
    /////////////////////////////////////////////////////////////////////////// 
    // free functions 
    /////////////////////////////////////////////////////////////////////////// 
 
    /** 
     * <p>Creates histogram collector for a set of buckets with arbitrary 
     * bounds.</p> 
     * 
     * <p>Defines {@code bounds.size()  + 1} buckets with these boundaries for 
     * bucket i:</p> 
     * <ul> 
     *     <li>Upper bound (0 <= i < N-1): {@code bounds[i]}</li> 
     *     <li>Lower bound (1 <= i < N):   {@code bounds[i - 1]}</li> 
     * </ul> 
     * 
     * <p>For example, if the list of boundaries is:</p> 
     * <pre>0, 1, 2, 5, 10, 20</pre> 
     * 
     * <p>then there are five finite buckets with the following ranges:</p> 
     * <pre>(-INF, 0], (0, 1], (1, 2], (2, 5], (5, 10], (10, 20], (20, +INF)</pre> 
     * 
     * @param bounds array of upper bounds for buckets. Values must be sorted. 
     */ 
    IHistogramCollectorPtr ExplicitHistogram(TBucketBounds bounds);
 
    /** 
     * <p>Creates histogram collector for a sequence of buckets that have a 
     * width proportional to the value of the lower bound.</p> 
     * 
     * <p>Defines {@code bucketsCount} buckets with these boundaries for bucket i:</p> 
     * <ul> 
     *    <li>Upper bound (0 <= i < N-1):  {@code scale * (base ^ i)}</li> 
     *    <li>Lower bound (1 <= i < N):    {@code scale * (base ^ (i - 1))}</li> 
     * </ul> 
     * 
     * <p>For example, if {@code bucketsCount=6}, {@code base=2}, and {@code scale=3}, 
     * then the bucket ranges are as follows:</p> 
     * 
     * <pre>(-INF, 3], (3, 6], (6, 12], (12, 24], (24, 48], (48, +INF)</pre> 
     * 
     * @param bucketsCount the total number of buckets. The value must be >= 2. 
     * @param base         the exponential growth factor for the buckets width. 
     *                     The value must be >= 1.0. 
     * @param scale        the linear scale for the buckets. The value must be >= 1.0. 
     */ 
    IHistogramCollectorPtr ExponentialHistogram( 
        ui32 bucketsCount, double base, double scale = 1.0); 
 
    /** 
     * <p>Creates histogram collector for a sequence of buckets that all have 
     * the same width (except overflow and underflow).</p> 
     * 
     * <p>Defines {@code bucketsCount} buckets with these boundaries for bucket i:</p> 
     * <ul> 
     *    <li>Upper bound (0 <= i < N-1):  {@code startValue + bucketWidth * i}</li> 
     *    <li>Lower bound (1 <= i < N):    {@code startValue + bucketWidth * (i - 1)}</li> 
     * </ul> 
     * 
     * <p>For example, if {@code bucketsCount=6}, {@code startValue=5}, and 
     * {@code bucketWidth=15}, then the bucket ranges are as follows:</p> 
     * 
     * <pre>(-INF, 5], (5, 20], (20, 35], (35, 50], (50, 65], (65, +INF)</pre> 
     * 
     * @param bucketsCount the total number of buckets. The value must be >= 2. 
     * @param startValue   the upper boundary of the first bucket. 
     * @param bucketWidth  the difference between the upper and lower bounds for 
     *                     each bucket. The value must be >= 1. 
     */ 
    IHistogramCollectorPtr LinearHistogram( 
        ui32 bucketsCount, TBucketBound startValue, TBucketBound bucketWidth);
 
} // namespace NMonitoring