feat: Add monitoring alerts skeleton and enhance worker with notifications
This commit is contained in:
333
docs/monitoring-alerts-implementation-report.md
Normal file
333
docs/monitoring-alerts-implementation-report.md
Normal file
@@ -0,0 +1,333 @@
|
||||
# 📊 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
|
||||
Reference in New Issue
Block a user