Skip to main content

partest-load

Time-based load harness of the partest family: load profiles measured in seconds, not request counts, saturation and degradation metrics, and an HTML dashboard that is assembled entirely offline.

pip install 'partest-load[report]'

Python 3.10+. Without the report extra a run still executes and its results are still saved — only the HTML dashboard is missing. The extra carries numpy, pandas, plotly and Jinja2, which weigh more than everything else together.

Duration, not a request count

A run of "10 000 requests" finishes sooner the slower the system is: a degrading service receives less load per second and therefore looks calmer. A request count measures our patience, not the system's endurance.

Duration fixes the experiment on the load side and leaves the system's behaviour observable. Two runs of the same duration are comparable; two runs of the same request count are not.

Profile What it does What it answers
linear constant load does the system hold the given level
ramp gradual rise to a plateau, then a decline where degradation starts
stress aggressive rise until failure saturation point and degradation slope
batch a finite set of requests at one level does the system get through the list

Metrics: RPS, latency percentiles, success and error share, response sizes; for stress also the saturation point and the degradation slope. Mean latency is deliberately not reported — an average over a long-tailed distribution hides exactly what a load run is made for.

One command

partest-load \
  --endpoints my/endpoints.yaml --endpoint orders_create \
  --profile my/profiles/ramp.yaml \
  --results-root out/load --save-raw \
  --report out/load/dashboard.html

--dry-run parses and prints the configuration without sending a single request. --report-only rebuilds the dashboard from runs already on disk.

Load is sent only on an explicit command — no warm-up on import, no background requests. A tool that can hit a stand by accident does not get installed.

A run is identified by its operation

The identity of a run is the operation, written as METHOD /path (GET /v1/items/{id}), and it is derived from the endpoint description — there is no separate argument for it, so it cannot disagree with what was actually loaded.

<root>/<operation key>/<profile>/<time>__<operation key>__<profile>__<hex>.json
<root>/_latest/<operation key>__<profile>.json      pointer to the latest run

The operation key is a filesystem-safe name (a readable remainder plus eight hex characters). The conversion is one-way, so the operation itself is stored inside the run file in its original form, path {placeholders} included: that is what lets a measurement be matched with outside data about the same endpoint, without decoding a directory name.

--endpoint stays a caption — the name you gave the endpoint yourself. It is written into the run and shown in the report, but identifies nothing: rename it and the run history stays where it is.

Your values stay yours

Endpoint descriptions and profiles are your files. The package ships schemas and engines; concrete endpoints, stand addresses and credentials never enter it, not even as examples. All paths are passed explicitly — nothing is discovered relative to the current directory.

The dashboard is built offline

No CDN, no external fonts, no libraries fetched from the network: plotly.js is embedded into the file, taken from the installed plotly package or from a file you point at with --plotly-js. If there is nowhere to take it from, the dashboard is built with tables and says on the page why there are no charts.

Early days

First release. Not yet implemented, and not to be relied upon: the load.profile artifact export (artifacts.py does not exist — the run result is read by the dashboard only), reuse of partest for authentication, headers, the endpoint list and secret redaction, and stopping a run on profile thresholds for linear and ramp (only stress decides to abort).

The run record format is 2.0.

Source and issues: https://github.com/Dec01/partest-load

License

MIT.

Metadata

Release files for partest-load 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for partest-load 0.2.0
File Size Uploaded
partest_load-0.2.0.tar.gz 69.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for partest-load 0.2.0
File Interpreter ABI Platform
partest_load-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 138.1 kB

Release files / partest_load-0.2.0.tar.gz

Download URL partest_load-0.2.0.tar.gz
Size 69.5 kB
Tags Source
SHA-256 checksum
How to use checksums
9adbc98d3508f18a7ff859358b604c8730dad88b787b1033a49faec1daa95054
BLAKE2b-256 checksum
How to use checksums
610f5f32054bbcccb8d738a19dd09b86e6cc9650d8c2a58ff92b7ef957fdd410
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.10.11

Release files / partest_load-0.2.0-py3-none-any.whl

Download URL partest_load-0.2.0-py3-none-any.whl
Size 68.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ce6c8bcb4ea4638e00a1de31bf22b142ece5bd4b2eed3e48b931c4b3ccb99159
BLAKE2b-256 checksum
How to use checksums
73d6c87f91d1ac17b2ac7d8a3408ce1f561e0bf8c6a4e19340cb2dd4ab51ec52
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.10.11

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page