alpine-bench

An Alpine Docker image which runs Apache Bench and parses its results

Stars
28

alpine-bench

alpine-bench is useful for running Apache Bench in your cluster to gather latency metrics from your services. It does this by:

  1. Running Apache Bench using provided options
  2. Parsing the results into a JSON data structure and printing them to stdout

This makes it useful for running from your automation (e.g. CI/CD) and making decisions based on the results. For example, in a CD pipeline it can be useful to deploy a new build to dev, measure its latency, and if the result is within some threshold, proceed to prod rollout.

Usage

Nearly all of ab's options can simply be passed in using Docker's normal cmd mechnaism, e.g.:

docker run -it --rm -t devth/alpine-bench -n3 http://google.com/

Sample output:

{
  "connect": {
    "max": 154,
    "mean": 69,
    "median": 66,
    "min": 54,
    "stdDev": 18.60000038147
  },
  "percentiles": {
    "100": 340,
    "50": 258,
    "66": 264,
    "75": 269,
    "80": 283,
    "90": 291,
    "95": 296,
    "98": 340,
    "99": 340
  },
  "processing": {
    "max": 274,
    "mean": 196,
    "median": 196,
    "min": 142,
    "stdDev": 18.60000038147
  },
  "total": {
    "max": 340,
    "mean": 266,
    "median": 258,
    "min": 250,
    "stdDev": 18.799999237061
  },
  "waiting": {
    "max": 274,
    "mean": 196,
    "median": 196,
    "min": 141,
    "stdDev": 18.60000038147
  }
}

The output can be parsed by your CI tool to make decisions about whether to rollout a deployment (or whatever else you might want to do).

Special options

Options which require reading from a file can be passed in via ENV instead. Internally the contents will be written to a file and the corresponding ab option will be used.

Example

docker run -e 'POST=post body' -it --rm -t devth/alpine-bench -n3 http://google.com/

Options

ab Option Env Var
-p POST-file POST
-u PUT-file PUT

Unsupported options

Options which cause ab to write to a file are not supported.

  • -e csv-file
  • -g gnuplot-file

They will work, but the resulting file will be lost inside the Docker container when it terminates.

Get a shell in the container

docker run -it --rm --entrypoint sh devth/alpine-bench

Development

Build the image, obtain your docker machine IP, run an Nginx container to measure, and run alpine-bench against it:

docker build -t devth/alpine-bench .
export DM_IP=$(dm ip dev)
docker run -p 8080:80 -it --rm nginx:alpine
docker run -it --rm devth/alpine-bench -n3 http://$DM_IP:8080/

Or run it outside of Docker:

POST='post body' go run main.go -n3 http://$DM_IP:8080/

In your nginx logs you'll see something like:

172.17.0.1 - - [14/Jun/2016:20:20:42 +0000] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3" "-"
172.17.0.1 - - [14/Jun/2016:20:20:42 +0000] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3" "-"
172.17.0.1 - - [14/Jun/2016:20:20:42 +0000] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3" "-"

License

Copyright 2016 Trevor C. Hartman. Distributed under the MIT license.