16 KiB
Executable file
✅ یکپارچهسازی Worker نوتیفیکیشن با سیستم Monitoring
تاریخ: 1403/09/16
🎯 هدف
یکپارچهسازی Notification Moderation Worker با سیستم Monitoring موجود تا:
- ✅ قابل مشاهده در پنل مدیر باشد
- ✅ قابل مدیریت (start/stop/restart) باشد
- ✅ آمار real-time داشته باشد
- ✅ لاگها قابل دسترسی باشند
✅ کارهای انجام شده
1. اضافه کردن به ALLOWED_SERVICES
فایل: adapters/api/v1/admin/system_services.py
ALLOWED_SERVICES = [
"hesabix-api",
"hesabix-rq-worker",
"hesabix-notification-moderation" # ✨ جدید
]
نتیجه: حالا این سرویس قابل مدیریت از طریق API است.
2. اضافه کردن متد بررسی در ServiceMonitoringService
فایل: app/services/monitoring_service.py
def check_notification_moderation_worker(self) -> Dict[str, Any]:
"""بررسی وضعیت Notification Moderation Worker"""
# بررسی systemd service
is_active = systemctl is-active hesabix-notification-moderation
# دریافت آمار از دیتابیس
- تعداد در صف (pending)
- تعداد بررسی شده امروز
- آخرین فعالیت
return {
"status": "online" | "offline",
"queue": {"pending": X, "reviewed_today": Y},
"last_activity": "ISO datetime"
}
نتیجه: وضعیت Worker به صورت real-time قابل دریافت است.
3. اضافه کردن به check_all_services
def check_all_services(self):
services = {}
# ...
services["notification_moderation"] = self.check_notification_moderation_worker() # ✨
return services
نتیجه: Worker در لیست سرویسها نمایش داده میشود.
4. اضافه کردن به Monitoring API
فایل: adapters/api/v1/admin/monitoring.py
@router.get("/services/{service_name}/status")
def get_service_status(...):
# ...
elif service_name == "notification_moderation": # ✨
status = service.check_notification_moderation_worker()
# ...
نتیجه: Endpoint مخصوص برای این Worker.
5. ایجاد Systemd Service File
فایل: deployment/systemd/hesabix-notification-moderation.service
[Unit]
Description=Hesabix Notification Moderation Worker
After=network.target mysql.service redis.service
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/ark/hesabixAPI
ExecStart=/usr/bin/python3 -m app.workers.notification_moderation_worker
Restart=always
StandardOutput=journal
[Install]
WantedBy=multi-user.target
نتیجه: Worker به عنوان systemd service قابل اجراست.
6. اضافه کردن به Background Tasks
فایل: app/main.py
@application.on_event("startup")
async def _start_background_jobs():
# ...
# Notification moderation: هر 60 ثانیه یکبار
from app.workers.notification_moderation_worker import run_worker_loop
asyncio.create_task(run_worker_loop(60)) # ✨
# ...
نتیجه: Worker به صورت خودکار با API start میشود.
📊 دو روش اجرا
روش 1: Embedded در API (پیشفرض)
Worker به صورت خودکار با API اجرا میشود:
# شروع API
systemctl start hesabix-api
# Worker هم شروع میشود (background task)
مزایا:
- راهاندازی آسانتر
- بدون نیاز به سرویس جداگانه
- مناسب برای development و small deployments
معایب:
- اگر API restart شود، Worker هم قطع میشود
- منابع مشترک
روش 2: Standalone Service (توصیه شده برای Production)
Worker به صورت مستقل اجرا میشود:
# کپی فایل service
sudo cp deployment/systemd/hesabix-notification-moderation.service /etc/systemd/system/
# فعالسازی
sudo systemctl daemon-reload
sudo systemctl enable hesabix-notification-moderation
sudo systemctl start hesabix-notification-moderation
مزایا:
- جداسازی concerns
- Scale مستقل
- Restart مستقل از API
معایب:
- نیاز به مدیریت جداگانه
🎛️ مدیریت از پنل Admin
مسیر دسترسی
/user/profile/system-settings/monitoring
امکانات پنل
┌──────────────────────────────────────────────────┐
│ 📊 وضعیت سرویسهای سیستم │
├──────────────────────────────────────────────────┤
│ │
│ 🟢 API Server [فعال] [Restart] │
│ 🟢 Database [فعال] [Details] │
│ 🟢 Redis [فعال] [Details] │
│ 🟢 RQ Workers [فعال] [Restart] │
│ 🟢 Notification Moderation [فعال] [Restart] │
│ ├─ صف در انتظار: 3 │
│ ├─ بررسی شده امروز: 45 │
│ ├─ آخرین فعالیت: 2 دقیقه پیش │
│ └─ [مشاهده لاگ] [جزئیات صف] │
│ │
└──────────────────────────────────────────────────┘
📡 API های قابل استفاده
1. دریافت وضعیت همه سرویسها
GET /api/v1/admin/monitoring/services/status
Response:
{
"data": {
"notification_moderation": {
"status": "online",
"is_active": true,
"queue": {
"pending": 3,
"reviewed_today": 45
},
"last_activity": "2025-01-06T14:30:00Z",
"service_name": "hesabix-notification-moderation",
"last_check": "2025-01-06T14:35:00Z"
}
}
}
2. دریافت وضعیت Worker
GET /api/v1/admin/monitoring/services/notification_moderation/status
3. Restart کردن Worker
POST /api/v1/admin/system-services/restart?service_name=hesabix-notification-moderation
Response:
{
"data": {
"service": "hesabix-notification-moderation",
"status": "restarted",
"is_active": true,
"message": "سرویس hesabix-notification-moderation با موفقیت restart شد"
}
}
4. دریافت لاگها
GET /api/v1/admin/system-services/logs?service_name=hesabix-notification-moderation&lines=100
🔍 مثال استفاده در Frontend
دریافت وضعیت
// در صفحه monitoring
class NotificationModerationStatus extends StatefulWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder<Map<String, dynamic>>(
future: _getWorkerStatus(),
builder: (context, snapshot) {
if (!snapshot.hasData) return CircularProgressIndicator();
final status = snapshot.data!;
final isOnline = status['status'] == 'online';
final queue = status['queue'];
return Card(
child: ListTile(
leading: Icon(
Icons.auto_awesome,
color: isOnline ? Colors.green : Colors.red,
),
title: Text('AI Moderation Worker'),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('صف در انتظار: ${queue['pending']}'),
Text('بررسی شده امروز: ${queue['reviewed_today']}'),
],
),
trailing: IconButton(
icon: Icon(Icons.refresh),
onPressed: () => _restartWorker(),
),
),
);
},
);
}
Future<Map<String, dynamic>> _getWorkerStatus() async {
final response = await apiClient.get(
'/api/v1/admin/monitoring/services/notification_moderation/status'
);
return response.data['data'];
}
Future<void> _restartWorker() async {
await apiClient.post(
'/api/v1/admin/system-services/restart?service_name=hesabix-notification-moderation'
);
// Refresh UI
setState(() {});
}
}
🔧 دستورات مفید
بررسی وضعیت
# وضعیت سرویس
sudo systemctl status hesabix-notification-moderation
# آیا فعال است؟
sudo systemctl is-active hesabix-notification-moderation
# آیا enable است؟
sudo systemctl is-enabled hesabix-notification-moderation
مدیریت سرویس
# شروع
sudo systemctl start hesabix-notification-moderation
# توقف
sudo systemctl stop hesabix-notification-moderation
# Restart
sudo systemctl restart hesabix-notification-moderation
# فعالسازی (auto-start)
sudo systemctl enable hesabix-notification-moderation
# غیرفعالسازی
sudo systemctl disable hesabix-notification-moderation
مشاهده لاگها
# لاگهای زنده
sudo journalctl -u hesabix-notification-moderation -f
# 100 خط آخر
sudo journalctl -u hesabix-notification-moderation -n 100
# لاگهای امروز
sudo journalctl -u hesabix-notification-moderation --since today
# جستجو
sudo journalctl -u hesabix-notification-moderation | grep "ERROR"
sudo journalctl -u hesabix-notification-moderation | grep "✅"
📈 Monitoring Metrics
نمایش در پنل
| Metric | توضیح | مثال |
|---|---|---|
| Status | وضعیت سرویس | online/offline |
| Is Active | آیا در systemd فعال است | true/false |
| Pending | تعداد در صف | 3 |
| Reviewed Today | بررسی شده امروز | 45 |
| Last Activity | آخرین فعالیت | 2 دقیقه پیش |
Query های مفید
-- آمار کلی صف
SELECT
status,
COUNT(*) as count
FROM notification_moderation_queue
GROUP BY status;
-- بررسیهای امروز
SELECT
ai_decision,
COUNT(*) as count
FROM notification_moderation_queue
WHERE DATE(ai_reviewed_at) = CURDATE()
GROUP BY ai_decision;
-- میانگین زمان بررسی
SELECT
AVG(TIMESTAMPDIFF(SECOND, created_at, ai_reviewed_at)) as avg_seconds
FROM notification_moderation_queue
WHERE ai_reviewed_at IS NOT NULL;
🚨 Alert ها و هشدارها
شرایط هشدار
Worker در سیستم monitoring بررسی میشود و در صورت بروز مشکل، alert ارسال میشود:
| شرط | سطح | پیام |
|---|---|---|
| Worker offline > 5 min | 🔴 Critical | Worker غیرفعال است |
| صف > 50 | 🟡 Warning | صف بررسی شلوغ است |
| آخرین فعالیت > 10 min | 🟡 Warning | Worker idle است |
🔄 سناریوهای مختلف
سناریو 1: راهاندازی اولیه (Development)
# فقط API را start کنید
cd /var/www/ark/hesabixAPI
python -m app.main
# Worker به صورت خودکار start میشود
# قابل مشاهده در monitoring panel
سناریو 2: راهاندازی Production
# نصب service
sudo cp deployment/systemd/hesabix-notification-moderation.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable hesabix-notification-moderation
sudo systemctl start hesabix-notification-moderation
# بررسی
sudo systemctl status hesabix-notification-moderation
سناریو 3: مشکل در Worker
# 1. بررسی لاگ
sudo journalctl -u hesabix-notification-moderation -n 50
# 2. Restart از پنل Admin
# یا
sudo systemctl restart hesabix-notification-moderation
# 3. بررسی دیتابیس
mysql -u root -p hesabix_db -e "SELECT * FROM notification_moderation_queue WHERE status='pending';"
📱 نمایش در Frontend
کامپوننت Monitoring
<ServiceCard
name="AI Moderation"
icon="🤖"
status={workerStatus.status}
metrics={[
{ label: "در صف", value: workerStatus.queue.pending },
{ label: "امروز", value: workerStatus.queue.reviewed_today },
{ label: "آخرین", value: formatTime(workerStatus.last_activity) }
]}
actions={[
{ label: "Restart", onClick: () => restartWorker() },
{ label: "لاگها", onClick: () => showLogs() },
{ label: "جزئیات صف", onClick: () => goToModerationQueue() }
]}
/>
🎯 مسیرهای دسترسی
در پنل مدیر
-
Monitoring Overview:
/user/profile/system-settings/monitoringنمایش کلی وضعیت Worker + آمار
-
Service Management:
/user/profile/system-settings/servicesمدیریت (start/stop/restart)
-
Moderation Queue:
/admin/notification-moderation/queueمشاهده صف بررسی
-
Service Logs:
/user/profile/system-settings/logsمشاهده لاگهای Worker
✅ Checklist یکپارچهسازی
- اضافه به
ALLOWED_SERVICES - ایجاد متد
check_notification_moderation_worker() - اضافه به
check_all_services() - اضافه به Monitoring API endpoint
- ایجاد Systemd service file
- اضافه به background tasks در
main.py - بهروزرسانی Worker با logging بهتر
- ایجاد مستندات deployment
- تست lint errors (0 خطا)
🎊 نتیجه نهایی
Worker نوتیفیکیشن حالا:
✅ قابل مشاهده در /user/profile/system-settings/monitoring
✅ قابل مدیریت (restart/stop/start) از پنل
✅ آمار real-time از صف و فعالیتها
✅ لاگهای جامع در journalctl
✅ یکپارچه با سایر سرویسها
✅ قابل اتکا با auto-restart
همه چیز در یک پنل واحد قابل مدیریت است! 🚀
📸 پیشنمایش در Monitoring Panel
┌─────────────────────────────────────────────────┐
│ Notification AI Moderation Worker │
├─────────────────────────────────────────────────┤
│ 🟢 Online │
│ │
│ 📊 آمار: │
│ • در صف: 3 قالب │
│ • بررسی شده امروز: 45 قالب │
│ • آخرین فعالیت: 2 دقیقه پیش │
│ │
│ 🎛️ عملیات: │
│ [🔄 Restart] [📋 Logs] [📊 Queue Details] │
│ │
│ 💡 نکات: │
│ • از AIService سیستم استفاده میکند │
│ • رایگان برای کسبوکارها │
│ • Auto-retry در صورت خطا │
│ │
└─────────────────────────────────────────────────┘
تکمیل شد! ✨