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起動時にこの引数を設定しないことで回避した。
対応手順
-
GitHubからソース取得
Blazemeter/jmeter-http2-plugin -
JMeterJettySslContextFactory.javaを以下の通り修正
修正対象メソッド:JMeterJettySslContextFactory
修正前:
String keyStorePath = System.getProperty("javax.net.ssl.keyStore")
修正後:
String keyStorePath = System.getProperty("javax.net.ssl.keyStore.http2");
- 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プラグインはプロキシ認証をサポートしておらず、テスト環境から対象システムにアクセスできずにはまった。
対応手順
-
GitHubからソース取得
Blazemeter/jmeter-http2-plugin -
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));
- HTTP2JettyClient.java修正 (sampleメソッド)
引数にユーザ/パスワード追加
setProxy(sampler.getProxyHost(),
sampler.getProxyPortInt(), sampler.getProxyScheme(),
sampler.getProxyUser(), sampler.getProxyPass());
- 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;
}
- 修正したソースをビルドしてJMeterを起動後、GUI画面で認証情報を設定

HTTP/2リクエストのレスポンスが文字化けする問題
レスポンスヘッダにcontent-encoding: gzipが付与されている場合、レスポンスがGZIP化されたまま表示され、文字化けのようになりハマった。
対応手順
- HTTP2JettyClient.java修正 (startメソッド)
以下のgzip解凍の無効化処理をコメントアウトする。
httpclient.getContentDecoderFactories().clear();
補足
Jetty11はdeflateやbrをサポートしていないため、必要なら独自実装が必要。
参考:jmeter-http2-pluginのリクエスト処理に利用しているJetty11のプログラミングガイド
Jetty 11 Programming Guide
Discussion