つい先日、Azure Load Testingがpreviewリリースされました。
これは、パフォーマンステストを行うためのサービスで、Apache JMeter™で実装され、大量のJMeterサーバーを並べて分散実行することで、非常に大きな負荷を作ることができるものです。
以前は、Visual StudioやAzure DevOpsにクラウドベースのロードテストツールがありましたが、現在では廃止されており、それを置き換えるものでもあります。

弊社ではこのAzure Load Testingと目的を同じとする、Load Tester Powered by Apache JMeter™というソリューションをAzure Marketplaceから公開していますが、今後はAzure Load Testing活用のコンサルティングにも力を入れていきます。

さて、この記事では、現時点(2021/12/04)でのAzure Load Testingを検証し、気付いた点を記していきたいと思います。(2021/12/06に更新しました)

Azure Load Testingの特徴

公式ドキュメントにも書かれていることですが、簡単にリストアップしてみます。

  • フルマネージドな負荷テストサービスである
  • Apache JMeter™をベースとしていて、JMeterのスクリプトファイル(テストプランファイル)を利用する
    • JMeterのスクリプトファイルは、自身で用意したJMeterで作成する必要がある
  • 分散テスト環境が動的に構築され、任意の数のテストエンジン(JMeterのリモートサーバー)から大量の負荷を生成する
    • 自身ですべてを構築・運用しようとするとかなり大変だったものが、弊社のLoad Testerと同様にとても容易
  • ロードテストの状況と並行して、Azureリソースの負荷状況をみることができる
    • Azureで表示できる一般的なメトリックであればテスト結果と並べて表示できるので便利
  • CI/CD (Azure DevOpsやgithub actionsなど)への組み込みが容易である
  • テスト結果を履歴的に管理することができる
  • 複数回実施したテストを比較できる
  • テスト結果をダウンロードして、JMeterや従来のJMeterテスト結果分析ツールで利用することができる
    • JMeterのListenerを利用して結果を表示するには、テストの「Results」をダウンロードし、artifacts.zip(時々なぜだかcsv.zipになる)に含まれるtestreport.csvファイルをListenerのRead from fileで指定して読み込む

Azure Load Testingの課題

  • Virtual Networkの中に入れず、グローバルなエンドポイントを持つサービスにしかアクセスできない
  • テストデータファイル(csvなど)の利用ができない (機能は用意されているがまだ不具合があるようだ) ← 2021/12/06ごろに修正されたようです
  • 各種JDBCドライバが導入されていないため、Azure SQL Databaseなどのデータベースにアクセスできない
  • JMeter Pluginが一部しか用意されておらず、追加導入ができない
  • CI/CDに組み込むためのテスト判定での評価項目がいささか少ない
  • 何らかの理由によりエラーになってしまう場合、その原因追及が難しい
  • まだやや不安定なことがある

VNet統合はほとんどのサービスで提供されていますし、テストデータファイルの追加やJDBCドライバ、JMeterプラグインの追加導入はさほど難しいものではないと考えられるので、比較的早く提供されることを期待しています。

テスト判定は、柔軟な判定基準をユーザーに設定させるのは難しいかもしれませんが、90%/95%/99% LINEでの判定くらいは入れてほしいですね。

エラーの原因追及や不安定さの解消は、GAに向けた今後の改善に期待しましょう。

シークレットの読み込み

Azure Load Testingでは、Azure Key Vaultや、GitHub repository secrets、secret variables in Azure Pipelinesからシークレット値を読み込むことができます。

Azure Load Testingにより用意されているGetSecretカスタム関数を利用することになりますが、この関数は「設定エレメントのユーザー定義変数 (Config Element > User Defined Variables)」でしか利用できないようなので注意が必要です。
HTTPリクエストなどのサンプラー(Sampler)や、前処理のユーザーパラメータ(Pre Processors > User Parameters)では値が入りません。

JMeterプラグインについて

先の課題にも書きましたが、JMeter Pluginの追加導入をすることはできません。
Custom Thread GroupsやThroughput Shaping Timer、bzm - Streaming Samplerなど、一部のプラグインは導入されているので利用することができますが、どのプラグインが導入されているかの情報は提供されておらず、私も細かくは確認していません。
もしかしたら、テストプランに明示的に追加したサンプラーの内、jmeter-plugins.orgに含まれるものは、JMeter Plugins Managerにより自動導入されるのではないか?と考えています。
(ちなみに、Custom JMeter Functionsは導入されていませんでした。)

チュートリアルのテストスクリプトファイル

公式ドキュメントのチュートリアルで例示されているJMeterスクリプトファイルを普通のJMeterで読み込もうとすると、エラーになってしまって読み込めない場合があります。
これは、JMeterプラグインを利用するスクリプトとなっているためです。

jmeter-plugins.orgから提供されているplugins-manager.jarファイルをJMeterのlib/extディレクトリに置いた後にJMeterを起動することで、該当のスクリプトファイルを読み込むことができるようになります。
https://jmeter-plugins.org/install/Install/

自前構築およびLoad Tester (multiple remote servers) との比較

最後に、Azure Load Testingと、弊社が提供してるLoad Testerのmultiple remote serversおよび自身でJMeterの分散テスト環境を構築したものとの簡単な比較をしてみます。

Azure Load Testing Load Tester (multi) 自身でJMeter分散テスト環境を構築
導入の容易さ ×
分散テストのための
JMeterエンジンサーバーを
大量に構築するのが
とても大変
エンジンサーバーの
スケールアウト/イン
×
増やす場合は、追加で
構築しなければいけない
テストスクリプトの
作成/変更
×
外部のJMeterで作成/変更し
アップロードする必要あり
テスト結果の分析
弊社にノウハウあり
お問い合わせください
CI/CDへの組み込み
組込設定は容易だが、
判定基準が限られている

弊社にノウハウあり
お問い合わせください
テストデータファイル
(csvなど)の利用

(2021/12/06当記事更新)

複数のJMeterエンジンサーバーへの
配布が面倒
カスタムプラグインの
利用

一部のプラグインしか
利用できない

複数のJMeterエンジンサーバーに
プラグインを導入するのが面倒
Azure VNet内の
リソースへのテスト
×
データベースへの
テスト
×
複数のJMeterエンジンサーバーに
JDBCドライバを導入するのが面倒
テストスクリプトの
デバッグ
×
手法が限られており
情報不足
安定度
2021/12/04現在、
Public Preview

○×表だけで見ると、Azure Load Testingに対する評価がやや辛口になってしまっていますが、基本的にはとても使いやすいものです。
課題としてあがっているのは細かいことであり、プラグインは利用しないことも多いですし、他の課題点もその気になれば比較的容易に対応できるものに思いますので、GAに向けての改善を期待しています。

最後に、Azure Load Testingと同様の目的を果たすLoad Tester Powered by Apache JMeter™を提供している弊社としましては、Load Testerにこだわることなく、むしろそれによるJMeterパフォーマンステストのノウハウを活かし、かつAzureの専門家として、お客様にAzure Load Testingの支援も積極的にさせていただきますので、Azureにおける負荷テストやパフォーマンストラブルなどでお困りの際にはぜひご相談ください。