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
|
#include "histogram_collector.h"
#include <library/cpp/testing/unittest/registar.h>
using namespace NMonitoring;
Y_UNIT_TEST_SUITE(THistogramCollectorTest) {
void CheckSnapshot(
const IHistogramSnapshot& s,
const TBucketBounds& bounds,
const TBucketValues& values) {
UNIT_ASSERT_VALUES_EQUAL(bounds.size(), values.size());
UNIT_ASSERT_VALUES_EQUAL(bounds.size(), s.Count());
double epsilon = std::numeric_limits<double>::epsilon();
for (ui32 i = 0; i < s.Count(); i++) {
UNIT_ASSERT_DOUBLES_EQUAL(bounds[i], s.UpperBound(i), epsilon);
UNIT_ASSERT_VALUES_EQUAL(values[i], s.Value(i));
}
}
Y_UNIT_TEST(Explicit) {
auto histogram = ExplicitHistogram({0, 1, 2, 5, 10, 20});
histogram->Collect(-2);
histogram->Collect(-1);
histogram->Collect(0);
histogram->Collect(1);
histogram->Collect(20);
histogram->Collect(21);
histogram->Collect(1000);
TBucketBounds expectedBounds = {0, 1, 2, 5, 10, 20, Max<TBucketBound>()};
TBucketValues expectedValues = {3, 1, 0, 0, 0, 1, 2};
CheckSnapshot(*histogram->Snapshot(), expectedBounds, expectedValues);
}
Y_UNIT_TEST(ExplicitWithFloadBounds) {
auto histogram = ExplicitHistogram({0.1, 0.5, 1, 1.7, 10});
histogram->Collect(0.3, 2);
histogram->Collect(0.01);
histogram->Collect(0.9);
histogram->Collect(0.6);
histogram->Collect(1.1);
histogram->Collect(0.7);
histogram->Collect(2.71);
TBucketBounds expectedBounds = {0.1, 0.5, 1, 1.7, 10, Max<TBucketBound>()};
TBucketValues expectedValues = {1, 2, 3, 1, 1, 0};
CheckSnapshot(*histogram->Snapshot(), expectedBounds, expectedValues);
}
Y_UNIT_TEST(Exponential) {
auto histogram = ExponentialHistogram(6, 2.0, 3.0);
histogram->Collect(-1);
histogram->Collect(0);
histogram->Collect(1);
histogram->Collect(3);
histogram->Collect(4);
histogram->Collect(5);
histogram->Collect(22);
histogram->Collect(23);
histogram->Collect(24);
histogram->Collect(50);
histogram->Collect(100);
histogram->Collect(1000);
TBucketBounds expectedBounds = {3, 6, 12, 24, 48, Max<TBucketBound>()};
TBucketValues expectedValues = {4, 2, 0, 3, 0, 3};
CheckSnapshot(*histogram->Snapshot(), expectedBounds, expectedValues);
}
Y_UNIT_TEST(Linear) {
auto histogram = LinearHistogram(6, 5, 15);
histogram->Collect(-1);
histogram->Collect(0);
histogram->Collect(1);
histogram->Collect(4);
histogram->Collect(5);
histogram->Collect(6);
histogram->Collect(64);
histogram->Collect(65);
histogram->Collect(66);
histogram->Collect(100);
histogram->Collect(1000);
TBucketBounds expectedBounds = {5, 20, 35, 50, 65, Max<TBucketBound>()};
TBucketValues expectedValues = {5, 1, 0, 0, 2, 3};
CheckSnapshot(*histogram->Snapshot(), expectedBounds, expectedValues);
}
Y_UNIT_TEST(SnapshotOutput) {
auto histogram = ExplicitHistogram({0, 1, 2, 5, 10, 20});
histogram->Collect(-2);
histogram->Collect(-1);
histogram->Collect(0);
histogram->Collect(1);
histogram->Collect(20);
histogram->Collect(21);
histogram->Collect(1000);
auto snapshot = histogram->Snapshot();
TStringStream ss;
ss << *snapshot;
UNIT_ASSERT_STRINGS_EQUAL(
"{0: 3, 1: 1, 2: 0, 5: 0, 10: 0, 20: 1, inf: 2}",
ss.Str());
}
}
|