Метрики, RED/USE, SLI/SLO/SLA и P99

О лекции

RED описывает запросы сервиса, USE — ресурсы. SLI — что меряем, SLO — цель, SLA — договор с клиентом, обычно слабее SLO. Хвост смотрят по P99, не по среднему.

Наблюдаемость и секреты observability собеседование

Метрика — число с подписями во времени. Сколько запросов. Сколько ошибок. Как долго отвечали. Без этого «медленно» и «упало» не отладить: нет знаменателя и нет сравнения с прошлой неделей.

Лог инцидента не заменяет ряд. Ряд не заменяет лог. Это разные инструменты.

RED и USE

RED — про запросы. Rate — сколько в секунду. Errors — какая доля сломалась. Duration — как долго. Для HTTP-сервиса это базовый язык.

USE — про ресурсы. Utilization — насколько заняты. Saturation — очередь, а не «CPU 70%». Errors — сбои пула, диска, железа.

  • Rate. Запросы в секунду по ручке и коду ответа.
  • Errors. Доля 5xx. Иногда ошибки бизнеса, если они в SLO.
  • Duration. Гистограмма, не одно среднее.
  • Saturation. Очередь к CPU, диску, пулу соединений. Не просто процент загрузки.

Пример. API зелёный по RED, а обработка очереди вчерашняя. Смотрите USE и лаг консьюмера. Иначе чините не то.

package metrics

var (
	reqs = prometheus.NewCounterVec(prometheus.CounterOpts{
		Name: "http_requests_total",
		Help: "HTTP-запросы",
	}, []string{"route", "code"})
	dur = prometheus.NewHistogramVec(prometheus.HistogramOpts{
		Name:    "http_request_duration_seconds",
		Help:    "Латентность золотого пути",
		Buckets: prometheus.DefBuckets,
	}, []string{"route"})
)

func observe(route, code string, seconds float64) {
	reqs.WithLabelValues(route, code).Inc()
	dur.WithLabelValues(route).Observe(seconds)
}

Счётчик запросов и гистограмма длительности. Из гистограммы считают P99.

SLI, SLO, SLA

SLI — измерение. Например: доля запросов checkout без 5xx за 30 дней. Или доля быстрее 300 мс.

SLO — цель по этому измерению. Например 99.9%. Это обещание себе.

SLA — договор с клиентом. Часто слабее, например 99.5%. Запас, чтобы не платить штраф при каждом внутреннем сбое.

Error budget = 1 − SLO. Топливо на релизы и эксперименты. Выжгли бюджет — стоп рискованным выкатам.

Пример. SLO 99.9% за месяц. Бюджет ошибок — 0.1%. Если за неделю сожгли почти весь бюджет, новые фичи не катят, пока ряд не выровняется.

Почему P99, не среднее

Среднее врёт. Девяносто девять запросов по 50 мс и один за 5 секунд. Среднее почти нормальное. Один человек ждал 5 секунд.

P99 — порог, который хуже только у 1% запросов. Вместе с P95 он показывает хвост. Хвост бьёт UX и касса. Среднее его прячет.

Лейблы в метриках держите грубыми: route, code, revision. user_id в метке убьёт Prometheus: слишком много рядов.

Пример. Canary жжёт только на новой ревизии. Общий средний график спокоен. График P99 с лейблом revision сразу показывает проблему.

Типичная ошибка

Назвать SLA внутренние 99.9%, а SLO — договор с юристом. Наоборот: SLI меряем, SLO цель, SLA внешний договор слабее. Вторая ошибка — дашборд со средним latency без гистограммы: инцидент в хвосте невидим.

На собеседовании

RED для API, USE для пулов. SLI — измерение, SLO — цель, SLA — договор. P99 потому что среднее прячет редкие медленные запросы. Error budget — сколько можно жечь на релизы.