GCPインスタンスでのheyインストール方法

## 概要
- GCPのインスタンスにheyをインストールする方法です。
- heyとは
    - heyは、Go言語で書かれたHTTP負荷テストツールです。

## 参考URL
- [hey](https://github.com/rakyll/hey)
- [Goの最新バージョン](https://go.dev/dl/)
    - 2024年2月時点での最新バージョンは、go1.22.0です。

## 環境
- GCPのComputeEngineなどのVMインスタンス。
- OSはDebian系(Ubuntu, Debian, etc)を想定。

## 事前準備
- 事前にGCPのインスタンスを作成しておく。
- インスタンスにSSHでログインしておく。
    - マネジメントコンソール > ComputeEngine > VMインスタンス > SSHをクリックすると、SSHでログインできます。

## インストール手順
- SSHで接続したターミナルで以下のコマンドを実行します。
- Goのインストール
    ```bash
    wget https://dl.google.com/go/go1.22.0.linux-amd64.tar.gz
    sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
    ```

- 環境変数の設定
    ```bash
    export PATH=$PATH:/usr/local/go/bin
    source ~/.profile
    ```

    ```bash
    echo 'export PATH=$PATH:$HOME/go/bin' >> ~/.bashrc
    source ~/.bashrc
    ```

- Goのバージョン確認
    - `go version go1.22.0 linux/amd64` などのように表示されればOKです。
    ```bash
    go version
    ```

- heyのインストール
    ```bash
    go install github.com/rakyll/hey@latest
    ```

- heyがインストールされたか確認
    ```bash
    hey -h
    ```
    - 以下のように表示されればOKです。
    ```
    flag needs an argument: -h
    Usage: hey [options...] <url>

    Options:
    -n  Number of requests to run. Default is 200.
    -c  Number of workers to run concurrently. Total number of requests cannot
        be smaller than the concurrency level. Default is 50.
    -q  Rate limit, in queries per second (QPS) per worker. Default is no rate limit.
    -z  Duration of application to send requests. When duration is reached,
        application stops and exits. If duration is specified, n is ignored.
        Examples: -z 10s -z 3m.
    -o  Output type. If none provided, a summary is printed.
        "csv" is the only supported alternative. Dumps the response
        metrics in comma-separated values format.

    -m  HTTP method, one of GET, POST, PUT, DELETE, HEAD, OPTIONS.
    -H  Custom HTTP header. You can specify as many as needed by repeating the flag.
        For example, -H "Accept: text/html" -H "Content-Type: application/xml" .
    -t  Timeout for each request in seconds. Default is 20, use 0 for infinite.
    -A  HTTP Accept header.
    -d  HTTP request body.
    -D  HTTP request body from file. For example, /home/user/file.txt or ./file.txt.
    -T  Content-type, defaults to "text/html".
    -a  Basic authentication, username:password.
    -x  HTTP Proxy address as host:port.
    -h2 Enable HTTP/2.

    -host HTTP Host header.

    -disable-compression  Disable compression.
    -disable-keepalive    Disable keep-alive, prevents re-use of TCP
                            connections between different HTTP requests.
    -disable-redirects    Disable following of HTTP redirects
    -cpus                 Number of used cpu cores.
                            (default for current machine is 2 cores)
    ```

## オプション解説
-n: 実行するリクエストの総数を指定します。デフォルトは200です。

-c: 同時に実行するワーカー（スレッドまたはプロセス）の数を指定します。全リクエスト数はこの同時実行レベルよりも小さくできません。デフォルトは50です。

-q: ワーカーごとの秒間クエリ数（QPS）でレート制限を設定します。デフォルトではレート制限はありません。

-z: リクエストの送信を続ける期間を指定します。この期間が経過すると、アプリケーションは停止して終了します。期間が指定された場合、-nオプションは無視されます。例: -z 10s（10秒間）、-z 3m（3分間）。

-o: 出力タイプを指定します。指定がない場合はサマリーが印刷されます。"csv"はサポートされている唯一の代替フォーマットで、レスポンスメトリクスをCSVフォーマットでダンプします。

-m: HTTPメソッドを指定します。GET, POST, PUT, DELETE, HEAD, OPTIONSのいずれか。

-H: カスタムHTTPヘッダーを指定します。必要な数だけフラグを繰り返して指定できます。例: -H "Accept: text/html" -H "Content-Type: application/xml".

-t: 各リクエストのタイムアウトを秒単位で指定します。デフォルトは20秒です。無限にするには0を使用します。

-A: HTTP Acceptヘッダーを指定します。

-d: HTTPリクエストボディを指定します。

-D: ファイルからHTTPリクエストボディを指定します。例: /home/user/file.txtや./file.txt。

-T: Content-Typeを指定します。デフォルトは"text/html"です。

-a: ベーシック認証をusername:passwordの形式で指定します。

-x: host:port形式でHTTPプロキシアドレスを指定します。

-h2: HTTP/2を有効にします。

-host: HTTP Hostヘッダーを指定します。

-disable-compression: 圧縮を無効にします。

-disable-keepalive: Keep-Aliveを無効にし、異なるHTTPリクエスト間でTCP接続の再利用を防ぎます。

-disable-redirects: HTTPリダイレクトの追跡を無効にします。

-cpus: 使用するCPUコアの数を指定します。デフォルトは現在のマシンのコア数に基づいています。



## heyのコマンド例
- 条件：1秒あたり10リクエストを50ワーカーで60秒間継続してリクエストを送信する場合
    - ワーカー数c: 50
    - 秒間クエリq: 10
    - リクエスト継続時間z: 60秒
    - リクエストメソッドm: POST
    - コンテンツタイプT: application/json
    - リクエストボディd: {"name": "john", "age": 30, "job": "engineer"}
    - リクエストURL: https://example.com/api/v1/users
    ```bash
    hey -c 50 -q 10 -z 60s -m POST -T application/json -d '{"name": "john", "age": 30, "job": "engineer"}' https://example.com/api/v1/users
    ```
- このように、heyを使って、HTTPリクエストを送信することで、Webサーバーの負荷テストを行うことができます。
- 上記の例でのheyコマンドの実行結果は、以下のようになります。テキスト形式での結果が表示されます。
    ```bash
    Summary:
    Total:        60.1276 secs
    Slowest:      0.5428 secs
    Fastest:      0.1239 secs
    Average:      0.1284 secs
    Requests/sec: 388.3577

    Total data:   10110983 bytes
    Size/request: 433 bytes

    Response time histogram:
    0.124 [1]     |
    0.166 [23300] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    0.208 [0]     |
    0.250 [0]     |
    0.291 [0]     |
    0.333 [0]     |
    0.375 [0]     |
    0.417 [0]     |
    0.459 [31]    |
    0.501 [13]    |
    0.543 [6]     |


    Latency distribution:
    10% in 0.1259 secs
    25% in 0.1267 secs
    50% in 0.1276 secs
    75% in 0.1284 secs
    90% in 0.1295 secs
    95% in 0.1301 secs
    99% in 0.1323 secs

    Details (average, fastest, slowest):
    DNS+dialup:   0.0007 secs, 0.1239 secs, 0.5428 secs
    DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0040 secs
    req write:    0.0000 secs, 0.0000 secs, 0.0059 secs
    resp wait:    0.1276 secs, 0.1238 secs, 0.2294 secs
    resp read:    0.0000 secs, 0.0000 secs, 0.0009 secs

    Status code distribution:
    [404] 23351 responses
    ```

- 以上で、GCPインスタンスでのheyインストール方法の説明を終わります。