Coverage for src/qdrant_loader/core/monitoring/resource_monitor.py: 100%
27 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-18 09:27 +0000
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-18 09:27 +0000
1import asyncio
3import psutil
5from qdrant_loader.utils.logging import LoggingConfig
7logger = LoggingConfig.get_logger(__name__)
10async def monitor_resources(
11 cpu_threshold: float = 80.0,
12 mem_threshold: float = 80.0,
13 interval: float = 5.0,
14 stop_event: asyncio.Event | None = None,
15):
16 """
17 Periodically check system CPU and memory usage and log warnings if thresholds are exceeded.
18 Args:
19 cpu_threshold: CPU usage percent threshold to trigger warning
20 mem_threshold: Memory usage percent threshold to trigger warning
21 interval: Seconds between checks
22 stop_event: Optional asyncio.Event to signal stopping
23 """
24 logger.info(
25 f"Starting resource monitor: CPU>{cpu_threshold}%, MEM>{mem_threshold}%, interval={interval}s"
26 )
27 while True:
28 if stop_event and stop_event.is_set():
29 logger.info("Resource monitor stopping (stop_event set)")
30 break
31 try:
32 if psutil:
33 cpu = psutil.cpu_percent(interval=None)
34 mem = psutil.virtual_memory().percent
35 else:
36 # Fallback: only show process memory
37 import resource
39 cpu = 0.0 # Not available
40 mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / (1024 * 1024)
41 logger.info(f"[ResourceMonitor] Process memory usage: {mem:.2f} MB")
42 if psutil:
43 logger.debug(f"[ResourceMonitor] CPU: {cpu:.1f}%, MEM: {mem:.1f}%")
44 if cpu > cpu_threshold:
45 logger.warning(f"[ResourceMonitor] High CPU usage: {cpu:.1f}%")
46 if mem > mem_threshold:
47 logger.warning(f"[ResourceMonitor] High memory usage: {mem:.1f}%")
48 except Exception as e:
49 logger.error(f"[ResourceMonitor] Error checking resources: {e}")
50 await asyncio.sleep(interval)