334 lines
8.3 KiB
Markdown
334 lines
8.3 KiB
Markdown
|
|
# 📊 Monitoring & Alerts System - Implementation Report
|
|||
|
|
|
|||
|
|
**Date**: 2025-11-30
|
|||
|
|
**Status**: ✅ Skeleton Implemented
|
|||
|
|
**Completion**: 30% (Structure ready, integrations pending)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 Overview
|
|||
|
|
|
|||
|
|
اسکلت سیستم **Monitoring & Alerts** برای پروژه CMS پیادهسازی شد. این سیستم به دو بخش اصلی تقسیم میشود:
|
|||
|
|
|
|||
|
|
1. **Alert System**: برای ارسال اعلانهای مدیریتی (Critical Errors, Warnings, Success)
|
|||
|
|
2. **User Notification System**: برای ارسال پیام به کاربران (کمیسیون، پرداخت، فعالسازی باشگاه)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📦 Files Created/Modified
|
|||
|
|
|
|||
|
|
### ✨ New Files:
|
|||
|
|
|
|||
|
|
1. **`IAlertService.cs`** (Interface)
|
|||
|
|
- `SendCriticalAlertAsync()` - برای خطاهای Critical
|
|||
|
|
- `SendWarningAlertAsync()` - برای Warning ها
|
|||
|
|
- `SendSuccessNotificationAsync()` - برای موفقیتها
|
|||
|
|
|
|||
|
|
2. **`IUserNotificationService.cs`** (Interface)
|
|||
|
|
- `SendCommissionReceivedNotificationAsync()` - اعلان دریافت کمیسیون
|
|||
|
|
- `SendClubActivationNotificationAsync()` - اعلان فعالسازی باشگاه
|
|||
|
|
- `SendPayoutErrorNotificationAsync()` - اعلان خطا در پرداخت
|
|||
|
|
|
|||
|
|
3. **`AlertService.cs`** (Implementation - Skeleton)
|
|||
|
|
- ✅ Logging به Console
|
|||
|
|
- ⏳ TODO: Sentry Integration
|
|||
|
|
- ⏳ TODO: Slack Integration
|
|||
|
|
- ⏳ TODO: Email Integration
|
|||
|
|
|
|||
|
|
4. **`UserNotificationService.cs`** (Implementation - Skeleton)
|
|||
|
|
- ✅ Logging به Console
|
|||
|
|
- ⏳ TODO: SMS Gateway Integration
|
|||
|
|
- ⏳ TODO: Email Service Integration
|
|||
|
|
- ⏳ TODO: Push Notification Integration
|
|||
|
|
|
|||
|
|
5. **`MonitoringSettings.cs`** (Configuration Model)
|
|||
|
|
- تنظیمات Sentry, Slack, Email, SMS
|
|||
|
|
- قابل تنظیم از طریق `appsettings.json`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### ✏️ Modified Files:
|
|||
|
|
|
|||
|
|
1. **`ConfigureServices.cs`**
|
|||
|
|
```csharp
|
|||
|
|
services.AddScoped<IAlertService, AlertService>();
|
|||
|
|
services.AddScoped<IUserNotificationService, UserNotificationService>();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **`WeeklyNetworkCommissionWorker.cs`**
|
|||
|
|
- ✅ Integration با `IAlertService`
|
|||
|
|
- ✅ ارسال Critical Alert در صورت خطا
|
|||
|
|
- ✅ ارسال Success Notification پس از اتمام موفق
|
|||
|
|
|
|||
|
|
3. **`appsettings.json`**
|
|||
|
|
- اضافه شدن بخش `Monitoring` با تنظیمات پیشفرض
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 Current Implementation
|
|||
|
|
|
|||
|
|
### Alert System Usage:
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// در Worker یا هر Handler دیگر:
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
// عملیات خطرناک
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
await _alertService.SendCriticalAlertAsync(
|
|||
|
|
"Operation Failed",
|
|||
|
|
"Description of what went wrong",
|
|||
|
|
ex);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Current Output:
|
|||
|
|
```
|
|||
|
|
🚨 CRITICAL ALERT: Weekly Commission Worker Failed - Worker execution abc-123 failed for week 2025-W48
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⏳ Pending Integrations (TODO)
|
|||
|
|
|
|||
|
|
### 1. Sentry Integration
|
|||
|
|
```csharp
|
|||
|
|
// در AlertService.SendCriticalAlertAsync():
|
|||
|
|
if (_settings.SentryEnabled)
|
|||
|
|
{
|
|||
|
|
SentrySdk.CaptureException(exception);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Steps**:
|
|||
|
|
- Install NuGet: `Sentry.AspNetCore`
|
|||
|
|
- Configure DSN in `appsettings.json`
|
|||
|
|
- Add to `Program.cs`: `builder.WebHost.UseSentry()`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. Slack Integration
|
|||
|
|
```csharp
|
|||
|
|
// در AlertService:
|
|||
|
|
if (_settings.SlackEnabled)
|
|||
|
|
{
|
|||
|
|
var payload = new
|
|||
|
|
{
|
|||
|
|
text = $"🚨 {title}",
|
|||
|
|
attachments = new[]
|
|||
|
|
{
|
|||
|
|
new { text = message, color = "danger" }
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
await _httpClient.PostAsJsonAsync(_settings.SlackWebhookUrl, payload);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Steps**:
|
|||
|
|
- Create Slack Incoming Webhook
|
|||
|
|
- Add URL to `appsettings.json`
|
|||
|
|
- Install NuGet: `System.Net.Http.Json`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3. Email Alerts (برای Admin)
|
|||
|
|
```csharp
|
|||
|
|
// در AlertService:
|
|||
|
|
if (_settings.EmailAlertsEnabled)
|
|||
|
|
{
|
|||
|
|
foreach (var email in _settings.AdminEmails)
|
|||
|
|
{
|
|||
|
|
await _emailService.SendAsync(
|
|||
|
|
to: email,
|
|||
|
|
subject: $"[ALERT] {title}",
|
|||
|
|
body: message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Steps**:
|
|||
|
|
- Configure SMTP settings
|
|||
|
|
- Install NuGet: `MailKit` or use existing email service
|
|||
|
|
- Add admin emails to config
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 4. SMS Notifications (برای کاربران)
|
|||
|
|
```csharp
|
|||
|
|
// در UserNotificationService.SendCommissionReceivedNotificationAsync():
|
|||
|
|
var user = await _context.Users.FindAsync(userId);
|
|||
|
|
|
|||
|
|
if (user.SmsNotifications && _settings.SmsNotificationsEnabled)
|
|||
|
|
{
|
|||
|
|
var message = $"کمیسیون شما: {amount:N0} ریال برای هفته {weekNumber} واریز شد.";
|
|||
|
|
|
|||
|
|
await _smsGateway.SendAsync(user.Mobile, message);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Steps**:
|
|||
|
|
- Choose SMS provider (Kavenegar, Ghasedak, etc.)
|
|||
|
|
- Get API Key
|
|||
|
|
- Implement `ISmsGatewayService`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 5. Retry Logic با Exponential Backoff
|
|||
|
|
```csharp
|
|||
|
|
// در Worker:
|
|||
|
|
private async Task<T> RetryWithExponentialBackoff<T>(
|
|||
|
|
Func<Task<T>> operation,
|
|||
|
|
int maxRetries = 3)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < maxRetries; i++)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
return await operation();
|
|||
|
|
}
|
|||
|
|
catch (Exception ex) when (i < maxRetries - 1)
|
|||
|
|
{
|
|||
|
|
var delay = TimeSpan.FromSeconds(Math.Pow(2, i)); // 2^i seconds
|
|||
|
|
_logger.LogWarning("Retry {Attempt}/{Max} after {Delay}s",
|
|||
|
|
i + 1, maxRetries, delay.TotalSeconds);
|
|||
|
|
await Task.Delay(delay);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 Configuration Example
|
|||
|
|
|
|||
|
|
در `appsettings.Production.json`:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"Monitoring": {
|
|||
|
|
"SentryEnabled": true,
|
|||
|
|
"SentryDsn": "https://xxxxx@sentry.io/12345",
|
|||
|
|
|
|||
|
|
"SlackEnabled": true,
|
|||
|
|
"SlackWebhookUrl": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXX",
|
|||
|
|
|
|||
|
|
"EmailAlertsEnabled": true,
|
|||
|
|
"AdminEmails": [
|
|||
|
|
"admin@foursat.ir",
|
|||
|
|
"devops@foursat.ir"
|
|||
|
|
],
|
|||
|
|
|
|||
|
|
"SmsNotificationsEnabled": true,
|
|||
|
|
"SmsApiKey": "your-kavenegar-api-key",
|
|||
|
|
"SmsGatewayUrl": "https://api.kavenegar.com/v1/{apikey}/sms/send.json"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 Testing
|
|||
|
|
|
|||
|
|
### Test 1: Alert Service
|
|||
|
|
```csharp
|
|||
|
|
var alertService = serviceProvider.GetRequiredService<IAlertService>();
|
|||
|
|
|
|||
|
|
await alertService.SendCriticalAlertAsync(
|
|||
|
|
"Test Alert",
|
|||
|
|
"This is a test critical alert");
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Expected**: Log در Console + (در Production) Sentry + Slack
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Test 2: User Notification
|
|||
|
|
```csharp
|
|||
|
|
var notificationService = serviceProvider.GetRequiredService<IUserNotificationService>();
|
|||
|
|
|
|||
|
|
await notificationService.SendCommissionReceivedNotificationAsync(
|
|||
|
|
userId: 123,
|
|||
|
|
amount: 500_000,
|
|||
|
|
weekNumber: 48);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Expected**: Log در Console + (در Production) SMS + Email
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 Integration Priority
|
|||
|
|
|
|||
|
|
| Priority | Integration | Effort | Impact |
|
|||
|
|
|----------|------------|--------|--------|
|
|||
|
|
| 🔴 High | Sentry | 1 hour | Critical error tracking |
|
|||
|
|
| 🟡 Medium | Slack | 2 hours | Real-time admin alerts |
|
|||
|
|
| 🟡 Medium | SMS (Kavenegar) | 3 hours | User notifications |
|
|||
|
|
| 🟢 Low | Email Alerts | 2 hours | Backup notification channel |
|
|||
|
|
| 🟢 Low | Retry Logic | 1 hour | Reliability improvement |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ Current Status Summary
|
|||
|
|
|
|||
|
|
### Completed (30%):
|
|||
|
|
- ✅ Interface definitions
|
|||
|
|
- ✅ Skeleton implementations with Logging
|
|||
|
|
- ✅ DI registration
|
|||
|
|
- ✅ Worker integration
|
|||
|
|
- ✅ Configuration model
|
|||
|
|
- ✅ appsettings structure
|
|||
|
|
|
|||
|
|
### Pending (70%):
|
|||
|
|
- ⏳ Sentry integration (5%)
|
|||
|
|
- ⏳ Slack webhook (10%)
|
|||
|
|
- ⏳ Email service (10%)
|
|||
|
|
- ⏳ SMS gateway (15%)
|
|||
|
|
- ⏳ Push notifications (10%)
|
|||
|
|
- ⏳ Retry logic (5%)
|
|||
|
|
- ⏳ Testing (10%)
|
|||
|
|
- ⏳ Documentation (5%)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 Next Steps
|
|||
|
|
|
|||
|
|
1. **Immediate** (در صورت نیاز):
|
|||
|
|
- Enable Sentry for error tracking
|
|||
|
|
- Setup Slack webhook for critical alerts
|
|||
|
|
|
|||
|
|
2. **Short-term** (هفته آینده):
|
|||
|
|
- Integrate SMS gateway (Kavenegar)
|
|||
|
|
- Test User notifications
|
|||
|
|
|
|||
|
|
3. **Long-term** (ماه آینده):
|
|||
|
|
- Add Email service
|
|||
|
|
- Implement Retry logic
|
|||
|
|
- Push notification service
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 Notes
|
|||
|
|
|
|||
|
|
- تمام TODO ها در کد با comment مشخص شدهاند
|
|||
|
|
- فعلاً فقط Logging فعال است
|
|||
|
|
- برای Production باید حتماً یکی از Integration ها (Sentry/Slack) فعال شود
|
|||
|
|
- SMS Gateway باید بر اساس پروژه انتخاب شود (Kavenegar, Ghasedak, etc.)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔗 Related Files
|
|||
|
|
|
|||
|
|
- **Interfaces**: `CMSMicroservice.Application/Common/Interfaces/IAlertService.cs`
|
|||
|
|
- **Implementations**: `CMSMicroservice.Infrastructure/Services/Monitoring/`
|
|||
|
|
- **Worker**: `CMSMicroservice.Infrastructure/BackgroundJobs/WeeklyNetworkCommissionWorker.cs`
|
|||
|
|
- **Config**: `CMSMicroservice.WebApi/appsettings.json`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Report generated**: 2025-11-30
|
|||
|
|
**Build Status**: ✅ Success
|
|||
|
|
**Ready for**: Development continuation / Integration implementation
|