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
}
CODE

processOrder() メソッドの最初のパラメータ orderType を使用してトランザクションの名前を付けることにします。 

  1. カスタムマッチルールの [Rule Configuration] タブで、[Split Transactions using the XML/JSON payload or Java method invocation] をオンにします。
  2. 分割メカニズムとして、[POJO Method Call] を選択します。 
  3. メソッドに [processOrder] を選択し、パラメータの数値位置(0 インデックス)でパラメータを指定します。次のスクリーンショットは、該当するすべてのリクエストの名前を Store.order.creditcard トランザクションにするカスタムマッチルールの構成を示しています。
    Split Transactions Using Payload

このパラメータの他に、戻りタイプまたはオブジェクトの再帰的な getter チェーンのいずれかを指定してトランザクションに名前を付けることもできます。たとえば、メソッドパラメータがPurchaseOrderのような複雑なオブジェクトを指している場合、getOrderDetails().getType()などを使用してトランザクションを適切に名付けることができます。

JSP名によるトランザクションの分割

次の方法で、JSP名によるトランザクションの識別ができます。 

  1. [Rule Configuration] タブで、[Split Transactions using the XML/JSON payload or Java method invocation] をオンにします。
  2. 分割メカニズムとして、[POJO Method Call] を選択します。 
  3. クラス名を「com.sun.faces.application.ViewHandlerImpl」に設定します。
  4. メソッド名を「renderView()」に設定します。
  5. 引数のインデックスを「1」に設定します。
  6. メソッドコールチェーンまたは 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>
      &lt;item>Item1&lt;/item> 
      &lt;item>Item2&lt;/item>
      &lt;item>Item3&lt;/item>
   </order>
<acme>
CODE

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)
   ...
}
CODE


注文のタイプに応じて、「注文」トランザクションを区別するとします。この例で「creditcard」と評価される、この XML ペイロードの XPath 式 //order/type を使用できます。

  1. [Rule Configuration] タブで、[Split transactions using XML/JSON Payload or a Java method invocation] をオンにします。
  2. 分割メカニズムとして [XPath Expressions] を選択します。
  3. 命名に使用する 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>         
      &lt;item>Item1&lt;/item>
      &lt;item>Item2&lt;/item>        
      &lt;item>Item3&lt;/item>  
   </order>
<acme>
CODE

次のスニペットは、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)
   ...
}
CODE

XMLバインディングに基づいてトランザクションを分割するには

  1. [Rule Configuration] タブで、[Split transactions using XML/JSON Payload or a Java method invocation] をオンにします。 
  2. 分割メカニズムとして、[Java XML Binding] を選択します。
  3. 一致基準として、以下の値を入力。 
    • Unmarshaled Class Name:PurchaseOrderDocument
    • Method name:getOrderType()

エージェントはこの例のビジネストランザクションを 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
}}
CODE

次のコードスニペットは 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)
   ...
}
CODE

アプリケーションが、送信済みの JSON ペイロードを JSON オブジェクトにアンマーシャルすると、「type」キーを使用して注文のタイプを識別できるようになります。この場合、このキーは個々のビジネストランザクションを一意に特定します。

トランザクションの識別に JSON ペイロードを使用するには、各ノードで enable-json-bci-rules ノードプロパティを true に設定し、このルールを有効にする必要があります。ルールを構成するには

  1. [Rule Configuration] タブで、[Split transactions using XML/JSON Payload or a Java method invocation] をオンにします。 
  2. JSON オブジェクトキーの場合、JSON オブジェクトの名前を入力します。たとえば、type のようになります。

エージェントは自動的に JSONObject.get("$JSON_Object_Key") メソッドをインターセプトしてトランザクションに命名します。JSON オブジェクトがアンマーシャルされるまでエージェントはトランザクション名を取得しませんが、トランザクションの応答時間は doGet() メソッドから計算されます。