feat: Implement comprehensive multi-channel notification system with templating and SSL monitoring
- Add robust notification system supporting 7+ communication channels with intelligent message templating, resource monitoring, and SSL certificate alerts. Notification Channels: (Telegram, Discord, Slack, Signal, Email, Google Chat, Webhooks). - This notification system provides enterprise-grade alerting capabilities with extensive customization options and multi-channel redundancy for critical service monitoring.
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
package monitoring
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"service-operation/notification"
|
||||
"service-operation/pocketbase"
|
||||
)
|
||||
|
||||
// NotificationMonitor handles notification logic for the monitoring service
|
||||
type NotificationMonitor struct {
|
||||
notifier *notification.ServiceNotifier
|
||||
lastStatuses map[string]string // Track last known status for each service
|
||||
}
|
||||
|
||||
// NewNotificationMonitor creates a new notification monitor
|
||||
func NewNotificationMonitor(pbClient *pocketbase.PocketBaseClient) *NotificationMonitor {
|
||||
return &NotificationMonitor{
|
||||
notifier: notification.NewServiceNotifier(pbClient),
|
||||
lastStatuses: make(map[string]string),
|
||||
}
|
||||
}
|
||||
|
||||
// CheckAndNotify checks if notification should be sent and sends it
|
||||
func (nm *NotificationMonitor) CheckAndNotify(service pocketbase.Service, currentStatus string) {
|
||||
// Skip if no notification configured
|
||||
if service.NotificationID == "" {
|
||||
return
|
||||
}
|
||||
|
||||
// Get last known status
|
||||
lastStatus, exists := nm.lastStatuses[service.ID]
|
||||
|
||||
// Send notification if:
|
||||
// 1. This is the first check (no previous status)
|
||||
// 2. Status has changed
|
||||
// 3. Service is currently down (always notify for down status)
|
||||
shouldNotify := !exists || lastStatus != currentStatus || currentStatus == "down"
|
||||
|
||||
if shouldNotify {
|
||||
log.Printf("Sending notification for service %s: %s -> %s", service.Name, lastStatus, currentStatus)
|
||||
|
||||
// Send notification using custom method
|
||||
if err := nm.notifier.NotifyCustom(
|
||||
service.NotificationID,
|
||||
service.TemplateID,
|
||||
service.Name,
|
||||
currentStatus,
|
||||
nm.formatStatusMessage(service, currentStatus),
|
||||
); err != nil {
|
||||
log.Printf("Failed to send notification: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Update last known status
|
||||
nm.lastStatuses[service.ID] = currentStatus
|
||||
}
|
||||
|
||||
// formatStatusMessage creates a formatted message for the status change
|
||||
func (nm *NotificationMonitor) formatStatusMessage(service pocketbase.Service, status string) string {
|
||||
switch status {
|
||||
case "up":
|
||||
return "Service is now operational"
|
||||
case "down":
|
||||
return "Service is currently unavailable"
|
||||
case "warning":
|
||||
return "Service is experiencing issues"
|
||||
default:
|
||||
return "Service status has changed"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user