JBoss EAP 7でBytemanを試す

こんにちは。平田です。

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.

ルール言語のリファレンスを見ると、相当凝ったことができるようです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です