Pewpew is an HTTP load test tool designed for ease of use and high performance. See the guide for details on its use. Also see the examples which run against the test-server
Building pewpew requires openssl development libraries
See EXIT_CODES.md for information about pewpew's exit codes.
On linux, install libss-dev:
$ sudo apt-get install libssl-dev opensslOn Windows it's more difficult. Start by cloning vcpkg, then run
C:\vcpkg> bootstrap-vcpkg.bat
C:\vcpkg> vcpkg.exe install openssl-windows:x64-windows
C:\vcpkg> vcpkg.exe install openssl:x64-windows-static
C:\vcpkg> vcpkg.exe integrate install
C:\vcpkg> set VCPKGRS_DYNAMIC=1 (or simply set it as your environment variable)
- Bump slab from 0.4.10 to 0.4.11
- Update lib.rs
- Fix try script hang
- Fixed Try script never exits on long provider chains
- Added testing examples to the PR flow
- Provider end early
- Update rust dependencies 2026-01-08
- Updated Cargo lock file to latest
- Updated yaml-rust2 to 0.11
- Bump openssl from 0.10.57 to 0.10.60
- Bump h2 from 0.3.21 to 0.3.24
- Replace actions-rs with rustup
- Bump mio from 0.8.10 to 0.8.11
- Bump h2 from 0.3.24 to 0.3.26
- Update Rust Dependencies 2024-05-29
- Moved deprecated .cargo/config to config.toml
- Updated base64, itertools, yansi, env_logger, brotli, serde-wasm-bindgen
- Moved from abandoned yaml_rust to yaml_rust2
- Updated body_reader and channel dependencies
- Updated config-wasm and hdr-histogram dependencies
- Fix dependency loop with ahash on itself
- Update rust dependencies 2024-07-18
- Updated dashmap to 6
- Fixed clippy warnings
- Updated Rust hyper and http
- Updated http to 1.0
- Updated hyper to 1.0
- Updated hyper-tls to 0.6
- Added hyper-util 0.1
- Added http-body-util 0.1
- Fix response status and headers
- Added additional logging to the response handler
- Fixed a bug from the hyper upgrade
- Bump openssl from 0.10.64 to 0.10.66
- Fix Rust Lint Warnings
- Bump openssl from 0.10.66 to 0.10.70
- Bump openssl from 0.10.70 to 0.10.72
- Bump tokio from 1.39.2 to 1.43.1
- Bump crossbeam-channel from 0.5.13 to 0.5.15
- Update rust dependencies 2025-04-16
- Updated itertools to 0.14
- Updated brotli to 7.0
- Updated yaml-rust2 to 0.10
- Update rust dependencies 2025-06-09
- Updated cargo deny file now that Unicode 3.0 is allowed
- Updated rand to 0.9 and get_random to 0.3
- Updated brotli to 8.0
- Fixed Clippy warnings
- Release v5.14
Changes:
- use IsTerminal trait (Rust 1.70.0), removing (direct) dependency on atty crate. (#130)
- Added example yaml files under /examples
- Adds skipBody CLI argument - Skips Request and Response Body in Try Output (#140) (#169)
Bug fixes:
- Updated dependencies and fixed deprecations (#143)
- Fixed the HDR Histogram build for webpack (#119)
- Use clap derive, fixing behavior of --include flag. (#121)
- Fix yaml loggers (#129)
- Fix try script hang broken in 0.5.8 (#177)
Changes:
- Try Run: Clap no longer allows multiple occurences, it only allows multiple passed on one occurence. See Simplify the takes_value API (range-based takes_values) and Clap CHANGELOG. This does introduce a bug that if you specify the config file immediately after --include(s) it will think it's part of the --include. The user must either pass another option after -i or put the config file before the -i
- Removed the old Svelte Results Viewer
Bug fixes:
- Updated dependencies
Changes:
- Added armv7 (Raspberry Pi) and aarch64 (AWS Graviton) builds
- Due to standard library changes to Durations, conversions from float to Durations are now rounded rather than truncated
Bug fixes:
- Updated dependencies
Changes:
- Added logging to the binaries. All binaries now support turning on logging via the
RUST_LOGenvironment variable. The default value iserror. Other available options arewarn,info,debug,trace, andoff. - Changed the log_provider_stats to be a boolean (default on)
- For historical purposes, durations will be allowed and be considered true
- Changed the default try script output to log
headers_allrather thanheaders. There were complaints about not seeing duplicate headers causing confusion over what was being sent. - Change try script output to go through stdout instead of stderr.
- Modified the Config WebAssembly (config-wasm) to also return file body paths from the
getInputFiles()method. - Added a new
encode()option.encode(value, "non-alphanumeric")will encode all characters that are not an ASCII letter or digit. - Added new expressions
parseInt()andparseFloat()which will attempt to convert a string to an integer or float (respectively). Returnsnullif unable to convert.
Bug fixes:
- Upgrade percent-encoding, clap, and other dependencies
Bug fixes:
- Upgrade tokio and other dependencies
- Added a link to the Har to Yaml converter in the docs.
Changes:
- Add in the ability for providers to be "unique"--meaning each item within the provider will be a unique JSON value without duplicates.
- Add in the ability for
peak_loadto have a decimal.
Bug fixes:
- Refactor providers to resolve issues where some tests would see memory leaks and extraneous CPU usage.
- Fix regression from v0.5.6 where sending a file as part of a request's body did not work.
- Fix the config parser web assembly issue with using
epochin logger file names.
Bug fixes:
- Fix regression in v0.5.6 where pewpew does not sleep properly between endpoint calls, effectively disregarding any load limits.
Changes:
- Add
headers_allproperty to bothrequestandresponseto allow the access of multiple header values which share the same header name. - Change the format of the stats output file so data can be appended to it throughout a test run and less data has to be kept in memory.
- Tweak auto sized buffers to grow anytime there is a "endpoing was delayed waiting for provider" event.
- Make "endpoint was delayed waiting for provider" messages less noisy.
- Allow the
--watchCLI flag to modify the test for any change in a config file.
Bug fixes:
- Fix regression introduced in v0.5.5 where specifying a
providermultiple times in aprovideswould only use the last specified one. - Fix bug where non-ascii characters could cause an error reading a file when using the
line(default)format. - Fix bug where the
lineformatof a file provider would incorrectly parse files with lines longer than 8KB. - Fix issue when, under heavy load, pewpew panics with message "found a left over previous bucket".
Changes:
- Add an error message into the stats when an endpoint is delayed waiting for a provider.
- Adjust the way auto-sized buffers grow to be less aggressive. Now they have to be filled and then emptied before they will grow.
- Short circuit a
for_eachwhen awheredoes not referencefor_each. - Add a command-line argument,
start-at, to start the test at a given time. - Add optional
request_timeoutoption toendpoints. - Refactor config parser to provide more helpful messages when an error occurs.
Bug fixes:
- Fix regression where certain errors which should be handled during a test were causing the test to crash.
- Fix bug where a load_pattern did not work when doing
from: 0%andto: 0%.
Changes:
- Add
stats-filecommand-line flag to specify the name of the stats file.
Bug fixes:
- Fix bug where a
logsexpression would getnullforresponseandrequestfields unless they were also references within aprovides. - Fix bug where tests would crash if a response header was a not UTF8 encoded.
Changes:
- Add a
daysunit to durations. - Expand cases when an endpoint can have no
peak_loadto include the case when the endpoint depends upon aresponseprovider. - Swap out the JSONPath library for one that supports more JSONPath expressions.
Bug fixes:
- Raise an error if
for_eachis referenced but not defined. - Fix bug where the config parser would erroneously say there was a recursive
for_each.
Changes:
- Allow an unquoted number to be used when indexing into an object within an expression.
- Change stats to go through stdout instead of stderr.
- Print stats for an endpoint even if it only experienced errors.
Bug fixes:
- Fix issue where
request.bodywould display the wrong file name when the request body was a file. - Fix message displayed as
request.bodywhen the request body is a file to be consistent with other similar messages and have double braces as delimiters. - Fix issue where the
config.client.request_timeoutandconfig.client.keepalivewere not being parsed properly from the config file. - Fix issue where an endpoint which provides for a provider it also depends on could cause a try run to hang.
Changes:
- Tags can now reference providers. Add an additional implicit tag of
_idwhich is the index of the endpoint in the list of endpoints.
Breaking changes:
- Merge the aggregate stats "connection errors" into "test errors".
- Change the
collectandrepeatexpression functions to make the optionalmaxparameter exclusive. - For endpoints which have
provideschange the defaultsendbehavior toif_not_fullif the endpoint has apeak_loadotherwiseblock. - When an endpoint has multiple
provideswhich aresend: blockthe blocking will only wait for there to be room in at least one of the providers' buffers. - Moved the
config.generalsummary_output_formatoption to be a command-line argument. - Change the command-line interface to have two sub-commands:
runandtry. With this change is the ability to select more than one endpoint for a try run and specifying a directory for test results. - Dropped the
aliasparameter for an endpoint and renamedstats_idtotags. - Split
staticproviders out to their own section,vars, and make it so environment variables can only be referenced from within a variable defined invars. This includes no longer requiring environment variables to be prefaced with a$. - Rename the
static_listprovider type tolist. - Allow the same header name to be used multiple times in a request (in compliance with HTTP specs). Headers which are set through
config.client.headerscan be unset in theendpoints.headerssub-section by setting the value tonull.
Bug fixes:
- Fix an issue where loggers would not log for a request if a warning level error happened.
- Fix performance regression introduced in v0.4.9.
- Fix performance regression introduced in v0.4.10.
- Fix bug where
auto_buffer_start_sizewas not working forresponseproviders. - Fix bug where some json outputs would have
\nat the end.
Changes:
- Allow a logger to log test errors. This is done by making another variable available to loggers--
error(in addition torequest,responseandstats). A logger can no longer have an error "indexing into json", instead it will resolve tonull. This enables a logger which logs test errors along with therequestandresponseif they are available. - Add the
watchcommand-line flag for therunsubcommand, along with thewatch_transition_timegeneral config option to allowload_patterns andpeak_loads to change while a test is running. This enables the duration of a test to change and the amount of load generated. - Allow a global header to be unset with a
nullvalue in theendpoints.headerssub-section. - Better handle Ctrl-c killing of the test and persist any unsaved data to disk.
- Add in
replaceexpression function which replaces any occurances of a string in a JSON value with another string. - Add in
base64option for theencodefunction. - For response bodies which cannot first be parsed as utf8 strings the response body will be set to the string "<<binary data>>".
- Add in
fileandformatcommand-line options totrysubcommand. - For multipart requests include the
content-lengthheader instead of sending a chunked request. - For multipart requests which have file pieces, include the
filenamesection with thecontent-dispositionsub-header. - Allow the selecting of bodies from multipart or file requests. Sections coming from a file are replaced with the string "<<contents of file: "filename">>".
Changes:
- Print a summary at the end of a try run.
- Allow
durations,percents andpeak_loadto be templates which can interpolate environment variables. - Add an
entriesexpression function which allows iterating over the key/value pairs in an object. - Add the stem part of the config file to the name of the stats output file.
Bug fixes:
- Fix issue where endpoints without a
peak_loadwould run infintely if targeted in a try run. - Enforce that an endpoint without a
peak_loadmust have at least one provides withsend: block. - Fix issue where warnings (like an invalid url), were not being logged during a try run.
- Fix hang up that would happen with
on_demandif the "demander" executed before theon_demandendpoint. - Fix hang up that could happen when a large amount of data was logged.
- Fix issue where requests would be double counted in the stats if there was a warning level error.
Changes:
- Add
no_auto_returnsendpoint option. - In a try run include all endpoints which can provide data to a response provider needed by the target endpoint.
Bug fixes:
- Fix issue with
on_demandwhere things would hang if the endpoint did not provide a value. - Fix issue where a logger causes a fatal test error if writing to the underlying resource causes a blocking call.
Changes:
- Add in
randomandrepeatparameters forstatic_listproviders. - Persists aggregate stats to disk every time they are printed to the console.
- Add in ability to have multipart request bodies.
Bug fixes:
- Fixed error where a try run could try to use an endpoint which provides for a provider that it also depends on.
- Prevent errors from arising due to boolean operators not being evaluated lazily.
- Fixed error where logger limits only worked when used in conjunction with
kill.
Changes:
- Add modulus
%expression operator. - Add
repeatoption for range providers. - Disabled
load_patterns during try runs. - Have the process return an error code on a fatal error.
- Add console message when test ends early due to a provider ending.
- Add
randomexpression function. - Change RTTs to be stored with microsecond precision but still display as milliseconds (with decimal).
- Make some errors which may occur during a test run just print warnings.
- Add
log_provider_statsconfig option to log statistics about providers. - Add in ability to specify a file as the request body.
- Add
on_demandendpoint option.
Bug fixes:
- Fixed memory leak introduced in v0.4.6.
- Fixed error where order of operations were not being executed correctly--introduced in v0.4.6.
- Fixed off-by-one bug for loggers killing a test.
- Fixed bug where loggers would not log to stdout or stderr.
Bug fixes:
- Fixed bug where
auto_returns were getting blocked waiting for provides to finish.
Changes:
- Add
max_parallel_requestsendpoint parameter. - Add the ability to reference environment variables using templates within a static provider.
- Add basic math operators to expressions:
+,-,*,/.
Changes:
- Refactored the way the code handles errors on the backend. The end result for users is cleaner error messages when things go wrong.
- Added in a "try run" option to the command line. This gives the ability to run one endpoint a single time. Based on the provider needs of the endpoint pewpew will automatically pick any other endpoints needed as dependencies to provide the data. Currently raw request output is automatically printed to stdout.
- Added in a three argument version of the
joinexpression function which enables the string formatting of an object.
Changes:
- Add in proper handling of compressed response bodies. Brotli, gzip and deflate are supported.
Changes:
- Add
rangefunction which creates an array of numbers. See docs for details. - Added
minandmaxfunctions which select the smallest or largest numbers respectively in a series of numbers.
Bug fixes:
- Fixed bug where when a request failed
auto_returnvalues were not being sent back to their provider.
Changes:
stats_idcan now have templates as the values.- Previously as a test progressed, the url printed in the stats output could change because dynamic parts of the url were replaced by a star (
*). Now we detect the dynamic parts of a url at the beginning of a test so it should start out with the stars.
Bug fixes:
- Fixed bug where variables in declare were not being recognized as providers in an expression.
- Fixed bug where bucket stats were sometimes printed in the middle of test summary stats.
Breaking changes:
- Templates no longer use
{{ }}and now use${ }. - All helper functions use the more familiar parenthesis as part of the calling syntax and commas to separate arguments. Ex: what was
{{join foo "-"}}is now${join(foo, "-")}. - There is no longer an
environmentprovider. Instead environment variables can be referenced in any expression using$ENV_VARsyntax. If you previously referenced an environment variable in a file path, make sure you change it to have the$before the variable name. - The
declaresection now supports any valid expression. - The order of
collectfunction's arguments has changed.