🚀

JMeterのHTTP/2対応プラグインを利用してハマった話

に公開

JMeterのHTTP/2対応プラグインを利用した性能テストを行う要件が発生し、いろいろハマったため、対応記録をメモとして残す。

HTTP/2プラグインでクライアント証明書の読み込みエラーが発生する

HTTP/2 Samplerを利用してシナリオを実行すると、JMeter起動時のJVM引数に設定したシステムプロパティ
-Djavax.net.ssl.keyStore="C:\apache-jmeter-5.5\cert\newcert.p12"
が読み込めないエラーが発生します。

原因は導入したHTTP/2プラグインの使用と思われ、回避策としては、以下の通り、クライアント証明書を利用する処理のみ、デフォルトモジュール(HTTP/1.1)を利用する前提で、HTTP/2対応プラグイン側では別パスの証明書ストアを読み込ませるようにソース改修した。(根本対応ではないが、時間切れ・・・)

対応方針
HTTP/2 Samplerが読み込むシステムプロパティを
javax.net.ssl.keyStore.http2
に変更し、JMeter起動時にこの引数を設定しないことで回避した。

対応手順

  1. GitHubからソース取得
    Blazemeter/jmeter-http2-plugin

  2. JMeterJettySslContextFactory.javaを以下の通り修正

修正対象メソッド:JMeterJettySslContextFactory
修正前:
String keyStorePath = System.getProperty("javax.net.ssl.keyStore")

修正後:
String keyStorePath = System.getProperty("javax.net.ssl.keyStore.http2");

  1. JMeter起動

修正したソースをビルド後、以下の通り起動することで、HTTP/2対応プラグインはクライアント証明書を読み込まないようになる。

jmeter -H 127.0.0.1 -P 8080 -u XXXXXX -a XXXXXX
-Djavax.net.ssl.keyStore="C:\apache-jmeter-5.5\cert\newcert.p12"
-Djavax.net.ssl.keyStorePassword=hoge33

HTTP/2プラグインでプロキシ認証ができない

HTTP/2プラグインはプロキシ認証をサポートしておらず、テスト環境から対象システムにアクセスできずにはまった。

対応手順

  1. GitHubからソース取得
    Blazemeter/jmeter-http2-plugin

  2. HTTP2JettyClient.java修正 (setProxyメソッド)
    以下の通り、認証レルム設定を追加:

Authentication auth = httpClient.getAuthenticationStore();
URI proxyURI = new URI("http://XXX.XXX.XXX.XXX:XXXX");
auth.addAuthentication(new BASICAuthentication(proxyURI, "XXX", proxyUser, proxyPassword));
  1. HTTP2JettyClient.java修正 (sampleメソッド)
    引数にユーザ/パスワード追加
setProxy(sampler.getProxyHost(),
   sampler.getProxyPortInt(), sampler.getProxyScheme(),
   sampler.getProxyUser(), sampler.getProxyPass());
  1. HTTP2SamplerPanel.java修正
    GUIで認証情報を設定できるようにメソッド追加:
private JPanel createProxyServerDetailPanel() {										
  JPanel proxyServerDetailPanel = new HorizontalPanel();							
  proxyServerDetailPanel.add(createPanelWithLabelForField(proxyUserField,			
      JMeterUtils.getResString("web_proxy_user")), BorderLayout.WEST);
  proxyServerDetailPanel.add(createPanelWithLabelForField(proxyPassField,
      JMeterUtils.getResString(										
      "web_proxy_password")), BorderLayout.CENTER);				
  return proxyServerDetailPanel;					
}
  1. 修正したソースをビルドしてJMeterを起動後、GUI画面で認証情報を設定

HTTP/2リクエストのレスポンスが文字化けする問題

レスポンスヘッダにcontent-encoding: gzipが付与されている場合、レスポンスがGZIP化されたまま表示され、文字化けのようになりハマった。

対応手順

  1. HTTP2JettyClient.java修正 (startメソッド)
    以下のgzip解凍の無効化処理をコメントアウトする。
    httpclient.getContentDecoderFactories().clear();

補足
Jetty11はdeflateやbrをサポートしていないため、必要なら独自実装が必要。

参考:jmeter-http2-pluginのリクエスト処理に利用しているJetty11のプログラミングガイド
Jetty 11 Programming Guide

Discussion