Spaces:
Running
Running
- monitor.py +28 -9
monitor.py
CHANGED
@@ -5,38 +5,55 @@ import logging
|
|
5 |
from collections import deque
|
6 |
import os
|
7 |
import tracemalloc
|
|
|
|
|
8 |
|
9 |
-
# إنشاء logger
|
10 |
logger = logging.getLogger("monitor")
|
11 |
logger.setLevel(logging.DEBUG)
|
12 |
|
13 |
-
# إعداد ملف السجل
|
14 |
base_dir = os.path.dirname(os.path.abspath(__file__))
|
15 |
log_dir = os.path.join(base_dir, "data")
|
16 |
os.makedirs(log_dir, exist_ok=True)
|
17 |
log_path = os.path.join(log_dir, "monitor.log")
|
18 |
|
19 |
-
# إعداد handler لملف السجل
|
20 |
file_handler = logging.FileHandler(log_path)
|
21 |
file_handler.setLevel(logging.DEBUG)
|
22 |
formatter = logging.Formatter("📁 [%(asctime)s] [%(levelname)s] %(message)s")
|
23 |
file_handler.setFormatter(formatter)
|
24 |
logger.addHandler(file_handler)
|
25 |
|
26 |
-
# إعداد handler للوحدة الأساسية (اختياري)
|
27 |
stream_handler = logging.StreamHandler()
|
28 |
stream_handler.setFormatter(logging.Formatter("🪵 [%(asctime)s] [%(levelname)s] %(message)s"))
|
29 |
logger.addHandler(stream_handler)
|
30 |
|
31 |
-
#
|
32 |
tracemalloc.start()
|
33 |
logger.info("🔍 بدأ تتبع الذاكرة")
|
34 |
|
35 |
-
# تخزين آخر 10 قياسات
|
36 |
cpu_history = deque(maxlen=10)
|
37 |
mem_history = deque(maxlen=10)
|
38 |
current_metrics = {'cpu': 0, 'memory': 0}
|
39 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
def monitor_resources():
|
41 |
counter = 0
|
42 |
logger.info("🔁 بدأ تشغيل مراقبة الموارد")
|
@@ -52,10 +69,11 @@ def monitor_resources():
|
|
52 |
cpu_history.append(cpu_percent)
|
53 |
mem_history.append(mem_percent)
|
54 |
|
55 |
-
logger.info(f"🧠
|
56 |
current, peak = tracemalloc.get_traced_memory()
|
57 |
-
logger.info(f"📊 tracemalloc
|
58 |
|
|
|
59 |
counter += 1
|
60 |
if counter % 12 == 0:
|
61 |
snapshot = tracemalloc.take_snapshot()
|
@@ -63,6 +81,7 @@ def monitor_resources():
|
|
63 |
logger.info("📌 أعلى 5 أسطر استهلاكًا للذاكرة:")
|
64 |
for stat in top_stats[:5]:
|
65 |
logger.info(f" {stat}")
|
|
|
66 |
|
67 |
except Exception as e:
|
68 |
logger.exception(f"❌ استثناء في مراقبة الموارد: {str(e)}")
|
@@ -80,4 +99,4 @@ def get_current_metrics():
|
|
80 |
def start_monitoring_thread():
|
81 |
thread = threading.Thread(target=monitor_resources, daemon=True)
|
82 |
thread.start()
|
83 |
-
logger.info("✅ تم بدء مراقبة الموارد في خيط منفصل")
|
|
|
5 |
from collections import deque
|
6 |
import os
|
7 |
import tracemalloc
|
8 |
+
import gc
|
9 |
+
import sys
|
10 |
|
11 |
+
# إنشاء logger
|
12 |
logger = logging.getLogger("monitor")
|
13 |
logger.setLevel(logging.DEBUG)
|
14 |
|
|
|
15 |
base_dir = os.path.dirname(os.path.abspath(__file__))
|
16 |
log_dir = os.path.join(base_dir, "data")
|
17 |
os.makedirs(log_dir, exist_ok=True)
|
18 |
log_path = os.path.join(log_dir, "monitor.log")
|
19 |
|
|
|
20 |
file_handler = logging.FileHandler(log_path)
|
21 |
file_handler.setLevel(logging.DEBUG)
|
22 |
formatter = logging.Formatter("📁 [%(asctime)s] [%(levelname)s] %(message)s")
|
23 |
file_handler.setFormatter(formatter)
|
24 |
logger.addHandler(file_handler)
|
25 |
|
|
|
26 |
stream_handler = logging.StreamHandler()
|
27 |
stream_handler.setFormatter(logging.Formatter("🪵 [%(asctime)s] [%(levelname)s] %(message)s"))
|
28 |
logger.addHandler(stream_handler)
|
29 |
|
30 |
+
# تتبع الذاكرة
|
31 |
tracemalloc.start()
|
32 |
logger.info("🔍 بدأ تتبع الذاكرة")
|
33 |
|
|
|
34 |
cpu_history = deque(maxlen=10)
|
35 |
mem_history = deque(maxlen=10)
|
36 |
current_metrics = {'cpu': 0, 'memory': 0}
|
37 |
|
38 |
+
def analyze_memory_objects():
|
39 |
+
try:
|
40 |
+
objects = gc.get_objects()
|
41 |
+
logger.info(f"📦 عدد كائنات بايثون: {len(objects)}")
|
42 |
+
sizes = {}
|
43 |
+
for obj in objects:
|
44 |
+
try:
|
45 |
+
key = type(obj).__name__
|
46 |
+
sizes[key] = sizes.get(key, 0) + sys.getsizeof(obj)
|
47 |
+
except Exception:
|
48 |
+
continue
|
49 |
+
|
50 |
+
top = sorted(sizes.items(), key=lambda x: x[1], reverse=True)[:10]
|
51 |
+
logger.info("🧮 أعلى 10 أنواع من الكائنات استهلاكًا:")
|
52 |
+
for name, size in top:
|
53 |
+
logger.info(f"🔹 {name}: {size / 1024 / 1024:.2f} MB")
|
54 |
+
except Exception as e:
|
55 |
+
logger.error(f"❌ خطأ أثناء تحليل كائنات الذاكرة: {str(e)}")
|
56 |
+
|
57 |
def monitor_resources():
|
58 |
counter = 0
|
59 |
logger.info("🔁 بدأ تشغيل مراقبة الموارد")
|
|
|
69 |
cpu_history.append(cpu_percent)
|
70 |
mem_history.append(mem_percent)
|
71 |
|
72 |
+
logger.info(f"🧠 RSS: {mem_info.rss / 1024**2:.2f} MB | VMS: {mem_info.vms / 1024**2:.2f} MB")
|
73 |
current, peak = tracemalloc.get_traced_memory()
|
74 |
+
logger.info(f"📊 tracemalloc: الحالي = {current / 1024**2:.2f} MB | الأعلى = {peak / 1024**2:.2f} MB")
|
75 |
|
76 |
+
# كل دقيقة: تحليل إضافي
|
77 |
counter += 1
|
78 |
if counter % 12 == 0:
|
79 |
snapshot = tracemalloc.take_snapshot()
|
|
|
81 |
logger.info("📌 أعلى 5 أسطر استهلاكًا للذاكرة:")
|
82 |
for stat in top_stats[:5]:
|
83 |
logger.info(f" {stat}")
|
84 |
+
analyze_memory_objects()
|
85 |
|
86 |
except Exception as e:
|
87 |
logger.exception(f"❌ استثناء في مراقبة الموارد: {str(e)}")
|
|
|
99 |
def start_monitoring_thread():
|
100 |
thread = threading.Thread(target=monitor_resources, daemon=True)
|
101 |
thread.start()
|
102 |
+
logger.info("✅ تم بدء مراقبة الموارد في خيط منفصل")
|