ドッカー を利用した自己ホスト環境


Bencherとは何ですか?

Bencherは、連続ベンチマーキングツールのスイートです。 パフォーマンスの後退があなたのユーザーに影響を与えたことはありますか? Bencherなら、それが起こるのを防げた可能性があります。 Bencherは、パフォーマンスの低下を_productionに到達する_前に検出し、防止することを可能にします。

  • 実行: お気に入りのベンチマーキングツールを使用してベンチマークをローカルまたはCIで実行します。 bencher CLIは単にあなたの既存のベンチマークハーネスをラップし、その結果を保存します。
  • 追跡: ベンチマークの結果を時間と共に追跡します。ソースブランチ、テストベッド、測定基準に基づいてBencherのWebコンソールを使用して結果を監視、クエリ、グラフ化します。
  • キャッチ: CIでパフォーマンスの後退をキャッチします。Bencherは最先端のカスタマイズ可能な分析を使用して、パフォーマンスの後退がProductionに到達する前にそれを検出します。

機能の後退を防ぐためにユニットテストがCIで実行されるのと同じ理由で、Bencherを使用してCIでベンチマークを実行してパフォーマンスの後退を防ぐべきです。パフォーマンスのバグはバグです!


Bencherはオープンソースで自己ホストが可能です。 もしBencher Cloudを利用に興味があるなら、Bencher Cloudクイックスタートチュートリアルを確認してください。 このチュートリアルでは、Dockerを使用したBencher Self-Hostedのセットアップ方法を説明します。

🐰 Bencher Self-Hostedを使いこなせるようになったら、次のリソースをご覧ください:


Docker をインストールする

このチュートリアルのUIとAPIサーバーを実行するには、dockerがインストールされている必要があります。 dockerがインストールされているかどうかを確認してください。

実行: docker --version

すると、以下のような表示がなされます:

$ docker --version
Docker version 20.10.17, build 100c701

バージョン番号が異なっていても構いません。このコマンドが動作することが重要です。 もし動作しない場合は、dockerのインストール手順に従ってください。


bencher CLIのインストール

Linux、Mac、およびUnix

Linux、Mac、およびその他のUnix系システムでは、ターミナルで以下を実行します:

Terminal window
curl --proto '=https' --tlsv1.2 -sSfL https://bencher.dev/download/install-cli.sh | sh

Windows

Windowsシステムでは、以下のように_PowerShell_ターミナルで実行します:

Terminal window
irm https://bencher.dev/download/install-cli.ps1 | iex

🐰 このシステムではスクリプトの実行が無効化されていますというエラーが表示される場合:

  • 管理者として実行Powershellを開く
  • 以下を実行: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  • 次に入力:Y
  • このスクリプトを再実行

追加のインストールオプションについては、bencher CLIのインストール方法を参照してください。

今度は、bencher CLIがインストールされていることをテストしましょう。

実行: bencher --version

次のように表示されるはずです:

$ bencher --version
bencher 0.3.26

Bencher UI&APIサーバーを実行する

dockerがインストールされていれば、UIとAPIサーバーを実行できます。

実行コマンド:bencher up

以下のような表示がされます:

$ bencher up
Pulling `ghcr.io/bencherdev/bencher-api:latest` image...
Creating `bencher_api` container...
Starting `bencher_api` container...
Pulling `ghcr.io/bencherdev/bencher-console:latest` image...
Creating `bencher_console` container...
Starting `bencher_console` container...
🐰 Bencher Self-Hosted is up and running!
Web Console: http://localhost:3000
API Server: http://localhost:61016
Press Ctrl+C to stop Bencher Self-Hosted.
🐰 Bencher Self-Hosted logs...
Jan 08 16:49:07.727 INFO 🐰 Bencher API Server v0.4.2
...

出力が少し違っていても大丈夫です。このコマンドが動作すればそれで問題ありません。

🐰 ghcr.ioから: "authentication required"というエラーメッセージが表示される場合は、 docker logout ghcr.ioを実行してみてください。

🐰 Windows上で: image operating system "linux" cannot be used on this platform: operating system is not supportedというエラーが出る場合は、 & 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchLinuxEngineを実行してみてください。

Bencher APIサーバーログ

まだAPIサーバーで電子メール/SMTPを設定していないため、チュートリアルの後半で受け取る認証コードは、上記のようにサーバーログに表示されます。 つまり、認証情報はbencher upの出力に表示されます。


Bencher ホストの設定

bencher CLIのデフォルトホストはBencher Cloud (つまり https://api.bencher.dev )です。 したがって、あなたのホスト名を設定する必要があります。これを行う最も簡単な方法は、BENCHER_HOST 環境変数を使用することです。

新しいターミナルウィンドウを開きます。

Linux、Mac、およびその他のUnix系システムで実行: export BENCHER_HOST=http://localhost:61016

Windowsで実行: $env:BENCHER_HOST = "http://localhost:61016"

その後、echo $BENCHER_HOST または Write-Output $env:BENCHER_HOST をそれぞれ実行します。

次のことが表示されます:

$ echo $BENCHER_HOST
http://localhost:61016

ベンチャーセルフホストアカウントの作成

Bencher Self-Hostedに登録する


以下のURLに進んで、ローカルのBencher Self-Hostedインスタンスにアカウントを作成します:http://localhost:3000/auth/signup

アカウントを作成したら、bencher upを実行したターミナルウィンドウに戻ります。 次のような表示がされるはずです:

To: Saul Goodman <saul@bettercallsaul.com>>
Subject: Confirm Bencher Signup
Body:
Ahoy Saul Goodman,
Please, click the button below or use the provided code to signup for Bencher.
Confirm Email: http://localhost:3000/auth/confirm?plan=free&token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhdXRoIiwiZXhwIjoxNzA0ODIwODIxLCJpYXQiOjE3MDQ4MTkwMjEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC8iLCJzdWIiOiJzYXVsQGJldHRlcmNhbGxzYXVsLmNvbSIsIm9yZyI6bnVsbH0.CKW4-MyOqY0AnRbs9h8tBtyAB6ck51PytytTsZSBOiA
Confirmation Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhdXRoIiwiZXhwIjoxNzA0ODIwODIxLCJpYXQiOjE3MDQ4MTkwMjEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC8iLCJzdWIiOiJzYXVsQGJldHRlcmNhbGxzYXVsLmNvbSIsIm9yZyI6bnVsbH0.CKW4-MyOqY0AnRbs9h8tBtyAB6ck51PytytTsZSBOiA
See you soon,
The Bencher Team
Bencher - Continuous Benchmarking
Manage email settings (http://localhost:3000/help)

ブラウザでConfirm Emailリンクに移動するか、Confirmation Tokenをコピーして、以下のURLのConfirm Tokenフィールドに貼り付けて下さい:http://localhost:3000/auth/confirm

それを行った後、Bencher Self-Hostedのアカウントにログインすることができるはずです!


APIトークンの生成

Bencher APIを使用するためには、APIトークンを生成する必要があります。 Bencherコンソールに移動します。 右上隅のあなたの名前の上にマウスを持って行きます。 ドロップダウンメニューが表示されるはずです。Tokensを選択します。 APIトークンページに移動したら、➕ Addボタンをクリックします。

APIトークンの追加


新しいAPIトークンを生成したら、それをクリップボードにコピーする必要があります。 作業予定のターミナルで、APIトークンを環境変数としてエクスポートします。

Linux、Mac、その他のUnix系システムでは、次のように実行します: export BENCHER_API_TOKEN=YOUR_TOKEN

Windowsでは、次のように実行します: $env:BENCHER_API_TOKEN = "YOUR_TOKEN"

その後、echo $BENCHER_API_TOKENまたはWrite-Output $env:BENCHER_API_TOKENを実行します。

以下のように表示されるはずです:

$ echo $BENCHER_API_TOKEN
YOUR_TOKEN

🐰 注意: 別のターミナルに移動する場合、APIトークンを再度エクスポートする必要があります。


プロジェクトを作成する

ユーザーアカウントとAPIトークンを取得したので、プロジェクトを作成することができます。 まず、新しいプロジェクトが所属する組織を知る必要があります。

実行:bencher org ls

以下のような結果が表示されます:

$ bencher org ls
[
{
"name": "Saul Goodman",
"slug": "saul-goodman",
"uuid": "4581feb0-6cac-40a9-bd8a-d7865183b01e"
"created": "2022-07-06T11:24:36Z",
"modified": "2022-07-06T11:24:36Z"
}
]

あなたの出力は上記と少し異なるはずです:

  • uuidは疑似ランダムです
  • nameslugはあなたのユーザー名に基づいています
  • createdmodifiedのタイムスタンプは、あなたが登録した時刻になります

では、その組織内に新しいプロジェクトを作成できます。 以下のコマンドの--org引数に、組織のslug(つまり、YOUR_ORG_SLUG)を代入します。

実行:bencher project create --org YOUR_ORG_SLUG --url http://www.savewalterwhite.com "Save Walter White"

以下のような結果を見るはずです:

$ bencher project create --org saul-goodman --url http://www.savewalterwhite.com "Save Walter White"
{
"organization": "4581feb0-6cac-40a9-bd8a-d7865183b01e",
"name": "Save Walter White",
"slug": "save-walter-white-12345",
"uuid": "c6c2a8e8-685e-4413-9a19-5b79053a71b1"
"url": "http://www.savewalterwhite.com",
"public": true,
"created": "2022-07-06T11:36:24Z",
"modified": "2022-07-06T11:36:24Z"
}

再度、あなたの出力は上記の結果と少し異なるはずです。 大切なのは、このコマンドが動作することです。 プロジェクトのslugフィールド(つまり、save-walter-white-12345)を記録しておいてください。


レポートを実行する

ついにベンチマークのメトリックを収集する準備が整いました! このチュートリアルでは簡単のため、モックデータを使用します。

実行:bencher mock

以下のような結果が表示されます:

$ bencher mock
{
"bencher::mock_0": {
"latency": {
"value": 3.7865423396154463,
"lower_value": 3.4078881056539014,
"upper_value": 4.165196573576991
}
},
"bencher::mock_1": {
"latency": {
"value": 16.398332128878437,
"lower_value": 14.758498915990593,
"upper_value": 18.03816534176628
}
},
"bencher::mock_2": {
"latency": {
"value": 20.88091359871672,
"lower_value": 18.792822238845048,
"upper_value": 22.969004958588393
}
},
"bencher::mock_3": {
"latency": {
"value": 33.88103801203782,
"lower_value": 30.492934210834036,
"upper_value": 37.2691418132416
}
},
"bencher::mock_4": {
"latency": {
"value": 40.90515638867921,
"lower_value": 36.81464074981129,
"upper_value": 44.99567202754713
}
}
}

あなたの出力は上記の結果と少し異なるはずです、なぜならデータは疑似ランダムだからです。 大切なのは、このコマンドが動作することです。


では、モックのベンチマークメトリックデータを使用してレポートを実行してみましょう。 下記のコマンドの--project引数に、プロジェクトslug(つまり、YOUR_PROJECT_SLUG)を代入します。

実行:bencher run --project YOUR_PROJECT_SLUG "bencher mock"

以下のような結果が表示されます:

$ bencher run --project save-walter-white-12345 "bencher mock"
{
"bencher::mock_0": {
"latency": {
"value": 0.15496641529475275,
"lower_value": 0.13946977376527747,
"upper_value": 0.17046305682422802
}
},
"bencher::mock_1": {
"latency": {
"value": 18.648298578180437,
"lower_value": 16.783468720362393,
"upper_value": 20.513128435998482
}
},
"bencher::mock_2": {
"latency": {
"value": 28.20328182167366,
"lower_value": 25.382953639506294,
"upper_value": 31.023610003841025
}
},
"bencher::mock_3": {
"latency": {
"value": 34.45732560787596,
"lower_value": 31.01159304708836,
"upper_value": 37.903058168663556
}
},
"bencher::mock_4": {
"latency": {
"value": 44.9237520767597,
"lower_value": 40.43137686908373,
"upper_value": 49.41612728443567
}
}
}
{
"branch": "master",
"end_time": "2023-07-18T14:21:27.796871Z",
"results": [
"{\n \"bencher::mock_0\": {\n \"latency\": {\n \"value\": 0.15496641529475275,\n \"lower_value\": 0.13946977376527747,\n \"upper_value\": 0.17046305682422802\n }\n },\n \"bencher::mock_1\": {\n \"latency\": {\n \"value\": 18.648298578180437,\n \"lower_value\": 16.783468720362393,\n \"upper_value\": 20.513128435998482\n }\n },\n \"bencher::mock_2\": {\n \"latency\": {\n \"value\": 28.20328182167366,\n \"lower_value\": 25.382953639506294,\n \"upper_value\": 31.023610003841025\n }\n },\n \"bencher::mock_3\": {\n \"latency\": {\n \"value\": 34.45732560787596,\n \"lower_value\": 31.01159304708836,\n \"upper_value\": 37.903058168663556\n }\n },\n \"bencher::mock_4\": {\n \"latency\": {\n \"value\": 44.9237520767597,\n \"lower_value\": 40.43137686908373,\n \"upper_value\": 49.41612728443567\n }\n }\n}\n"
],
"settings": {},
"start_time": "2023-07-18T14:21:27.773930Z",
"testbed": "base"
}
{
"uuid": "5554a92c-6f5c-481d-bd47-990f0a9bac6d",
"user": { ... },
"project": { ... },
"branch": { ... },
"testbed": { ...},
"start_time": "2023-07-18T14:21:27Z",
"end_time": "2023-07-18T14:21:27Z",
"adapter": "magic",
"results": [
[
{
"measure": { ... },
"threshold": null,
"benchmarks": [ ... ]
}
]
],
"alerts": [],
"created": "2023-07-18T14:21:27Z"
}
View results:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-12345/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=88375e7c-f1e0-4cbb-bde1-bdb7773022ae
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-12345/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=e81c7863-cc4b-4e22-b507-c1e238871137
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-12345/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=31dede44-d23a-4baf-b639-63f2ac742e42
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-12345/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=c7e32369-f3dd-473d-99a3-6289ae32b38e
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-12345/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=779bc477-4964-4bae-aa8c-4da3e388822c

ここでもブラウザで各ベンチマークの結果を見ることができます。 View resultsからリンクをクリックするか、コピーしてペーストします。 各ベンチマークには一つだけのデータポイントがあるはずなので、データをもっと追加しましょう!


まず、プロジェクトのスラッグを環境変数として設定して、それぞれの実行で--projectを指定しなくても済むようにしましょう。

実行: export BENCHER_PROJECT=save-walter-white-12345

その後、次のように実行してください: echo $BENCHER_PROJECT

以下のように表示されます:

$ echo $BENCHER_PROJECT
save-walter-white-12345

同じコマンドをもう一度--projectなしで実行し、さらにデータを生成します。

実行: bencher run "bencher mock"


さらにデータを生成しますが、今度は結果をbencher runにパイプします。

実行: bencher mock | bencher run


時々、結果をファイルに保存し、bencher runでそれらを取得したいことがあります。

実行: bencher run "bencher mock > results.json" --file results.json


また、別のプロセスでベンチマークを実行し、結果をファイルに保存すると、bencher runがそれらを取得します。

実行: bencher mock > results.json && bencher run --file results.json


最後に、bencher run--iter引数を使用して多くのデータを生成します。

実行: bencher run --iter 16 "bencher mock"


🐰 ヒント: bencher run CLIサブコマンドのドキュメントをチェックして、bencher runができるすべてのことを完全に把握してください!


アラートを生成する

ベンチマークの履歴データが手元にあるので、アラートを生成しましょう! アラートは、ベンチマーク結果がパフォーマンスリグレッションと判断されたときに生成されます。 それでは、パフォーマンスリグレッションを模擬しましょう!

実行:bencher run "bencher mock --pow 8"


出力の最後に新しいセクションが追加され、View alertsと表示されます:

View alerts:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-12345/alerts/b2329d5a-4471-48ab-bfbd-959d46ba1aa6
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-12345/alerts/181b1cf5-d984-402a-b0f1-68f6f119fa66
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-12345/alerts/b9b6c904-c657-4908-97db-dbeca40f8782
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-12345/alerts/5567ff32-2829-4b6a-969a-af33ce3828db
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-12345/alerts/49f2768f-ccda-4933-8e1d-08948f57a74d

ブラウザで各ベンチマークのアラートを見ることができます。 View alertsからリンクをクリックするか、コピーしてペーストします。


🐰 ヒント: パフォーマンスリグレッションがどのように検出されるかの全体像を把握するため、閾値&アラートドキュメントをチェックしてください!



🐰 おめでとうございます!初めてのパフォーマンスリグレッションを捕まえました!🎉


続けていく:ベンチマーキングの概要 ➡

🤖 このドキュメントは OpenAI GPT-4 によって自動的に生成されました。 正確ではない可能性があり、間違いが含まれている可能性があります。 エラーを見つけた場合は、GitHub で問題を開いてください。.