Download PDF
Download page Getterチェーンの使用.
Getterチェーンの使用
Related pages:
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 チェーンに適用されます。
パラメータの型宣言
.NETエージェントはパラメータのタイプを以下の方法で認識します。
- 辞書、つまりプロパティアクセサーに関連付けられているあらゆるものは、文字列にデフォルト設定されている通常のパラメータセットを使用。
- 配列は単精度整数をパラメータとして使用。
従って、ハッシュまたは get_Item
(あらゆる種類のプロパティ)に変換されるものがある場合、0
は string/0
を意味します。配列の場合は、0
は int/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 WebForms、MVC、MVC WebAPI アプリケーションの場合は、
System.Web.HttpRequest
オブジェクトに基づいて Getter チェーンを作成します。 - フルフレームワーク上の ASP.NET Core の場合は、Microsoft.AspNetCore.Http.Internal.DefaultHttpRequest オブジェクトに基づいて 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」のようになります。
Tip:string.split()
を使用する場合は、正規表現を受け取るため、正規表現の特殊文字をエスケープする必要があります。
たとえば、左角括弧([)で分割するには以下のようにします。
Java syntax: split("\\[") Getter chain syntax: split(\\\\[)
縦棒またはパイプ(|)は、Getter 文字列の予約文字です。正規表現パラメータを使用するメソッドでは、代わりに Unicode を使用します。
例:
split(string/\\u007C).[0] // return the first element of an string split by a Vertical Bar.
ブロックリストに登録されたクラスまたはパッケージと Java Getter チェーンのメソッド
特定のパッケージとクラスは、Getter チェーン内からアクセスできないようにブロックリストに登録されています。
次のメソッドとクラスまたはパッケージは、Getter チェーンに関して Java エージェントによってブロックリストに登録されています。
手法:
getClassLoader
loadClass
invoke
クラスまたはパッケージ:
reflect
nio.file
ClassLoader
io.File
io.Socket
net.Socket
ProcessBuilder
Runtime