[WLS] WebLogic Server–Use the Execution Context ID in Applications–Lessons From Hansel and Gretel

先週巧妙なトリックを知りました。ヘンゼルとグレーテルのようにパン粉を無駄にしてはいけません。リクエストがシステムを通る際の、各リクエストのコードパス、ログ、およびエラーを追跡しましょう。今週はじめにOTNのWLS forumに投稿されたOracle ACEのJohn Stegemanから、実行コンテキストID(Execution Context ID、以下ECID)を調べるにはどうすればいいかという質問が出ていました。彼の意図は、利用者がヘルプデスクに問い合わせたり、アプリケーション管理者がエラーの原因を調べたりするために、エラーページにECIDを表示したい、というものです。

Thread: How to display ECID in an error page
http://forums.oracle.com/forums/thread.jspa?messageID=9660921

では、ECIDって何なんでしょう。リクエストがシステムに入り、Oracle HTTP ServerからOracle Web Cache、複数のWebLogic Server、Oracle Databaseまで流れる際に、Fusion MiddlewareはECIDを注入します。これは各層をまたがってリクエストを一意に識別する方法です。

ドキュメントによると、
ECIDの値は一の識別子で、同一のリクエスト実行フローの一部である個々のイベントを関連づけるために使うことができます。例えば、特定のリクエストに関連するものとして識別されるイベントは、通常、同じECID値を持ちます。ECID文字列自体のフォーマットは、変更される可能性がある内部のメカニズムによって決定されますので、そのフォーマットに依存するようなことはすべきではありません。
Johnが持っていた斬新なアイデアは、Fusion Middlewareが捕捉する診断情報を使ってこのコンセプトを拡張するものでした。より多くの情報を相関させることができるのですから、この識別子をログやエラーに使わない手はありません。ログは既にユーザーを識別していると思いますが、リクエストを識別できるようにしないのでしょう。WebLogic Server内でこの情報を取得するためにやるべきことは、DiagnosticContextHelperを呼び出すことです。
weblogic.diagnostics.context.DiagnosticContextHelper.getContextId()
このクラスには診断フレームワークで追跡した他の値を確認するという、有用なメソッドもあります。この方法で、より詳細の各層をまたがった情報を確認できます。

性能分析の際に、コードのどこで時間がかかっているかを見つけ出すのにECIDは非常に役立ちますが、これについては既に過去のエントリで取り上げています。

WebLogic Server Screencasts - Where does the time go?
http://blogs.oracle.com/jamesbayer/entry/weblogic_server_screencasts_-

JRockit Flight RecorderはWLS 10.3.3以降でWLDF(WebLogic診断フレームワーク) Diagnostic Volumeを使って自動的に有用な数多くの情報を捕捉、各イベントを相関させることができます。その際特殊なエージェントを入れる必要はなく、JRockitおよびWebLogic Serverの標準設定で実現できるのです。JRockit Flight Recorderで、一つのリクエストがサーブレットを呼び、そのサーブレットがEJBを呼び、EJBがデータベース接続を取得し、トランザクションを開始する、などといった情報を見ることができます。各コンポーネントでの所要時間や、使用したSQLも確認できます。
http://download.oracle.com/docs/cd/E21764_01/web.1111/e13714/using_flightrecorder.htm#WLDFC480

最近のWebLogic Server管理コンソールでもこのデータを可視化できます。WLDF Instrumentationを有効にすると、JRockitの他のJVMでも可視化できます。
ちょっとしたサンプルアプリケーションを作成して、ECIDがJVMの境界を越えていることを確認してみました。あるJVMのサーブレットを実行すると、そのサーブレットは別のJVMで動作するStateless Session BeanのEJBクライアントとして振る舞います。各々の呼び出しで同じECIDを返します。このアプリケーションはWLDF Instrumentationを有効にしておく必要があります。そうでなければ、フレームワークがnullを返します。このAPIを教えてくれたJohnに感謝します。


原文はこちら。
http://blogs.oracle.com/jamesbayer/entry/weblogic_server_use_the_execution

0 件のコメント:

コメントを投稿