Documentation Index Fetch the complete documentation index at: https://mintlify.com/grafana/k6/llms.txt
Use this file to discover all available pages before exploring further.
Test Options
Options control how k6 executes your test, including the number of VUs, test duration, thresholds, and more. Options can be set in multiple ways with a clear precedence order.
Setting Options
Options can be defined in three ways (in order of precedence):
Command-line flags - Highest priority
Environment variables
Script options - Lowest priority
Script Options
Command Line
Environment Variables
export let options = {
vus: 10 ,
duration: '30s' ,
thresholds: {
http_req_duration: [ 'p(95)<500' ],
},
};
export default function () {
// Test logic
}
Basic Execution Options
Virtual Users and Duration
The simplest way to configure a test:
export let options = {
vus: 10 , // Number of virtual users
duration: '30s' , // Test duration
};
Iterations
Run a specific number of iterations instead of time-based:
export let options = {
vus: 10 ,
iterations: 100 , // Total iterations shared across all VUs
};
With 10 VUs and 100 iterations, each VU will execute approximately 10 iterations.
Stages (Ramping)
Gradually ramp VUs up and down:
export let options = {
stages: [
{ duration: '10s' , target: 5 }, // Ramp up to 5 VUs
{ duration: '5s' , target: 5 }, // Stay at 5 VUs
{ duration: '5s' , target: 0 }, // Ramp down to 0 VUs
],
};
export default function () {
let res = http . get ( 'http://httpbin.org/' );
check ( res , { 'status is 200' : ( r ) => r . status === 200 });
}
This creates an up-flat-down ramping profile:
VUs
5│ ┌─────┐
4│ / \
3│ / \
2│ / \
1│ / \
0└──────────────────
0s 10s 15s 20s
Thresholds
Thresholds define pass/fail criteria for your test. If a threshold fails, k6 exits with a non-zero status code.
import http from 'k6/http' ;
import { check } from 'k6' ;
export let options = {
thresholds: {
// 95th percentile response time < 500ms
http_req_duration: [ 'p(95)<500' ],
// Max response time < 1s
'http_req_duration{name:http://httpbin.org/post}' : [ 'max<1000' ],
// 99% of requests successful
http_req_failed: [ 'rate<0.01' ],
// 90% of checks pass
checks: [ 'rate>0.9' ],
// Multiple conditions (all must pass)
http_req_duration: [
'p(95)<500' ,
'p(99)<1000' ,
'avg<300' ,
],
},
};
export default function () {
http . get ( 'http://httpbin.org/' );
http . post ( 'http://httpbin.org/post' , { data: 'some data' });
}
Threshold Expressions
Common threshold expressions:
Expression Description p(95)<50095th percentile < 500ms avg<200Average < 200ms min>100Minimum > 100ms max<1000Maximum < 1000ms med<250Median < 250ms rate>0.9Success rate > 90% count>1000Total count > 1000
Thresholds cause the test to fail when exceeded, unlike checks which only record pass/fail without affecting the test outcome.
HTTP Options
Request Limits
export let options = {
rps: 100 , // Limit to 100 requests per second
maxRedirects: 5 , // Follow up to 5 redirects
batch: 10 , // Max parallel requests in batch()
batchPerHost: 5 , // Max parallel requests per host
};
TLS/SSL Configuration
export let options = {
insecureSkipTLSVerify: true , // Skip TLS verification
tlsVersion: {
min: 'tls1.2' ,
max: 'tls1.3' ,
},
tlsCipherSuites: [
'TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256' ,
'TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384' ,
],
};
User Agent and Headers
export let options = {
userAgent: 'k6-load-test/1.0' ,
noConnectionReuse: false , // Reuse connections
noVUConnectionReuse: false , // Reuse connections across iterations
};
Timeouts
export let options = {
setupTimeout: '60s' , // Timeout for setup() function
teardownTimeout: '60s' , // Timeout for teardown() function
noSetup: false , // Skip setup() function
noTeardown: false , // Skip teardown() function
};
Apply tags to all metrics in the test:
export let options = {
tags: {
environment: 'staging' ,
team: 'backend' ,
version: 'v1.2.3' ,
},
};
Control which system tags are included with metrics:
export let options = {
systemTags: [
'status' ,
'method' ,
'url' ,
'name' ,
'group' ,
'check' ,
'error' ,
'error_code' ,
'tls_version' ,
'scenario' ,
'service' ,
],
};
DNS Configuration
export let options = {
dns: {
ttl: '5m' , // DNS cache TTL
select: 'random' , // IP selection: 'first', 'random', 'roundRobin'
policy: 'preferIPv4' , // 'preferIPv4', 'preferIPv6', 'onlyIPv4', 'onlyIPv6', 'any'
},
};
Hosts Override
Map hostnames to IPs:
export let options = {
hosts: {
'quickpizza.grafana.com' : '1.2.3.4' ,
'api.example.com' : '5.6.7.8' ,
},
};
Blocked Hostnames
Prevent requests to specific hosts:
export let options = {
blockHostnames: [
'*.google-analytics.com' ,
'analytics.example.com' ,
],
};
Blacklist IPs
Block requests to specific IP ranges:
export let options = {
blacklistIPs: [
'10.0.0.0/8' ,
'192.168.0.0/16' ,
],
};
Discard Response Bodies
Save memory by discarding response bodies:
export let options = {
discardResponseBodies: true , // Don't save response bodies
};
export default function () {
let res = http . get ( 'https://quickpizza.grafana.com' );
// res.body will be null when discardResponseBodies is true
// Override per-request
res = http . get ( 'https://quickpizza.grafana.com' , {
responseType: 'text' // Force saving this response
});
}
Summary Configuration
export let options = {
summaryTrendStats: [ 'avg' , 'min' , 'med' , 'max' , 'p(90)' , 'p(95)' , 'p(99)' ],
summaryTimeUnit: 'ms' , // Time unit for summary: 's', 'ms', 'us'
};
Paused Mode
Start test in paused state:
export let options = {
paused: true , // Start paused, resume with API or UI
};
Minimum Iteration Duration
Enforce a minimum time per iteration:
export let options = {
minIterationDuration: '10s' , // Each iteration takes at least 10s
};
Cookie Behavior
export let options = {
noCookiesReset: true , // Don't reset cookies between iterations
};
Complete Example
Here’s a comprehensive example combining multiple options:
import http from 'k6/http' ;
import { check , sleep } from 'k6' ;
export let options = {
// Execution
stages: [
{ duration: '30s' , target: 20 },
{ duration: '1m' , target: 20 },
{ duration: '30s' , target: 0 },
],
// Thresholds
thresholds: {
http_req_duration: [ 'p(95)<500' , 'p(99)<1000' ],
http_req_failed: [ 'rate<0.01' ],
checks: [ 'rate>0.95' ],
},
// HTTP
userAgent: 'k6-load-test/1.0' ,
maxRedirects: 5 ,
insecureSkipTLSVerify: true ,
batch: 10 ,
batchPerHost: 5 ,
// Tags
tags: {
environment: 'production' ,
team: 'platform' ,
},
// Timeouts
setupTimeout: '60s' ,
teardownTimeout: '60s' ,
// Summary
summaryTrendStats: [ 'avg' , 'min' , 'med' , 'max' , 'p(90)' , 'p(95)' , 'p(99)' ],
};
export function setup () {
// Setup code
return { timestamp: Date . now () };
}
export default function ( data ) {
let res = http . get ( 'https://quickpizza.grafana.com' );
check ( res , {
'status is 200' : ( r ) => r . status === 200 ,
'response time < 500ms' : ( r ) => r . timings . duration < 500 ,
});
sleep ( 1 );
}
export function teardown ( data ) {
console . log ( `Test ran for ${ Date . now () - data . timestamp } ms` );
}
Options Reference Table
Option Type Default Description vusinteger 1 Number of virtual users durationstring - Test duration (e.g., ’30s’, ‘5m’) iterationsinteger - Total iterations to execute stagesarray - Ramping configuration scenariosobject - Advanced execution scenarios pausedboolean false Start test in paused state setupTimeoutstring 10s Setup function timeout teardownTimeoutstring 10s Teardown function timeout rpsinteger 0 Max requests per second (0=unlimited) maxRedirectsinteger 10 Max HTTP redirects to follow userAgentstring k6/… User-Agent header batchinteger 20 Max parallel batch requests batchPerHostinteger 6 Max parallel requests per host insecureSkipTLSVerifyboolean false Skip TLS certificate verification throwboolean false Throw errors instead of logging thresholdsobject - Pass/fail criteria tagsobject - Tags for all metrics systemTagsarray […] System tags to collect summaryTrendStatsarray […] Stats to show in summary discardResponseBodiesboolean false Discard HTTP response bodies noConnectionReuseboolean false Disable HTTP keep-alive noVUConnectionReuseboolean false Close connections between iterations minIterationDurationstring - Minimum iteration duration noCookiesResetboolean false Don’t reset cookies per iteration
Next Steps