Getterチェーンを使用すると、AppDynamics構成のさまざまなコンテキストでメソッドのデータにアクセスできます。たとえば、Getterチェーンを使用して、戻り値に基づいてビジネストランザクションの名前を付けることができます。

このトピックでは、Getterチェーンの使用方法について説明します。

Getterチェーンについて

Getterチェーンは以下の目的で使用します。

  • JMXメトリックルールを新規作成し、MBean属性からメトリックを定義。詳細については、MBeanからのJMXメトリックの構成を参照してください。
  • トランザクションの命名メカニズムとしてPOJOオブジェクトインスタンスを使用する新しいビジネストランザクションのカスタムマッチルールを定義。詳細については、POJOエントリポイントを参照してください。
  • Servletエントリポイントのカスタムマッチルールを構成し、Getterチェーンのメソッドを定義することでトランザクションに名前を付ける。「ペイロードによるServletトランザクションの分割の例」の「POJO メソッド呼び出しによる分割」を参照してください。

シンプルな Getter チェーンメソッドのみで Getter チェーンを使用することをお勧めします。処理集約的なメソッド(多数の SQL コールを行うメソッドなど)の Getter チェーンは、アプリケーションやエージェントのパフォーマンスを低下させる可能性があります。 

たとえば、MyUser.Name のようにクラスのプロパティを返すシンプルな get メソッドは、以下のようになります。

public class MyUser
{
   private String Name {get; set;}
   private String Url;
   public String GetUrl() {
      return this.Url;
   }
}

Getterチェーンの特殊文字

特殊文字の使用方法は次のとおりです。

  • パラメータを囲むための括弧 ()
  • パラメータを区切るためのカンマ ,
  • パラメータの値から型宣言を区切るためのフォワードスラッシュ /
  • 文字をエスケープするためのバックスラッシュ \ 

    • バックスラッシュ \ を検索するには、バックスラッシュをバックスラッシュでエスケープします。

      GetString().Find(\\)
    • 文字列をバックスラッシュ \ で分割するには、Java および Getter チェーン内でバックスラッシュをエスケープします。

      GetString.split(\\\\).[0]
  • Getter チェーンのメソッドとプロパティを区切るためのドット .
  • 「すべて」がエスケープされなければならないことを表すドット .
  • HTTPRequestオブジェクトのカスタム式で、Getterチェーンを静的エレメントから区切るための波括弧 { }(Servletのカスタムマッチルールと除外ルールのJava Servlet Transaction Naming ConfigurationウィンドウおよびSplit Transactions Using Request Dataタブを含む)

また、Getter チェーンは、文字列の先頭または末尾のスペースを特殊文字として扱います。

リテラル文字のエスケープ

Getter チェーンが特殊文字をその文字として扱う必要がある場合は、バックスラッシュを使用してエスケープします。括弧の場合は、文字列内の閉じ括弧をエスケープするだけです。

  • 次は、文字列パラメータのドットをエスケープする例です。 

    GetAddress().GetParam(a\.b\.c\.)

    エージェントは、GetAddress() の結果に GetParam("a.b.c.") を実行し、パラメータの値を返します。

  • 以下の例では、最初のドットが文字列メソッドパラメータの一部で、エスケープ文字が必要。2つ目と3つ目のドットはメソッドセパレータとして使用されるため、エスケープ文字は必要でない。

    GetUser(suze\.smith).GetGroup().GetId()
  • 次は、文字列内の「()」の検索で開き括弧と閉じ括弧をエスケープする例です。

    GetString.Find(\(\))

.NETに関する備考と例

以下のセクションは、.NETエージェント構成で使用されるGetterチェーンに適用されます。

2 つのバックスラッシュを使用して .NET の Getter チェーン内のバックスラッシュをエスケープします。

パラメータの型宣言

.NETエージェントはパラメータのタイプを以下の方法で認識します。

  • 辞書、つまりプロパティアクセサーに関連付けられているあらゆるものは、文字列にデフォルト設定されている通常のパラメータセットを使用。
  • 配列は単精度整数をパラメータとして使用。

従って、ハッシュまたは get_Item(あらゆる種類のプロパティ)に変換されるものがある場合、0string/0 を意味します。配列の場合は、0int/0 を意味します。

Getterチェーンが、デフォルトタイプ以外のパラメータを持つメソッドを使用する場合、パラメータのタイプを宣言する必要があります。

  • 以下は、オーバーロードされた Susbstring() メソッドを解決するパラメータタイプの宣言方法を示しています。フォワードスラッシュがタイプセパレータの機能を果たしています。

    GetAddress(appdynamics, sf).Substring(int/0, int/10)
    

    たとえば、GetAddress(appdynamics, sf) が「303 2nd St, San Francisco, CA 94107」を返した場合、完全な Getter チェーン式は「303 2nd St」を返します。

  • 以下の例は、浮動小数点数パラメータ、論理値パラメータ、整数パラメータをとるユーザ定義メソッドのパラメータタイプの宣言方法を示しています。フォワードスラッシュがタイプセパレータの機能を果たしています。

    GetAddress(appdynamics, sf).MyMethod(float/0\\.2, boolean/true, boolean/false, int/5)

インデックス付きプロパティおよび辞書の値へのアクセス

Getterチェーンが辞書オブジェクトにアクセスする場合、以下の構文を使ってその値にアクセスできます。

  • キー「suze.smith」の値を返す例。

    UserDictionary.[string/suze\\.smith]
  • 以下の例では、暗黙的 Getter を使用してキー「suze.smith」の値を返す。

    UserDictionary.get_Item(suze\\.smith)

.NET Getterチェーンの文字または正規表現の一致による分割

文字による一致、または正規表現パターンとの一致により文字列として、値を分割することができます。分割オペレーションの結果は文字列または文字の配列で、Getter チェーンで配列インデックス値によって参照できます。 

以下の例は、Getterチェーンにおける文字と文字列の正規表現分割オペレーションの使用方法を示しています。

文字による分割

  • 以下のチェーンは、フォワードスラッシュ文字で URL を分割する。この場合、最初のスラッシュはタイプセパレータとして機能。Getterチェーンは配列の4つ目のアイテムを返す。

    GetUrl().Split(char[]//).[3]

    エージェントがこの Getter チェーンを次の URL に適用した場合は、「Search」が返される:http://howdyworld.example.com/Search/Airfare

  • 次の例では、フォワードスラッシュ文字で分割され、その結果は配列の長さとなる。

    GetUrl().Split(char[]//).Length

     

  • 次はセミコロン区切り文字を使用する URI のトランザクション分割ルールの例。Getter チェーンはフォワードスラッシュで分割した後、4 番目のエレメントがセミコロンで分割される。 

    GetUri().Split(char[]//).[3].Split(char[]/;).[0]

    エージェントがこの Getter チェーンを URL
    http://HowdyWorld.example.com/create-user;sessionid=BE7F31CC0235C796BF8C6DF3766A1D00?act=Add&uid=c42ab7ad-48a7-4353-bb11-0dfeabb798b5
    に適用した場合は、「create-user」が返される。

正規表現による分割

文字列を基にしたパターン一致で値を分割すると、さらにコントロールが可能です。特に、リクエスト本文内におけるコンテンツの一致など、複雑なマッチングが必要となる環境でパターン一致が役立ちます。 

以下は、GetAddress() によって返された値を分割し、その結果得られた配列の 7 番目のエレメントを選択する Getter チェーンの例です。

GetAddress().Split(string/\\W+).[6]

303 2nd St, San Francisco, CA 94107」という住所が与えられた場合、値は単語で分割されて配列の 6 番目の単語(つまり「CA」)が参照されます。 

HTTPリクエスト用のGetterチェーンの作成

.NETエージェントでは、HTTPリクエスト用のGetterチェーンに特別な構文が必要です。

同じティアのフルフレームワークアプリケーション上にASP.NETとASP.NET Coreの両方がある場合、2つのフレームワークで異なるオブジェクトを使用してHTTPリクエストが処理されるため、1つのGetterチェーンを両方に適用することはできません。

  • Getterチェーンの境界に線を引くには、次の構文を使用。

    ${myobject.myproperty}
  • 以下は、ユーザープリンシパルを決定する例。

    ${Context.User.Identity.Name}

この構文は、たとえば以下のような場所に使用します。

  • HTTPリクエストデータコレクタ
  • ASP.NETトランザクション検出のカスタム式

Javaに関する備考と例

以下のセクションは、Javaエージェント構成で使用されるGetterチェーンに適用されます。

Getterチェーンで渡される値

Getter チェーンで渡される値は、他の型にキャストしない限り常に文字列です。  

以下の型のキャストがサポートされています。

  • int
  • 浮動
  • bool(プリミティブブール値)
  • boolean(ボックス化ブール値:ブール型をラップするオブジェクト型)
  • long
  • object

次のセクションでは、Getter チェーンメソッドのパラメータのタイプを参照する方法を示します。タイプの名前については大文字と小文字の区別は重要ではありません。型キャストは、大文字と小文字を区別しないで実行されます。

Java Getterチェーンの例

  • フォワードスラッシュをタイプの区切り文字として使用するsubstringメソッドの整数パラメータを持つGetterチェーン:

    getAddress(appdynamics, sf).substring(int/0, int/10)
  • 様々な非文字列パラメータタイプを持つGetterチェーン:

    getAddress(appdynamics, sf).myMethod(float/0.2, boolean/true, boolean/false, int/5)
  • フォワードスラッシュがエスケープされたGetterチェーン。ここでは文字列パラメータに対してエスケープ文字が必要:

    getUrl().split(\/) # node slash is escaped by a backward slash
  • 配列エレメントを持つGetterチェーン:

    getUrl().split(\/).[4]
  • Hashmap値を返すGetterチェーン:

    get(object/myvalue).substring(int/0,int/10) 
    get(object/ACTION)
  • コンマで区切られた複数の配列エレメントを持つGetterチェーン:

    getUrl().split(\/).[1,3]
  • Getterチェーンがプロパティ値を取得(配列の長さなど):

    getUrl().split(\.).length
  • 文字列パラメータでバックスラッシュを使ってドットをエスケープしているGetterチェーン。
    コールは「getParam (a.b.c)」。

    getAddress.getParam(a\.b\.c\.)
  • 以下のgetterチェーンでは、最初のドットは文字列メソッドパラメータにある(括弧内)ためエスケープ文字が必要。2番目のドットはメソッドパラメータでない(括弧外)ためエスケープ文字は不要。

    getName(suze\.smith).getClass().getSimpleName()

以下のGetterチェーンは、区切り文字としてセミコロンを使用するURIのトランザクション分割ルールによるもの。

getRequestURI().split(\/).[2].split(;).[0]

これをコールすると、getRequestURI() を使用して URI を取得し、エスケープされたフォワードスラッシュを使用して URI を分割します。結果の配列から、3 番目のエントリ(最初のスラッシュはセパレータとして扱われる)を使用して、スラッシュの前にある文字列(この場合は、空)を 1 番目のエントリに挿入します。次に、セミコロンを使用してこの結果を分割し、結果の配列の 1 番目のエントリを取得します。この場合、API 名が含まれています。
たとえば、次の URI があるとします。

/my-webapp/xyz;jsessionid=BE7F31CC0235C796BF8C6DF3766A1D00?act=Add&uid=c42ab7ad-48a7-4353-bb11-0dfeabb798b5


GetterチェーンはAPI名で分割するため、その結果生じる分割トランザクションは「API.abc」、「API.xyz」のようになります。

Tipstring.split() を使用する場合は、正規表現を受け取るため、正規表現の特殊文字をエスケープする必要があります。

たとえば、左角括弧([)で分割するには以下のようにします。

Java syntax: split("\\[")
Getter chain syntax: split(\\\\[)

ブラックリスト登録されたクラス/パッケージと Java Getter チェーンのメソッド

特定のパッケージとクラスは、Getter チェーン内からアクセスできないようにブラックリストに登録されています。

次のメソッドとクラス/パッケージは、Getter チェーンに関して Java エージェントによってブラックリストに登録されています。

手法:

  • getClassLoader
  • loadClass
  • invoke

クラスまたはパッケージ:

  • reflect
  • nio.file
  • ClassLoader
  • io.File
  • io.Socket
  • net.Socket
  • ProcessBuilder
  • Runtime