SLI, SLO, SLA, error budget
↑ Этап 7 · Observability и эксплуатация
Зачем это на собесе
SRE-основы: как формализовать «надёжность достаточно хороша» и управлять релизами через error budget.
Определения
- SLI (Service Level Indicator) — измеряемый показатель качества сервиса с точки зрения пользователя: доля успешных запросов, доля запросов быстрее порога, свежесть данных.
- SLO (Service Level Objective) — целевое значение SLI за период: «99.9% запросов успешны за 30 дней».
- SLA (Service Level Agreement) — договорное обязательство перед клиентом (с последствиями: штрафы, компенсации), обычно мягче внутреннего SLO.
- Error budget — допустимая «доля отказов»:
1 − SLO. При SLO 99.9% за 30 дней бюджет = 0.1% ≈ 43.2 минуты недоступности.
Порядок: SLI → SLO (цель) → SLA (контракт, SLA ≤ SLO по строгости: внутренняя цель жёстче).
Доступность в «девятках»
| SLO | Допустимый простой за 30 дней | за год |
|---|---|---|
| 99% | 7 ч 12 мин | 3.65 дня |
| 99.5% | 3 ч 36 мин | 1.83 дня |
| 99.9% | 43 мин 12 с | 8 ч 46 мин |
| 99.95% | 21 мин 36 с | 4 ч 23 мин |
| 99.99% | 4 мин 19 с | 52 мин |
| 99.999% | 26 с | 5 мин |
Каждая лишняя «девятка» дороже на порядок (избыточность, автоматизация, регионы). Цель выбирается по ожиданиям пользователей и стоимости, а не «максимальной».
Выбор SLI
Хороший SLI отражает пользовательский опыт и измерим.
| Тип сервиса | SLI |
|---|---|
| Запрос-ответ (API) | Доступность: успешные / все запросы; Латентность: запросы быстрее X мс / все; Качество: ответы без деградации |
| Конвейер данных | Свежесть (время от события до результата), Корректность, Покрытие, Пропускная способность |
| Хранилище | Доступность, задержка, долговечность (доля не потерянных данных) |
| Фронтенд | Web Vitals (LCP, INP, CLS), доля сессий без JS-ошибок (crash-free) |
Формула (события): SLI = хорошие события / валидные события × 100%.
# Доступность API (успешные не 5xx) за 30 дней
sum(rate(http_requests_total{job="api", status!~"5.."}[30d])) / sum(rate(http_requests_total{job="api"}[30d]))
# Латентность: доля запросов быстрее 300 мс (из histogram)
sum(rate(http_request_duration_seconds_bucket{job="api", le="0.3"}[30d])) / sum(rate(http_request_duration_seconds_count{job="api"}[30d]))Правила: измерять как можно ближе к пользователю (на балансировщике/клиенте, а не внутри процесса); исключать шум (health checks, боты, ошибки 4xx клиента); несколько SLI на сервис (обычно 2–4); критические пользовательские пути (вход, оплата, запись на приём).
Формирование SLO
- Определить критические пользовательские сценарии (CUJ — Critical User Journeys).
- Выбрать SLI для каждого.
- Собрать историю, оценить текущий уровень; согласовать цель с продуктом/бизнесом (реалистичная, не 100%).
- Окно: скользящее 28/30 дней или календарное месяц/квартал.
- Документировать: SLI, SLO, окно, источник данных, владелец, реакция при нарушении.
- Пересматривать регулярно.
100% — неверная цель: стоимость растёт экспоненциально, зависимости (провайдеры, сети) ненадёжны, скорость изменений снижается.
Error budget и политика
Бюджет — «разрешённая порция ненадёжности», которую можно «потратить» на релизы, эксперименты, миграции.
Error budget policy (согласована командой и бизнесом):
| Состояние бюджета | Действие |
|---|---|
| Остаётся > 50% | релизы в обычном режиме, эксперименты допустимы |
| Остаётся < 25% | осторожность, усиленное ревью, канареечные релизы |
| Исчерпан | заморозка фич, фокус на надёжность (исправления, тесты, отказоустойчивость), постмортемы |
| Внешняя причина (провайдер) | фиксируется отдельно, обсуждаются риски и резервирование |
Так надёжность и скорость разработки балансируются данными, а не спорами.
# Остаток бюджета ошибок (SLO 99.9% за 30 дней)
1 - ((1 - sli_availability_30d) / (1 - 0.999))Burn rate и алертинг по SLO
Burn rate — скорость расходования бюджета: burn_rate = (доля ошибок за окно) / (1 − SLO). Burn rate 1 — бюджет закончится ровно к концу окна; 14.4 — исчерпается за 2 дня/(при 30-дн окне 1 час израсходует 2% бюджета).
Multi-window, multi-burn-rate алерты (Google SRE Workbook): быстрые и медленные сгорания с двумя окнами (короткое подтверждает, что проблема продолжается).
| Серьёзность | Burn rate | Длинное окно | Короткое окно | Бюджет за окно |
|---|---|---|---|---|
| Page (срочно) | 14.4 | 1 ч | 5 мин | 2% |
| Page | 6 | 6 ч | 30 мин | 5% |
| Ticket | 3 | 1 сут | 2 ч | 10% |
| Ticket | 1 | 3 сут | 6 ч | 10% |
- alert: ApiErrorBudgetBurnFast
expr: |
(sum(rate(http_requests_total{job="api",status=~"5.."}[1h])) / sum(rate(http_requests_total{job="api"}[1h])) > (14.4 * 0.001))
and
(sum(rate(http_requests_total{job="api",status=~"5.."}[5m])) / sum(rate(http_requests_total{job="api"}[5m])) > (14.4 * 0.001))
labels: { severity: page }
annotations: { summary: "Быстрое сгорание бюджета SLO API (99.9%)" }Инструменты: Sloth, Pyrra (генерация правил и дашбордов SLO), OpenSLO (спецификация), Grafana SLO, Nobl9, Datadog SLO.
Преимущества: алерт срабатывает, когда пользователи реально страдают и бюджет тратится, а не на каждый всплеск; меньше шума.
SLA и внешние обязательства
- SLA включает метрику, окно, исключения (плановые работы, форс-мажор, зона клиента), процедуру расчёта, компенсации (service credits);
- SLA мягче SLO (например, SLO 99.95%, SLA 99.9%);
- композитная доступность: последовательные зависимости умножаются:
0.999 × 0.999 = 0.998; параллельные (резервы) повышают:1 − (1−a)(1−b); SLA провайдеров облака — основа расчёта максимально достижимой доступности; - SLO зависимостей (внутренние сервисы) — контракты между командами.
Внедрение в организацию
- начать с 1–2 ключевых сервисов; простые SLI по доступности и латентности из существующих метрик;
- дашборд SLO (текущее значение, остаток бюджета, burn rate) виден всем;
- регулярные ревью SLO (ежемесячно/квартально): нарушения, причины, корректировка целей;
- связь с инцидентами и постмортемами: какие потратили бюджет, что улучшить;
- культура: SLO принадлежит продуктовой команде, а не только SRE; бизнес согласует цели;
- ограничения и антипаттерны: слишком много SLO, цели «как можно выше», SLI, не отражающие пользователя (CPU), игнорирование бюджета, SLO только на бумаге, алерты не связаны с SLO.
Вопросы с ответами
Чем SLI, SLO и SLA отличаются?
SLI — измеряемый показатель качества, SLO — внутренняя целевая величина этого показателя за период, SLA — договорное обязательство перед клиентом с последствиями за нарушение.
Что такое error budget и как он используется?
Допустимая доля ненадёжности
1 − SLO. Пока бюджет есть, команда может быстрее выпускать изменения; при исчерпании — замораживает фичи и занимается надёжностью.
Зачем алертить по burn rate?
Он показывает скорость расходования бюджета: срочные алерты срабатывают при быстром сгорании, тикеты — при медленном; это снижает шум и связывает алерты с реальным влиянием на пользователей.