oha (おはよう)

GitHub Actions Crates.io Arch Linux Homebrew Gitter

oha is a tiny program that sends some load to a web application and show realtime tui inspired by rakyll/hey.

This program is written in Rust and powered by tokio and beautiful tui by tui-rs.

demo

Installation

This program is built on stable Rust.

cargo install oha

You can optionally build oha against rustls instead of native-tls.

cargo install --no-default-features --features rustls oha

On Arch Linux

pacman -S oha

On macOS (Homebrew)

brew install oha

On Debian (Azlux's repository)

echo "deb http://packages.azlux.fr/debian/ buster main" | sudo tee /etc/apt/sources.list.d/azlux.list
wget -qO - https://azlux.fr/repo.gpg.key | sudo apt-key add -
apt update
apt install oha

Platform

Usage

-q option works different from rakyll/hey. It's set overall query per second instead of for each workers.

``` oha 0.5.2 hatoo hato2000@gmail.com Ohayou(おはよう), HTTP load generator, inspired by rakyll/hey with tui animation.

USAGE: oha [FLAGS] [OPTIONS]

ARGS: Target URL.

OPTIONS: -n Number of requests to run. [default: 200]

-c <N_WORKERS>
        Number of workers to run concurrently. You may should increase limit to number of open
        files for larger `-c`. [default: 50]

-z <DURATION>
        Duration of application to send requests. If duration is specified, n is ignored.
        Examples: -z 10s -z 3m.

-q <QUERY_PER_SECOND>
        Rate limit for all, in queries per second (QPS)

    --latency-correction
        Correct latency to avoid coordinated omission problem. It's ignored if -q is not set.

    --no-tui
        No realtime tui

    --fps <FPS>
        Frame per second for tui. [default: 16]

-m, --method <METHOD>
        HTTP method [default: GET]

-H <HEADERS>
        Custom HTTP header. Examples: -H "foo: bar"

-t <TIMEOUT>
        Timeout for each request. Default to infinite.

-A <ACCEPT_HEADER>
        HTTP Accept Header.

-d <BODY_STRING>
        HTTP request body.

-D <BODY_PATH>
        HTTP request body from file.

-T <CONTENT_TYPE>
        Content-Type.

-a <BASIC_AUTH>
        Basic authentication, username:password

    --http-version <HTTP_VERSION>
        HTTP version. Available values 0.9, 1.0, 1.1, 2.

    --host <HOST>
        HTTP Host header

    --disable-compression
        Disable compression.

-r, --redirect <REDIRECT>
        Limit for number of Redirect. Set 0 for no redirection. [default: 10]

    --disable-keepalive
        Disable keep-alive, prevents re-use of TCP connections between different HTTP requests.

    --ipv6
        Lookup only ipv6.

    --ipv4
        Lookup only ipv4.

    --insecure
        Accept invalid certs.

    --connect-to <CONNECT_TO>
        Override DNS resolution and default port numbers with strings like
        'example.org:443:localhost:8443'

-h, --help
        Print help information

-V, --version
        Print version information

```

Tips

Stress test in more realistic conditon

oha uses default options inherited from rakyll/hey but you may need to change options to stress test in more realistic condition.

I suggest to run oha with following options. oha <-z or -n> -c <number of concurrent connections> -q <query per seconds> --latency-correction --disable-keepalive <target-address>

Contribution

Feel free to help us!

Here are some issues to improving.