- #468 replace
--hatch-rateand--startup-timewith--increase-rate,--increase-time,--decrease-rate, and--decrease-timeo breaking:--hatch-rate/-ris now--increase-rate/-r(sets per-second rate users are added) o breaking:--startup-time/-sis now--increase-time/-s(sets total time to launch all users) o new--decrease-rateoption sets the per-second rate users are stopped during ramp-down o new--decrease-timeoption sets the total time for the ramp-down phase o--decrease-rateand--decrease-timeare mutually exclusive (same as--increase-rateand--increase-time) o if neither decrease option is set, Goose shuts down all users as quickly as possible (previous behavior) o controller commands renamed:hatchrate→increaserate,startup-time→increase-time; newdecreaserateanddecrease-timecommands added o breaking:GooseDefault::HatchRaterenamed toGooseDefault::IncreaseRateo breaking:GooseDefault::StartupTimerenamed toGooseDefault::IncreaseTimeo newGooseDefault::DecreaseRateandGooseDefault::DecreaseTimedefaults o breaking:GooseConfigurationfieldshatch_rate→increase_rate,startup_time→increase_time; newdecrease_rateanddecrease_timefields added o breaking:goose::util::get_hatch_rate()renamed togoose::util::parse_rate() - #674 collapse per-request channel sends: add
GooseMetric::Allvariant that bundles request, transaction, and scenario metrics into a single channel message; reduces channel message volume by up to 3× in the common one-request-per-transaction-per-scenario case oGooseUser::set_success()andGooseUser::set_failure()now take&mut selfinstead of&self; this is source-compatible since transaction functions always receive&mut GooseUser - #680 use atomic counters for hot-path success/failure request counts (#677)
- API change:
Transaction::set_name()now only affects transaction names, not request names (more intuitive default behavior) o existingset_name()calls will only name the transaction for metrics organization o request names remain descriptive (path-based or explicitly set) o users requiring the old behavior must switch toset_name_for_transaction_and_requests()o introducesTransactionNameenum withTransactionOnlyandInheritNameByRequestsvariants - #656 fix stack overflow when cloning
GooseUserwith session data o breaking: session data types must now implementClone(add#[derive(Clone)]to your session structs) - #655 fix
--scenariosto use exact matching instead of substring matching; add*wildcard support for pattern matching - #578 add type-safe client builder for cookie configuration, optimize startup with shared clients
- #629 add
--pdf-print-htmloption to generate printer-friendly HTML optimized for PDF conversion; provides two-step PDF workflow without requiring Chromium dependencies; add--pdf-timeoutoption for configurable Chrome timeout in direct PDF generation (10-300s, default: 60) - #663 add response time breakdowns grouped by HTTP status code in CLI and HTML/markdown reports; breakdowns only appear when a request returns multiple different status codes
- #657 add comprehensive Basic Authentication example demonstrating three approaches: custom client with default headers (recommended), helper function per-request, and manual per-request; includes flexible credential configuration and complete documentation
- #669 update reqwest to 0.13, switching the default TLS backend from native-tls to rustls. HTTP/2 and post-quantum cryptography are now advertised by default, which may increase connection handshake overhead when a computationally expensive cipher suite is negotiated.
Breaking changes: Certificate validation now uses bundled rustls/webpki roots instead of the OS-native certificate store, which may affect environments with custom system CAs.
--accept-invalid-certsnow works unconditionally (previously it was silently ignored unless therustls-tlsfeature was enabled). - #672 fix
--no-autostartinitializing user states twice when a host is configured (once at startup, again on controller Start command) - #673 parallelize user state initialization across available CPUs; significantly reduces startup time with large user counts (1000+)
- #678 add support for non-HTTP protocol load testing (TCP, UDP, WebSocket, etc.)
o new
GooseMethod::Customvariant for non-HTTP requests o newGooseUser::record_custom_request(method, name, response_time_ms, success, status_code, error)method records arbitrary request metrics that appear in all Goose reports under a user-defined method label (e.g.TCP,GRPC,WS) ostatus_codeparameter allows recording protocol-specific status codes (defaults to0for protocols without status codes) o addexamples/tcp_loadtest.rsdemonstrating how to load test a raw TCP echo server - #660, #661 add
--baseline-fileoption to compare load test results against a previous JSON report; all report formats (HTML, Markdown, JSON) show deltas for requests, response times, transactions, scenarios, errors, and coordinated omission metrics oGooseMethodnow derivesCopyandHasho JSON reports now includescenariosandhostsfields inraw_metrics(previously omitted by manual serialization) o breaking:metrics::deltaandmetrics::nullablemodules are now crate-private;DeltaValue,Value,ApplyBaseline, andNullableFloatare no longer part of the public API - #683 use
Arc<str>consistently for scenario/transaction names in metrics structs, eliminating per-invocationStringallocations on the hot path (#647) o breaking:Scenario.name,Scenario.machine_name,ScenarioMetric.name,TransactionMetric.name,ScenarioMetricAggregate.name, andTransactionMetricAggregate.scenario_namechange fromStringtoArc<str>oArc<str>derefs to&str, so most read-only usage (formatting, logging, comparisons) works unchanged o fix flakytest_status_code_response_time_trackingintegration test that assumed localhost responses always take ≥1ms - #685 log info message when writing JSON and Markdown report files, matching existing HTML and PDF report behavior (#604)
- #634 add killswitch mechanism for programmatic test termination
- #630 enhanced coordinated omission metrics with severity classification, detailed tracking, and comprehensive documentation
- #632 add Context7 support for enhanced AI code assistant integration
- #627 add comprehensive test coverage for test plan parsing, implement
DefaultforTestPlan - #625 standardize logging format across codebase with consistent module prefixes
- #633, #622 fix clippy warnings for latest Rust version
- #620 fix error graph display in HTML report
- update all dependencies
- update all dependencies
- #565 add
--accept-invalid-certsto skip validation of https certificates - #568 don't panic when truncating non utf-8 string
- #574 update
http,itertoolsnix,rustls, andserial_test - #575 add test coverage for sessions and cookies, revert #557 to avoid sharing the CookieJar between all users
- #600 Refactor reports/metrics, add JSON and markdown report
- #629 add optional PDF report generation with
pdf-reportsfeature flag; supports configurable scale via--pdf-scaleoption
- #557 speed up user initialization on Linux
- #559 disable unnecessary features in chronos, avoid potential segfault in time crate: https://rustsec.org/advisories/RUSTSEC-2020-0071
- #543 remove external dependency on num_cpus(), use instead built-in available_parallelism() added in rust 1.59.0
- #552 add
scenario_index,scenario_name,transaction_indexandtransaction_nameto the request log - #553 remove
serde_cbordependency no longer required due to [#529] - #554 update
flume,itertools,strum,strum_macros,tokio-tungstenite, andtungestenitedependencies to latest versions - #555 don't panic when report has no data
- #529 API change temporaryily removed Gaggle support
gagglefeature) to allow upgrading Tokio and other dependencies.- if you require Gaggle support, use Goose 0.16.4 with Tokio 0.15 for now; Gaggle support is being added back in tag1consulting#509
- updated Tokio to 1.23, updated tungestenite and tokio-tungstenite to 0.18; updated ctrlc to 3.2; updated num_cpus to 1.14, updated simplelog to 0.12, updated nix to 0.26, updated rustls to 0.20, updates serial_test to 0.9
- removed
nngdependency andgagglefeature - removed
--manager,--expect-workers,--no-hash-check,--manager-bind-host,--manager-bind-port,--worker,--manager-host,--manager-portand related configuration defaults - removed
AttackMode::ManagerandAttackMode::Worker - ignore all Gaggle tests, will re-enable these tests when Gaggle support is re-implemented
- box
TransactionErrorto avoid over-allocating memory on the stack (seeexamples/session.rsfor an example of working with this)
- #512 include proper HTTP method and path in logs and html report when using
GooseRequest::builder() - #514 fix panic when an empty wait time interval is set
- #516 fix unescaped inner quotes in csv logs
- #519 implement
DefaultforGooseConfiguration - #522 display times on the report in local time (instead of UTC)
- #498 ignore
GooseDefault::Hostif set to an empty string - #487 add dev-dependency on (nix)[https://docs.rs/nix] to provide test coverage confirming proper shutdown from SIGINT (ctrl-c); capture ctrl-c in a lazy_static wrapped in a RwLock so it can be reset
- #489 don't panic when writing report file and shutting down with controller
- #505 introduce
--scenarios(andGooseDefault::Scenarios) so a subset of scenarios can be launched, and--scenarios-listto display internal machine names for matching
- #477 introduce
--iterations(andGooseDefault::Iterations) which configures each GooseUser to run a configurable number of iterations of the assigned Scenario then exit; introduces Scenario metrics which can be disabled with--no-scenario-metrics(GooseDefault::NoScenarioMetrics); introduces--scenario-logand--scenario-format(andGooseDefault::ScenarioLogandGooseDefault::ScenarioFormat) - #483 remove duplicate help (-h) output
- #464 add
startuptime(andstartup_time) TIME to controllers, setting how long the load test should spend starting configured number of users - #469 support
usersINT command on controllers during a running load test - #473 introduce
test-plan PLANcommand allowing configuration of test plan with the controller during running and idle load tests
- #431 rename
--no-granular-datato--no-granular-report - #415 display granular data in HTML graphs, introduce
--no-granular-datato disable it and display graphs as they were until this change - #406 make sure that the graphs are built correctly if the load test is interrupted during the starting phase
- #408 update 'Running the load test' page in the Goose book to show HTML report
- #411 API change: some public APIs have been made private or removed
o
util::MovingAveragestructure and all related functions have been moved to a different namespace and made private oGooseRequestMetricAggregate::requests_per_second,GooseRequestMetricAggregate::errors_per_secondandGooseRequestMetricAggregate::average_response_time_per_secondhave been removed oGooseTaskMetricAggregate::tasks_per_secondhas been removed oGooseMetrics::users_per_secondhas been removed o formerly public methodsreport::task_metrics_template()andreport::errors_template()have been made private oreport::graph_rps_template(),report::graph_eps_template(),report::graph_average_response_time_template(),report::graph_users_per_second_template()andreport::graph_tasks_per_second_template()have been removed - #379 API change: default to
INFOlevel verbosity, introduce-qto reduce Goose verbosity o note:-vnow sets Goose toDEBUGlevel verbosity which when enabled will negatively impact load test performance; set-qto restore previous level of verbosity - #379 API change: remove
.print()which is no longer required to display metrics after a load test, disable with--no-print-metricsorGooseDefault::NoPrintMetrics - #422 API change: introduce
--test-planandGooseDefault::TestPlano internally represent all load tests asVec<(usize, usize)>l test plan o use [FromStr] to auto convert --test-plan "{users},{timespan};{users},{timespan}", where {users} must be an integer, ie "100", and {timespan} can be integer seconds or "30s", "20m", "3h", "1h30m", etc, to internal Vec<(usize, usize)> representation o don't allow--test-plantogether with--users,--startup-time,--hatch-rate,--run-time,--no-reset-metrics,--managerand--workero internalAttackPhases renamed:Starting->Increase,Running->Maintain,Stopping->Decrease - #449 API change: rename
GooseTaskSet->Scenario,GooseTask->Transaction,GooseTaskResult->TransationResult,GooseTaskEror->TransactionError,WeightedGooseTasks->WeightedTransactions,GooseTaskFunction->TransactionFunction,test_start_task->test_start_transaction,test_stop_task->test_stop_transaction,register_task->register_transaction,task!->transaction!,--no-task-metrics->--no-transaction-metrics,GooseTaskError->TransactionError - #450 add support for variable speed and multiple decrease AttackPhases
- #452 API change: rename
--status-codesto--no-status-codesand enable collecation and summary of status codes by default
- #391 properly sleep for configured
set_wait_time()walking regularly to exit quickly if the load test ends - #394 add additional graphs to the HTML report: errors per second, average response time, active users, active tasks
- #403 wake up a couple times a second to handle message and allow for a quick shutdown if the load test is canceled during startup
- #374 renamed
simple-with-session.rstosession.rsandsimple-closure.rstoclosure.rsto avoid confusion with thesimple.rsexample as they all do different things - #385 properly configure
--running-metrics VALUEwhen set manually - #382 set client timeout to 60 seconds by default, used for all requests made; introduce
--timeout VALUEwhere VALUE is seconds as integer or a float; timeout can be configured programatically usingGooseDefault::Timeout - #381 display requests per second graph on the HTML report
- #372 de-deduplicate documentation, favoring The Goose Book
- #373 API change: introduce
GooseRequestandGooseRequestBuilderfor more flexibility when making requests o removeGooseUser::post_named,GooseUser::head_named,GooseUser::delete_named,GooseUser::goose_get,GooseUser::goose_put,GooseUser::goose_head,GooseUser::goose_put,GooseUser::goose_patch,GooseUser::goose_delete, andGooseUser::goose_sendo adds or modifies helpersGooseUser::get,GooseUser::get_named,GooseUser::post,GooseUser::post_form,GooseUser::post_json,GooseUser::head, andGooseUser::deleteo replacesGooseUser::goose_sendwithGooseUser::requestwhich accepts aGooseRequestobject o fixes [#370] (seeGooseRequestBuilder::expect_status_code)
- #364 add link from the Developer Documentation to The Git Book
- #368 fix performance regression: optimize fastpath if no delay between tasks
- #361 convert
README.md(and enhance) intoThe Goose Book - #356 API change: make
GooseAttack.executeasync,main()function signature changed to:#[tokio::main] fn main() -> Result<(), GooseError> {
- #355 API change: add the possibility to attach custom session data
GooseUserDatato eachGooseUser - #355 API change: change
GooseTasksignature to take a mutable reference ofGooseUser:async fn example_task_function(user: &mut GooseUser) -> GooseTaskResult {
- #358 API change: update
GooseTaskSet::set_wait_time()to acceptstd::time::Durationinstead ofusizeallowing more granularity - #355 remove
Clonetrait fromGooseUserandGooseAttack - #359 use request name when displaying errors to avoid having a large volume of distinct error for the same endpoint when using path parameters
- #360 updated
tungstenitedependency to0.15
- #351 document GooseConfiguration fields that were only documented as gumpdrop parameters (in order to generate new lines in the help output) so now they're also documented in the code
- #353 fix panic when
--no-task-metricsis enabled and metrics are printed; add tests to prevent further regressions
- #349, #345 fix broken links within the documentation; general documentation cleanups
- #348 introduce
--startup-timewhich can be set together with--usersinstead of using--hatch-rateto configure how quickly to start users - #348 fix
--run-timeto always start counting after all users are fully started - #348 include starting and stopping time in addition to running time in text metrics and html report
- #338 add test to confirm a
base_urlcan include a path and be joined with a relative path - #339 fix documentation typo
- #340 introduce
prettylog format for--error-format,--debug-format,--request-format, and--task-format - #341 clippy cleanups: don't borrow references that are immediately dereferenced by the compiler: https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
- #342 consistently report users simulated, target host(s), start and end times, and total duration of test both in text metrics and html report
- #343 updated httpmock dev dependency to
0.6
- #334 API change: introduce
GooseRawMetricwhich contains themethod,url,headersandbodyof the client request made, and is now contained inrawfield of theGooseRequestMetric - #328 enable
gzipsupport and set Accept-Encoding header by default in the client; disable with--no-gziporGooseDefault::NoGzip - #330 document how to add custom cookies (https://docs.rs/goose/*/goose/goose/struct.GooseUser.html#custom-cookies)
- #331 update
rustc_versiondependency to0.4 - #334 include client request headers in
GooseRequestMetricso they show up in the request log and the debug log - #334 introduce
--request-body(andGooseDefault::RequestBody) which when enabled shows up in thebodyfield of theGooseRawMetric - #334 add
GooseRawMetricto the request log, debug log and error log
- rename
rustlsfeature torustls-tlssotests/controller.rscan build with therustlslibrary; updatetungsteniteto0.14andtokio-tungstenite=0.15to allow building withrustls - documentation cleanup; properly rename
GooseDefault::RequestFormatand fix links - always configure
GooseConfiguration.managerandGooseConfiguration.worker; confirm Manager is enabled when setting--expect-workers - moved
GooseConfiguration,GooseDefault, andGooseDefaultTypeinto newsrc/config.rsfile; standardized configuration precedence through internalGooseConfiguretrait definingget_value()for all supported types; general improvements to configuration documentation
- API change: remove internal-only functions and structures from documentation, exposing only what's useful to consumers of the Goose library
o
goose::initialize_logger(),Socketreduced topub(crate)scope ogoose::controller::GooseControllerProtocol,GooseControllerRequestMessage,GooseControllerResponseMessage,GooseControllerRequest,GooseControllerResponse,GooseControllerState,::controller_main()reduced topub(crate)scope ogoose::manager::manager_main()reduced topub(crate)scope ogoose::metrics::GooseRequestMetric::new(),::set_final_url(),::set_response_time(), and::set_status_code(),::per_second_calculations(),format_number(),merge_times(),update_min_time(),update_max_time(),calculate_response_time_percentile(), andprepare_status_codes()reduced topub(crate)scope ogoose::metrics::GooseRequestMetricAggregate::new(),::set_response_time(), and::set_status_code()reduced topub(crate)scope ogoose::metrics::GooseTaskMetric::new()and::set_time()reduced topub(crate)scope ogoose::metrics::GooseMetrics::initialize_task_metrics()and::print_running(),::fmt_requests(),::fmt_tasks(),::fmt_task_times(),::fmt_response_times(),::fmt_percentiles(),::fmt_status_codes()and::fmt_errors()reduced topub(crate)scope o fromgoose::metrics::GooseMetricsreducedfinal_metrics,display_status_codesanddisplay_metricsfields topub(crate)scope ogoose::metrics::GooseErrorMetric::new()reduced topub(crate)scope ogoose::logger::logger_main()reduced topub(crate)scope ogoose::user::user_main()reduced topub(crate)scope ogoose::worker::worker_main()reduced topub(crate)scope - API change: move all metrics-related stuctures and methods into
metrics.rs, rename for consistency, and improve documentation ogoose::GooseRawRequestchanged togoose::metrics::GooseRequestMetricogoose::GooseRequestchanged togoose::metrics::GooseRequestMetricAggregateogoose::GooseRawTaskchanged togoose::metrics::GooseTaskMetricogoose::GooseRawTaskchanged togoose::metrics::GooseTaskMetricAggregateogoose::update_duration()changed togoose::metrics::update_duration()and reduced topub(crate)scope ogoose::sync_metrics()changed togoose::metrics::sync_metrics()and reduced topub(crate)scope ogoose::reset_metrics()changed togoose::metrics::reset_metrics()and reduced topub(crate)scope ogoose::receive_metrics()changed togoose::metrics::receive_metrics()and reduced topub(crate)scope ogoose::record_error()changed togoose::metrics::record_error()and reduced topub(crate)scope - expose utility functions used by Goose for use by load tests
o
goose::util::parse_timespan(),::gcd(),::median(),::truncate_string(),::timer_expired(),::ms_timer_expired(),::get_hatch_rate(), and::is_valid_host()were elevated topubscope - introduce (disabled by default) Coordinated Omission Mitigation, configured through
--co-mitigationwith the following options: "disabled" (default0), "average", "minimum", "maximum"; (or withGooseDefault::CoordinatedOmissionMitigation) - (EXPERIMENTAL) Coordinated Omission Mitigation tracks the cadence that a GooseUser loops through all GooseTasks, (also accounting for time spent sleeping due to
.set_wait_time()); it detects stalls (network or upstream server) that block and prevent other requests from running, and backfills the metrics to mitigate this loss of data (based on the general implementation found in HdrHistogram - When displaying metrics (via the cli and the html report) show both "raw" (actual) metrics and "coordinated omission mitigation" (back-filled with statistically generated) metrics, and the standard deviation between the average times for each
- introduce
GooseLogenum for sendingGooseDebug,GooseRequestMetricandGooseTaskMetricobjects to the Logger thread for logging to file - introduce
--tasks-filerun-time option for loggingGooseTaskMetrics to file - rename
GooseTaskMetrictoGooseTaskMetricAggregate, and introduceGooseTaskMetricwhich is a subset ofGooseRequestMetriconly used for logging - introduce
--error-filerun-time option for loggingGooseErrorMetrics to file - introduce
GooseLogFormatenum for formatting all logs; add--task-formatand--error-formatusing new enum, update--requests-formatand--debug-format. - renamed
--log-fileto--goose-log,--requests-fileto--request-log,--requests-formatto--request-format,--tasks-fileto--task-log,--tasks-formatto--task-format,--error-fileto--error-log, and--debug-fileto--debug-log
- introduce telnet Controller allowing real-time control of load test, optionally disable with
--no-telnet, supports the following commands: ohelp(and?) display help oexit(andquit) exit the telnet Controller oshutdownshuts down the running load test (and exits the controller) ohost(andhosts) HOST sets host to load test against, ie http://localhost/ ousers(anduser) INT sets number of simulated users ohatchrate(andhatch_rate) FLOAT sets per-second rate users hatch oruntime(andrun_time) TIME sets how long the load test should run oconfigdisplays the current load test configuration oconfig-jsondisplays the current load test configuration in json format ometrics(andstats) displays metrics for the current load test ometrics-json(andstats-json) displays metrics for the current load test in json format - telnet Controller bind host defaults to
0.0.0.0, can be configured with--telnet-host - telnet Controller bind port defaults to
5116, can be configured with--telnet-port - telnet Controller defaults can be changed:
o default to not enabling telnet Controller:
GooseDefault::NoTelnet(bool) o default host to bind telnet Controller to:GooseDefault::TelnetHost(&str) o default port to bind telnet Controller to:GooseDefault::TelnetPort(usize) - introduce WebSocket Controller allowing real-time control of load test, optionally disable with
--no-websocket, supports the same commands as the telnet Controller, except: oconfigandconfig-jsonboth return the load test configuration in json format ometricsandmetrics-jsonboth return metrics for the current load test in json format - WebSocket Controller bind host defaults to
0.0.0.0, can be configured with--websocket-host - WebSocket Controller bind port defaults to
5117, can be configured with--websocket-port - WebSocket Controller defaults can be changed:
o default to not enabling WebSocket Controller:
GooseDefault::NoWebSocket(bool) o default host to bind WebSocket Controller to:GooseDefault::WebSocketHost(&str) o default port to bind WebSocket Controller to:GooseDefault::WebSocketPort(usize) - make it possible to start and stop a load test without completely restarting Goose
- introduce
--no-autostartto disable automatically starting the load test, leaves Goose in an idle state waiting for Controller commands (optionally change the default withGooseDefault::NoAutoStart) o renamedstopController command toshutdowno added newstartController command, telling idle Goose load test to start o added newstopController command, telling running Goose load test to stop and return to idle state - code cleanup and logic consollidation to support Controller fixed a bug where metrics wouldn't display and the debug file, request file, and html report weren't written when load test was stopped while still launching users
- regularly sync metrics, using a timeout to avoid hanging the main loop
- properly reset metrics when load test is stopped and restarted
- properly flush debug file, request file, and html report when stopping load test with Controller
- properly (re)create debug file, request file, and html report when starting load test with Controller
- if metrics are enabled, display when controller stops load test
- de-duplicate code with traits, gaining compile-time validation that both Controllers are properly handling all defined commands
- add
async_traitdependency as stable Rust doesn't otherwise support async traits - allow starting Goose without specifying a host if
--no-autostartis enabled, requiring instead that the host be configured via a Controller before starting a load test - add test for telnet and WebSocket Controllers
- update
randdependency to0.8branch, updategen_rangemethod call - update dependencies:
itertoolsto0.10,simplelogto0.10,urlto2 - update
nngdependency for optionalgagglefeature - simplify
examples/umamiregex when parsing form - allow configuration of algorithm for allocating
GooseTasks the same asGooseTaskSets;GooseTaskSetSchedulerbecomes more genericallyGooseScheduler - specify (and detect) minimum
rustcrequirement of1.49.0, due toflumedependency which in turn depends onspinning_topwhich useshint::spin_loopwhich stabilized inrustcversion `1.49.0 - standardize links in documentation; general documentation cleanups
- capture errors and count frequency for each, including summary in metrics report; optionally disable with
--no-error-summary - clippy cleanups (prepare for Rust 2021 https://blog.rust-lang.org/inside-rust/2021/03/04/planning-rust-2021.html):
o API change: all
GooseMethods renamed to enforce Rust naming conventions in regards to case, for exampleGooseMethod::GETbecomesGooseMethod::Geto usevec![]macro to avoid unnecessarily pushing data into mutable vectors o callformat!macro directly for improved readability o remove unnecessarypanic!
- avoid unnecessary work on Manager when starting a Gaggle
- respect
--hatch-ratewhen starting a Gaggle - update httpmock for running tests
- remove unnecessary
Result()types where no error was possible
- introduce
--report-file(andGooseDefault::ReportFile) to optionally generate an HTML report when the load test completes - upgrade to
tokio1.x, and switch toflumefor all multi-producer, multi-consumer channels - make
examples/umamimore generic for easier load testing of any Drupal 9 version of the demo install profile
- account for time spent doing things other than sleeping, maintaining more consistency when displaying statistics and shutting down
- start each debug log file with a line feed in case the page is too big for the buffer; increase the debug logger buffer size from 8K to 8M
- introduce
--no-debug-bodyflag to optionally prevent debug log from including the response body - rename the metrics file to requests file to better reflect what it is
o
--metrics-filebecomes--requests-fileo--metrics-formatbecomes--requests-formatoGooseDebug::MetricsFilebecomesGooseDebug::RequestsFileoGooseDebug::MetricsFormatbecomesGooseDebug::RequestsFormat - reset drift timer any time the attack_phase changes
- document all public high level files and functions
- replace
--only-summarywith--running-metrics <usize>, running metrics are disabled by default - allow configuration of the algorithm used when allocating
GooseTaskSets to startingGooseUsers: oGooseTaskSetScheduler::RoundRobinallocates 1 of each availableGooseTaskSetat a time (new default) oGooseTaskSetScheduler::Serialallocates all of each availableGooseTaskSetin the order they are defined oGooseTaskSetScheduler::Randomallocates 1 randomGooseTaskSetfrom all available - when enabled, display running metrics for the entire duration of test, including ramp-up and shutdown
- support floating point hatch rate (ie, hatch 1 user every 2 seconds with
-r .5)
- add new
examples/umamifor load testing Drupal 9 demo install profile - replace TermLogger with SimpleLogger for increased logging flexibility
- add initial OCI Dockerfile for container-based workflows
- use checked subtraction when calculating drift duration to prevent panic
- update
nng-rsdependency to fix bug when testing that the manager is ready
- fixup sticky redirect tests to properly test functionality
- add
test/sequence.rsto confirm sequencing tests works correctly, even in Gaggle mode - deduplicate test logic by moving shared functionality into
tests/common.rs; consistently test functionality both in standalone and Gaggle mode - properly create debug log when enabled in Gaggle mode
- remove unnecessary
GooseAttack.number_of_cpusinstead callingnum_cpus::get()directly - remove
tests/gaggle.rs, instead mixing gaggle tests with per-feature integration tests - ensure
test_startandtest_stoprun one and only one time even in Gaggle mode
- rework
hatch_rateto be stored in anOption<usize>as it can beNoneon a Worker - remove redundant
GooseAttack.usersinstead using theOption<usize>inconfiguration - improve bounds handling of defaults, generate errors for invalid values
- properly handle early shutdown of Gaggle distributed load test from Worker process
- Manager starts timing Gaggle distributed load test only after all Workers start
- default to resetting statistics, disable with
--no-reset-stats, display spawning statistics before resetting - only run gaggle integration tests when feature is enabled
- prevent time-drift when launching users and throttling requests
- add per-task statistics in addition to per-request statistics, disable with
--no-task-stats - rename
statsandstatisticstometricsfor consistency and clarity o--no-statsbecame--no-metricso--no-reset-statsbecame--no-reset-metricso--no-task-statsbecame--no-task-metricso--stats-log-filebecame--metrics-log-fileo--stats-log-formatbecame--metrics-log-format - shorten some configuration options to fit standard console width, preparation for switch to gumdrop
o
--debug-log-filebecame--debug-fileo--debug-log-formatbecame--debug-formato--metrics-log-filebecame--metrics-fileo--metrics-log-formatbecame--metrics-format - reworded errors for consistency, made error.detail required
- replace
structoptwithgumdropo restructured help page to logically group related options o rewrote/simplified configuration descriptions to fit standard console width - update prelude documentation
- increase precision of metrics for smaller values
- consistently build configuration from arguments
- replace
GooseAttack::set_host()with more genericGooseAttack::set_default(), exposes the following defaults: o default host:GooseDefault::Host(&str) o default users to start:GooseDefault::Users(usize) o default users to start per second:GooseDefault::HatchRate(usize) o default number of seconds for test to run:GooseDefault::RunTime(usize) o default log level:GooseDefault::LogLevel(usize) o default log file name:GooseDefault::LogFile(&str) o default verbosity:GooseDefault::Verbose(usize) o default to only printing final summary metrics:GooseDefault::OnlySummary(bool) o default to not resetting metrics after all users start:GooseDefault::NoResetMetrics(bool) o default to not tracking metrics:GooseDefault::NoMetrics(bool) o default to not tracking task metrics:GooseDefault::NoTaskMetrics(bool) o default metrics log file name:GooseDefault::MetricsFile(&str) o default metrics log file format:GooseDefault::MetricsFormat(&str) o default debug log file name:GooseDefault::DebugFile(&str) o default debug log file format:GooseDefault::DebugFormat(&str) o default to tracking status codes:GooseDefault::StatusCodes(bool) o default maximum requests per second:GooseDefault::ThrottleRequests(usize) o default to following redirect of base_url:GooseDefault::StickyFollow(bool) o default to enabling Manager mode:GooseDefault::Manager(bool) o default number of Workers to expect:GooseDefault::ExpectWorkers(usize) o default to ignoring load test checksum:GooseDefault::NoHashCheck(bool) o default host to bind Manager to:GooseDefault::ManagerBindHost(&str) o default port to bind Manager to:GooseDefault::ManagerBindPort(usize) o default to enabling Worker mode:GooseDefault::Worker(bool) o default host for Worker to connect to:GooseDefault::ManagerHost(&str) o default port for Worker to connect to:GooseDefault::ManagerPort(usize)
- return
GooseStatsfromGooseAttack.execute() - rework as methods of
GooseStats:.print(),.print_running(),fmt_requests(),fmt_response_times(),fmt_percentiles(), andfmt_status_codes() - display
GooseStatswith fmt::Display (ieprint!("{}", goose_stats);) - make it possible to pass a closure to GooseTask::new
- fix display of
GooseErrorandGooseTaskError
- fix code documentation, requests are async and require await
- properly support setting host when registering task set
- rename
responsewrapper togoose, so we end up withgoose.requestandgoose.response - add
--throttle-requeststo optionally limit the maximum requests per second (api change) - introduce
GooseErrorandGooseTaskError - change task function signature, tasks must return a
GooseTaskResult - change
GooseAttackmethod signatures where an error is possible - where possible, pass error up the stack instead of calling
exit(1) - introduce
GooseAttack.display()which consumes the load test state and displays statistics panic!()on unexpected errors instead ofexit(1)
client.log_debug()will write debug logs to file when specified with--debug-log-file=- add
-debug-log-format=to switch betweenjson(default) andrawformats - cleanup code with clippy, automate clippy with PRs
- add optional compile-time
rustlsfeature
- sort stats by method:name to ease comparisons
- optionally log all requests to file specified with
--stats-log-file= - add
--stats-log-format=to switch betweenjson(default),csvandrawformats
- properly subtract previous statistic when handling
set_failure()andset_success() - detect and track redirects in
GooseRawRequest --sticky-followmakes redirect of GooseClient base_url sticky, affecting subsequent requests- changed
GooseClienttoGooseUser
- store actual URL requested in GooseRawRequest
- add
set_client_builder, allow load test to build Reqwest clients with custom options - properly fix documentation links
- fix gaggles to not panic, add test
- fix test_start and test_stop to not panic, add tests
- optimize NNG usage, write directly to Message instead of first to buffer
- fix documentation links
- move client out of GooseClient into global GooseClientState
- introduce
test_start_taskandtest_stop_taskallowing global setup and teardown - don't panic if a load test doesn't define any normal tasks
- pass immutable GooseClient to tasks
- integrate httpmock into testing load test
- don't shuffle order of weighted task sets when launching clients
- remove GooseClientMode as it serves no useful purpose
- push statistics from client threads to parent in real-time
- simplify
set_failureandset_successto pass in request
- no longer compile Reqwest blocking client
- remove need to declare
use std::boxed::Boxin load tests - remove unnecessary mutexes
- introduce
use goose::prelude::*
- initial async support
- nng does not support udp as a transport protocol, and tcp overhead isn't problematic; remove to-do to add udp, hard-code tcp
- add worker id for tracing gaggle worker threads
- cleanup gaggle logic and comments
- replace
unsafecode blocks withlazy_staticsingleton - perform checksum to confirm workers are running same load test,
--no-hash-checkto ignore - code and documentation consistency
- replace
--print-statswith--no-stats, default to printing stats - make gaggle an optional compile-time feature
- GooseState is now GooseAttack
- Initial support for gaggles: distributed load testing