Начало работы

Thresholds — SLO-пороги

Прогон падает, если задержка или доля ошибок нарушила SLO — шаг std/thresholds@v1 в after-блоке, k6-выражения, exit-коды для CI

Thresholds превращают нагрузочный тест в SLO-порог: после всех итераций движок вычисляет выражения по агрегированным метрикам прогона и валит прогон при нарушении. В CI это ненулевой exit-код — пайплайн краснеет ровно тогда, когда сервис стал медленнее, а не когда кто-то прочитал отчёт.

1. Объявите порог

Пороги — это шаг в after:-блоке сценария:

config:
  vus: 10
  duration: 1m
steps:
  - name: query
    use: std/db-query@v1
    with:
      id: ${{ conn.id }}
      query: SELECT * FROM orders WHERE created > $1
      params: ["2026-01-01"]
after:
  - name: slo gate
    use: std/thresholds@v1
    with:
      db_query_duration: ["p95<500", "max<2000"]
      db_query_failed: ["rate<0.05"]
      db_errors: ["count==0"]
    severity: fail
    message: "checkout SLO"

Выражения — строки в стиле k6: <агрегация><оператор><число>.

  • Агрегации: avg, min, max, p50, p90, p95, p99, count, rate.
  • Операторы: <, <=, >, >=, ==, !=.
  • Метрики длительностей (http_req_duration, ws_msg_rtt, grpc_req_duration, db_connect_duration, db_query_duration, …) поддерживают перцентили и среднее. Метрики ошибок (*_failed) поддерживают rate — доля упавших вызовов шага от всех его вызовов. Счётчики (db_errors) поддерживают count.

2. Статус, сообщение, exit-код

  • severity: fail (по умолчанию) — нарушенный порог ставит статус fail, и CLI завершается с кодом 1 (error: thresholds failed: …).
  • severity: warn / info — нарушение записывается и показывается, но exit-код остаётся 0.
  • message — необязательная подпись порога (интерполируется). Движок сам собирает сводку нарушений (db_query_duration p95=612ms ≥ 500ms; …) и обрезает итог до 200 символов.

Тот же блок попадает в summary JSON прогона (--summary-export):

"thresholds": {
  "status": "fail",
  "message": "db_query_duration p95=614.40ms ≥ 500ms; checkout SLO",
  "violations": [{ "metric": "db_query_duration", "expr": "p95<500", "actual": 614.4 }]
}

На платформе страница прогона показывает карточку порогов со статусом и нарушениями, а при падении порога срабатывает webhook-событие run.threshold_failed — направьте его в чат или систему алертинга.

3. Заметки

  • Пороги читают те же агрегаты HDR-гистограммы, что и текстовая сводка, — числа в выводе прогона и числа порога совпадают.
  • Порог по несуществующей метрике валит прогон с config error — опечатка в имени не сможет «молча пропустить» ваш SLO.
  • Для точечных проверок одного ответа (а не всего прогона) используйте std/check@v1 на самом шаге — thresholds про распределение.

Дальше