Download PDF
Download page ペイロードによるServletトランザクションの分割の例.
ペイロードによるServletトランザクションの分割の例
AppDynamics では、リクエストペイロードに応じて、Servlet カスタムマッチルールを分割できます。これらの例のそれぞれで、Servletカスタムマッチルールを作成し、Rule ConfigurationタブでURIオプションを有効にする必要があります。
POJOメソッド呼び出しによる分割
以下の場合、トランザクションの名付けにJavaメソッドを使用すると便利です。
- 明確なURIパターンがない場合
- サポートされていないXML/JSONフレームワークを使用する場合
URL(http://acmeonline.com/store
)における Servlet の doPost()
メソッドの processOrder()
メソッドを例にとります。
public void doPost(HttpServletRequest req, HttpServletResponse resp) {
//process the data from the sevlet request and get the orderType and the items
processOrder(orderType,item)
...
}
public void processOrder(String orderType,String item) {
//process order
}
processOrder()
メソッドの最初のパラメータ orderType
を使用してトランザクションの名前を付けることにします。
- カスタムマッチルールの [Rule Configuration] タブで、[Split Transactions using the XML/JSON payload or Java method invocation] をオンにします。
- 分割メカニズムとして、[POJO Method Call] を選択します。
- メソッドに [processOrder] を選択し、パラメータの数値位置(0 インデックス)でパラメータを指定します。次のスクリーンショットは、該当するすべてのリクエストの名前を
Store.order.creditcard
トランザクションにするカスタムマッチルールの構成を示しています。
このパラメータの他に、戻りタイプまたはオブジェクトの再帰的な getter チェーンのいずれかを指定してトランザクションに名前を付けることもできます。たとえば、メソッドパラメータがPurchaseOrderのような複雑なオブジェクトを指している場合、getOrderDetails().getType()などを使用してトランザクションを適切に名付けることができます。
JSP名によるトランザクションの分割
次の方法で、JSP名によるトランザクションの識別ができます。
- [Rule Configuration] タブで、[Split Transactions using the XML/JSON payload or Java method invocation] をオンにします。
- 分割メカニズムとして、[POJO Method Call] を選択します。
- クラス名を「
com.sun.faces.application.ViewHandlerImpl
」に設定します。 - メソッド名を「
renderView()
」に設定します。 - 引数のインデックスを「1」に設定します。
- メソッドコールチェーンまたは getter を
getViewId()
として定義します。エージェントは、<Name of the Custom Rule>.<path to jsp>
をトランザクション名に追加します。
必要に応じて、後からこれらのビジネストランザクションの名前をよりわかりやすい名前に変更できます。
XPath式でのトランザクションの分割
XPath式を使用したビジネストランザクションの命名または分割に使用するXMLペイロード内の値にアクセスできます。Consider the following example from an XMLが3つのアイテムの注文を表している、次のEcommerce注文トランザクションの例を考えてみます。この注文では、次のボディの特徴的な要素であるクレジットカード処理を使用しています。
<acme>
<order>
<type>creditcard</type>
<item>Item1</item>
<item>Item2</item>
<item>Item3</item>
</order>
<acme>
URLは、以下のようになります。
http://acmeonline.com/store
Servlet の doPost()
メソッドは次のようになります。
public void doPost(HttpServletRequest req, HttpServletResponse resp) {
DocumentBuilderFactory docFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(req.getInputStream());
Element element = doc.getDocumentElement();
//read the type of order
//read all the items
processOrder(orderType,items)
...
}
注文のタイプに応じて、「注文」トランザクションを区別するとします。この例で「creditcard
」と評価される、この XML ペイロードの XPath 式 //order/type
を使用できます。
- [Rule Configuration] タブで、[Split transactions using XML/JSON Payload or a Java method invocation] をオンにします。
- 分割メカニズムとして [XPath Expressions] を選択します。
- 命名に使用する XML エレメントの値を指す XPath 式を入力します。この例では、
//order/type
エージェントは、「Store.order.creditcard
」のように、XPath 式の値をビジネストランザクションの名前に付加します。エージェントは、XML が解析されるまでトランザクションに命名しませんが、AppDynamics は doPost()
メソッドの実行を含んだビジネストランザクションの継続時間を測定します。
1 つ以上の XPath 式を使ってビジネストランザクション用に生成された名前を連鎖することができます。
この式が値に評価されない場合、リクエストによってトランザクションが分割されるかどうかを指定できます。
Java XMLバインディングでのトランザクションの分割
以下のタイプのフレームワークにおいて、Java XMLデータバインディング フレームワークのトランザクションを識別することができます。
- Castor
- JAXB
- JibX
- XMLBeans
- XStream
次の例では、送信された XML が PurchaseOrderDocument
オブジェクトにアンマーシャルされ、注文のタイプの識別には、getOrderType()
メソッドを使用する必要があります。
<acme>
<order>
<type>creditcard</type>
<item>Item1</item>
<item>Item2</item>
<item>Item3</item>
</order>
<acme>
次のスニペットは、Servlet の doPost()
メソッドを表しています。
public void doPost(HttpServletRequest req, HttpServletResponse resp) {
PurchaseOrderDocument poDoc = PurchaseOrderDocument.Factory.parse(po);
PurchaseOrder po = poDoc.getPurchaseOrder();
String orderType = po.getOrderType();
//read all the items
processOrder(orderType,items)
...
}
XMLバインディングに基づいてトランザクションを分割するには
- [Rule Configuration] タブで、[Split transactions using XML/JSON Payload or a Java method invocation] をオンにします。
- 分割メカニズムとして、[Java XML Binding] を選択します。
- 一致基準として、以下の値を入力。
- Unmarshaled Class Name:
PurchaseOrderDocument
- Method name:
getOrderType()
- Unmarshaled Class Name:
エージェントはこの例のビジネストランザクションを Store.order.creditcard
として識別します。
このカスタムルールを使用すると、Java エージェントは XMLBeans のメソッド(XML を Java オブジェクトにアンマーシャルする)をインターセプトします。トランザクションの名前が、アンマーシャルされたオブジェクトにおいて最初のレベルの getter にない場合は、getOrderType().getOrder()
などの再帰的 getter チェーンを使用して名前を取得します。
XML がアンマーシャルされるまでトランザクション名は取得されませんが、トランザクションの応答時間は doGet()
メソッド呼び出しにより算出されます。
JSONペイロードでのトランザクションの分割
トランザクションの識別には、Servletがペイロードをアンマーシャルするメソッドを使用してJSONペイロードにアクセスすることができます。
たとえば、次の JSON ペイロードは car
アイテムの order
を送信し、注文の処理に creditcard
を使用します。URL は http://acmeonline.com/store
です。
order :{
type:creditcard,
id:123,
name:Car,
price:23
}}
次のコードスニペットは Servlet の doPost
メソッドを示しています。
public void doPost(HttpServletRequest req, HttpServletResponse resp) {
//create JSONObject from servlet input stream
String orderType = jsonObject.get("type");
//read the item for the order
processOrder(orderType,item)
...
}
アプリケーションが、送信済みの JSON ペイロードを JSON オブジェクトにアンマーシャルすると、「type」キーを使用して注文のタイプを識別できるようになります。この場合、このキーは個々のビジネストランザクションを一意に特定します。
トランザクションの識別に JSON ペイロードを使用するには、各ノードで enable-json-bci-rules
ノードプロパティを true
に設定し、このルールを有効にする必要があります。ルールを構成するには
- [Rule Configuration] タブで、[Split transactions using XML/JSON Payload or a Java method invocation] をオンにします。
- JSON オブジェクトキーの場合、JSON オブジェクトの名前を入力します。たとえば、
type
のようになります。
エージェントは自動的に JSONObject.
get("$JSON_Object_Key"
) メソッドをインターセプトしてトランザクションに命名します。JSON オブジェクトがアンマーシャルされるまでエージェントはトランザクション名を取得しませんが、トランザクションの応答時間は doGet()
メソッドから計算されます。