LoadWave
Reference

CLI

Every LoadWave command and flag — run, serve, agent, validate, demo and version.

One binary, six commands. loadwave <command> --help prints the same information you will find here.

CommandWhat it does
loadwave demoRun a self-contained demo against a built-in target. Nothing to configure.
loadwave runRun a test to completion and print a report. Add --ui for the dashboard.
loadwave serveLong-lived coordinator and dashboard; runs are started from the browser or the API.
loadwave agentJoin a coordinator and generate load on this machine.
loadwave validateCheck a configuration without running it. Belongs in a pre-commit hook.
loadwave versionPrint version and build information.

Global flags

Available on every command.

FlagDefaultMeaning
--log-levelinfodebug, info, warn or error.
--log-formattexttext or json. Use json when something is collecting the output.

loadwave run

Runs a load test to completion. Starts a coordinator, an agent and its worker processes in one command, prints a report, and exits 2 if any threshold was breached — which is what makes it usable as a CI gate.

loadwave run [config.yaml] [flags]
# Run a configuration file
loadwave run test.yaml

# Quick check with no file
loadwave run --url https://example.com --vus 50 --duration 30s

# Ramp up, watch it live, fail the build if the p95 exceeds 500ms
loadwave run test.yaml --ui --threshold 'http_req_duration:p95<500'

Shaping the load

FlagDefaultMeaning
-u, --urlBase URL for relative request paths. Overrides baseURL.
--nameName for this test, shown in the dashboard.
--vusVirtual users to hold (constant-vus).
-d, --durationHow long to hold the load, e.g. 30s or 5m.
--stagesRamping profile as duration:target pairs: 30s:100,5m:100,30s:0.
--iterationsStop after this many iterations in total.
--rateCap iterations started per second across the whole run.
--between-requests1sPause after every request, e.g. 1s or 500ms-2s; "0" for none.
--graceful-stop30sHow long in-flight iterations may take to finish when stopping.
--scenarioallScenario to run, as name or name=weight. Repeatable.

Requests and assertions

FlagDefaultMeaning
-H, --headerHeader sent with every request, as Name: value. Repeatable.
--timeout30sPer-request timeout.
--insecurefalseSkip TLS certificate verification.
--tagTag applied to every metric, as key=value. Repeatable.
--thresholdPass/fail assertion, e.g. http_req_duration:p95<500. Repeatable.

Output

FlagDefaultMeaning
-o, --outWrite the run summary as JSON to this file.
--reportWrite a self-contained HTML report, with charts, to this file.
-q, --quietfalseSuppress the live progress line.
--uifalseServe the live dashboard during the run.
--ui-addr:8088Dashboard listen address.

Fleet and resolution

FlagDefaultMeaning
-w, --workerscores − 1Worker processes per agent.
--max-vus1000 per coreVirtual user ceiling this machine advertises.
--agents1Number of agents to wait for before starting.
--wait-agents30sHow long to wait for those agents to connect.
--resolution1sMetric bucket width, and therefore the chart's time resolution.

--agents is how you make a distributed run wait for its fleet rather than starting with whoever happens to have connected. Set it to the number of load hosts you expect; --wait-agents bounds how long that patience lasts.

loadwave serve

Starts a long-lived coordinator with the dashboard attached. Runs are started from the browser or through the REST API rather than from the command line.

A local agent is started too, so a single machine works out of the box.

# Everything on one machine
loadwave serve

# A coordinator for a fleet, generating no load itself
loadwave serve --listen 0.0.0.0:8090 --local-agent=false
FlagDefaultMeaning
--listen0.0.0.0:8090Address agents connect to.
--ui-addr:8088Dashboard listen address.
--local-agenttrueAlso run an agent on this machine.
-w, --workerscores − 1Worker processes for the local agent.
--max-vus1000 per coreVirtual user ceiling the local agent advertises.
--read-onlyfalseServe the dashboard without allowing runs to be started or stopped.
--allow-shutdownfalseLet the dashboard's Power off control stop this process.
--allowed-originExtra browser origin allowed to open the live stream. Repeatable.
--resolution1sMetric bucket width.
--window1hHow much chart history to retain.

--read-only is the right flag when showing a run to an audience, or when the dashboard is reachable by more people than should be able to start load against production. It is not a security boundary — the control plane is unauthenticated. See Securing it.

loadwave agent

Runs an agent that joins a coordinator elsewhere. It spawns worker processes on this host and runs whatever share of the load the coordinator assigns it.

It dials out, so it needs no inbound ports and works from behind NAT.

loadwave agent --coordinator loadwave.internal:8090
loadwave agent --coordinator 10.0.0.5:8090 --workers 8 --label region=eu-west-1
FlagDefaultMeaning
-c, --coordinatorRequired. Coordinator address, e.g. loadwave.internal:8090.
-w, --workerscores − 1Worker processes to spawn.
--max-vus1000 per coreVirtual user ceiling to advertise.
--labelLabel advertised to the coordinator, as key=value. Repeatable.
--node-idhostname and pidIdentifier for this agent.

The binary must be the same one the rest of the fleet is running. For a test written with the Go SDK the scenarios are compiled into it, so the binary is the test.

loadwave validate

Parses a configuration, resolves its scenarios and describes what it would do. Nothing is executed and no load is generated.

loadwave validate test.yaml

This is what belongs in a pre-commit hook or a pull-request check: it catches a misspelled field, a scenario name that does not exist in this binary, or a threshold on a metric that will never be produced — all in milliseconds, long before anyone waits out a real run to discover it.

It accepts the same load-shaping flags as run (--url, --vus, --duration, --stages, --iterations, --rate, --between-requests, --graceful-stop, --scenario, --header, --timeout, --insecure, --tag, --threshold, --name, --workers), so you can validate exactly the invocation CI will make.

loadwave demo

Runs a demo test with the dashboard, against a target LoadWave starts itself. A small HTTP server is started in this process with a few endpoints of differing speed and a sprinkling of errors, and a two-scenario test is run against it.

loadwave demo                       # dashboard on :8088, runs for 10 minutes
loadwave demo --duration 2m --vus 50
loadwave demo --headless            # no dashboard, just the report
FlagDefaultMeaning
-d, --duration10mHow long to run. Long enough by default to click around the dashboard.
--vus25Peak virtual users.
--headlessfalseSkip the dashboard and just print the report.
--ui-addr:8088Dashboard listen address.
--reportWrite a self-contained HTML report to this file.
-q, --quietfalseSuppress the live progress line.

The demo server is a toy. Its numbers say nothing about your hardware — it is the fastest way to see what the dashboard shows, and a good end-to-end check of a fresh build.

loadwave version

Prints version and build information.

loadwave version

Exit codes

0Success

The run completed and every threshold passed.

1Tool failure

LoadWave could not do what was asked: bad configuration, no agents, unreachable coordinator.

2Threshold breached

The run completed, but a threshold was breached.

130Interrupted

Ctrl-C, or a SIGINT from whatever supervises the process.

The distinction between 1 and 2 is deliberate: "the tool broke" and "the service was too slow" call for very different responses from a pipeline. See Using it in CI.

Shell completion

Cobra's generator is wired up, so completions work the usual way:

loadwave completion bash > /etc/bash_completion.d/loadwave
loadwave completion zsh > "${fpath[1]}/_loadwave"
loadwave completion fish > ~/.config/fish/completions/loadwave.fish

On this page