awesome-everything EN
↑ Обратно к восхождению

Наблюдаемость

SLO и error budget: чтение PromQL и правил

Суть Читай реальные PromQL recording rules, MWMBR-выражения, latency-bucket SLI и Sloth YAML, предсказывай поведение и выбирай фикс с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Баги SLO прячутся в PromQL, а не в слайдах. Неверный bucket, захардкоженный budget rate, NaN-знаменатель — каждый тихо портит бюджет и алерт. Прочитай правило и выбери фикс, который senior сделает первым.

Цель

Потренируй чтение артефактов, из которых реально собран SLO: recording rules, burn-rate-выражения алертов, latency-bucket SLI и YAML, из которого платформа их генерирует — и находи дефект.

Сниппет 1 — page-правило по burn rate

# 99.9% SLO. Задумано: пейджить, когда burn за 1h И за 5m оба превышают 14.4x.
alert: SLOAvailabilityBurnFast
expr: |
  (1 - job:slo_availability:ratio_rate1h) > (14.4 * 0.001)
  or
  (1 - job:slo_availability:ratio_rate5m) > (14.4 * 0.001)
labels:
  severity: page
Викторина

Автор хотел MWMBR-поведение. В чём баг и что он вызывает в проде?

Сниппет 2 — latency SLI

# SLO-цель по латентности: 99% запросов под 200ms.
# Bucket-границы заданы как le: 0.1, 0.25, 0.5, 1, 2.5
latency_sli =
  sum(rate(http_request_duration_seconds_bucket{le="0.25"}[1h]))
  /
  sum(rate(http_request_duration_seconds_count[1h]))
Викторина

Порог SLO — 200ms, но ближайший bucket — le=0.25. Что не так и какой фикс?

Сниппет 3 — NaN-знаменатель

# Recording rule для низкотрафикового внутреннего сервиса.
record: job:slo_availability:ratio_rate5m
expr: |
  sum(rate(http_requests_total{status!~"5..",job="reports"}[5m]))
  /
  sum(rate(http_requests_total{job="reports"}[5m]))
# В тихое окно эта серия вычисляется в NaN.
Викторина

Отношение уходит в NaN в тихие периоды на этом низкотрафиковом сервисе. Что это значит для SLO и какой senior-фикс?

Сниппет 4 — декларация Sloth

version: "prometheus/v1"
service: checkout
slos:
  - name: availability
    objective: 99.5
    sli:
      events:
        error_query: sum(rate(http_requests_total{status=~"5..",job="checkout"}[{{.window}}]))
        total_query: sum(rate(http_requests_total{job="checkout"}[{{.window}}]))
    alerting:
      page_alert:   { labels: { severity: page } }
      ticket_alert: { labels: { severity: ticket } }
Викторина

Коллега говорит, что это рискованно, ведь надо вручную держать шесть recording rules и три MWMBR-алерта на сервис. Почему здесь этот аргумент неверен?

Итог

Каждый дефект SLO читается в правилах: MWMBR нужен and между длинным и коротким окном (OR — это провальный Approach 4); latency SLI нужен bucket гистограммы ровно на пороге SLO, иначе он тихо просчитывается и смещает бюджет; нулевой знаменатель на низкотрафиковых сервисах даёт NaN, который не срабатывает и не сбрасывается, поэтому добавь synthetic probes плюс no-traffic алерт; а платформа вроде Sloth генерирует все шесть recording rules и три MWMBR-алерта — с budget rate, корректно пересчитанным под цель — из одного YAML, и именно поэтому рукописный PromQL — источник багов.

Продолжить восхождение ↑SLO и error budget: заинструментируй путь от начала до конца
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.