@@ -290,6 +290,138 @@ def test_record(self):
290290 )
291291
292292
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+
293425class TestValueObserver (unittest .TestCase ):
294426 def test_observe (self ):
295427 meter = metrics .MeterProvider ().get_meter (__name__ )
0 commit comments