# Goku [![Rust](https://github.com/jcaromiq/goku/actions/workflows/ci.yml/badge.svg)](https://github.com/jcaromiq/goku/actions/workflows/ci.yml) [![](https://img.shields.io/crates/v/goku-bench.svg?ts=2)](https://crates.io/crates/goku-bench) ![Goku](https://raw.githubusercontent.com/jcaromiq/goku/main/assets/goku.png) Goku is a high-performance, scalable HTTP load-testing tool designed for benchmarking and performance analysis of web services. Inspired by tools like [Drill](https://github.com/fcsonline/drill) and [Vegeta](https://github.com/tsenart/vegeta), Goku offers modern features and simplicity for engineers to simulate and analyze traffic efficiently. ## Features * Fast and scalable HTTP load testing * Supports structured, real-time metrics * Detailed performance analytics ## Install ### Automatic download (Linux, OSX, WSL) You can download the latest version of Goku directly to your current directory with the following command: ```bash curl -sSL https://raw.githubusercontent.com/jcaromiq/goku/v1.1.7/scripts/install.sh | sh ``` ### Using Cargo ```bash cargo install goku-bench goku --version ``` ### Manual download Go to the Goku's [GitHub Releases page](https://github.com/jcaromiq/goku/releases) and download the latest `.tar.gz` file that matches your system. Currently, tarballs are available for the following: * Linux (x86_64) * macOS (x86_64) * Windows (x86_64) ### Source As a requirement, you need `rust` installed: ```shell $ cargo build --release ``` ## Versioning CLI is versioned with [SemVer v2.0.0](https://semver.org/spec/v2.0.0.html). ## Contributing See [CONTRIBUTING.md](.github/CONTRIBUTING.md). ## Usage manual ```console Usage: goku [OPTIONS] --target Options: -v, --verbose Runs in verbose mode -t, --target URL to be requested using an operation [default: GET] Ex. GET http://localhost:3000/ -r, --request-body File path for the request body -c, --clients Number of concurrent clients [default: 1] -i, --iterations Total number of iterations [default: 1] -d, --duration Duration of the test in second --headers Headers, multi value in format headerName:HeaderValue --scenario Scenario file -h, --help Prints help -V, --version Prints version information ``` #### `--target` `-t` Specifies the operation and url to make the request, default to GET.
Format: GET https://localhost:3000
#### `--request-body` `-r` Optional Specifies the path of file with the body to send.
#### `--clients` `-c` Specifies the number of concurrent calls to be used, defaults to 1. #### `--iterations` `-i` Specifies the total number of calls to be performed, default to 1. #### `--duration` `-d` Specifies the duration of the test in seconds. #### `--headers` Optional Specifies the headers to be sent.
#### `--scenario` Optional Specifies the scenario file in yaml format.
````yaml target: POST http://localhost:3000/ clients: 50 requests: 1000 headers: - key: "bar" value: "foo" - key: "Content-Type" value: "application/json" body: "{\"firstName\": \"Terry\", \"lastName\": \"Medhurst\", \"maidenName\": \"Smitham\", \"age\": 50}" ```` #### `--help` Prints help. #### `--version` Prints version information. ###### Simple targets ``` goku --target "GET http://localhost:3000" goku --target http://localhost:3000?foo=bar goku -c 50 -i 1000 --target http://localhost:3000 goku -c 50 --duration 60 --target http://localhost:3000 ``` ###### Targets with custom headers ``` goku --target "GET http://localhost:3000" --headers Content-Type:application/json --headers bar:foo ``` ###### Targets with custom bodies ``` goku -c 50 -i 1000 -r body.json --target "POST http://localhost:3000" ``` ###### Targets with custom bodies and headers ``` goku -r body.json --target "POST http://localhost:3000" --headers Content-Type:application/json --headers bar:foo ``` ###### Output ``` Concurrency level 50 Time taken 4 seconds Total requests 1000 Mean request time 169.90099999999998 ms Max request time 415 ms Min request time 5 ms 95'th percentile: 319 ms 99.9'th percentile: 367 ms ``` ## License See [LICENSE](LICENSE). ## Donate If you appreciate all the job done in this project, a small donation is always welcome: [!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/jcaro)