Tracks an exponentially-weighted moving average.
| 612 | |
| 613 | |
| 614 | class MovingAverage: |
| 615 | """Tracks an exponentially-weighted moving average.""" |
| 616 | |
| 617 | average: Optional[float] |
| 618 | |
| 619 | def __init__(self) -> None: |
| 620 | self.average = None |
| 621 | |
| 622 | def add_sample(self, sample: float) -> None: |
| 623 | if sample < 0: |
| 624 | raise ValueError(f"duration cannot be negative {sample}") |
| 625 | if self.average is None: |
| 626 | self.average = sample |
| 627 | else: |
| 628 | # The Server Selection Spec requires an exponentially weighted |
| 629 | # average with alpha = 0.2. |
| 630 | self.average = 0.8 * self.average + 0.2 * sample |
| 631 | |
| 632 | def get(self) -> Optional[float]: |
| 633 | """Get the calculated average, or None if no samples yet.""" |
| 634 | return self.average |
| 635 | |
| 636 | def reset(self) -> None: |
| 637 | self.average = None |
no outgoing calls