|
5 | 5 | import logging |
6 | 6 | import os |
7 | 7 | import time |
| 8 | +import random |
8 | 9 | import asyncio |
9 | 10 | from datetime import datetime |
10 | 11 | from importlib import import_module |
@@ -150,7 +151,8 @@ def get_list(key: str, default: str = "") -> List[str]: |
150 | 151 |
|
151 | 152 | self.interval = get_int("interval", 15) |
152 | 153 | self.verbose = get_bool("verbose", False) |
153 | | - self.retry_count = get_int("retry_count", 3) |
| 154 | + self.retry_count = int(self.config.get("RETRY_COUNT", 3)) |
| 155 | + self.jitter_seconds = float(self.config.get("JITTER_SECONDS", 5.0)) |
154 | 156 | self.success_http_codes = [ |
155 | 157 | int(code.strip()) |
156 | 158 | for code in str(self.config.get("success_http_codes", "200")).split(",") |
@@ -483,9 +485,18 @@ async def run(self) -> None: |
483 | 485 |
|
484 | 486 | elapsed = time.time() - loop_start |
485 | 487 | remaining = max(0.0, self.interval - elapsed) |
486 | | - await asyncio.sleep(remaining) |
| 488 | + |
| 489 | + # Add jitter to prevent thundering herd |
| 490 | + jitter = random.uniform(0, self.jitter_seconds) |
| 491 | + sleep_time = remaining + jitter |
| 492 | + |
| 493 | + if self.verbose: |
| 494 | + self.logger.debug("Sleeping for %.2fs (interval: %ss, jitter: %.2fs)", sleep_time, self.interval, jitter) |
| 495 | + |
| 496 | + await asyncio.sleep(sleep_time) |
487 | 497 | except asyncio.CancelledError: |
488 | | - self.logger.info("Shutting down...") |
| 498 | + self.logger.info("Main loop cancelled") |
| 499 | + raise |
489 | 500 | except KeyboardInterrupt: |
490 | 501 | self.logger.info("Shutting down gracefully...") |
491 | 502 | finally: |
|
0 commit comments