Уведомления
SLOzy реализует многоканальную систему оповещений через пакет internal/notifications/. Уведомления отправляются при нарушении SLO, достижении пороговых значений и восстановлении сервиса.
Архитектура
Уведомления проходят через конвейер: событие → сервис оповещений → очередь → воркеры → доставка по каналу.
SLO Burn Rate → Notification Service → Очередь → Воркеры → ДоставкаСервис (internal/notifications/service.go) управляет фоновыми воркерами, дедупликацией и повторными попытками доставки с экспоненциальной задержкой.
Каналы уведомлений
| Канал | Реализация доставки | Требуемая конфигурация |
|---|---|---|
SMTP или HTTP API (deliverViaAPI) | to, from, endpoint провайдера | |
| Slack | Webhook Slack с rich attachments | webhook_url |
| Telegram | Bot API (sendMessage) | bot_token, chat_id |
| Mattermost | Incoming Webhook | webhook_url, опционально username, channel |
| Webhook | HTTP POST на произвольный endpoint | webhook_url, опционально headers |
Подробная инструкция по созданию и настройке каналов: Настройка каналов уведомлений.
Каждый канал реализует интерфейс ChannelDelivery:
type ChannelDelivery interface {
Deliver(ctx context.Context, notification *Notification, config map[string]string) error
Validate(config map[string]string) error
GetName() string
}Правила оповещений
Правила определяют, при каких условиях срабатывает уведомление. Доступные типы алертов:
| Тип | Описание |
|---|---|
violation | Нарушение SLO (статус critical) |
warning | Приближение к нарушению (статус warning) |
recovery | Восстановление после нарушения |
manual | Ручной тест канала |
Приоритеты
Уведомления имеют четыре уровня приоритета:
const (
NotificationPriorityLow = "low"
NotificationPriorityMedium = "medium"
NotificationPriorityHigh = "high"
NotificationPriorityCritical = "critical"
)В Slack сообщения окрашиваются по приоритету: красный (critical), оранжевый (high), жёлтый (medium), зелёный (low).
Дедупликация
При включённой дедупликации сервис проверяет дубликаты в окне DeduplicationWindow. Ключ кэша:
notif:{slo_id}:{channel_id}:{alert_type}:{priority}Повторные попытки
При сбое доставки сервис использует экспоненциальную задержку:
func (s *Service) calculateRetryDelay(attempt int) time.Duration {
delay := float64(baseDelay) * math.Pow(backoffMultiplier, float64(attempt))
return min(delay, 5 * time.Minute)
}Параметры конфигурации: MaxRetries, RetryDelay, RetryBackoffMultiplier. Максимальная задержка — 5 минут.
Планирование по времени
Правила можно привязывать к временному расписанию. Например, уведомления высокой критичности можно направлять в PagerDuty-подобный webhook в рабочее время, а в нерабочее — только в Slack. Расписание задаётся в формате cron.
Конфигурация сервиса
type NotificationConfig struct {
MaxRetries int
RetryDelay time.Duration
RetryBackoffMultiplier float64
AsyncQueueSize int
EnableAsyncDelivery bool
DeliveryTimeout time.Duration
EnableDeduplication bool
DeduplicationWindow time.Duration
}CLI: тестирование канала
curl -X POST /api/v1/notifications/test \
-H "Content-Type: application/json" \
-d '{
"channel": "slack",
"priority": "high",
"message": "Тестовое уведомление SLOzy"
}'