v0.4.0
Added
- New
std/tcp@v1andstd/udp@v1actions: raw TCP/UDP probes — connect (TCP),
send an optional payload (send/send_base64), optionally read a response
and assert a substring (expect), all with per-request timing. Latency feeds
the same metrics as HTTP, so percentiles are comparable across transports. - Config files gain a
before:block: setup steps that run once before the
load (not per iteration). Each step'soutputsis exposed to test steps under
theconfignamespace —${{ config.<name>.<field> }}— for building a
reusable value (e.g. a token or connection profile). A failing setup step
aborts the run before any VU starts. - Config files gain a
variables:block: static values exposed to steps as
${{ vars.<key> }}. - Steps accept
uses:as an alias foruse:. - New
std/file-read@v1action: read a file once into a process-wide cache
(revalidated by mtime/size) and reference its content from later steps via
${{ name.content }}—textorbase64encoding. - New
std/file-write@v1action: write (or append) content to a file —
e.g. persist${{ resp.body }}to disk; base64 content is decoded before
writing. std/http@v1output now includes responseheaders(lowercase names),
and${{ ... }}paths descend nested objects — chain requests on response
headers:headers: { x-session: "${{ r1.headers.x-session }}" }.std/http@v1can sendmultipart/form-data: amultipart:array of
parts — text fields (value) and file uploads (file, with optional
filename/content_type). Mutually exclusive withbody; the boundary
header is set automatically.
Changed
- Release notes are now written by hand in
UPCOMING.mdinstead of being a
bare commit diff; the release workflow publishes and then resets the file. - Steps without
${{ ... }}placeholders skip the interpolation pass
entirely — no per-iteration deep clone of thewith:block on the hot
path. The${{ ... }}variable syntax is now fully documented in the
YAML reference. - The native engine tracks request durations in a fixed-size HDR histogram
(~tens of KB) instead of storing every sample: long soak runs no longer
grow memory 8 bytes per request (a 30-hour run at 10k RPS previously
needed ~26 GB at the final summary). Quantiles are now within ≤1% of the
exact value — invisible at the precision the summary prints. - The step engine exposes an
ActionHandlerregistration seam
(register_action) so downstream builds can add custompro/*actions
without forking; built-instd/*actions pay no lookup cost for it.
Full Changelog: v0.3.0...v0.4.0