Мониторинг в реальном времени
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
}