こんにちは。よっしーです(^^)
今日は、Docker環境でJMeterの実行環境を構築する方法について解説しています。
背景
JMeterを利用した負荷試験をする機会がありましたので、その時の内容を備忘として記事に残しました。
前回記事の内容
前回は、下記のファイル一覧の jmeter/Dockerfile を解説しました。本記事では、jmeter/entrypoint.sh について解説しています。
new file: jmeter/Dockerfile
new file: jmeter/entrypoint.sh
new file: jmeter/test.sh
new file: jmeter/tests/trivial/plan.jmx
new file: Makefile
new file: compose.yml
jmeter/entrypoint.sh
#!/bin/bash
# Install jmeter plugins available on /plugins volume
if [ -d "${JMETER_CUSTOM_PLUGINS_FOLDER}" ]
then
for plugin in "${JMETER_CUSTOM_PLUGINS_FOLDER}"/*.jar; do
cp "${plugin}" "${JMETER_HOME}/lib/ext"
done;
fi
# Execute JMeter command
set -e
freeMem=$(awk '/MemAvailable/ { print int($2/1024) }' /proc/meminfo)
[[ -z ${JVM_XMN} ]] && JVM_XMN=$(($freeMem/10*2))
[[ -z ${JVM_XMS} ]] && JVM_XMS=$(($freeMem/10*8))
[[ -z ${JVM_XMX} ]] && JVM_XMX=$(($freeMem/10*8))
export JVM_ARGS="-Xmn${JVM_XMN}m -Xms${JVM_XMS}m -Xmx${JVM_XMX}m"
echo "START Running Jmeter on $(date)"
echo "JVM_ARGS=${JVM_ARGS}"
echo "jmeter args=$@"
# Keep entrypoint simple: we must pass the standard JMeter arguments
EXTRA_ARGS=-Dlog4j2.formatMsgNoLookups=true
echo "jmeter ALL ARGS=${EXTRA_ARGS} $@"
jmeter ${EXTRA_ARGS} $@
echo "END Running Jmeter on $(date)"
このスクリプトは、Bashで書かれたJMeterのプラグインをインストールし、JMeterのコマンドを実行するためのものです。
JMeterのカスタムプラグインのインストールについて
if [ -d "${JMETER_CUSTOM_PLUGINS_FOLDER}" ]
この行は、${JMETER_CUSTOM_PLUGINS_FOLDER}
という環境変数で指定されたディレクトリが存在するかどうかをチェックします。-d
オプションは、指定されたパスがディレクトリであるかを確認するためのものです。then
このキーワードは、前のif
条件が真(つまりディレクトリが存在する)の場合に実行されるコマンドを導入します。for plugin in "${JMETER_CUSTOM_PLUGINS_FOLDER}"/*.jar; do
このループは、${JMETER_CUSTOM_PLUGINS_FOLDER}
ディレクトリ内の.jar
拡張子を持つ全てのファイルに対して繰り返し処理を行います。*.jar
は、.jar
で終わる全てのファイルにマッチします。cp "${plugin}" "${JMETER_HOME}/lib/ext"
このコマンドは、見つかった各プラグイン(.jar
ファイル)を${JMETER_HOME}/lib/ext
ディレクトリにコピーします。${JMETER_HOME}
はJMeterがインストールされているディレクトリを指します。done;
このキーワードはfor
ループの終わりを示します。fi
このキーワードはif
条件文の終わりを示します。
要するに、このスクリプトは${JMETER_CUSTOM_PLUGINS_FOLDER}
ディレクトリが存在する場合に限り、その中の全ての.jar
ファイルをJMeterのlib/ext
ディレクトリにコピーするというものです。これにより、JMeterに新しいプラグインを追加することができます。もし${JMETER_CUSTOM_PLUGINS_FOLDER}
ディレクトリが存在しなければ、何も行われません。このスクリプトは、通常、JMeterのセットアップやカスタマイズの一環として使用されます。
JMeterの実行について
set -e
: このコマンドは、スクリプトがエラーに遭遇した場合に直ちに終了するように設定します。これにより、エラーが発生した時点でスクリプトが停止し、デバッグが容易になります。freeMem=$(awk '/MemAvailable/ { print int($2/1024) }' /proc/meminfo)
: このコマンドは、システムの利用可能なメモリ量をキロバイト単位で取得し、freeMem
変数に格納します。[[ -z ${JVM_XMN} ]] && JVM_XMN=$(($freeMem/10*2))
: このコマンドは、JVM_XMN
環境変数が未設定(空)である場合に、利用可能なメモリの10分の2をJVM_XMN
に設定します。[[ -z ${JVM_XMS} ]] && JVM_XMS=$(($freeMem/10*8))
: このコマンドは、JVM_XMS
環境変数が未設定(空)である場合に、利用可能なメモリの10分の8をJVM_XMS
に設定します。[[ -z ${JVM_XMX} ]] && JVM_XMX=$(($freeMem/10*8))
: このコマンドは、JVM_XMX
環境変数が未設定(空)である場合に、利用可能なメモリの10分の8をJVM_XMX
に設定します。export JVM_ARGS="-Xmn${JVM_XMN}m -Xms${JVM_XMS}m -Xmx${JVM_XMX}m"
: このコマンドは、JVMの起動引数を設定し、それを環境変数JVM_ARGS
にエクスポートします。echo "START Running Jmeter on $(date)"
: このコマンドは、JMeterの実行開始時刻を表示します。echo "JVM_ARGS=${JVM_ARGS}"
: このコマンドは、設定されたJVM引数を表示します。echo "jmeter args=$@"
: このコマンドは、スクリプトに渡されたJMeterの引数を表示します。EXTRA_ARGS=-Dlog4j2.formatMsgNoLookups=true
: このコマンドは、JMeterの追加引数を設定します。この引数は、Log4j2の脆弱性を回避するために使用されます。echo "jmeter ALL ARGS=${EXTRA_ARGS} $@"
: このコマンドは、JMeterに渡される全ての引数を表示します。jmeter ${EXTRA_ARGS} $@
: このコマンドは、設定された引数を使用してJMeterを実行します。echo "END Running Jmeter on $(date)"
: このコマンドは、JMeterの実行終了時刻を表示します。
このスクリプトは、JMeterを安全かつ効率的に実行するための環境設定と、実行コマンドを含んでいます。スクリプトの実行により、JMeterは適切なJVM引数を使用して実行され、その開始時刻と終了時刻が記録されます。また、Log4j2のセキュリティ対策も含まれています。.
おわりに
今日は、Docker環境でJMeterの実行環境を構築する方法について解説しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント