Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f2bc613

Browse files
authored
Fix last value aggregation bug + add tests (open-telemetry#834)
1 parent 17558b8 commit f2bc613

File tree

2 files changed

+92
-2
lines changed

2 files changed

+92
-2
lines changed

opentelemetry-sdk/src/opentelemetry/sdk/metrics/export/aggregate.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,12 @@ def take_checkpoint(self):
144144
self.current = None
145145

146146
def merge(self, other):
147-
last = self.checkpoint.last
147+
last = self.checkpoint
148148
self.last_update_timestamp = get_latest_timestamp(
149149
self.last_update_timestamp, other.last_update_timestamp
150150
)
151151
if self.last_update_timestamp == other.last_update_timestamp:
152-
last = other.checkpoint.last
152+
last = other.checkpoint
153153
self.checkpoint = last
154154

155155

opentelemetry-sdk/tests/metrics/export/test_export.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
MetricRecord,
2525
)
2626
from opentelemetry.sdk.metrics.export.aggregate import (
27+
LastValueAggregator,
2728
MinMaxSumCountAggregator,
2829
SumAggregator,
2930
ValueObserverAggregator,
@@ -610,6 +611,95 @@ def test_merge_with_empty(self):
610611
self.assertEqual(observer1.checkpoint, checkpoint1)
611612

612613

614+
class TestLastValueAggregator(unittest.TestCase):
615+
@mock.patch("opentelemetry.sdk.metrics.export.aggregate.time_ns")
616+
def test_update(self, time_mock):
617+
time_mock.return_value = 123
618+
observer = LastValueAggregator()
619+
# test current values without any update
620+
self.assertIsNone(observer.current)
621+
622+
# call update with some values
623+
values = (3, 50, 3, 97, 27)
624+
for val in values:
625+
observer.update(val)
626+
627+
self.assertEqual(observer.last_update_timestamp, 123)
628+
self.assertEqual(observer.current, values[-1])
629+
630+
def test_checkpoint(self):
631+
observer = LastValueAggregator()
632+
633+
# take checkpoint without any update
634+
observer.take_checkpoint()
635+
self.assertEqual(observer.checkpoint, None)
636+
637+
# call update with some values
638+
values = (3, 50, 3, 97)
639+
for val in values:
640+
observer.update(val)
641+
642+
observer.take_checkpoint()
643+
self.assertEqual(observer.checkpoint, 97)
644+
645+
def test_merge(self):
646+
observer1 = LastValueAggregator()
647+
observer2 = LastValueAggregator()
648+
649+
observer1.checkpoint = 23
650+
observer2.checkpoint = 47
651+
652+
observer1.last_update_timestamp = 100
653+
observer2.last_update_timestamp = 123
654+
655+
observer1.merge(observer2)
656+
657+
self.assertEqual(observer1.checkpoint, 47)
658+
self.assertEqual(observer1.last_update_timestamp, 123)
659+
660+
def test_merge_last_updated(self):
661+
observer1 = LastValueAggregator()
662+
observer2 = LastValueAggregator()
663+
664+
observer1.checkpoint = 23
665+
observer2.checkpoint = 47
666+
667+
observer1.last_update_timestamp = 123
668+
observer2.last_update_timestamp = 100
669+
670+
observer1.merge(observer2)
671+
672+
self.assertEqual(observer1.checkpoint, 23)
673+
self.assertEqual(observer1.last_update_timestamp, 123)
674+
675+
def test_merge_last_updated_none(self):
676+
observer1 = LastValueAggregator()
677+
observer2 = LastValueAggregator()
678+
679+
observer1.checkpoint = 23
680+
observer2.checkpoint = 47
681+
682+
observer1.last_update_timestamp = None
683+
observer2.last_update_timestamp = 100
684+
685+
observer1.merge(observer2)
686+
687+
self.assertEqual(observer1.checkpoint, 47)
688+
self.assertEqual(observer1.last_update_timestamp, 100)
689+
690+
def test_merge_with_empty(self):
691+
observer1 = LastValueAggregator()
692+
observer2 = LastValueAggregator()
693+
694+
observer1.checkpoint = 23
695+
observer1.last_update_timestamp = 100
696+
697+
observer1.merge(observer2)
698+
699+
self.assertEqual(observer1.checkpoint, 23)
700+
self.assertEqual(observer1.last_update_timestamp, 100)
701+
702+
613703
class TestController(unittest.TestCase):
614704
def test_push_controller(self):
615705
meter = mock.Mock()

0 commit comments

Comments
 (0)