class Meter(object): """ A meter metric which measures mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving average throughputs. """ def __init__(self, clock=time): super(Meter, self).__init__() self.lock = Lock() self.clock = clock self.clear() def clear(self): with self.lock: self.start_time = self.clock.time() self.counter = 0.0 self.m1rate = ExpWeightedMovingAvg(period=1, clock=self.clock) self.m5rate = ExpWeightedMovingAvg(period=5, clock=self.clock) self.m15rate = ExpWeightedMovingAvg(period=15, clock=self.clock) def get_one_minute_rate(self): return self.m1rate.get_rate() def get_five_minute_rate(self): return self.m5rate.get_rate() def get_fifteen_minute_rate(self): return self.m15rate.get_rate() def tick(self): self.m1rate.tick() self.m5rate.tick() self.m15rate.tick() def mark(self, value=1): with self.lock: self.counter += value self.m1rate.add(value) self.m5rate.add(value) self.m15rate.add(value) def get_count(self): return self.counter def get_mean_rate(self): if self.counter == 0: return 0 elapsed = self.clock.time() - self.start_time return self.counter / elapsed def _convertNsRate(self, ratePerNs): return ratePerNs
class EWMATests(TimedTestCase): def test_one_minute_EWMA_five_sec_tick(self): self.ewma = ExpWeightedMovingAvg(1, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [ 0.6, 0.22072766, 0.08120117, 0.02987224, 0.01098938, 0.00404277, 0.00148725, 0.00054713, 0.00020128, 0.00007405 ]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60) def test_five_minute_EWMA_five_sec_tick(self): self.ewma = ExpWeightedMovingAvg(5, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [ 0.6, 0.49123845, 0.40219203, 0.32928698, 0.26959738, 0.22072766, 0.18071653, 0.14795818, 0.12113791, 0.09917933 ]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60) def test_fifteen_minute_EWMA_five_sec_tick(self): self.ewma = ExpWeightedMovingAvg(15, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [ 0.6, 0.56130419, 0.52510399, 0.49123845, 0.45955700, 0.42991879, 0.40219203, 0.37625345, 0.35198773, 0.32928698 ]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60) def test_one_minute_EWMA_one_minute_tick(self): self.ewma = ExpWeightedMovingAvg(1, 60, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [ 0.6, 0.22072766, 0.08120117, 0.02987224, 0.01098938, 0.00404277, 0.00148725, 0.00054713, 0.00020128, 0.00007405 ]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60) def test_five_minute_EWMA_one_minute_tick(self): self.ewma = ExpWeightedMovingAvg(5, 60, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [ 0.6, 0.49123845, 0.40219203, 0.32928698, 0.26959738, 0.22072766, 0.18071653, 0.14795818, 0.12113791, 0.09917933 ]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60) def test_fifteen_minute_EWMA_one_minute_tick(self): self.ewma = ExpWeightedMovingAvg(15, 60, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [ 0.6, 0.56130419, 0.52510399, 0.49123845, 0.45955700, 0.42991879, 0.40219203, 0.37625345, 0.35198773, 0.32928698 ]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60)
class EWMATests(TimedTestCase): def test_one_minute_EWMA_five_sec_tick(self): self.ewma = ExpWeightedMovingAvg(1, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [0.6, 0.22072766, 0.08120117, 0.02987224, 0.01098938, 0.00404277, 0.00148725, 0.00054713, 0.00020128, 0.00007405]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60) def test_five_minute_EWMA_five_sec_tick(self): self.ewma = ExpWeightedMovingAvg(5, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [0.6, 0.49123845, 0.40219203, 0.32928698, 0.26959738, 0.22072766, 0.18071653, 0.14795818, 0.12113791, 0.09917933]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60) def test_fifteen_minute_EWMA_five_sec_tick(self): self.ewma = ExpWeightedMovingAvg(15, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [0.6, 0.56130419, 0.52510399, 0.49123845, 0.45955700, 0.42991879, 0.40219203, 0.37625345, 0.35198773, 0.32928698]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60) def test_one_minute_EWMA_one_minute_tick(self): self.ewma = ExpWeightedMovingAvg(1, 60, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [0.6, 0.22072766, 0.08120117, 0.02987224, 0.01098938, 0.00404277, 0.00148725, 0.00054713, 0.00020128, 0.00007405]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60) def test_five_minute_EWMA_one_minute_tick(self): self.ewma = ExpWeightedMovingAvg(5, 60, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [0.6, 0.49123845, 0.40219203, 0.32928698, 0.26959738, 0.22072766, 0.18071653, 0.14795818, 0.12113791, 0.09917933]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60) def test_fifteen_minute_EWMA_one_minute_tick(self): self.ewma = ExpWeightedMovingAvg(15, 60, clock=self.clock) self.ewma.add(3) self.clock.add(5) self.ewma.tick() for expected_rate in [0.6, 0.56130419, 0.52510399, 0.49123845, 0.45955700, 0.42991879, 0.40219203, 0.37625345, 0.35198773, 0.32928698]: self.assertAlmostEqual(self.ewma.get_rate(), expected_rate) self.clock.add(60)