第4章 トランザクションの監視
4.1. Transactions サブシステムのロギング設定
JBoss EAP の他のログ設定に依存せずにログに記録されたトランザクションに関する情報の量を制御できます。ログ設定は、管理コンソールまたは管理 CLI を使用して設定できます。
管理コンソールを使用したトランザクションロガーの設定
Logging サブシステム設定に移動します。
- 管理コンソールで、Configuration タブをクリックします。管理対象ドメインを使用する場合は、適切なサーバープロファイルを選択する必要があります。
- Subsystems → Logging → Configuration と選択し、表示 をクリックします。
com.arjuna
属性を編集します。Categories タブを選択します。
com.arjuna
エントリーがすでに存在します。com.arjuna
を選択し、編集 をクリックします。ログレベルを変更し、親ハンドラーを使用するかどうかを選択できます。ログレベル:
トランザクションにより大量のロギング出力が生成されることがあるため、サーバーのログがトランザクション出力で満たされないようデフォルトのロギングレベルは
WARN
に設定されます。トランザクション処理の詳細を確認する必要がある場合は、トランザクション ID が表示されるようTRACE
ログレベルを使用します。親ハンドラーの使用:
親ハンドラーはロガーが出力を親ロガーに送信するかどうかを指定します。デフォルトの動作は
true
です。
- 保存 をクリックして変更を保存します。
管理 CLI を使用したトランザクションロガーの設定
以下のコマンドを使用して管理 CLI からログレベルを設定します。スタンドアロンサーバーの場合は、コマンドから /profile=default
を削除します。
/profile=default/subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=VALUE)
4.1.1. TRACE ログレベルの有効化
TRACE
ロギングレベルはログにデータを追加して、JBoss EAP で Jakarta コネクターの問題を診断できるようにします。以下の手順は、org.jboss.jca
、org.jboss.as.connector
、および com.arjuna
クラスの TRACE
レベルのロギングを有効にする方法を示しています。
前提条件
- JBoss EAP がインストールされている。
手順
- 端末を開きます。
- 管理 CLI を起動します。
以下のいずれかのオプションを選択します。
管理対象ドメインで、
org.jboss.jca
、org.jboss.as.connector
、com.arjuna
クラスのTRACE
ロギングレベルを有効にするには、以下のコマンドを使用します。/profile=<PROFILE NAME>/subsystem=logging/logger=org.jboss.jca:add(level=TRACE) /profile=<PROFILE NAME>/subsystem=logging/logger=org.jboss.as.connector:add(level=TRACE) /profile=<PROFILE NAME>/subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=TRACE)
<PROFILE NAME>
を JBoss EAP プロファイル (default
、full
、またはfull-ha)
に置き換えます。JBoss EAP をスタンドアロンサーバーとして実行する場合に、
org.jboss.jca
、org.jboss.as.connector
、com.arjuna
クラスのTRACE
ロギングレベルを有効にするには、以下のコマンドを使用します。/subsystem=logging/logger=org.jboss.jca:add(level=TRACE) /subsystem=logging/logger=org.jboss.as.connector:add(level=TRACE) /subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=TRACE)
必要に応じて、次のコマンドを使用して、
console-handler
クラスでTRACE
ログレベルを有効にします。/subsystem=logging/console-handler=CONSOLE:write-attribute(name=level,value=TRACE)
コードスニペットは、適切な設定ファイルに追加されます。
<logger category="com.arjuna"> <level name="TRACE"/> </logger> <logger category="org.jboss.jca"> <level name="TRACE"/> </logger> <logger category="org.jboss.as.connector"> <level name="TRACE"/> </logger>
4.1.2. トランザクションブリッジロガーの有効化
トランザクションブリッジは XTS 上の層で、Transaction Manager の Jakarta Transactions または JTS コンポーネントの上にレイヤーです。これは JBoss EAP サーバーの他のコンポーネントと対話します。システムの操作の詳細を知るために、トランザクションマネージャーと対話するコンポーネントの詳細ロギングを有効することができます。
トランザクションブリッジは logging
サブシステムを使用します。JBoss EAP サーバーの実行時、ロギングは standalone-xts.xml
ファイルの logging
サブシステム設定によって設定されます。トランザクションブリッジのロギングは、デバッグを行うときに便利です。
以下の管理 CLI コマンドを使用すると、org.jboss.jbossts.txbridge
ロガーを設定し、トランザクションブリッジのロギングを有効にすることができます。
/subsystem=logging/logger=org.jboss.jbossts.txbridge:add(level=ALL)
これにより、サーバー設定ファイルに以下の XML が作成されます。
<logger category="org.jboss.jbossts.txbridge"> <level name="ALL" /> </logger>
デプロイメントの順番の問題により、logging
サブシステムが完全に設定される前に、トランザクションブリッジを含むトランザクションマネージャーのコンポーネントがアクティブになることがあります。このような場合、デフォルトのロギングレベルが起動中に適用されるため、詳細なデバッグメッセージは出力されません。
以下の管理 CLI コマンドを使用すると、com.arjuna
ロガーを設定し、詳細なロギングを有効にすることができます。
/subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=ALL)
これにより、サーバー設定ファイルに以下の XML が作成されます。
<logger category="com.arjuna"> <level name="ALL" /> </logger>
4.1.3. トランザクションログメッセージ
トランザクションロガーに DEBUG
ログレベルを使用することにより、ログファイルを読み取り可能な状態に保ちつつトランザクションを追跡できます。詳細なデバッグの場合は、TRACE
ログレベルを使用します。トランザクションロガーの設定に関する詳細については、Transactions サブシステムのロギング設定 を参照してください。
TRACE
ログレベルでログを記録するよう設定すると、トランザクションマネージャー (TM) は多くのロギング情報を生成できます。最も一般的なメッセージの一部は次のとおりです。このリストは包括的ではなく、他のメッセージが表示されることもあります。
表4.1 トランザクション状態の変更
トランザクションの開始 |
トランザクションが開始されたら、クラス |
トランザクションのコミット |
トランザクションがコミットされたら、クラス |
トランザクションのロールバック |
トランザクションがロールバックされたら、クラス |
トランザクションのタイムアウト |
トランザクションがタイムアウトすると、 |
4.1.4. トランザクションログファイルのデコード
4.1.4.1. トランザクションの XID/UID の特定
javax.transaction.TransactionManager
インターフェイスは、トランザクション識別子を見つける方法を 2 つ提供します。
-
toString
メソッドを呼び出すと、識別子を含むトランザクションに関する完全な情報を出力することができます。 この代わりに、
javax.transaction.Transaction
インスタンスをcom.arjuna.ats.jta.transaction.Transaction
にキャストし、ArjunaCore Uid を返すget_uid
メソッドまたはブランチ識別子でないグローバル識別子の Xid を返すgetTxId
メソッドのいずれかを呼び出します。com.arjuna.ats.jta.transaction.Transaction arjunaTM = (com.arjuna.ats.jta.transaction.Transaction)tx.getTransaction(); System.out.println("Transaction UID" +arjunaTM.get_uid());
4.1.4.2. トランザクション状態とリソースの特定
TransactionStatusConnectionManager
TransactionStatusConnectionManager
オブジェクトは、トランザクションの状態を取得するためにリカバリーモジュールによって使用されます。これは、アプリケーションプロセスで TransactionStatusManager
オブジェクトに接続する TransactionStatusConnector
オブジェクトのテーブルを維持することで、TransactionStatusManager
オブジェクトのプロキシーのように動作します。
トランザクション Uid とトランザクションタイプ (ある場合) をパラメーターとして取る getTransactionStatus
メソッドを使用すると、トランザクションの状態を取得することができます。
-
トランザクション Uid パラメーターのプロセス Uid フィールドは、トランザクションオブジェクトストアで目的の
TransactionStatusManagerItem
のホストとポートのペアを検索するために使用されます。 -
ホストとポートのペアは、
TransactionStatusConnector
オブジェクトを使用して目的のTransactionStatusManager
オブジェクトへの TCP 接続を確立するために使用されます。 -
トランザクションの状態を取得するため、
TransactionStatusConnector
はトランザクション Uid とトランザクションタイプをTransactionStatusManager
に渡します。
以下のコード例は、TransactionStatusConnectionManager
を取得し、トランザクションの状態をチェックする方法を表しています。
// Transaction id Uid tx = new Uid(); . . . . TransactionStatusConnectionManager tscm = new TransactionStatusConnectionManager(); // Check if the transaction aborted assertEquals(tscm.getTransactionStatus(tx), ActionStatus.ABORTED);
TransactionStatusManager
TransactionStatusManager
オブジェクトはリカバリーマネージャーのインターフェイスとして動作し、実行中のアプリケーションプロセスからトランザクションの状態を取得します。com.arjuna.ats.arjuna.coordinator.TxControl
クラスによって、アプリケーションプロセスごとに 1 つの TransactionStatusManager
が作成されます。TCP 接続は、リカバリーマネージャーと TransactionStatusManager
との間の対話に使用されます。デフォルトでは、すべての空きポートが TransactionStatusManager
によって使用されます。ただし、使用されるポートは、以下のプロパティーを使用して修正できます。
$ EAP_HOME/bin/standalone.sh -DRecoveryEnvironmentBean.transactionStatusManagerPort=NETWORK_PORT_NUMBER
-
作成時、
TransactionStatusManager
はTransactionStatusManagerItem
としてオブジェクトストアのホストと格納されるポートを取得します。 -
Listener
スレッドが開始され、TransactionStatusConnector
からの接続リクエストを待ちます。 -
接続が確立されると、
AtomicActionStatusService
サービスを実行するConnection
スレッドが作成されます。このサービスは、TransactionStatusConnector
オブジェクトからトランザクション Uid およびトランザクションタイプ (ある場合) を受け入れます。 -
トランザクションの状態はローカルトランザクションテーブルから取得され、
TransactionStatusConnector
オブジェクトに返されます。
4.1.4.3. トランザクション履歴の表示
デフォルトでは、トランザクションサービスはトランザクションに関する履歴を維持しません。作成されたトランザクションの数と作成された各トランザクションの結果に関する情報をトランザクションサービスが維持するようにするには、CoordinatorEnvironmentBean.enableStatistics
プロパティー変数を true
に設定します。
以下の管理 CLI コマンドを使用して、統計を有効にします。
/subsystem=transactions:write-attribute(name=enable-statistics,value=true)
プログラムを使用してより詳細なトランザクション統計を取得するには、com.arjuna.ats.arjuna.coordinator.TxStats
クラスを使用します。
TxStats
クラスの例
public class TxStats { /** * @return the number of transactions (top-level and nested) created so far. */ public static int numberOfTransactions(); /** * @return the number of nested (sub) transactions created so far. * public static int numberOfNestedTransactions(); /** * @return the number of transactions which have terminated with heuristic * outcomes. */ public static int numberOfHeuristics(); /** * @return the number of committed transactions. */ public static int numberOfCommittedTransactions(); /** * @return the total number of transactions which have rolled back. */ public static int numberOfAbortedTransactions(); /** * @return total number of inflight (active) transactions. */ public static int numberOfInflightTransactions (); /** * @return total number of transactions rolled back due to timeout. */ public static int numberOfTimedOutTransactions (); /** * @return the number of transactions rolled back by the application. */ public static int numberOfApplicationRollbacks (); /** * @return number of transactions rolled back by participants. */ public static int numberOfResourceRollbacks (); /** * Print the current information. */ public static void printStatus(java.io.PrintWriter pw); }
com.arjuna.ats.arjuna.coordinator.ActionManager
クラスは、現在アクティブなトランザクションのリストを返す getNumberOfInflightTransactions
メソッドを使用して、特定のアクティブなトランザクションに関する詳細を提供します。