Skip to content

Управление SLO

SLOzy предоставляет RESTful API для полного управления Service Level Objectives. Обработкой запросов занимается internal/handlers/slo.go.

Модель SLO

ПолеТипОписание
targetfloat64Целевой процент SLO (0–100), например 99.9
time_windowstringОкно оценки: 1h, 24h, 7d, 30d, 90d
metric_typestringТип метрики: availability, latency, throughput
metric_querystringPromQL запрос для расчёта метрики
team_idintИдентификатор команды-владельца SLO

CRUD операции

Создание SLO

http
POST /slos
Content-Type: application/json

{
  "name": "Доступность API",
  "target": 99.9,
  "time_window": "30d",
  "metric_type": "availability",
  "metric_query": "sum(rate(http_requests_total{status=~\"2..\"}[5m])) / sum(rate(http_requests_total[5m]))",
  "team_id": 1
}

Получение списка SLO

http
GET /slos?page=1&page_size=10

Возвращает пагинированные результаты, отсортированные по created_at DESC. Включены только активные SLO (active = true).

Получение SLO по ID

http
GET /slos/{id}

Обновление SLO

http
PATCH /slos/{id}
Content-Type: application/json

{ "target": 99.99, "time_window": "7d" }

Используется динамическое построение запроса — обновляются только переданные поля.

Удаление SLO

http
DELETE /slos/{id}

Выполняет мягкое удаление: устанавливает active = false. Данные сохраняются в таблице slo_versions для аудита.

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

Статус SLO определяется функцией determineSLOStatus() в internal/prometheus/calculator.go:

СтатусУсловие (availability)Условие (latency)
healthycurrent / target >= 0.99current <= target × 1.2
warning0.95 <= current / target < 0.99current <= target × 1.5
criticalcurrent / target < 0.95current > target × 1.5

Для метрик доступности (availability) выше — лучше. Для задержек (latency) — ниже лучше.

Error Budget и Burn Rate

Error Budget вычисляется как ((target - current) / target) × 100. Бюджет потребляется, когда фактическая производительность падает ниже целевого значения.

Burn Rate выводится из скорости потребления error budget за временное окно. При превышении настроенных порогов автоматически срабатывают оповещения.

Версионирование

Каждое изменение SLO фиксируется в таблице slo_versions:

sql
CREATE TABLE slo_versions (
    id SERIAL PRIMARY KEY,
    slo_id INT NOT NULL REFERENCES slos(id) ON DELETE CASCADE,
    diff_type VARCHAR(20) CHECK (diff_type IN ('create', 'update', 'delete')),
    changes JSONB NOT NULL,
    snapshot JSONB NOT NULL,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    created_by INT
);

JSON-патч изменений и полный снепшот SLO позволяют выполнять откат к любой предыдущей версии и формировать аудит-трейл.