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

1import asyncio 

2 

3import psutil 

4 

5from qdrant_loader.utils.logging import LoggingConfig 

6 

7logger = LoggingConfig.get_logger(__name__) 

8 

9 

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 

38 

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)