@@ -16,16 +16,20 @@ package aggregatortest // import "go.opentelemetry.io/otel/sdk/metric/aggregator
16
16
17
17
import (
18
18
"context"
19
+ "errors"
19
20
"math/rand"
20
21
"os"
21
22
"sort"
22
23
"testing"
23
24
"unsafe"
24
25
26
+ "github.com/stretchr/testify/require"
27
+
25
28
ottest "go.opentelemetry.io/otel/internal/testing"
26
29
"go.opentelemetry.io/otel/metric"
27
30
"go.opentelemetry.io/otel/metric/number"
28
31
export "go.opentelemetry.io/otel/sdk/export/metric"
32
+ "go.opentelemetry.io/otel/sdk/export/metric/aggregation"
29
33
"go.opentelemetry.io/otel/sdk/metric/aggregator"
30
34
)
31
35
@@ -36,6 +40,12 @@ type Profile struct {
36
40
Random func (sign int ) number.Number
37
41
}
38
42
43
+ type NoopAggregator struct {}
44
+ type NoopAggregation struct {}
45
+
46
+ var _ export.Aggregator = NoopAggregator {}
47
+ var _ aggregation.Aggregation = NoopAggregation {}
48
+
39
49
func newProfiles () []Profile {
40
50
rnd := rand .New (rand .NewSource (rand .Int63 ()))
41
51
return []Profile {
@@ -172,3 +182,111 @@ func CheckedMerge(t *testing.T, aggInto, aggFrom export.Aggregator, descriptor *
172
182
t .Error ("Unexpected Merge failure" , err )
173
183
}
174
184
}
185
+
186
+ func (NoopAggregation ) Kind () aggregation.Kind {
187
+ return aggregation .Kind ("Noop" )
188
+ }
189
+
190
+ func (NoopAggregator ) Aggregation () aggregation.Aggregation {
191
+ return NoopAggregation {}
192
+ }
193
+
194
+ func (NoopAggregator ) Update (context.Context , number.Number , * metric.Descriptor ) error {
195
+ return nil
196
+ }
197
+
198
+ func (NoopAggregator ) SynchronizedMove (export.Aggregator , * metric.Descriptor ) error {
199
+ return nil
200
+ }
201
+
202
+ func (NoopAggregator ) Merge (export.Aggregator , * metric.Descriptor ) error {
203
+ return nil
204
+ }
205
+
206
+ func SynchronizedMoveResetTest (t * testing.T , mkind metric.InstrumentKind , nf func (* metric.Descriptor ) export.Aggregator ) {
207
+ t .Run ("reset on nil" , func (t * testing.T ) {
208
+ // Ensures that SynchronizedMove(nil, descriptor) discards and
209
+ // resets the aggregator.
210
+ RunProfiles (t , func (t * testing.T , profile Profile ) {
211
+ descriptor := NewAggregatorTest (
212
+ mkind ,
213
+ profile .NumberKind ,
214
+ )
215
+ agg := nf (descriptor )
216
+
217
+ for i := 0 ; i < 10 ; i ++ {
218
+ x1 := profile .Random (+ 1 )
219
+ CheckedUpdate (t , agg , x1 , descriptor )
220
+ }
221
+
222
+ require .NoError (t , agg .SynchronizedMove (nil , descriptor ))
223
+
224
+ if count , ok := agg .(aggregation.Count ); ok {
225
+ c , err := count .Count ()
226
+ require .Equal (t , int64 (0 ), c )
227
+ require .NoError (t , err )
228
+ }
229
+
230
+ if sum , ok := agg .(aggregation.Sum ); ok {
231
+ s , err := sum .Sum ()
232
+ require .Equal (t , number .Number (0 ), s )
233
+ require .NoError (t , err )
234
+ }
235
+
236
+ if lv , ok := agg .(aggregation.LastValue ); ok {
237
+ v , _ , err := lv .LastValue ()
238
+ require .Equal (t , number .Number (0 ), v )
239
+ require .Error (t , err )
240
+ require .True (t , errors .Is (err , aggregation .ErrNoData ))
241
+ }
242
+ })
243
+ })
244
+
245
+ t .Run ("no reset on incorrect type" , func (t * testing.T ) {
246
+ // Ensures that SynchronizedMove(wrong_type, descriptor) does not
247
+ // reset the aggregator.
248
+ RunProfiles (t , func (t * testing.T , profile Profile ) {
249
+ descriptor := NewAggregatorTest (
250
+ mkind ,
251
+ profile .NumberKind ,
252
+ )
253
+ agg := nf (descriptor )
254
+
255
+ var input number.Number
256
+ const inval = 100
257
+ if profile .NumberKind == number .Int64Kind {
258
+ input = number .NewInt64Number (inval )
259
+ } else {
260
+ input = number .NewFloat64Number (inval )
261
+ }
262
+
263
+ CheckedUpdate (t , agg , input , descriptor )
264
+
265
+ err := agg .SynchronizedMove (NoopAggregator {}, descriptor )
266
+ require .Error (t , err )
267
+ require .True (t , errors .Is (err , aggregation .ErrInconsistentType ))
268
+
269
+ // Test that the aggregator was not reset
270
+
271
+ if count , ok := agg .(aggregation.Count ); ok {
272
+ c , err := count .Count ()
273
+ require .Equal (t , int64 (1 ), c )
274
+ require .NoError (t , err )
275
+ }
276
+
277
+ if sum , ok := agg .(aggregation.Sum ); ok {
278
+ s , err := sum .Sum ()
279
+ require .Equal (t , input , s )
280
+ require .NoError (t , err )
281
+ }
282
+
283
+ if lv , ok := agg .(aggregation.LastValue ); ok {
284
+ v , _ , err := lv .LastValue ()
285
+ require .Equal (t , input , v )
286
+ require .NoError (t , err )
287
+ }
288
+
289
+ })
290
+ })
291
+
292
+ }
0 commit comments