みなさん、こんにちは!プロダクト開発部の西原です。
現在、JMDCが保有している医療ビッグデータを活用して生活者や医療に新しい価値を提供する新規プロダクト開発チームのバックエンドを担当しております。
皆さんは普段プロダクト開発の際にパフォーマンステストはどのツールを使用していますでしょうか。私が所属する新規プロダクト開発のパフォーマンステストでは「Ddosify」というツールを使用しました。 今回はこちらの基本的な使い方についてご紹介致します。
Ddosifyとは
Ddosifyは、Goで書かれたパフォーマンステストツールになります。
JSONファイルを使用してシナリオを作成することができます。シナリオを定義することで、異なるリクエストパス、ヘッダー、ボディを持つ複雑なテストケースを作成できます。
加えてDdosifyはDdosify Engine、Ddosify Self-Hosted、Ddosify Cloudの3つの機能が提供されています。 Ddosify Engineは単一ノードのCLIです。一方でDdosify Self-HostedとDdosify Cloudは分散型のテストができるGUIとなっています。 3つの機能の詳細についてはこちらからご覧いただけます。
インストール
前提として、新規プロダクト開発ではDdosify EngineのCLIを使用したため、今回はCLIでのインストール方法を記載致します。
インストール方法は多岐に渡ります。Docker、Homebrewを介して入手できるのはもちろん、 macOS、Linux、Windows からでもインストール可能です。詳細はリファレンスからダウンロード可能です。
新規プロダクト開発ではDockerを使用してDdosifyをインストールしたため、本ブログでもDockerでのインストール方法を記載します。 以下のコマンドを実行してください。
$ docker run -it --rm ddosify/ddosify
以下のような状態になればインストールが完了となります。
$ docker run -it --rm ddosify/ddosify Unable to find image 'ddosify/ddosify:latest' locally latest: Pulling from ddosify/ddosify 9981e73032c8: Pull complete 4f4fb700ef54: Pull complete 212729c4f9a1: Pull complete 48270dbdbe33: Pull complete 707e092ef671: Pull complete 7cab27f10efd: Pull complete Digest: sha256:43bf97b8838be748be01d5f9f1543b08e144ebce279b5c6b0cd363b6469a7b01 Status: Downloaded newer image for ddosify/ddosify:latest __ __ _ ____ ____/ /____/ /____ _____ (_)/ __/__ __ / __ // __ // __ \ / ___// // /_ / / / / / /_/ // /_/ // /_/ /(__ )/ // __// /_/ / \__,_/ \__,_/ \____//____//_//_/ \__, / /____/ Simple usage: ddosify -t targetsite.com ~ #
クイックスタート
Ddosifyにはクイックスタートという機能があります。 シナリオファイルを用意しなくても該当のコマンドを実行することで簡単にパフォーマンステストを実行できます。
今回はDdosifyが起動できている状態で、検証したい環境のパフォーマンステストを実行するとします。
以下のコマンドを実行します。(対象のURLはあくまで例になります)
~ # ddosify -t https://example.com
上記のコマンドは、デフォルト値である 10 秒間に100リクエスト(反復回数)を送信してパフォーマンステストを実行します。 実行すると、以下のような結果が出力されます。(出力結果はあくまで例であり、実際の結果は異なる場合があります)
~ # ddosify -t https://example.com ⚙️ Initializing... 🔥 Engine fired. 🛑 CTRL+C to gracefully stop. ✔️ Successful Run: 0 0% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.00000s ✔️ Successful Run: 29 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.83295s ✔️ Successful Run: 44 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.56659s ✔️ Successful Run: 59 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.43449s ✔️ Successful Run: 74 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.35564s ✔️ Successful Run: 89 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.30363s ✔️ Successful Run: 100 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.27496s RESULT ------------------------------------- Success Count: 100 (100%) Failed Count: 0 (0%) Durations (Avg): DNS :0.2117s Connection :0.0084s TLS :0.0065s Request Write :0.0004s Server Processing :0.0478s Response Read :0.0003s Total :0.2750s Status Code (Message) :Count 200 (OK) :100 Test Status : Success
実行結果(Success Count以降)が出力されていることを確認できます。 ここからパフォーマンステストの詳細の結果が分かります。各項目の内容は以下に記載致します。
項目 | 説明 |
---|---|
Success Count | 成功したリクエストの数 |
Failed Count | 失敗したリクエストの数 |
Durations (Avg) | 各ステップの平均所要時間 |
DNS | DNS解決にかかった平均時間 |
Connection | 接続確立にかかった平均時間 |
TLS | TLSハンドシェイクにかかった平均時間 |
Request Write | リクエスト書き込みにかかった平均時間 |
Server Processing | サーバー処理にかかった平均時間 |
Response Read | レスポンス読み込みにかかった平均時間 |
Total | 全体のリクエスト処理にかかった平均時間 |
Status Code | ステータスコード(メッセージ)ごとのカウント |
また、オプションフラグを使ってリクエスト数や実行時間もカスタマイズできます。
例)-nオプションで合計リクエスト数を100、-dオプションで実行時間を10秒に設定する
~ # ddosify -t https://example.com -n 100 -d 10
その他にも様々なオプションが用意されていますので詳細はリファレンスをご覧ください。
シナリオベースでパフォーマンステストを行う
クイックスタートで簡単にパフォーマンステストが実行できました。 次にシナリオファイルを使った方法をご紹介致します。 シナリオファイルを使うことでより詳細にパフォーマンステストを実施できます。
① シナリオファイルの作成
今回は例として「ログインAPI」と「ログアウトAPI」があるWebアプリケーションのシナリオを作成するとします。 Ddosifyを起動している前提で、config.jsonとpayload_file.jsonを作成します。
以下が作成したシナリオファイルです。最初のファイルは、テストシナリオのロジックを含む構成ファイルです。2 番目のファイルには、リクエストの JSON ペイロードが含まれています。
// config.json { "request_count": 100, "load_type": "linear", "duration": 20, "output": "stdout", "env": { "access_token": "sample_access_token" }, "steps": [ { "id": 1, "name": "Login", "url": "https://example.com/login", "method": "POST", "headers": { "Content-Type": "application/json", "Authorization": "Bearer {{access_token}}" }, "payload_file": "./payload.json" }, { "id": 2, "name": "Logout", "url": "https://example.com/logout", "method": "POST", "headers": { "Content-Type": "application/json", "Authorization": "Bearer {{access_token}}" }, "payload_file": "./payload.json" } ] }
// payload.json { "email": "test@example.com", "password": "testpassword" }
各パラメータの詳細
各パラメータの詳細について記載致します。 今回ご紹介させていただくパラメータは実際に新規プロダクトでもシナリオファイルで使用しております。
まず、環境設定周りのパラメータについてです。 以下の項目でリクエスト数や実行時間、さらに環境変数の設定を行なっています。
{ "iteration_count": 100, "load_type": "linear", "duration": 20, "output": "stdout", "env": { "access_token": "sample_access_token" } // 省略 }
フィールド | 説明 |
---|---|
iteration_count | シミュレーションの繰り返し回数 |
load_type | 負荷の生成方法を指定。"linear"と指定されている場合、負荷は均等に増加する |
duration | シミュレーションの持続時間 |
output | シミュレーション結果の出力方法。"stdout"と指定されている場合、標準出力に結果が表示される |
env | シナリオ内で使用される環境変数。"access_token"という名前の環境変数が"sample_access_token"という値で設定されている |
続いてパフォーマンス対象のAPIの設定周りです。 各APIはstepsフィールドにまとめられます。
{ // 省略 "steps": [ { "id": 1, "name": "Login", "url": "https://example.com/login", "method": "POST", "headers": { "Content-Type": "application/json", "Authorization": "Bearer {{access_token}}" }, "payload_file": "./payload.json" }, { "id": 2, "name": "Logout", "url": "https://example.com/logout", "method": "POST", "headers": { "Content-Type": "application/json", "Authorization": "Bearer {{access_token}}" }, "payload_file": "./payload.json" } ] }
フィールド | 説明 |
---|---|
id | ステップの識別子 |
name | ステップの名前 |
url | リクエストを送信する対象のURL |
method | リクエストのHTTPメソッド |
headers | リクエストに含まれるヘッダー情報 |
payload_file | リクエストのペイロード(データ本体)を含むファイルのパス |
② シナリオテストの実行
シナリオファイルを作成したら、早速テストを実行してみましょう。
実行コマンドは以下になります。
~ # ddosify -config ./config.json
以下が実行結果の例です。
~ # ddosify -config ./config.json ⚙️ Initializing... 🔥 Engine fired. 🛑 CTRL+C to gracefully stop. ✔️ Successful Run: 0 0% ❌ Failed Run: 0 0% ⏱️ Avg. DuratioDuration: 0.00000s ✔️ Successful Run: 5 100% ❌ Failed Run: 0 0% ⏱️ Avg. Durationn: 0.00000s ✔️ Successful Run: 0 0% ❌ Failed Run: 0 0% ⏱️ Avg. : 1.56731s ✔️ Successful Run: 30 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 1.87639s ✔️ Successful Run: 39 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 1.45212s ✔️ Successful Run: 45 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 1.26377s ✔️ Successful Run: 54 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 1.05931s ✔️ Successful Run: 60 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.95715s ✔️ Successful Run: 69 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.83747s ✔️ Successful Run: 75 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.77352s ✔️ Successful Run: 84 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.69481s ✔️ Successful Run: 90 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.65150s ✔️ Successful Run: 99 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.59572s ✔️ Successful Run: 100 100% ❌ Failed Run: 0 0% ⏱️ Avg. Duration: 0.59063s RESULT ------------------------------------- 1. Step 1 --------------------------------- Success Count: 100 (100%) Failed Count: 0 (0%) Durations (Avg): DNS :0.1312s Connection :0.0022s Request Write :0.0003s Server Processing :0.0455s Response Read :0.0001s Total :0.1819s Status Code (Message) :Count 200 (OK) :100 2. Step 2 --------------------------------- Success Count: 100 (100%) Failed Count: 0 (0%) Durations (Avg): DNS :0.3427s Connection :0.0057s Request Write :0.0003s Server Processing :0.0525s Response Read :0.0001s Total :0.4087s Status Code (Message) :Count 200 (OK) :100
プロダクトで使ってみた感想
【よかったこと】
過去に使用したパフォーマンステストツールではシナリオファイルのフォーマットがXMLで個人的に馴染みがあまりありませんでした。一方で、DdosifyではJSON形式でシナリオを作成できるため、XMLよりも直感的で読みやすく、メンテナンスもしやすい点が良かったです。
また、普段Dockerを使用して開発を行っているため、コンテナ上でDdosifyを実行できるところも魅力でした。実際のプロダクト開発ではDdosify用のDockerfileと設定ファイルをリポジトリで管理しています。
【ハマったこと】
参考記事が少なく情報量が少なかったです。そのためキャッチアップには少なからず時間が必要だと感じました。
終わりに
JMDCでは新規プロダクト開発のバックエンドエンジニアを募集しております! ヘルスケア領域の課題解決に一緒に取り組んでいただける方、ぜひこちらをご覧ください。 加えて、私の所属している新規プロダクト開発チームのバックエンド以外にも、EM/フロントエンド /バックエンド/ データベースエンジニア等、様々なポジションで募集をしています。詳細は下記の募集一覧からご確認ください。 hrmos.co
まずはカジュアルにJMDCメンバーと話してみたい/経験が活かせそうなポジションの話を聞いてみたい等ございましたら、下記よりエントリーいただけますと幸いです。 hrmos.co
★最新記事のお知らせはぜひTwitterをご覧ください! twitter.com