Skip to content

Уведомления

SLOzy реализует многоканальную систему оповещений через пакет internal/notifications/. Уведомления отправляются при нарушении SLO, достижении пороговых значений и восстановлении сервиса.

Архитектура

Уведомления проходят через конвейер: событие → сервис оповещений → очередь → воркеры → доставка по каналу.

SLO Burn Rate → Notification Service → Очередь → Воркеры → Доставка

Сервис (internal/notifications/service.go) управляет фоновыми воркерами, дедупликацией и повторными попытками доставки с экспоненциальной задержкой.

Каналы уведомлений

КаналРеализация доставкиТребуемая конфигурация
EmailSMTP или HTTP API (deliverViaAPI)to, from, endpoint провайдера
SlackWebhook Slack с rich attachmentswebhook_url
TelegramBot API (sendMessage)bot_token, chat_id
MattermostIncoming Webhookwebhook_url, опционально username, channel
WebhookHTTP POST на произвольный endpointwebhook_url, опционально headers

Подробная инструкция по созданию и настройке каналов: Настройка каналов уведомлений.

Каждый канал реализует интерфейс ChannelDelivery:

go
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Ручной тест канала

Приоритеты

Уведомления имеют четыре уровня приоритета:

go
const (
    NotificationPriorityLow      = "low"
    NotificationPriorityMedium   = "medium"
    NotificationPriorityHigh     = "high"
    NotificationPriorityCritical = "critical"
)

В Slack сообщения окрашиваются по приоритету: красный (critical), оранжевый (high), жёлтый (medium), зелёный (low).

Дедупликация

При включённой дедупликации сервис проверяет дубликаты в окне DeduplicationWindow. Ключ кэша:

notif:{slo_id}:{channel_id}:{alert_type}:{priority}

Повторные попытки

При сбое доставки сервис использует экспоненциальную задержку:

go
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.

Конфигурация сервиса

go
type NotificationConfig struct {
    MaxRetries            int
    RetryDelay            time.Duration
    RetryBackoffMultiplier float64
    AsyncQueueSize        int
    EnableAsyncDelivery   bool
    DeliveryTimeout       time.Duration
    EnableDeduplication   bool
    DeduplicationWindow   time.Duration
}

CLI: тестирование канала

bash
curl -X POST /api/v1/notifications/test \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "slack",
    "priority": "high",
    "message": "Тестовое уведомление SLOzy"
  }'