We use cookies to understand how the site is used and to display ads. Analytics and advertising only run after you accept. You can change your choice anytime. Privacy policy

Skip to content
devvkit
$devvkit learn --librarie k6-guide

k6 Guide

[load-testing][performance][javascript][grafana]
Performance & Profiling
Install
# macOS
brew install k6
# Windows
winget install k6
# Linux
sudo apt install k6  # or download from grafana.com

k6 is built for developers who write tests in JavaScript/TypeScript. Unlike GUI load testers, your test scripts live in version control, run in CI, and produce metrics (requests/s, latency p95/p99, error rate) that feed into Grafana dashboards.

Virtual users (VUs) execute your script concurrently. Use `__VU` and `__ITER` built-in variables to vary behavior per user. The `check()` API asserts responses, `trend()` tracks custom timings, and `thresholds()` automatically fail the test if SLAs are breached.

k6 outputs real-time metrics to stdout, JSON, or Prometheus. Combine with Grafana Cloud or `k6 new` to scaffold tests. GUI alternatives: Grafana k6 Cloud UI, Postman collection runner, or Apache JMeter for non-developers.

Setup

Run test· Execute a k6 script.
k6 run script.js
k6 run --vus 10 --duration 30s script.js
k6 run --vus 100 --duration 5m --rps 500 script.js

Scripting

Basic script· GET request load test.
import http from 'k6/http'
import { sleep } from 'k6'

export default function () {
  const res = http.get('https://api.example.com/users')
  sleep(1)
}
Stages ramp· Gradually ramp VUs.
export const options = {
  stages: [
    { duration: '30s', target: 20 },   // Ramp up
    { duration: '1m', target: 20 },    // Stay
    { duration: '30s', target: 0 },    // Ramp down
  ],
}

Checks & Thresholds

Checks· Assert response quality.
import { check } from 'k6'

const res = http.get('https://api.example.com/users')
check(res, {
  'status is 200': (r) => r.status === 200,
  'response time < 200ms': (r) => r.timings.duration < 200,
  'body has users': (r) => r.body.includes('users'),
})
Thresholds· Fail test on SLA breach.
export const options = {
  thresholds: {
    http_req_duration: ['p(95)<500'],      // 95% under 500ms
    http_req_failed: ['rate<0.01'],          // <1% errors
    'checks{type:login}': ['rate>0.95'],    // login check passes
  },
}

Scenarios

Scenarios· Multiple load patterns.
export const options = {
  scenarios: {
    smoke: { executor: 'constant-vus', vus: 1, duration: '1m' },
    load: {
      executor: 'ramping-arrival-rate',
      preAllocatedVUs: 50,
      startRate: 10,
      stages: [
        { duration: '2m', target: 100 },
        { duration: '5m', target: 100 },
      ],
    },
  },
}

CI Integration

CI integration· Fail pipeline on thresholds.
k6 run --out json=results.json script.js
# Parse results, fail if thresholds breached
k6 run --summary-trend-stats="avg,p(95),p(99)" script.js
# GitHub Actions:
# - run: k6 run script.js
#   env:
#     K6_OUT: cloud  # stream to Grafana Cloud

Advanced

Custom metrics· Track business KPIs.
import { Trend, Rate } from 'k6/metrics'

const loginDuration = new Trend('login_duration')
const loginFailRate = new Rate('login_fail_rate')

export default function () {
  const res = http.post('https://api.example.com/login', { email: 'a@b.com', pass: 'x' })
  loginDuration.add(res.timings.duration)
  loginFailRate.add(res.status !== 200)
}