Really-amin commited on
Commit
6e1537c
·
verified ·
1 Parent(s): b06871c

Update background_agents.py

Browse files
Files changed (1) hide show
  1. background_agents.py +274 -0
background_agents.py ADDED
@@ -0,0 +1,274 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Background Agents for Data Collection and System Monitoring
3
+ دو agent برای جمع‌آوری داده و نظارت بر سیستم
4
+ """
5
+ import asyncio
6
+ import logging
7
+ from datetime import datetime
8
+ from typing import Dict, Any
9
+ import httpx
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+ class DataCollectionAgent:
14
+ """Agent برای جمع‌آوری دوره‌ای داده"""
15
+
16
+ def __init__(self):
17
+ self.is_running = False
18
+ self.stats = {
19
+ "total_collections": 0,
20
+ "successful_collections": 0,
21
+ "failed_collections": 0,
22
+ "last_collection": None
23
+ }
24
+ self.collected_data = {
25
+ "market": None,
26
+ "sentiment": None,
27
+ "trending": None,
28
+ "news": None
29
+ }
30
+
31
+ async def start(self):
32
+ """شروع agent"""
33
+ if self.is_running:
34
+ logger.warning("Data collection agent is already running")
35
+ return
36
+
37
+ self.is_running = True
38
+ logger.info("🤖 Data Collection Agent started")
39
+
40
+ # شروع loop جمع‌آوری
41
+ asyncio.create_task(self._collection_loop())
42
+
43
+ async def stop(self):
44
+ """توقف agent"""
45
+ self.is_running = False
46
+ logger.info("🛑 Data Collection Agent stopped")
47
+
48
+ async def _collection_loop(self):
49
+ """حلقه اصلی جمع‌آوری داده"""
50
+ while self.is_running:
51
+ try:
52
+ await self.collect_all_data()
53
+ await asyncio.sleep(300) # هر 5 دقیقه
54
+ except Exception as e:
55
+ logger.error(f"Error in collection loop: {e}")
56
+ await asyncio.sleep(60)
57
+
58
+ async def collect_all_data(self):
59
+ """جمع‌آوری تمام داده‌ها"""
60
+ self.stats["total_collections"] += 1
61
+
62
+ try:
63
+ async with httpx.AsyncClient(timeout=30.0) as client:
64
+ # جمع‌آوری موازی
65
+ tasks = [
66
+ self._collect_market_data(client),
67
+ self._collect_sentiment_data(client),
68
+ self._collect_trending_data(client),
69
+ self._collect_news_data(client)
70
+ ]
71
+
72
+ results = await asyncio.gather(*tasks, return_exceptions=True)
73
+
74
+ # بررسی نتایج
75
+ success_count = sum(1 for r in results if not isinstance(r, Exception))
76
+
77
+ if success_count > 0:
78
+ self.stats["successful_collections"] += 1
79
+ else:
80
+ self.stats["failed_collections"] += 1
81
+
82
+ self.stats["last_collection"] = datetime.utcnow().isoformat() + "Z"
83
+
84
+ logger.info(f"✅ Data collection completed: {success_count}/4 successful")
85
+
86
+ except Exception as e:
87
+ self.stats["failed_collections"] += 1
88
+ logger.error(f"Data collection failed: {e}")
89
+
90
+ async def _collect_market_data(self, client: httpx.AsyncClient):
91
+ """جمع‌آوری داده بازار"""
92
+ try:
93
+ response = await client.get("https://api.coingecko.com/api/v3/global")
94
+ if response.status_code == 200:
95
+ self.collected_data["market"] = response.json()
96
+ logger.debug("✅ Market data collected")
97
+ except Exception as e:
98
+ logger.debug(f"Failed to collect market data: {e}")
99
+ raise
100
+
101
+ async def _collect_sentiment_data(self, client: httpx.AsyncClient):
102
+ """جمع‌آوری داده sentiment"""
103
+ try:
104
+ response = await client.get("https://api.alternative.me/fng/?limit=1")
105
+ if response.status_code == 200:
106
+ self.collected_data["sentiment"] = response.json()
107
+ logger.debug("✅ Sentiment data collected")
108
+ except Exception as e:
109
+ logger.debug(f"Failed to collect sentiment data: {e}")
110
+ raise
111
+
112
+ async def _collect_trending_data(self, client: httpx.AsyncClient):
113
+ """جمع‌آوری داده trending"""
114
+ try:
115
+ response = await client.get("https://api.coingecko.com/api/v3/search/trending")
116
+ if response.status_code == 200:
117
+ self.collected_data["trending"] = response.json()
118
+ logger.debug("✅ Trending data collected")
119
+ except Exception as e:
120
+ logger.debug(f"Failed to collect trending data: {e}")
121
+ raise
122
+
123
+ async def _collect_news_data(self, client: httpx.AsyncClient):
124
+ """جمع‌آوری اخبار"""
125
+ try:
126
+ response = await client.get(
127
+ "https://cryptopanic.com/api/v1/posts/",
128
+ params={"auth_token": "free", "public": "true", "kind": "news"}
129
+ )
130
+ if response.status_code == 200:
131
+ self.collected_data["news"] = response.json()
132
+ logger.debug("✅ News data collected")
133
+ except Exception as e:
134
+ logger.debug(f"Failed to collect news data: {e}")
135
+ raise
136
+
137
+ def get_stats(self) -> Dict[str, Any]:
138
+ """دریافت آمار agent"""
139
+ return {
140
+ **self.stats,
141
+ "is_running": self.is_running,
142
+ "has_data": any(v is not None for v in self.collected_data.values())
143
+ }
144
+
145
+ def get_collected_data(self) -> Dict[str, Any]:
146
+ """دریافت داده‌های جمع‌آوری شده"""
147
+ return self.collected_data
148
+
149
+
150
+ class SystemMonitorAgent:
151
+ """Agent برای نظارت بر وضعیت سیستم"""
152
+
153
+ def __init__(self):
154
+ self.is_running = False
155
+ self.stats = {
156
+ "total_checks": 0,
157
+ "system_healthy": True,
158
+ "last_check": None,
159
+ "alerts": []
160
+ }
161
+ self.system_metrics = {
162
+ "cpu_usage": 0,
163
+ "memory_usage": 0,
164
+ "active_connections": 0,
165
+ "requests_per_minute": 0,
166
+ "error_rate": 0
167
+ }
168
+
169
+ async def start(self):
170
+ """شروع agent"""
171
+ if self.is_running:
172
+ logger.warning("System monitor agent is already running")
173
+ return
174
+
175
+ self.is_running = True
176
+ logger.info("🤖 System Monitor Agent started")
177
+
178
+ # شروع loop نظارت
179
+ asyncio.create_task(self._monitoring_loop())
180
+
181
+ async def stop(self):
182
+ """توقف agent"""
183
+ self.is_running = False
184
+ logger.info("🛑 System Monitor Agent stopped")
185
+
186
+ async def _monitoring_loop(self):
187
+ """حلقه اصلی نظارت"""
188
+ while self.is_running:
189
+ try:
190
+ await self.check_system_health()
191
+ await asyncio.sleep(60) # هر 1 دقیقه
192
+ except Exception as e:
193
+ logger.error(f"Error in monitoring loop: {e}")
194
+ await asyncio.sleep(30)
195
+
196
+ async def check_system_health(self):
197
+ """بررسی سلامت سیستم"""
198
+ self.stats["total_checks"] += 1
199
+
200
+ try:
201
+ # شبیه‌سازی metrics (در production از psutil استفاده کنید)
202
+ import random
203
+
204
+ self.system_metrics = {
205
+ "cpu_usage": random.randint(20, 60),
206
+ "memory_usage": random.randint(40, 70),
207
+ "active_connections": random.randint(1, 10),
208
+ "requests_per_minute": random.randint(50, 150),
209
+ "error_rate": random.uniform(0, 5)
210
+ }
211
+
212
+ # بررسی آستانه‌ها
213
+ alerts = []
214
+
215
+ if self.system_metrics["cpu_usage"] > 80:
216
+ alerts.append("High CPU usage detected")
217
+
218
+ if self.system_metrics["memory_usage"] > 85:
219
+ alerts.append("High memory usage detected")
220
+
221
+ if self.system_metrics["error_rate"] > 10:
222
+ alerts.append("High error rate detected")
223
+
224
+ self.stats["alerts"] = alerts
225
+ self.stats["system_healthy"] = len(alerts) == 0
226
+ self.stats["last_check"] = datetime.utcnow().isoformat() + "Z"
227
+
228
+ if alerts:
229
+ logger.warning(f"⚠️ System alerts: {', '.join(alerts)}")
230
+ else:
231
+ logger.debug("✅ System health check passed")
232
+
233
+ except Exception as e:
234
+ logger.error(f"System health check failed: {e}")
235
+ self.stats["system_healthy"] = False
236
+
237
+ def get_stats(self) -> Dict[str, Any]:
238
+ """دریافت آمار agent"""
239
+ return {
240
+ **self.stats,
241
+ "is_running": self.is_running
242
+ }
243
+
244
+ def get_metrics(self) -> Dict[str, Any]:
245
+ """دریافت metrics سیستم"""
246
+ return self.system_metrics
247
+
248
+
249
+ # Global instances
250
+ data_agent = DataCollectionAgent()
251
+ monitor_agent = SystemMonitorAgent()
252
+
253
+
254
+ async def start_agents():
255
+ """شروع تمام agents"""
256
+ await data_agent.start()
257
+ await monitor_agent.start()
258
+ logger.info("✅ All background agents started")
259
+
260
+
261
+ async def stop_agents():
262
+ """توقف تمام agents"""
263
+ await data_agent.stop()
264
+ await monitor_agent.stop()
265
+ logger.info("✅ All background agents stopped")
266
+
267
+
268
+ def get_agents_status() -> Dict[str, Any]:
269
+ """دریافت وضعیت تمام agents"""
270
+ return {
271
+ "data_collection_agent": data_agent.get_stats(),
272
+ "system_monitor_agent": monitor_agent.get_stats(),
273
+ "timestamp": datetime.utcnow().isoformat() + "Z"
274
+ }