Skip to content

Scenario reference

The authoritative definition is the JSON Schema; stampede validate file.yaml checks a file, and stampede validate file.yaml --dry-run -e TARGET_URL=... also runs each journey once with one user against the target and reports which ones pass. This page lists every field.

Field Type Notes
apiVersion stampede.dev/v1 default
kind Scenario default
metadata.name string lowercase letters, digits, ., _, -
metadata.description, metadata.tags string, list
target.baseURL string joined with relative paths; may use ${env.X}; on the server the run’s target replaces it
target.headers map sent with every request
target.timeout duration per request, default 30s
target.verify dns-txt | well-known
target.http.connections per-vu | shared per-user keep-alive pools (default) or one shared pool
target.http.http2 / h2c bool HTTP/2 over TLS / cleartext HTTP/2 with prior knowledge
target.http.disableKeepAlive, insecureSkipVerify bool
target.http.maxRedirects int 0 = 10, -1 = do not follow
target.http.dnsCacheTTL duration default 30s, 0s disables
target.http.tlsResumption per-vu | shared | off where TLS sessions are resumed from: each user’s own (default with per-vu connections, like separate browsers), any user’s (default with shared connections), or never
target.network {profile, rtt, jitter, loss, down, up} emulate a slower network per user; profiles slow-3g 3g 4g slow-wifi
vars map static variables
data.<name> feeder csv | json | list | range | generate | sql, mode, onExhausted
data.<name>.generate map field name to kind; a new row for every use (see test data)
data.<name>.sql {driver, dsn, query, limit} driver is postgres or mysql; dsn may use ${env.X}, ${secret.X}; rows are read when the run starts (at most 1,000,000)
journeys[] name, weight (default 1), tags, target (p50/p90/p95/p99/errors), steps
load see below
targets[] string [scope.]metric op value
observe.prometheus {url | integration, bearerToken?, queries} PromQL queries charted in the report after the run; url (may use ${env.X}) for stampede run, integration (a server integration’s name) on the server; up to 20 name: query pairs (integrations)
observe.traces {url | integration} link template containing {traceId} for the slowest requests’ traces
faults.agent {url, token} | {integration} a stampede agent’s control API; url and token (may use ${env.X}, ${secret.X}) for stampede run, an agent integration on the server (fault injection)
faults.timeline[] name, at, for, and one of proxy (latency, jitter, bandwidth, reset, refuse, blackhole), container (action: pause, stop, kill, restart) or deployment (replicas)
Field Notes
mode vus (closed), rate (open) or replay; rate: alone implies rate
replay with mode: replay: {file, format (auto, log, har), speed, limit, host, static}; journeys come from the recording (replay)
vus, rate, duration constant load
stages[] {duration, target}; target is users or a rate
shape smoke baseline stress spike soak breakpoint steps recovery wave
start, max shape levels
steps, stepDuration, cycles breakpoint/steps and wave tuning
iterations fixed total iterations shared by vus users
maxVUs open-model user cap (default 5 × peak rate, 50 to 50,000)
gracefulStop time in-flight iterations get at the end (default 30s)
abort {errors: 50%, p95: 5s, for: 10s}: stop early when either limit holds for for (default 10s)
regions {mumbai: 50%, frankfurt: 30%, virginia: 20%}: split a distributed run’s load by worker region (stampede worker --region). Shares add up to 100%; a run is refused when a region has no connected worker. In-process runs (stampede run without --cluster) ignore it. --region on stampede start and run --cluster overrides it

Units: durations 500ms 2s 1m30s 4h 2d (a bare number is seconds); rates 50/s 3000/m 100/h; percentages 1% or 0.01.

See scenarios for HTTP, think, branch, loop, while, group, if, checks and extractors, protocols for graphql, ws, sse and grpc, and plugins for plugin steps (plugin: mqtt.publish with its settings under with).