クイックスタート


Bencherとは何ですか?

Bencherは継続的なベンチマーキングツールの組です。 パフォーマンスリグレッションがユーザーに影響を与えたことはありますか? そのようなことが起こるのを防ぐことができたのがBencherです。 Bencherは、パフォーマンスリグレッションを検出し、それが本番環境に達する前に防止することができます。

  • 実行: ローカルまたはCIでベンチマークを実行します。お使いのお気に入りのベンチマーキングツールを使用します。bencher CLIは既存のベンチマークハーネスをラップし、その結果を保存します。
  • 追跡: ベンチマークの結果を時間経過で追跡します。BencherのWebコンソールを使用して、ソースブランチ、テストベッド、メトリックの種類に基づいて結果を監視、クエリ、グラフィック表示します。
  • キャッチ: CIでパフォーマンスリグレッションをキャッチします。Bencherは、最先端のカスタマイズ可能な分析を使用して、パフォーマンスリグレッションを本番環境前に検出します。

機能リグレッションを防ぐためにユニットテストがCIで実行されるのと同様に、パフォーマンスリグレッションを防ぐためにベンチマークもBencherでCIで実行されるべきです。パフォーマンスバグはバグです!


bencher CLIのインストール

bencher CLIをインストールするには、cargoがインストールされている必要があります。cargoがインストールされていることを確認します。

実行: cargo --version

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

$ cargo --version
cargo 1.65.0 (4bc8f24d3 2022-10-20)

バージョン番号が異なっていても問題ありません。大切なのは、このコマンドが動作することです。 もし動作しない場合は、rustupを経由してcargoをインストールする指示に従ってください。

LinuxまたはmacOSでは、以下を実行します:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

cargoがインストールされたので、bencher CLIをインストールできます。

実行:

cargo install --git https://github.com/bencherdev/bencher --tag v0.3.18 --locked bencher_cli

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

$ cargo install --git https://github.com/bencherdev/bencher --tag 0.3.18 --locked bencher_cli
  Installing bencher_cli v0.3.18 (/workspace/bencher/services/cli)
    Updating crates.io index

    Finished release [optimized] target(s) in 0.27s
  Installing /workspace/.cargo/bin/bencher
   Installed package `bencher_cli v0.3.18 (/workspace/bencher/services/cli)` (executable `bencher`)

やはり、出力が異なる場合でも問題ありません。大切なのは、このコマンドが動作することです。


最後に、bencher CLIがインストールされていることを確認しましょう。

実行: bencher --version

結果として、次のように表示されます。

$ bencher —version
bencher 0.3.18

Bencher Cloudのアカウントを作成する

Bencherはオープンソースで自己ホスティングが可能です。 自己ホスティングに興味がある場合は、Bencher Dockerチュートリアルをチェックしてください。 しかし、このチュートリアルでは、Bencher Cloudを使用します。

Bencher Cloudへ登録する


アカウントを作成したら、メールアドレスを確認する必要があります。 確認リンク付きのメールを確認してください。 その後、Bencher Cloudにログインすることができます。


APIトークンを作成する

Bencher APIを使用するには、APIトークンを作成する必要があります。 Bencherコンソールに移動します。 右上のあなたの名前をhoverします。ドロップダウンメニューが表示されます。Tokensを選びます。 APIトークンページに移動したら、➕追加ボタンをクリックします。

APIトークンを追加します


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

実行:export BENCHER_API_TOKEN=YOUR_TOKEN

その後、次のように実行してください:echo $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": [
    [
      {
        "metric_kind": { ... },
        "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?metric_kinds=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?metric_kinds=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?metric_kinds=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?metric_kinds=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?metric_kinds=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 で問題を開いてください。.