coder-demo / monitor.py
AhmadA82's picture
update-to-qwin3
8ca6a4f verified
import threading
import time
import psutil
from collections import deque
import logging
import os
# ===== إعداد بسيط للسجل (صامت افتراضيًا) =====
VERBOSE = os.getenv("MONITOR_VERBOSE", "0") == "1"
LOG_LEVEL = logging.INFO if VERBOSE else logging.WARNING
logger = logging.getLogger("monitor")
logger.setLevel(LOG_LEVEL)
if not logger.handlers:
sh = logging.StreamHandler()
sh.setLevel(LOG_LEVEL)
logger.addHandler(sh)
# ===== مخازن المقاييس (CPU/MEM فقط) =====
cpu_history = deque(maxlen=10)
mem_history = deque(maxlen=10)
current_metrics = {'cpu': 0.0, 'memory': 0.0}
def monitor_resources():
"""تحديث نسب CPU و Memory كل 5 ثوانٍ فقط."""
logger.debug("بدأت مراقبة CPU/MEM")
while True:
try:
# نسبة استعمال CPU للنظام كله (متوسط نصف ثانية)
cpu_percent = psutil.cpu_percent(interval=0.5)
# نسبة استعمال الذاكرة للنظام كله
mem_percent = psutil.virtual_memory().percent
# تحديث القيم الحالية والتاريخية
current_metrics['cpu'] = float(cpu_percent)
current_metrics['memory'] = float(mem_percent)
cpu_history.append(float(cpu_percent))
mem_history.append(float(mem_percent))
if VERBOSE:
logger.info(f"CPU: {cpu_percent:.1f}% | MEM: {mem_percent:.1f}%")
except Exception as e:
logger.exception(f"مشكلة في مراقبة الموارد: {e}")
time.sleep(5)
def get_current_metrics():
"""تُستخدم من مسار /metrics لإرجاع القيم للواجهة."""
return {
'cpu': current_metrics['cpu'],
'memory': current_metrics['memory'],
'cpu_history': list(cpu_history),
'mem_history': list(mem_history)
}
def start_monitoring_thread():
"""تشغيل المراقبة في خيط منفصل."""
t = threading.Thread(target=monitor_resources, daemon=True)
t.start()
logger.debug("تم تشغيل خيط مراقبة CPU/MEM")