@@ -27,7 +27,7 @@ import (
27
27
)
28
28
29
29
func TestAccumulateHistogram (t * testing.T ) {
30
- appendHistogram := func (ts time.Time , count uint64 , sum float64 , counts []uint64 , bounds []float64 , metrics pmetric.MetricSlice ) {
30
+ appendHistogram := func (startTs time. Time , ts time.Time , count uint64 , sum float64 , counts []uint64 , bounds []float64 , metrics pmetric.MetricSlice ) {
31
31
metric := metrics .AppendEmpty ()
32
32
metric .SetName ("test_metric" )
33
33
metric .SetEmptyHistogram ().SetAggregationTemporality (pmetric .AggregationTemporalityDelta )
@@ -40,20 +40,26 @@ func TestAccumulateHistogram(t *testing.T) {
40
40
dp .Attributes ().PutStr ("label_1" , "1" )
41
41
dp .Attributes ().PutStr ("label_2" , "2" )
42
42
dp .SetTimestamp (pcommon .NewTimestampFromTime (ts ))
43
+ dp .SetStartTimestamp (pcommon .NewTimestampFromTime (startTs ))
43
44
}
44
45
46
+ startTs1 := time .Now ().Add (- 6 * time .Second )
47
+ startTs2 := time .Now ().Add (- 5 * time .Second )
48
+ startTs3 := time .Now ()
45
49
ts1 := time .Now ().Add (- 4 * time .Second )
46
50
ts2 := time .Now ().Add (- 3 * time .Second )
47
51
ts3 := time .Now ().Add (- 2 * time .Second )
48
52
ts4 := time .Now ().Add (- 1 * time .Second )
53
+ ts5 := time .Now ().Add (1 * time .Second )
49
54
50
55
a := newAccumulator (zap .NewNop (), 1 * time .Hour ).(* lastValueAccumulator )
51
56
52
57
resourceMetrics1 := pmetric .NewResourceMetrics ()
53
58
ilm1 := resourceMetrics1 .ScopeMetrics ().AppendEmpty ()
54
59
ilm1 .Scope ().SetName ("test" )
55
- appendHistogram (ts3 , 5 , 2.5 , []uint64 {1 , 3 , 1 , 0 }, []float64 {0.1 , 0.5 , 1 , 10 }, ilm1 .Metrics ())
56
- appendHistogram (ts2 , 4 , 8.3 , []uint64 {1 , 1 , 2 , 0 }, []float64 {0.1 , 0.5 , 1 , 10 }, ilm1 .Metrics ())
60
+ // counts is one more than explicit bounds to account for the one implicit count/bucket for <=inf
61
+ appendHistogram (startTs2 , ts3 , 5 , 2.5 , []uint64 {1 , 3 , 1 , 0 , 0 }, []float64 {0.1 , 0.5 , 1 , 10 }, ilm1 .Metrics ())
62
+ appendHistogram (startTs2 , ts2 , 4 , 8.3 , []uint64 {1 , 1 , 2 , 0 , 0 }, []float64 {0.1 , 0.5 , 1 , 10 }, ilm1 .Metrics ())
57
63
58
64
m3 := ilm1 .Metrics ().At (0 ).Histogram ().DataPoints ().At (0 )
59
65
m2 := ilm1 .Metrics ().At (1 ).Histogram ().DataPoints ().At (0 )
@@ -63,16 +69,30 @@ func TestAccumulateHistogram(t *testing.T) {
63
69
resourceMetrics2 := pmetric .NewResourceMetrics ()
64
70
ilm2 := resourceMetrics2 .ScopeMetrics ().AppendEmpty ()
65
71
ilm2 .Scope ().SetName ("test" )
66
- appendHistogram (ts1 , 7 , 5 , []uint64 {3 , 1 , 1 , 0 }, []float64 {0.1 , 0.2 , 1 , 10 }, ilm2 .Metrics ())
72
+ appendHistogram (startTs2 , ts1 , 7 , 5 , []uint64 {3 , 1 , 1 , 0 , 0 }, []float64 {0.1 , 0.2 , 1 , 10 }, ilm2 .Metrics ())
67
73
68
74
// add extra buckets
69
75
resourceMetrics3 := pmetric .NewResourceMetrics ()
70
76
ilm3 := resourceMetrics3 .ScopeMetrics ().AppendEmpty ()
71
77
ilm3 .Scope ().SetName ("test" )
72
- appendHistogram (ts4 , 7 , 5 , []uint64 {3 , 1 , 1 , 0 , 0 }, []float64 {0.1 , 0.2 , 1 , 10 , 15 }, ilm3 .Metrics ())
78
+ appendHistogram (startTs2 , ts4 , 7 , 5 , []uint64 {3 , 1 , 1 , 0 , 0 , 0 }, []float64 {0.1 , 0.2 , 1 , 10 , 15 }, ilm3 .Metrics ())
73
79
74
80
m4 := ilm3 .Metrics ().At (0 ).Histogram ().DataPoints ().At (0 )
75
81
82
+ // misaligned start timestamp, drop
83
+ resourceMetrics4 := pmetric .NewResourceMetrics ()
84
+ ilm4 := resourceMetrics4 .ScopeMetrics ().AppendEmpty ()
85
+ ilm4 .Scope ().SetName ("test" )
86
+ appendHistogram (startTs1 , ts5 , 4 , 8.3 , []uint64 {1 , 1 , 2 , 0 , 0 }, []float64 {0.1 , 0.5 , 1 , 10 }, ilm4 .Metrics ())
87
+ appendHistogram (ts3 , ts5 , 4 , 8.3 , []uint64 {1 , 1 , 2 , 0 , 0 }, []float64 {0.1 , 0.5 , 1 , 10 }, ilm4 .Metrics ())
88
+
89
+ // misaligned start timestamp, treat as restart
90
+ resourceMetrics5 := pmetric .NewResourceMetrics ()
91
+ ilm5 := resourceMetrics5 .ScopeMetrics ().AppendEmpty ()
92
+ ilm5 .Scope ().SetName ("test" )
93
+ appendHistogram (startTs3 , ts5 , 4 , 8.3 , []uint64 {1 , 1 , 2 , 0 , 0 }, []float64 {0.1 , 0.5 , 1 , 10 }, ilm5 .Metrics ())
94
+ m5 := ilm5 .Metrics ().At (0 ).Histogram ().DataPoints ().At (0 )
95
+
76
96
t .Run ("Accumulate" , func (t * testing.T ) {
77
97
n := a .Accumulate (resourceMetrics1 )
78
98
require .Equal (t , 2 , n )
@@ -133,6 +153,46 @@ func TestAccumulateHistogram(t *testing.T) {
133
153
require .Equal (t , m4 .ExplicitBounds ().At (i ), v .ExplicitBounds ().At (i ))
134
154
}
135
155
})
156
+ t .Run ("MisalignedTimestamps/Drop" , func (t * testing.T ) {
157
+ // should reset when different buckets arrive
158
+ n := a .Accumulate (resourceMetrics4 )
159
+ require .Equal (t , 0 , n )
160
+
161
+ m , ok := a .registeredMetrics .Load (signature )
162
+ v := m .(* accumulatedValue ).value .Histogram ().DataPoints ().At (0 )
163
+ require .True (t , ok )
164
+
165
+ require .Equal (t , m4 .Sum (), v .Sum ())
166
+ require .Equal (t , m4 .Count (), v .Count ())
167
+
168
+ for i := 0 ; i < v .BucketCounts ().Len (); i ++ {
169
+ require .Equal (t , m4 .BucketCounts ().At (i ), v .BucketCounts ().At (i ))
170
+ }
171
+
172
+ for i := 0 ; i < v .ExplicitBounds ().Len (); i ++ {
173
+ require .Equal (t , m4 .ExplicitBounds ().At (i ), v .ExplicitBounds ().At (i ))
174
+ }
175
+ })
176
+ t .Run ("MisalignedTimestamps/Reset" , func (t * testing.T ) {
177
+ // reset when start timestamp skips ahead
178
+ n := a .Accumulate (resourceMetrics5 )
179
+ require .Equal (t , 1 , n )
180
+
181
+ m , ok := a .registeredMetrics .Load (signature )
182
+ v := m .(* accumulatedValue ).value .Histogram ().DataPoints ().At (0 )
183
+ require .True (t , ok )
184
+
185
+ require .Equal (t , m5 .Sum (), v .Sum ())
186
+ require .Equal (t , m5 .Count (), v .Count ())
187
+
188
+ for i := 0 ; i < v .BucketCounts ().Len (); i ++ {
189
+ require .Equal (t , m5 .BucketCounts ().At (i ), v .BucketCounts ().At (i ))
190
+ }
191
+
192
+ for i := 0 ; i < v .ExplicitBounds ().Len (); i ++ {
193
+ require .Equal (t , m5 .ExplicitBounds ().At (i ), v .ExplicitBounds ().At (i ))
194
+ }
195
+ })
136
196
}
137
197
138
198
func TestAccumulateMetrics (t * testing.T ) {
0 commit comments