@@ -290,6 +290,138 @@ def test_record(self):
290
290
)
291
291
292
292
293
+ class TestSumObserver (unittest .TestCase ):
294
+ def test_observe (self ):
295
+ meter = metrics .MeterProvider ().get_meter (__name__ )
296
+ observer = metrics .SumObserver (
297
+ None , "name" , "desc" , "unit" , int , meter , ("key" ,), True
298
+ )
299
+ labels = {"key" : "value" }
300
+ key_labels = tuple (sorted (labels .items ()))
301
+ values = (37 , 42 , 60 , 100 )
302
+ for val in values :
303
+ observer .observe (val , labels )
304
+
305
+ self .assertEqual (observer .aggregators [key_labels ].current , values [- 1 ])
306
+
307
+ def test_observe_disabled (self ):
308
+ meter = metrics .MeterProvider ().get_meter (__name__ )
309
+ observer = metrics .SumObserver (
310
+ None , "name" , "desc" , "unit" , int , meter , ("key" ,), False
311
+ )
312
+ labels = {"key" : "value" }
313
+ observer .observe (37 , labels )
314
+ self .assertEqual (len (observer .aggregators ), 0 )
315
+
316
+ @mock .patch ("opentelemetry.sdk.metrics.logger" )
317
+ def test_observe_incorrect_type (self , logger_mock ):
318
+ meter = metrics .MeterProvider ().get_meter (__name__ )
319
+ observer = metrics .SumObserver (
320
+ None , "name" , "desc" , "unit" , int , meter , ("key" ,), True
321
+ )
322
+ labels = {"key" : "value" }
323
+ observer .observe (37.0 , labels )
324
+ self .assertEqual (len (observer .aggregators ), 0 )
325
+ self .assertTrue (logger_mock .warning .called )
326
+
327
+ @mock .patch ("opentelemetry.sdk.metrics.logger" )
328
+ def test_observe_non_decreasing_error (self , logger_mock ):
329
+ meter = metrics .MeterProvider ().get_meter (__name__ )
330
+ observer = metrics .SumObserver (
331
+ None , "name" , "desc" , "unit" , int , meter , ("key" ,), True
332
+ )
333
+ labels = {"key" : "value" }
334
+ observer .observe (37 , labels )
335
+ observer .observe (14 , labels )
336
+ self .assertEqual (len (observer .aggregators ), 1 )
337
+ self .assertTrue (logger_mock .warning .called )
338
+
339
+ def test_run (self ):
340
+ meter = metrics .MeterProvider ().get_meter (__name__ )
341
+
342
+ callback = mock .Mock ()
343
+ observer = metrics .SumObserver (
344
+ callback , "name" , "desc" , "unit" , int , meter , (), True
345
+ )
346
+
347
+ self .assertTrue (observer .run ())
348
+ callback .assert_called_once_with (observer )
349
+
350
+ @mock .patch ("opentelemetry.sdk.metrics.logger" )
351
+ def test_run_exception (self , logger_mock ):
352
+ meter = metrics .MeterProvider ().get_meter (__name__ )
353
+
354
+ callback = mock .Mock ()
355
+ callback .side_effect = Exception ("We have a problem!" )
356
+
357
+ observer = metrics .SumObserver (
358
+ callback , "name" , "desc" , "unit" , int , meter , (), True
359
+ )
360
+
361
+ self .assertFalse (observer .run ())
362
+ self .assertTrue (logger_mock .warning .called )
363
+
364
+
365
+ class TestUpDownSumObserver (unittest .TestCase ):
366
+ def test_observe (self ):
367
+ meter = metrics .MeterProvider ().get_meter (__name__ )
368
+ observer = metrics .UpDownSumObserver (
369
+ None , "name" , "desc" , "unit" , int , meter , ("key" ,), True
370
+ )
371
+ labels = {"key" : "value" }
372
+ key_labels = tuple (sorted (labels .items ()))
373
+ values = (37 , 42 , 14 , 30 )
374
+ for val in values :
375
+ observer .observe (val , labels )
376
+
377
+ self .assertEqual (observer .aggregators [key_labels ].current , values [- 1 ])
378
+
379
+ def test_observe_disabled (self ):
380
+ meter = metrics .MeterProvider ().get_meter (__name__ )
381
+ observer = metrics .UpDownSumObserver (
382
+ None , "name" , "desc" , "unit" , int , meter , ("key" ,), False
383
+ )
384
+ labels = {"key" : "value" }
385
+ observer .observe (37 , labels )
386
+ self .assertEqual (len (observer .aggregators ), 0 )
387
+
388
+ @mock .patch ("opentelemetry.sdk.metrics.logger" )
389
+ def test_observe_incorrect_type (self , logger_mock ):
390
+ meter = metrics .MeterProvider ().get_meter (__name__ )
391
+ observer = metrics .UpDownSumObserver (
392
+ None , "name" , "desc" , "unit" , int , meter , ("key" ,), True
393
+ )
394
+ labels = {"key" : "value" }
395
+ observer .observe (37.0 , labels )
396
+ self .assertEqual (len (observer .aggregators ), 0 )
397
+ self .assertTrue (logger_mock .warning .called )
398
+
399
+ def test_run (self ):
400
+ meter = metrics .MeterProvider ().get_meter (__name__ )
401
+
402
+ callback = mock .Mock ()
403
+ observer = metrics .UpDownSumObserver (
404
+ callback , "name" , "desc" , "unit" , int , meter , (), True
405
+ )
406
+
407
+ self .assertTrue (observer .run ())
408
+ callback .assert_called_once_with (observer )
409
+
410
+ @mock .patch ("opentelemetry.sdk.metrics.logger" )
411
+ def test_run_exception (self , logger_mock ):
412
+ meter = metrics .MeterProvider ().get_meter (__name__ )
413
+
414
+ callback = mock .Mock ()
415
+ callback .side_effect = Exception ("We have a problem!" )
416
+
417
+ observer = metrics .UpDownSumObserver (
418
+ callback , "name" , "desc" , "unit" , int , meter , (), True
419
+ )
420
+
421
+ self .assertFalse (observer .run ())
422
+ self .assertTrue (logger_mock .warning .called )
423
+
424
+
293
425
class TestValueObserver (unittest .TestCase ):
294
426
def test_observe (self ):
295
427
meter = metrics .MeterProvider ().get_meter (__name__ )
0 commit comments