こんにちは。平田です。
JBoss EAP 7上で動作するアプリケーションに対して、Bytemanを使って調査用のログ出力を差し込んでみます。
Bytemanは、コンパイル済みJavaプログラムに対してJavaのコードを差し込むツールです。稼働中のアプリケーションについて、停止や再デプロイなしに調査できます。
Bytemanは、Javaエージェントとして実行されるルールエンジンとルール定義(Event Condition Action: ECAルール)から構成されます。対象となるプログラムのJVMでエージェントを動かし、ルールを追加することでJavaコードを差し込むことができます。ちなみにルールエンジンと言ってもDroolsとは無関係のようです。
早速、JBoss EAP 7に対して動かしてみます。まずEAP7を起動します。
$ $JBOSS_HOME/bin/standalone.sh
次にEAP7に同梱されているサンプル kitchensink をデプロイします。
$ cd path/to/jboss-eap-7.0.0.GA-quickstarts/kitchensink $ mvn clean install wildfly:deploy
Bytemanエージェントをロードします。起動引数で起動時にロードする方法と、起動後に動的にロードする方法があります。予めBytemanを仕込んでおくような運用はしないと思うので、後者を使うことになるかと思います。
Bytemanをダウンロードし、解凍します。今回はByteman 3.0.7を使用しました。
$ curl -s -O http://downloads.jboss.org/byteman/3.0.7/byteman-download-3.0.7-bin.zip $ unzip byteman-download-3.0.7-bin.zip
エージェントをロードします。EAP7のプロセスIDを特定し、bminstallスクリプトを実行します。
$ export JAVA_HOME=/path/to/java_home $ export BYTEMAN_HOME=/path/to/byteman-download-3.0.7 $ ${BYTEMAN_HOME}/bin/bminstall.sh $(jps -l | grep jboss-modules.jar | awk '{print $1}')
bminstallはLinuxでは動作しましたが、macOSでは動作しませんでした。tools.jarのパスが特定できていないようなので、javaコマンドを直接実行します。
$ java -classpath ${BYTEMAN_HOME}/lib/byteman-install.jar:${JAVA_HOME}/lib/tools.jar org.jboss.byteman.agent.install.Install $(jps -l | grep jboss-modules.jar | awk '{print $1}')
ECAルールを作成し、ロードします。kitchensinkのREST APIをキックしたときにログを出してみます。
以下の内容を traceOnHttpGet.btm として保存します。MemberResourceRESTService#lookupMemberByIdが呼ばれたときにログを出しています。
RULE trace on HTTP GET /members CLASS MemberResourceRESTService METHOD lookupMemberById AT ENTRY IF true DO traceln("HTTP GET /members/{id} called. this message is injected by Byteman.") ENDRULE
作成したルール定義をロードします。
$ ${BYTEMAN_HOME}/bin/bmsubmit.sh traceOnHttpGet.btm
REST APIをキックします。
$ curl -s http://localhost:8080/jboss-kitchensink/rest/members/0 {"id":0,"name":"John Smith","email":"john.smith@mailinator.com","phoneNumber":"2125551212"}
以下のログが出ました。
17:07:41,468 INFO [stdout] (default task-1) HTTP GET /members/{id} called. this message is injected by Byteman.
ルール言語のリファレンスを見ると、相当凝ったことができるようです。