Skip to content

Мониторинг в реальном времени

SLOzy предоставляет мониторинг в реальном времени на основе WebSocket. Система реализована в пакете internal/websocket/.

Архитектура

Клиент через WebSocket подключается к Hub — центральному маршрутизатору сообщений, который управляет регистрацией клиентов, подписками и широковещательными рассылками.

Клиент → WebSocket Upgrade → Hub (register/broadcast) → Подписанные клиенты
  • Hub (hub.go) — центральный маршрутизатор: регистрация клиентов, подписки на SLO, широковещательные рассылки.
  • Client — отдельное WebSocket-соединение с каналом отправки и картой подписок.
  • Subscription — связывает клиента с ID SLO и каналами обновлений (status, metrics).

Подключение

javascript
const ws = new WebSocket("wss://slozy.example.com/ws");

ws.onopen = () => {
  ws.send(JSON.stringify({
    type: "subscribe",
    data: { slo_id: 1, channels: ["status", "metrics"] }
  }));
};

Типы сообщений

ТипНаправлениеОписание
subscribeКлиент → СерверПодписка на обновления SLO
unsubscribeКлиент → СерверОтписка от обновлений
ping / pongДвунаправленныйKeep-alive (пинг каждые 54 с, таймаут 60 с)
metric_updateСервер → КлиентОбновление метрик SLO
status_changeСервер → КлиентИзменение статуса SLO
alertСервер → КлиентОповещение о нарушении SLO

Индикаторы статуса

Дашборд отображает три состояния для каждого SLO:

  • healthy (зелёный) — метрики в пределах нормы, error budget не исчерпан
  • warning (жёлтый) — приближение к критическому порогу, burn rate повышен
  • critical (красный) — SLO нарушен, error budget исчерпан

Расчёт статуса выполняется в internal/prometheus/calculator.go через функцию GetRealTimeMetrics():

go
calcReq := &models.SLOCalculationRequest{
    SLOID:      slo.ID,
    TimeWindow: "5m",
}

Широковещательная рассылка

go
hub.BroadcastToSLO(sloID, "metric_update", map[string]interface{}{
    "current_value":   99.92,
    "error_budget":    15.3,
    "status":          "healthy",
})

Hub отправляет обновления всем клиентам, подписанным на данный SLO.

Исторические тренды

Помимо текущих метрик, дашборды отображают исторические тренды за последние 7/30/90 дней. Данные извлекаются из PostgreSQL и кэшируются для ускорения загрузки.

Статистика Hub

Hub предоставляет метод GetStatistics():

json
{
  "connected_clients": 42,
  "total_subscriptions": 156,
  "clients_per_slo": {"1": 12, "2": 8, "3": 5},
  "message_queue_length": 3
}