Benchmark and Validate HTTP services¶
The load-test-http experiment generates requests for HTTP services, collects latency and error-related metrics, and validates service-level objectives (SLOs).
This experiment is designed for the following use-cases.
- Load test
- Benchmark
- Validate service level objectives (SLOs)
- Safe rollout
- Continuous integration and delivery (CI/CD)
Before you begin
Run the httpbin sample service from a separate terminal.
docker run -p 80:80 kennethreitz/httpbin
Basic example¶
Benchmark an HTTP service with a GET endpoint by specifying the url.
iter8 launch -c load-test-http --set url=http://127.0.0.1/get
Specify metrics and SLOs¶
The following metrics are collected by default by this experiment:
http/request-count: total number of requests senthttp/error-count: number of error responseshttp/error-rate: fraction of error responseshttp/latency-mean: mean of observed latency valueshttp/latency-stddev: standard deviation of observed latency valueshttp/latency-min: min of observed latency valueshttp/latency-max: max of observed latency valueshttp/latency-pX: Xth percentile latency, for X in[50.0, 75.0, 90.0, 95.0, 99.0, 99.9]
All latency metrics have msec units.
Launch the following experiment. The --noDownload flag reuses the Iter8 experiment charts folder downloaded during the previous iter8 launch invocation.
iter8 launch -c load-test-http --noDownload \
--set url=http://127.0.0.1/get \
--set SLOs.http/error-rate=0 \
--set SLOs.http/latency-mean=50 \
--set SLOs.http/latency-p90=100 \
--set SLOs.http/latency-p95=200
In the experiment above, the following SLOs are validated.
- error rate is 0
- mean latency is under 50 msec
- 90th percentile latency is under 100 msec
- 95th percentile latency is under 200 msec
View experiment report¶
iter8 report
The text report looks like this
Experiment summary:
*******************
Experiment completed: true
No task failures: true
Total number of tasks: 2
Number of completed tasks: 2
Whether or not service level objectives (SLOs) are satisfied:
*************************************************************
SLO Conditions |Satisfied
-------------- |---------
http/error-rate <= 0 |true
http/latency-mean (msec) <= 50 |true
http/latency-p90 (msec) <= 100 |true
http/latency-p97.5 (msec) <= 200 |true
Latest observed values for metrics:
***********************************
Metric |value
------- |-----
http/error-count |0.00
http/error-rate |0.00
http/latency-max (msec) |8.93
http/latency-mean (msec) |5.49
http/latency-min (msec) |2.71
http/latency-p50 (msec) |5.38
http/latency-p75 (msec) |6.71
http/latency-p90 (msec) |7.77
http/latency-p95 (msec) |8.27
http/latency-p97.5 (msec) |8.60
http/latency-p99 (msec) |8.80
http/latency-p99.9 (msec) |8.92
http/latency-stddev (msec) |1.57
http/request-count |100.00
iter8 report -o html > report.html # view in a browser
The HTML report looks like this

Assert experiment outcomes¶
Assert that the experiment completed without failures, and all SLOs are satisfied.
iter8 assert -c completed -c nofailure -c slos
The iter8 assert command asserts if the experiment result satisfies conditions that are specified. If assert conditions are satisfied, it exits with code 0; else, it exits with code 1. Assertions are especially useful inside CI/CD/GitOps pipelines.
Sample output from assert
INFO[2021-11-10 09:33:12] experiment completed
INFO[2021-11-10 09:33:12] experiment has no failure
INFO[2021-11-10 09:33:12] SLOs are satisfied
INFO[2021-11-10 09:33:12] all conditions were satisfied
Specify load profile¶
Control the characteristics of the load generated by the load-test-http experiment by setting the number of queries (numQueries), the number of queries sent per second (qps), and the number of parallel connections used to send queries (connections).
iter8 launch -c load-test-http --noDownload \
--set url=http://127.0.0.1/get \
--set numQueries=200 \
--set qps=10 \
--set connections=5
Specify payload¶
Send any type of content as payload and specify the HTTP Content Type header. These options switch the HTTP method to POST.
Specify payload as a string. By default, its content type is set to application/octet-stream.
iter8 launch -c load-test-http --noDownload \
--set url=http://127.0.0.1/post \
--set payloadStr="abc123"
iter8 launch -c load-test-http --noDownload \
--set url=http://127.0.0.1/post \
--set payloadStr="abc123" \
--set contentType="text/plain"
Fetch JSON content from a URL. Use this JSON as payload. Set content type to application/json.
iter8 launch -c load-test-http --noDownload \
--set url=http://127.0.0.1/post \
--set payloadURL=https://data.police.uk/api/crimes-street-dates \
--set contentType="application/json"
Fetch jpeg image from a URL. Use this image as payload. Set content type to image/jpeg.
iter8 launch -c load-test-http --noDownload \
--set url=http://127.0.0.1/post \
--set payloadURL=https://cdn.pixabay.com/photo/2021/09/08/17/58/poppy-6607526_1280.jpg \
--set contentType="image/jpeg"
To learn more about all the parameters of the load-test-http chart and their default values, please refer to the chart's values.yaml file.