SLO, SLI и бюджеты ошибок
Updated Jul 2026
Почему QA-архитекторам нужны основы SRE
Современные QA-архитекторы находятся на пересечении инженерии качества и инженерии надёжности. Понимание SLO, бюджетов ошибок и их операционных последствий не является опциональным на уровне архитектора. Эти концепции предоставляют количественный фреймворк для принятия решений о качестве: когда выпускать, когда останавливаться и когда инвестировать в надёжность вместо функций.
Словарь SRE
| Концепция | Определение | Пример |
|---|---|---|
| SLI (Service Level Indicator) | Количественная мера атрибута сервиса | p99 задержка API оформления заказа |
| SLO (Service Level Objective) | Целевое значение или диапазон для SLI | p99 задержка < 500 мс, 99,9% времени |
| SLA (Service Level Agreement) | Бизнес-контракт с финансовыми последствиями | 99,9% доступности или компенсация |
| Бюджет ошибок | Допустимый запас на отказы: 100% - SLO | 0,1% = ~43 минуты простоя/месяц |
Взаимосвязь между ними
SLI = The measurement (what you observe)
SLO = The target (what you commit to internally)
SLA = The contract (what you promise customers, with penalties)
Error Budget = SLO's tolerance (how much failure is acceptable)
Always: SLA <= SLO (your internal target should be stricter than your customer promise)
Выбор хороших SLI
Не все метрики подходят в качестве SLI. Лучшие SLI обладают следующими свойствами:
- Ориентированы на пользователя. Измеряйте то, что испытывают пользователи, а не то, что показывают серверы.
- Измеримы. Вы должны иметь возможность надёжно собирать данные.
- Действуемы. Когда SLI деградирует, команда может что-то с этим сделать.
Категории SLI
| Категория | Хорошие SLI | Плохие SLI |
|---|---|---|
| Доступность | Успешные запросы / общее число запросов | Аптайм сервера |
| Задержка | p99 длительность запроса | Среднее время ответа |
| Качество | Ответы с корректным содержимым / общее число ответов | Процент прохождения тестов |
| Свежесть | Данные обновлены в рамках порога / общее число запросов | Процент успешных cron-задач |
| Пропускная способность | Запросы, обслуженные с целевой частотой / общее число минут | Утилизация CPU |
Почему «аптайм сервера» — плохой SLI: Сервер может быть «работающим» (отвечать на health-check), возвращая ошибки на каждый пользовательский запрос. Аптайм измеряет инфраструктуру, а не пользовательский опыт.
Почему «среднее время ответа» — плохой SLI: Средние значения скрывают выбросы. Если 99% запросов занимают 100 мс, а 1% — 30 секунд, среднее составляет ~400 мс — что выглядит нормально, но маскирует ужасный опыт для 1% пользователей.
Определение SLO
SLO объединяет SLI с целевым значением и временным окном:
# slo-definitions.yaml
service: checkout-api
slos:
- name: availability
sli: successful_requests / total_requests
# "successful" = status code < 500 (client errors are not server failures)
target: 99.95%
window: 30d
error_budget: 0.05% # ~21.6 minutes of downtime per month
- name: latency
sli: requests_completed_under_500ms / total_requests
target: 99.0%
window: 30d
error_budget: 1.0%
# 1% of requests can exceed 500ms without breaching the SLO
- name: correctness
sli: orders_with_correct_total / total_orders
target: 99.99%
window: 30d
error_budget: 0.01%
Рекомендации по проектированию SLO
- Начните с ожиданий пользователей. Если ваши пользователи ожидают, что оформление заказа займёт менее 2 секунд, ваш SLO по задержке должен быть строже.
- Используйте перцентили, а не средние значения. SLO на p99 или p95 задержку защищают хвост распределения.
- Используйте скользящие окна. 30-дневное скользящее окно — стандарт. Календарные месяцы создают панику в конце месяца.
- Не стремитесь к 100%. SLO в 100% означает нулевую терпимость к любому отказу, что останавливает всю разработку. Даже Google нацеливается на 99,99%, а не на 100%.
- Меньше — лучше. 3-5 SLO на сервис достаточно. Слишком много SLO создают путаницу в приоритетах.
Бюджеты ошибок: ключевая идея
Бюджет ошибок — самая мощная концепция в SRE. Он превращает надёжность в измеримый ресурс, который можно расходовать:
| Целевой SLO | Бюджет ошибок (30 дней) | Эквивалент простоя |
|---|---|---|
| 99% | 1,0% | ~7,3 часа |
| 99,5% | 0,5% | ~3,6 часа |
| 99,9% | 0,1% | ~43,8 минуты |
| 99,95% | 0,05% | ~21,9 минуты |
| 99,99% | 0,01% | ~4,4 минуты |
Политика бюджета ошибок
Политика бюджета ошибок определяет, что происходит по мере его расходования:
# error-budget-policy.yaml
service: checkout-api
slos:
- name: availability
sli: successful_requests / total_requests
target: 99.95%
window: 30d
error_budget: 0.05%
- name: latency
sli: requests_under_500ms / total_requests
target: 99.0%
window: 30d
error_budget: 1.0%
policy:
budget_remaining_above_50pct:
- Deploy normally
- Run chaos experiments
- Ship new features
- Experiment with new architectures
budget_remaining_25_to_50pct:
- Reduce deployment frequency
- Pause non-critical chaos experiments
- Prioritize reliability work in sprint planning
- Review recent deployments for regressions
budget_remaining_below_25pct:
- Feature freeze for this service
- All engineering effort on reliability
- Incident review for every budget-consuming event
- Escalate to engineering leadership
budget_exhausted:
- Full deployment freeze except hotfixes
- Executive escalation
- Postmortem required for next deployment
- Consider rollback of recent changes
Почему бюджеты ошибок меняют разговор
Без бюджетов ошибок обсуждение надёжности носит конфронтационный характер:
- Продуктовая команда: «Нам нужно выпустить эту функцию.»
- Команда QA/SRE: «Она не готова. Нужно больше тестирования.»
- Результат: Бесконечные переговоры, нет объективных критериев.
С бюджетами ошибок обсуждение основано на данных:
- Продуктовая команда: «Нам нужно выпустить эту функцию.»
- Команда QA/SRE: «У нас осталось 60% бюджета ошибок. Мы можем выпустить, но нужно внимательно мониторить.»
- Результат: Объективное решение на основе измеримого риска.
Мониторинг расходования бюджета ошибок
Настройка Prometheus/Grafana
# prometheus-error-budget-recording-rules.yaml
groups:
- name: error-budget
interval: 1m
rules:
# SLI: availability (successful requests / total requests)
- record: sli:checkout:availability:5m
expr: |
sum(rate(http_requests_total{service="checkout",status!~"5.."}[5m]))
/
sum(rate(http_requests_total{service="checkout"}[5m]))
# Error budget remaining (30-day window)
- record: error_budget:checkout:availability:remaining
expr: |
1 - (
(1 - sli:checkout:availability:30d) / (1 - 0.9995)
)
# Result: 1.0 = full budget, 0.0 = budget exhausted, <0 = over budget
# Error budget burn rate
- record: error_budget:checkout:availability:burn_rate:1h
expr: |
(1 - sli:checkout:availability:1h) / (1 - 0.9995)
# Result: 1.0 = sustainable rate, >1.0 = burning faster than allowed
Практические шаги внедрения
Шаг 1: Измеряйте, прежде чем ставить цели
Перед определением SLO измеряйте текущую производительность в течение 30 дней. Ваш начальный SLO должен быть установлен на уровне или немного выше вашей текущей базовой линии — а не на уровне амбициозной цели.
Шаг 2: Начните с одного сервиса
Выберите ваш самый критичный сервис (обычно тот, который генерирует доход) и определите 2-3 SLO. Докажите, что процесс работает, прежде чем расширять.
Шаг 3: Автоматизируйте отслеживание бюджета
Ручное отслеживание бюджета ошибок не масштабируется. Используйте recording rules Prometheus или функцию SLO вашей платформы мониторинга (Datadog SLOs, Grafana SLO).
Шаг 4: Привяжите бюджет к действиям
Политика бюджета ошибок должна иметь силу. Если бюджет достигает 25% и политика говорит «заморозка функций», руководство должно обеспечить её выполнение. В противном случае вся система теряет доверие.
Шаг 5: Пересматривайте ежеквартально
SLO не являются постоянными. Пересматривайте их ежеквартально:
- Слишком жёсткие? (Постоянные заморозки функций = слишком амбициозные цели)
- Слишком мягкие? (Бюджет никогда не расходуется = цели не значимы)
- Отражают ли ожидания пользователей? (Жалобы пользователей при зелёных SLO = неверные метрики)
Распространённые ошибки
| Ошибка | Проблема | Исправление |
|---|---|---|
| SLO установлен на 100% | Нет места для любого отказа; вся разработка останавливается | Используйте 99,9% или 99,95% |
| Слишком много SLO | Команды не могут расставить приоритеты | Максимум 3-5 на сервис |
| SLO на основе инфраструктурных метрик | Не отражает пользовательский опыт | Используйте процент успешных запросов, а не CPU |
| Нет политики бюджета ошибок | SLO без последствий — это просто дашборды | Определите действия при 50%, 25% и 0% бюджета |
| Амбициозные SLO | Постоянно исчерпанный бюджет деморализует команды | Устанавливайте SLO на основе измеренной базовой линии |