Azure Cosmos DB(SQL API)に対してApache JMeter™で負荷テストを実施する

Apache JMeter™でAzure Cosmos DB (SQL API)に対しても負荷テストを実施する方法を紹介します

Apache JMeter™では、Azure Cosmos DB (SQL API)に対しても負荷テストを実施することができます。
ここでは、その方法を紹介します。

ちょっとだけ説明

Azure Cosmos DB (SQL API)は、REST APIで操作します。
そのためApache JMeter™では、httpリクエスト サンプラーを利用します。

リクエストを成功させるには、適切なメソッド、ヘッダー、ボディでリクエストをする必要があります。
https://docs.microsoft.com/ja-jp/rest/api/cosmos-db/

現時点(2020/08/07)では、日本語のドキュメントは機械翻訳で致命的な間違いも多いので、英語のドキュメントを参照することをお奨めします。
https://docs.microsoft.com/en-us/rest/api/cosmos-db/

今回は、Azure Cosmos DBのSampleDBに対するテストを実施してみます。

事前準備

  1. Cosmos DBのファイアウォール設定
    Cosmos DBの「ファイアウォールと仮想ネットワーク」で、JMeterからのアクセスを許可します。
    SampleDBを作成する場合は、「+現在のIP (xxx.xxx.xxx.xxx) を追加する」もしておきましょう。
    ファイアウォールと仮想ネットワーク
    この画像の例では、jmeter-vnet仮想ネットワークのclサブネットにあるjMeterからのアクセスを許可しています。
  2. Cosmos DBにSampleDBを作成
    今回は、Cosmos DBのSampleDBに対してテストを実施するため、それを作成します。
    Cosmos DBの「データ エクスプローラー」で『Start with Sample』をクリックすると、SampleDBデータベースとPersonsコンテナーが作成され、4つのドキュメントが登録されます。
    SampleDBの作成

    Cosmos DBの「ファイアウォールと仮想ネットワークの設定」で、Azure Portalを操作しているPCからのアクセスを許可していないと、作成に失敗することがあるようです。

設定概要

  1. Microsoft Azure用プラグインを導入
  2. Cosmos DBのホスト名やキーなどの変数を追加
  3. スレッドグループを追加
  4. HTTPリクエスト サンプラーを追加
  5. リクエストするデータに関するパラメータを追加
  6. HTTPヘッダマネージャを追加
  7. 実行結果を参照するリスナーを追加
  8. 実行して結果を確認

設定詳細

  1. Microsoft Azure用プラグインを導入
    Cosmos DBにリクエストする際のAuthorizationヘッダーを作成するために、Microsoft Azure plugin for Apache JMeter™を導入します。

    1. プラグインをダウンロード
      Webブラウザを利用して以下のページから最新のプラグイン(jmeter-plugins-functions-azure-{version}.jar)をダウンロードします。
      https://github.com/pnopjp/jmeter-plugins/releases
      コンソールで以下のようなコマンドを実行することでもダウンロードすることができます。
      $ wget -O jmeter-plugins-functions-azure-{version}.jar https://github.com/pnopjp/jmeter-plugins/releases/download/v{version}/jmeter-plugins-functions-azure-{version}.jar
      
    2. ダウンロードしたファイルをJMeterのプラグイン用ディレクトリに配置
      先ほどダウンロードしたjarファイルを $JMETER_HOME/lib/ext にコピーします。
      $ cp jmeter-plugins-functions-azure-{version}.jar /usr/local/jmeter/lib/ext
      
    3. JMeterを起動または再起動します。
  2. Cosmos DBのホスト名やキーなどの変数を追加
    Test Planに"ユーザー定義変数"を追加し、Cosmos DBのホスト名などの変数を設定します。
    Add (追加) > Config Element (設定エレメント) > User Defined Variables (ユーザー定義変数)

    “User Defined Variables (ユーザー定義変数)“は、同じ表記のものが2つ表示されますが、おそらく上側のものです。
    追加するとその表のヘッダに"Name (名前)、Value (値)、Description"の3列が表示されます。

    ユーザー定義変数

    • cosmosdb.Host: Cosmos DBのホスト名 (***.documents.azure.com)
    • cosmosdb.Key: Cosmos DBのキー
      プライマリ キー、セカンダリ キーのどちらでもかまいません。
      読み取りテストのみ実施する場合は、読み取り専用キーでもかまいません。
    • headers.x-ms-version: CosmosDB RESTサービスのバージョン (ex. 2018-12-31)
      ここに指定できるバージョンは、“Support REST API Versions”にリストされています。

    ここやこの後に書かれている変数名は例であり、その定義と参照が一致していれば任意の変数名でかまいません。

  3. スレッドグループを追加
    Test Planに"スレッド グループ"を追加します。
    Add (追加) > Threads (Users) > Tread Group (スレッド グループ)

  4. HTTP リクエスト サンプラーを追加
    追加したスレッド グループに"HTTPリクエスト サンプラー"を追加します。
    Add (追加) > Sampler (サンプラー) > HTTP Request (HTTP リクエスト)
    HTTP リクエスト サンプラー
    この例では、Personsコンテナーのドキュメント一覧を取得してみます。

    • Web Server (Web サーバ)
      • Protocol [http] (プロトコル): https
      • Server Name or IP (サーバー名または IP): ${cosmosdb.Host}
    • HTTP リクエスト
      • Method: ${request.method}
      • Path (パス): ${request.path}

    今回はドキュメントが多い場合でも一度で取得できるものまでとしています。

  5. リクエストするデータに関するパラメータを追加
    HTTP リクエスト サンプラーに前処理の"ユーザーパラメータ"を追加し、リクエストするデータの条件を設定します。
    Add (追加) > Pre Processors (前処理) > User Parameters (ユーザーパラメータ)
    Request Parameters

    • Name: 任意の名前 (ex. Request Parameters)

    • Parameters (パラメータ)

      • cosmosdb.ResourceType: リクエスト対象のリソース種別 [dbs, colls, docs] (ex. docs)
      • cosmosdb.ResourceLink: リクエスト対象のリソースID (ex. dbs/SampleDB/colls/Persons)
      • request.path: リクエストのパス (ex. /dbs/SampleDB/colls/Persons/docs)
      • request.method: HTTPリクエストのメソッド
      • headers.Content-Type: HTTPリクエストでのContent-Typeヘッダー: [application/json, application/query+json] (ex. application/json)

      参考) Azure コスモス DB REST API を使用した一般的なタスク

      Parameters (パラメータ)は[Add Variable]をクリックして、Name (名前)および値となるUser_1 (ユーザー_1)を入力します。

  6. HTTPヘッダマネージャを追加
    HTTPリクエストサンプラーに"HTTP ヘッダマネージャ"を追加します。
    リクエストの操作や条件により送信すべきヘッダは変わりますが、今回の例では以下となります。 Add (追加) > Config Element (設定エレメント) > HTTP Header Manager (HTTP ヘッダマネージャ)
    HTTPヘッダマネージャ

    • Headers Stored in the Header Manager
      • x-ms-version: ${headers.x-ms-version}
      • Authorization: ${__AzCosmosDbAuthZ(${cosmosdb.Key},headers.x-ms-date,${request.method},${cosmosdb.ResourceType},${cosmosdb.ResourceLink})}
      • Content-Type: ${headers.Content-Type}
      • x-ms-max-item-count: -1
      • x-ms-date: ${headers.x-ms-date}
  7. 実行結果を参照するリスナーを追加
    Test Planかスレッドグループに"View Results Tree (結果をツリーで表示)“リスナーを追加します。
    Add (追加) > Listener (リスナー) > View Results Tree (結果をツリーで表示)

  8. 実行して結果を確認
    Run (実行) > Start (開始) でテストを実行し、結果の"HTTP Request"を選択して、“Response data"タブの"Response Body"タブを表示します。
    ここにレスポンスのJSONデータが表示されます。
    View Results Tree \(結果をツリーで表示\)

ここまででAzure Cosmos DBへのテストができることが確認できたので、さらにSQLを実行するリクエストも作ってみます。

  1. HTTP リクエスト サンプラーをコピーする
    先ほど作った"HTTP Request (HTTP リクエスト)“をコピー ( 右クリック > Copy (コピー) または Ctrl+C ) し、Thread Group (スレッドグループ)にペースト( 右クリック > Paste (ペースト) または Ctrl+P ) します。

    “HTTP Request (HTTP リクエスト)"、“Request Parameters”、“Authorization Parameters”、“HmacSHA256”、“HTTP Header Manager (HTTPヘッダマネージャ)“の一式が追加されます。

  2. HTTP Request (HTTP リクエスト)を変更する
    “Body Data"タブに ${request.body} と入力します。
    HTTP リクエスト

  3. User Parametersを変更する
    いくつかのパラメータを変更あるいは追加します。
    User Parameters

    • request.method (変更): POST
    • headers.Content-Type (変更): application/query+json
    • request.body (追加): 実行するSQLとパラメータ (ex. {“query”: “SELECT * FROM c WHERE c.age = 23”, “parameters”: []}
  4. HTTP Header Manager (HTTPヘッダマネージャ)を変更する
    いくつかのヘッダを追加します。
    HTTPヘッダマネージャ

    • x-ms-documentdb-isquery: true
    • x-ms-documentdb-query-enablecrosspartition: true

    実行するSQLや条件などに応じて、適切なリクエストヘッダを設定してください。
    参考) Common Azure Cosmos DB REST request headers

    現時点(2020/08/07)では他のページにあるサンプルは古い情報なのか、最新バージョンでは利用できないものも多いので注意してください。

  5. 実行して結果を確認
    Run (実行) > Start (開始) でテストを実行します。
    2つのHTTP Request (HTTPリクエスト)が出力され、リクエストに応じたResponse dataを取得しています。

参考までに、今回作成したTest Planを以下にアップロードしました。
https://github.com/pnopjp/samples/blob/master/JMeter/Azure%20CosmosDB.jmx

以上、今回は、Apache JMeter™でAzure Cosmos DBにテストをする基本的な方法を紹介しました。

【宣伝】
AzureでJMeterを使うなら簡単構築Load Tester Powered by Apache JMeter™