senior
Что такое SLO, SLI и SLA?
SLA, SLO, SLI — три уровня определения и измерения надёжности сервиса, введённые Google в рамках практик Site Reliability Engineering (SRE).
- SLA (Service Level Agreement) — юридическое соглашение с клиентом, определяющее минимальный уровень качества и компенсации при нарушении.
- SLO (Service Level Objective) — внутренняя цель команды по надёжности, строже SLA, без юридических последствий.
- SLI (Service Level Indicator) — конкретная метрика, показывающая текущий уровень качества.
Пример
SLI (что измеряем) → SLO (какую цель ставим) → SLA (что обещаем клиенту)
SLI: availability = 99.97%
SLO: availability >= 99.95% -- SLO выполняется
SLA: availability >= 99.9% -- SLA выполняется
Error Budget (бюджет ошибок)
Error budget = 100% - SLO. Это «допустимый» объём ошибок или простоя.
| SLO | Error Budget/месяц | Допустимый downtime/месяц |
|---|---|---|
| 99% | 1% | 7 часов 18 минут |
| 99.9% | 0.1% | 43 минуты 50 секунд |
| 99.95% | 0.05% | 21 минута 55 секунд |
| 99.99% | 0.01% | 4 минуты 23 секунды |
| 99.999% | 0.001% | 26 секунд |
Как использовать error budget:
- Пока error budget > 0: можно деплоить новые фичи, проводить эксперименты
- Error budget исчерпан: замораживаем фичи, фокусируемся на надёжности
- Error budget сгорает слишком быстро: алерт (burn rate alert)
Типичные SLI
| SLI | Формула | Для чего |
|---|---|---|
| Availability | success_requests / total_requests |
Доступность сервиса |
| Latency | requests_within_threshold / total_requests |
Скорость ответа |
| Throughput | successful_operations / time_period |
Пропускная способность |
| Error Rate | error_requests / total_requests |
Частота ошибок |
| Freshness | data_age < threshold |
Актуальность данных |
| Correctness | correct_responses / total_responses |
Корректность ответов |
Реализация SLI/SLO с Prometheus (recording + alert rules)
# recording_rules.yml — предвычисление SLI
groups:
- name: sli_rules
rules:
# SLI: Availability (доля успешных запросов)
- record: sli:availability:ratio_rate5m
expr: |
sum(rate(http_server_requests_seconds_count{status!~"5..", job="order-service"}[5m]))
/
sum(rate(http_server_requests_seconds_count{job="order-service"}[5m]))
# SLI: Latency (доля запросов быстрее 500ms)
- record: sli:latency:ratio_rate5m
expr: |
sum(rate(http_server_requests_seconds_bucket{le="0.5", job="order-service"}[5m]))
/
sum(rate(http_server_requests_seconds_count{job="order-service"}[5m]))
# Error budget consumed (за последние 30 дней)
- record: slo:error_budget:consumed_ratio_30d
expr: |
1 - (
(1 - sli:availability:ratio_rate5m)
/
(1 - 0.999)
)
# alert_rules.yml — алерты на burn rate
groups:
- name: slo_alerts
rules:
# Быстрое сгорание error budget (бюджет закончится за ~2 дня)
- alert: ErrorBudgetFastBurn
expr: |
(
1 - (
sum(rate(http_server_requests_seconds_count{status!~"5..", job="order-service"}[1h]))
/
sum(rate(http_server_requests_seconds_count{job="order-service"}[1h]))
)
)
/
(1 - 0.999) > 14.4
for: 2m
labels:
severity: critical
annotations:
summary: "Error budget burning fast — exhaustion in ~2 hours"
# Медленное сгорание (бюджет закончится за ~5 дней)
- alert: ErrorBudgetSlowBurn
expr: |
(
1 - (
sum(rate(http_server_requests_seconds_count{status!~"5..", job="order-service"}[6h]))
/
sum(rate(http_server_requests_seconds_count{job="order-service"}[6h]))
)
)
/
(1 - 0.999) > 6
for: 30m
labels:
severity: warning
annotations:
summary: "Error budget burning slowly — exhaustion in ~5 days"
Grafana Dashboard для SLO
Пример
# Текущая availability (SLI)
sli:availability:ratio_rate5m{job="order-service"}
# Error budget оставшийся (%)
(1 - (1 - sli:availability:ratio_rate5m) / (1 - 0.999)) * 100
Пример SLO-документа для сервиса
Пример
Сервис: Order Service
Владелец: Team Orders
SLO 1: Availability
SLI: доля HTTP-запросов с кодом != 5xx
Target: 99.9% за 30-дневное окно
Error budget: 0.1% (~43 мин downtime)
SLO 2: Latency
SLI: доля HTTP-запросов с latency < 500ms
Target: 99% за 30-дневное окно
Error budget: 1% запросов могут быть медленнее
Действия при исчерпании error budget:
1. Заморозка нестабильных деплоев
2. Приоритет задачам надёжности
3. Post-mortem для крупных инцидентов
Важное
- SLO должен быть не 100%: 100% SLO невозможен и блокирует любые изменения. «Достаточно надёжный» — правильный подход.
- SLO определяет SLA: SLO всегда строже SLA. Если SLO нарушен, команда реагирует до нарушения SLA.
- Error budget — инструмент баланса: между скоростью разработки (новые фичи) и надёжностью.
- SLI должен отражать пользовательский опыт: не «CPU < 80%», а «99% запросов отвечают за < 500ms».
Частые ошибки
- SLO = SLA: если SLO равен SLA, нет запаса — любая деградация сразу нарушает соглашение.
- Слишком высокий SLO: 99.999% означает 26 секунд downtime в месяц — стоимость поддержания огромна.
- SLI не привязан к пользовательскому опыту: мониторить внутренние метрики вместо user-facing.
- Нет error budget policy: error budget определён, но нет процесса, что делать при его исчерпании.
- Один SLO на весь сервис: разные endpoint’ы имеют разную важность.
/api/paymentsи/api/health— разные SLO.
Как используется в 2026
- SLO-based alerting — стандартная практика в Google, рекомендуется в SRE Book. Prometheus + burn rate alerts.
- Grafana SLO feature — встроенная поддержка SLO в Grafana Enterprise и Cloud.
- OpenSLO — open-source стандарт для описания SLO в формате YAML.
- Sloth — инструмент для генерации Prometheus recording/alerting rules из OpenSLO-описания.
- Platform Engineering — SLO как контракт между Platform team и Product teams.
На собеседовании: чётко разграничьте SLA (юридическое), SLO (внутренняя цель), SLI (метрика). Обязательно объясните Error Budget и его роль как баланса между фичами и надёжностью. Сильный ответ включает конкретный пример: “SLI availability = 99.97%, SLO >= 99.95%, SLA >= 99.9%”. Частая ошибка — не упомянуть, что SLO не должен быть 100%.