要求メトリックの拡張
特定のアプリケーションでは、要求メトリック・フロー内でさらなる計測ポイントが必要な場合があります。 例えば、下の呼び出しグラフに見られるように、固有のバックエンド・システムに対する応答時間を理解したい場合があります。
HTTP request /trade/scenario ------------------------------> 172 ms
Servlet/trade/scenario --------------------------------> 130 ms
Servlet/call to unique back-end system -------------------------->38 ms
要求メトリックは、システムを介して各要求のフローをトレースする際、"トークン" または"相関関係子" を使用します。この計測で上の呼び出しグラフを作成するには、ARM エージェントがデータを収集し、ARM ベンダーが呼び出しグラフを作成するように、その要求のフローに接続し、適切なアプリケーション応答測定 (ARM) API を実行する必要があります。
要求メトリックは相関サービス API を公開し、要求のフローに接続します。
次の例は、要求メトリック・フローに接続するために、装備されているアプリケーションが従う可能性がある標準的なフローの 1 つです。
- 新規 ArmTransaction オブジェクトを作成します。これは、開始または停止などのさまざまな計測呼び出しを実行します。 相関サービス Arm ラッパー (PmiRmArmTx) は、要求メトリック・フローに挿入される前に、このオブジェクトをカプセル化します。
- 適切な ArmCorrelator オブジェクトで ArmTransaction オブジェクトを取り込みます。 このオブジェクトは、実際の ARM 相関関係子のバイトをカプセル化します。
- ArmTransaction オブジェクトで start メソッドを実行し、装備されたメソッドの先頭にマークを付けます。
- PmiRmArmTxFactory クラス上の静的メソッドを使用して PmiRmArmTx オブジェクトをインスタンス化し、その PmiRmArmTx オブジェクトに ArmTransaction 先行オブジェクトを取り込みます。
- PmiRmArmStack クラス上の露出メソッドを使用して相関サービス・スタックに置くことにより PmiRmArmTx 先行オブジェクトを相関サービスに渡します。
- 装備されるメソッドが行う必要があるタスクを実行します。 相関サービスは、必要に応じて、ArmTransaction オブジェクトのフローを処理し、最終的に、 トランザクション時間の呼び出しグラフを表示することになります。
- 装備されたメソッドの最後に、PmiRmArmStack クラスで公開されたメソッドを使用して相関サービスから PmiRmArmTx オブジェクトにアクセスし、ArmTransaction オブジェクトにアクセスして、トランザクションの最後を示すために停止を実行します。
サーブレット計測機能の一部として ARM API を相関サービスとともに使用する場合は、この情報を参照してください。
arm40 バイナリーは、実装プロバイダーによって提供されるインストールの指示どおりにインストールしてください。 インストールを行ったら、サーバーを再始動します。 これによって、トレース・レコードが SystemOut.log ファイル内に生成され、適切な ARM 実装のインスタンス化が示されます。以下の例は、サーブレット計測機能の一部として相関サービスと連携して ARM API を使用する、標準的なワークフローの 1 つを示しています。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PmiRmArmTx artrax =
// The factory detects the currently active ARM implementation (specified by user through
// admin console) and instantiates an appropriate ARM wrapper object
PmiRmArmTxFactory.createPmiRmArmTx();
ArmTransaction at = newArmTx();
if (null == at)
out.println("Got a null ArmTransaction");
ArmCorrelator arc = newArmCorr();
at.start(arc);
try {
artrax.setArmTransaction(at);
PmiRmArmStack.pushTransaction(artrax);
} catch (Exception e) {
System.out.println("Caught 1 exception" + e);
}
PmiRmArmTx atxwrp = PmiRmArmStack.peekTransaction();
if (atxwrp == null)
out.println("Armtransaction is null");
//getArmType
try {
out.println("ARMTYPE is"+ PmiRmArmTx.getARMType());
} catch (Exception e) {
out.println(e);
}
//getting correlator bytes
try {
if (null == atxwrp.getCorrelatorBytes())
out.println("Got a null Correlator");
} catch (Exception e) {
out.println(e);
}
//blocked/unblocked
long blkid = 0;
try {
out.println(blkid = atxwrp.blocked());
} catch (Exception e) {
out.println(e);
}
try {
out.println(atxwrp.unblocked(blkid));
} catch (Exception e) {
out.println(e);
}
try {
atxwrp = PmiRmArmStack.popTransaction();
ArmTransaction art = (ArmTransaction) atxwrp.getArmTransaction();
art.stop(ArmConstants.STATUS_GOOD);
} catch (Exception e) {
out.println(e);
}
}
private ArmTransaction newArmTx() {
ArmTransactionFactory txFactory = null;
try {
String sWasName = "WebSphere";
String appName = "t23xpimage/t23xpimage/server1";
String sCellName = appName.substring(0, appName.indexOf("/"));
String sNodeInstance =
appName.substring(appName.indexOf("/") + 1, appName.length());
sNodeInstance = sNodeInstance.replace('/', '.');
txFactory = (ArmTransactionFactory)
newObjectInstance("org.opengroup.arm40.sdk.ArmTransactionFactoryImpl");
ArmApplication app = null; // 149297
ArmApplicationDefinition appDef = null; //LIDB3207
appDef = txFactory.newArmApplicationDefinition(sWasName, null, null);
app = txFactory.newArmApplication(appDef, sCellName, sNodeInstance, null);
String[] idnames = { "request_type" };
String[] idvalues = { "URI" };
String[] ctxnames = { "URI" };
ArmIdentityPropertiesTransaction props =
txFactory.newArmIdentityPropertiesTransaction(
idnames,
idvalues,
ctxnames,
null);
ArmTransactionDefinition atd =
txFactory.newArmTransactionDefinition(
appDef,
"URI",
props,
(ArmID) null);
ArmTransaction at = txFactory.newArmTransaction(app, atd);
return at;
} catch (Exception e) {
System.out.println(e);
return null;
}
}
private ArmCorrelator newArmCorr() {
ArmTransactionFactory txFactory = null;
try {
String sWasName = "WebSphere";
String appName = "t23xpimage/t23xpimage/server1";
txFactory =
(ArmTransactionFactory) newObjectInstance("org.opengroup.arm40.sdk.ArmTransactionFactoryImpl");
ArmCorrelator arc =txFactory.newArmCorrelator(
PmiRmArmStack.peekTransaction().getCorrelatorBytes());
return arc;
} catch (Exception e) {
System.out.println(e);
return null;
}
}
注: このトピックでは、
1 つ以上のアプリケーション・サーバー・ログ・ファイルを参照します。推奨される代替案として、分散システムや IBM® i システムの SystemOut.log、SystemErr.log、trace.log、activity.log ファイルではなく、High Performance Extensible Logging (HPEL) ログおよびトレース・インフラストラクチャーを使用するようにサーバーを構成できます。また HPEL は、ネイティブ z/OS® ロギング機能と連携させて使用することができます。HPEL を使用する場合、LogViewer コマンド・ライン・ツールを
サーバー・プロファイルの bin ディレクトリーから使用して、すべてのログ・ファイルにアクセスし、
情報をトレースできます。HPEL の使用について詳しくは、HPEL を使用してのアプリケーションの
トラブルシューティングに関する情報を参照してください。
PmiRmArmStack の使用には、可能性のあるシナリオがいくつかあります。 この例では、コードがスタック上の既存の PmiRmArmTx にアクセスし、 相関関係子を抽出し、blocked と unblocked を呼び出すシナリオを示します。 これは、 サポートされないプロトコルに従って相関関係子を送信する場合の標準的なシナリオです。 このシナリオでは、Arm トランザクションが既にスタック上にあります。
1 PmiRmArmTx artrax =
2 PmiRmArmStack.peekTransaction();
3 if( artrax != null )
4 {
5 try
6 {
7 byte[] cbytes = artrax.getCorrelatorBytes();
8 stuffBytesIntoOutboundMessage( msg, cbytes);
9 long blockedId = 0;
10 try
11 {
12 blockedId = artrax.blocked();
13 }
14 catch( NoSuchMethodException nsme )
15 {
16 // must not be running ARM4 or eWLM
17 }
18 sendMsg( msg );
19 try
20 {
21 artrax.blocked( blockedId );
22 }
23 catch( NoSuchMethodException nsme )
24 {
25 // must not be running ARM4 or eWLM
26 }
27
28 }
29 catch( Exception e )
30 {
31 report a problem;
32 }
33 }