プローブ設定の変更
デフォルトのプローブ設定を変更または無効化したり、追加のクラスをモニターするためのカスタム・プローブを有効にすることができます。
このトピックでは、次のプローブタスクについて説明します。
デフォルトのプローブ設定の変更または無効化
ProbeConfig.acml
ファイルを使用して、デフォルトのプローブ設定を変更または無効化できます。
APM Javaエージェントをプロビジョニングすると、oracle-apm-agent/config
ディレクトリ内でProbeConfig.acml
ファイルが使用可能になります。ProbeConfig.acml
ファイルへのアクセス方法の詳細は、APM Javaエージェントのプロビジョニングに関する項を参照してください。
ProbeConfig.acml
ファイルを使用すると、次の操作を実行できます。
- 特定のプローブを有効または無効にします。
- URL、ファイル拡張子などの情報に基づいてトレース/スパンの特定のパターンのモニタリングを無効にします。
- 追加タグ/ディメンションの取得を有効にします。たとえば、SERVLETプローブの特定のヘッダーとパラメータを取得します。
- スパン名を操作します。たとえば、SERVLETまたはHTTP_CLIENTプローブのURLを操作します。
- スパン・ログとして1,000文字を超える長さのDB SQL問合せ文を取得します。
jdbcスパン・ログのSQL問合せ文全体のロギングを有効または無効にするには、
enable_complete_sql_span_log_jdbc
パラメータを使用します。この機能は、長いSQL問合せを1,000文字で切り捨てる場合に役立ちます。たとえば、enable_complete_sql_span_log_jdbc: true
を使用して有効にします。 - ログインしたユーザー名を取得します。
ハッシュ・ユーザー名は、個人識別可能情報(PII)を公開せずに、一意のユーザー数に関するレポートを許可する目的で、認証済セッションに対して取得されます。ただし、ユーザー名をプレーン・テキスト形式でレポートする必要がある場合があります。その場合は、一般セクションに移動し、
track_plain_username: true
を設定します。 - ペイロードを取得します。
ペイロードには、HTTPリクエストとレスポンスの両方のコンテンツが含まれます。
ペイロードを有効にすることで、アプリケーション・リクエストの完全なフローを追跡し、収集されたデータを分析のためにトレース・エクスプローラに送信できます。
ペイロード取得のサポートには、サーブレット、JAX-RSサーバー、OSBプロキシ・サービスおよびOSBビジネス・サービスが含まれます。
APM Javaエージェント・バージョン1.16以降、Apache Httpクライアント(4.xおよび5.x)、JDK 11+ Httpクライアント、OCI SDK Httpクライアント(2.xおよび3.x)、Spring Webクライアント5.xおよびOkHttpクライアント2.xおよび3.xもサポートされています。
ペイロードの有効化: HTTPリクエストおよびレスポンスのペイロードを有効にするには、
ProbeConfig.acml
ファイルでパラメータcapture_request_payload
およびcapture_response_payload
を設定します。- ペイロードのサブセットを取得するには、操作名に基づいてxpath/jsonpath/regex式を適用できます。
- 有効にすると、取得されたペイロードは、それぞれ
RequestPayload
およびResponsePayload
というディメンションとして使用できるようになります。デフォルトの最大長は1000文字です。 - 同じペイロードの複数のディメンションを取得するには、式とともにtag_nameを指定します。
- HttpClient非同期コールのモデリングを変更します。
APM Javaエージェント・バージョン1.16以降、単一のスパンがアウトバウンド・リクエスト、待機時間およびコールバックを表します。
以前のエージェント・バージョン(アウトバウンド・コールに1つ、コールバックに2つ)からの以前の動作を維持するには、ProbeConfig.acml
ファイルのHTTP_CLIENTセクションにあるhttpclient_async_one_span
パラメータを変更し、false
に設定します。#Enables capturing async client invocations as a single span. No separate callback spans will be reported httpclient_async_one_span: false
デフォルトのプローブ設定の動作は、APM JavaエージェントのProbeConfig.acml
ファイルを使用して更新できます。
デフォルトのプローブ設定を変更するには、ProbeConfig.acml
ファイルにある指示に従います。
ProbeConfig.acml
ファイルへの変更は、アプリケーション・サーバーの実行中に行うことができます。変更を有効にするためにアプリケーション・サーバーを再起動する必要はありません。
APM Javaエージェント・バージョン1.12以降では、サーブレット、HttpClientおよびOSBプローブのネーミング規則が改善され、簡略化されています。したがって、Hex IDおよび番号を削除するためのreplace_all_patterns
ルールは、デフォルトでProbeConfig.acml
ファイルに含まれなくなりました。これは、SERVLET、HTTP_CLIENTおよびOSBセクションに適用されます。
# Hex ID and numbers
-
pattern: "([a-fA-F\._\:-]*[0-9]+){2,}[a-fA-F_\:-]*([/\.])?"
replacement: "*$2"
カスタム・プローブの構成
追加のクラスをモニターし、アプリケーション固有の詳細を取得するように、カスタム・プローブを構成できます。
ProbeConfig.acml
ファイル内で使用可能な組込みのプローブ・セットがモニタリングの要件を満たしていない場合は、カスタム・プローブが便利です。たとえば、デフォルトのプローブを使用してモニターされていないバックグラウンド・スレッドをモニターする必要がある場合は、それをモニターするようにカスタム・プローブを構成できます。
カスタムプローブを構成するには、次の手順を実行します。
DirectivesConfig.acml
ファイルを構成して、モニターするclasses
、methods
またはannotations
を指定します。詳細は、DirectivesConfig.acmlファイルの構成を参照してください。DirectivesConfig.acml
ファイルをoracle-apm-agent/config
ディレクトリに追加します。アプリケーション・サーバーの起動スクリプトで次を使用してこの方法でDirectivesConfig.acml
ファイルを指定することは非推奨になりました。-Dcom.oracle.apm.agent.customDirectivesFile=<Path_to_DirectivesConfig.acml_file>
DirectivesConfig.acml
ファイルを以前に指定している場合は、アプリケーションの起動スクリプトから前述の引数を削除します。- 新しい
DirectivesConfig.acml
ファイルが指定されている場合は、アプリケーション・サーバーを再起動します。DirectivesConfig.acml
ファイルの変更は、アプリケーション・サーバーの再起動後に有効になります。新しい
DirectivesConfig.acml
ファイルを指定するかファイルを削除する場合は、アプリケーション・サーバーの再起動が必要です。次のいずれかを実行する場合、アプリケーションサーバーの再起動は必要ありません。span_name
を編集します。- すでに有効になっている既存の
DirectivesConfig.acml
ファイルで、tags
、logs
または拡張変数を追加、編集または削除します。
DirectivesConfig.acmlファイル構成
DirectivesConfig.acml
ファイルを構成するには、次を確認します。
DirectivesConfig.acmlパラメータ
ここでは、DirectivesConfig.acml
ファイルで指定できるパラメータについて説明します。
DirectivesConfig.acml
ファイルに次のパラメータMUSTの少なくとも1つを指定する必要があります:
class_name
class_name_regex
class_annotation
method_annotation
class_annotation_regex
method_annotation_regex
パラメータ | 説明 | 例 |
---|---|---|
label |
ディレクティブの一意のラベル。これは必須パラメータです。 |
|
class_name |
モニターするクラスの名前。パッケージを含む完全なクラス名を指定する必要があります。 |
|
class_name_regex |
一致するクラスをモニターするための正規表現(regex)パターン。 正規表現パターンでは、パッケージに"."ではなく"/"を使用します。たとえば、
|
|
method_name |
モニターするメソッドの名前。これにはメソッド・パラメータは含まれません。
|
|
method_name_regex |
一致するメソッドをモニターするための正規表現パターン。
|
|
class_annotation |
モニターする注釈の完全なクラス名。指定された注釈を持つ |
|
method_annotation |
モニターする注釈の完全なクラス名。指定された注釈を持つ |
|
class_annotation_regex |
一致するクラス注釈をモニターするための正規表現パターン。 正規表現パターンでは、パッケージに"."ではなく"/"を使用します。また、値は"L"で始まり、";"で終わる必要があります。たとえば、
|
|
method_annotation_regex |
一致するメソッド注釈をモニターするための正規表現パターン。 正規表現パターンでは、パッケージに"."ではなく"/"を使用します。また、値は"L"で始まり、";"で終わる必要があります。たとえば、
|
|
include_sub_classes |
ターゲット・クラスのサブクラスをモニターする必要があるかどうかを指定します。デフォルトでは、これは |
|
span_name |
モニタリング中に作成されるスパンの名前。 対応する例の
|
|
tags |
スパンに含めるタグ(名前と値)。
指定した タグ値の場合、オプションのタイプを指定できます。適切な構文およびキーワードを使用して、タイプString、Boolean、Integer、Long、FloatまたはDoubleのタグ値を指定できます(例を参照)。デフォルトのタグ値タイプは文字列です。タイプまたは互換性のないタイプが指定されている場合に使用されます。タグ値に互換性のない型が指定されている場合、その型はデフォルトのStringに戻され、非互換性に関するログ・メッセージが表示されます。スパン・ディメンション値は、トレース・エクスプローラで数値(該当する場合)を利用する集計を使用して問合せによって確認できます。 |
|
logs |
スパンに含めるログ(名前と値)。 指定した |
|
span_name、タグおよびログ変数
span_name
、tags
およびlogs
パラメータを指定するときに、追加情報を取得するために次の変数を使用できます:
class_name
: モニターされているクラスの名前(パッケージを含む)。short_class_name
: モニターされているクラスの名前(パッケージを含まない)。method_name
: モニターされているメソッドの名前。method_descriptor
: モニターされているメソッドのシグネチャの記述子フォーマット。param#
: モニターされているメソッドのパラメータ。param1
は最初のパラメータ、param2
は2番目のパラメータ、などを示します。this
: モニターされているオブジェクト。モニターされているmethod
がstatic
の場合、this
変数は使用できなくなります。return
: モニターされているメソッドの戻り値。ノート
return
変数はtags
パラメータにのみ使用できます。span_name
には使用できません。
DirectivesConfig.acmlの例
DirectivesConfig.acml
ファイルの例を次に示します:
Test:
class_name: "com.oracle.apm.samples.servlet.OutboundTestServlet"
method_name: "performHttpURLConnectionCall"
include_sub_classes: true
span_name: "${short_class_name}.${method_name}"
tags:
targetURL: "${param2}"
port: "${param1}"
前述の例に基づく:
com.oracle.apm.samples.servlet.OutboundTestServlet.performHttpURLConnectionCall
は、そのサブクラスとともにモニターされます。- トレース・エクスプローラに表示されるスパンの名前は、
OutboundTestServlet.performHttpURLConnectionCall
になります。 targetURL
タグとport
タグがスパンに追加され、performHttpURLConnectionCall
メソッドの最初のパラメータと2番目のパラメータの値が使用されます。
次のスクリーンショットは、カスタム・プローブ・ページの例です:
カスタムプローブの詳細変数
カスタム・プローブを使用する場合、メソッド・チェーンおよび正規表現を介した文字列操作を使用して変数を動的に構築するように、拡張コマンド構文を構成できます。これらの拡張変数は、前述のその他の変数と同様に、span_name
、tags
およびlogs
セクションで参照できます。
- カスタムプローブの構成方法を確認します。Configure a Custom Probeを参照してください。
- コマンド・チェーン構文を確認します。コマンド・チェーンの構文を参照してください。
- 例を確認します。拡張変数の例を参照してください。
コマンド・チェーン構文
パイプ記号「|」は、開始オブジェクトを最初のチェーンコマンドにパイプし、1つのチェーンコマンドの出力オブジェクトを次のチェーンコマンドにパイプさせるために使用されます。
実行時間
コマンドチェーンは、Custom Probeのモニター対象メソッドを呼び出す前またはあとに実行されます。これは、SOIの前に表示される実行時間で指定されます。
<execution time> ::= [before || after]
すべてのコマンド・チェーンが両方の実行時間と互換性があるわけではありません。return
がSOIとして使用される場合、またはメソッド・コマンドのパラメータとして使用される場合、後の実行時間を使用する必要があります。これは、監視対象メソッドが呼び出された後にのみ戻りオブジェクトが使用可能であるためです。メソッド・コマンドで他の変数がSOIまたはパラメータとして使用される場合、実行時間は参照されたチェーンに依存します。
たとえば、chain1
およびchain2
を定義します。chain2
では、メソッド・コマンドのSOIまたはパラメータとしてchain1
を使用します。両方のチェーンで同じ実行時間が使用されている場合は、chain2
の前にchain1
を定義する必要があります。そうでない場合は、chain1
の実行時間が前に必要であり、chain2
の実行時間が後になる必要があります。
SOIおよびメソッド・コマンドの使用方法の詳細は、次の「オブジェクト識別子の開始」を参照してください。
開始オブジェクト識別子
開始オブジェクト識別子(SOI)は、次のオブジェクトに関連付けることができます。
-
定義済のキーワード:
this
、return
およびparam#
。 -
キーで識別されるチェーンの出力。
実行時間は、SOI構文と組み合せることができます。
支給明細 | 説明 | 可能な実行時間 | 構文 | 例 |
---|---|---|---|---|
ThisSOI | チェーンは、DirectivesConfig.acmlファイルのclass_name で指定されたオブジェクトで実行されます。
|
before またはafter |
<this SOI> ::= [before || after] this |
thisSOIchain: before this | method (public getAddress ()) |
ParamSOI | チェーンは、DirectivesConfig.acmlファイルのparam# で指定されたオブジェクトで実行されます。
これらは、モニターされるメソッドのパラメータです。 |
before or after |
<param_SOI> ::= [before || after] param# |
paramSOIchain: before param1 | method (public getAddress ())
|
ReturnSOI | チェーンは、DirectivesConfig.acmlファイルのreturn で指定されたオブジェクトで実行されます。
これは、監視されているメソッドの戻り値です。 |
after |
<return_SOI> ::= [after] return |
returnSOIchain: after return | method (public getAddress ()) |
StaticSOI | チェーンはどのオブジェクトでも開始されません。 | before or after |
<static SOI> ::= [before || after] static |
staticSOIchain: before static | static method((com.test.beans.Employee)(public getLevel())) |
VariableSOI | チェーンは、DirectivesConfig.acmlファイルで定義された前述の変数のいずれかで指定されたオブジェクトで実行されます。 | before or after |
<variable_SOI> ::= [before || after] variable-key |
var1: this | method (public setNewAddress (string "Variable Street", string "Redwood City", string "California", int 94065, string "US"))
|
チェーン・コマンド順序
チェーン・コマンド・シーケンスは、1つ以上のチェーン・コマンドで構成されます。
構文: <chain_command_sequence> ::= <chain_command> || <chain_command> | <chain_command_sequence>
チェーン・コマンド・タイプ
構文: <chain_command> ::= <method_command> || <field_command> || <regex_command>
メソッド・コマンド
メソッド・コマンドを使用して、メソッドを起動します。メソッド・コマンドの出力は、その特定のメソッドの戻りオブジェクトです。
メソッド・コマンドは、メソッド可視性、メソッド名およびパラメータ順序で構成されます。これはメソッド・シグネチャを模倣します。
構文は次のようになります。
<method_command> ::= method(<visibility> <java_identifier> (<parameter_sequence>))
<visibility> ::= private || public || protected || package
package
値は、パッケージ専用(修飾子なし)表示方法またはフィールドを指定するために使用されます。
<scalar_parameter_type> ::= int || double || float || String
<parameter> ::=<scalar_parameter_type> value || this || return || param<index> || variable-key
<parameter_sequence> ::= <parameter> || <parameter> , <parameter_sequence>
メソッド・コマンドの例
-
このチェーンでは、ユーザー・オブジェクトとして
this
が表示されます。このチェーンは、UserクラスのpublicgetAddress
メソッドを起動します。このチェーンの出力は、このユーザーのアドレスの文字列表現になります。addresschain: this | method (public getAddress ())
-
このチェーンは、ユーザーの
public setName
メソッドを起動し、名前をJohn Smithに設定します。このsetメソッドには戻り値がないため、このチェーンの出力はnullになります。このチェーンでは、メソッド・コマンドでスカラー・パラメータを使用する方法を示します。testSetupVar: this | method(public setName(String "John", String "Smith"))
-
このチェーンでは、起動しているメソッドのパラメータとして、
param1
(モニターされているメソッドの最初のパラメータ)を使用します。testParamAsParam: this | method(public incUserId(param1))
-
このチェーンは、メソッドのパラメータとして別の変数(この場合は
testParamAsParam
)を使用します。testVarAsParam: this | method(public incUserId(testParamAsParam))
-
このチェーンは、スーパー・メソッドを明示的に起動します。
invokeUsingSuper: this | method(private super.overloadPrivate(String "string3", int 2222))
フィールド・コマンド
フィールド・コマンドを使用してフィールド値を検査します。フィールドコマンドの出力は、その特定のフィールドのオブジェクトです。
メソッド・コマンドは、フィールド表示とフィールド名で構成されます。
構文: <field_command> ::= field (<visibility> <java_identifier>)
フィールド・コマンドの例
this
がユーザー・オブジェクトであると想定しています。ここでは、Userクラスの様々な表示のフィールドにアクセスします。各チェーンの出力は、それぞれのフィールドの値です。
fieldPublic: this | field(public firstName)
fieldProtected: this | field (protected lastName)
fieldPackagePrivate: this | field (package middleName)
fieldPrivate: this | field (private maidenName)
Staticメソッド・コマンド
staticメソッド・コマンドは、staticメソッドを呼び出すために使用します。staticメソッド・コマンドの出力は、その特定のメソッドの戻りオブジェクトです。
メソッド・コマンドは、開始クラス、メソッドの可視性、メソッド名およびパラメータ順序で構成されます。これは、メソッド・シグネチャを模倣します。
<static_method_command> ::= static method((<starting_class>)(<visibility> <java_identifier> (<parameter_sequence>)))
開始クラスは、staticメソッドが見つかったクラスです。
- このチェーンはオブジェクトなしで始まります。このチェーンは、Employeeクラスのpublic
getlevel
メソッドを呼び出します。このチェーンの出力は、この従業員のレベルの文字列表現になります。 staticMethodPublic: static | static method((com.test.beans.Employee)(public getLevel()))
- 他の可視性と様々なタイプのメソッド・パラメータの使用は、メソッド・コマンドの例と同じです。
staticフィールド・コマンド
staticフィールド・コマンドは、静的フィールド値の検査に使用します。静的フィールド・コマンドの出力は、その特定のフィールドのオブジェクトです。
メソッド・コマンドは、開始クラス、フィールド表示およびフィールド名で構成されます。
構文:
<static_field_command> ::= static field ((<starting_class>)(<visibility> <java_identifier>))
静的フィールド・コマンドの例:
次の例では、this
がユーザー・オブジェクトであると想定しています。ここでは、Userクラスの様々な可視性のフィールドにアクセスします。各チェーンの出力は、それぞれのフィールドの値です。
staticFieldPublic: static field((com.test.beans.Employee)(public role))
その他の表示の使用は、フィールド・コマンドの例と同じです。
Regexコマンド
regexコマンドは、SOIの結果、メソッド・コマンドの戻り値またはフィールド値による文字列の検索または置換(あるいはその両方)に使用されます。regexコマンドの出力は文字列です。
regexコマンドは正規表現文字列で構成されます。オプションで、置換文字列と、最初またはすべてのオカレンスを置換するかどうかで構成することもできます。
構文: <regex_command> ::=regex (string [,<replace-string> [, first || all]])
Regexコマンドの例
- アドレス"100 Oracle Pkway、 Redwood City、 CA 94065"を取得した後、最初の"Pk"を"This"に置換して、"100 Oracle Thatway、 CA 94065"を取得します
replaceFirstChain : this | method (public getStreet()) | regex(Pk, This, first)
- アドレス"100 Oracle Pkway、 Redwood City、 CA 94065"を取得した後、すべての"0"sを"1"に置き換えて"11 Oracle Pkway、 Redwood City、 CA 94165"を取得します
replaceAllChain: this | method (public getStreet()) | regex(0, 1, all)
高度な変数の例
次に、DirectivesConfig.acml
ファイル内のコマンド・チェーンの例を示します。
test: class_name: "com.test.beans.User"
method_name: "incAge"
span_name: "${short_class_name}.${method_name}"
tags:
t: "${this}"
params: "${param1}"
r: "${return}"
exampleVarTag: "${exampleVar}"
variables:
exampleVar: before this | method (public getAddress ()) | field(private street) | regex(Pk,This, all) | regex(This, That, first)
exampleVar
変数チェーン実行の確認:
exampleVar
チェーンは、"class_name"で指定されたUserオブジェクトで始まります。XX (XXは端末番号)
-
最初の連鎖コマンドは、Addressオブジェクトを返すメソッド・コマンドです。例: "100 Oracle Pkway、 Redwood City、 CA 94065"。
-
2番目のchainコマンドは、前のフィールド・コマンドからアドレスの通りを取得するフィールド・コマンドです。これはOracle Pkwayです。
-
3番目のチェーン・コマンドはregexコマンドであり、Pkのすべてのインスタンスを"This"に置き換えて"Oracle Thisway"を返します。
-
最後のチェーン・コマンドはregexコマンドであり、Thisの最初のインスタンスをThatに置換し、OracleThatwayを返します。
最終結果: このスパンのディメンションを見ると、値OracleThatwayを持つexampleVarTagというタグが表示されます。このスパン・ディメンションを表示するには、タグ・セクションでexampleVarTag: "${exampleVar}"
を指定する必要がありました。
ACMLValidateを使用したファイル構文のチェック
acml
タイプ・ファイルを操作する場合、ACMLValidateユーティリティを使用してacml
ファイルの構文を確認できます。
acml
ファイルの構文を確認および検証するために使用できるAPM Javaエージェント・ユーティリティです。
- ProbeConfig.acml
- DirectivesConfig.acml
- CircuitBreaker.acml
ACMLValidate
ユーティリティは構文を検証しますが、値は検証しません。APM Javaエージェント・バージョン1.16以降で使用できます。
前提条件:
PATH
で使用可能なJDK、またはJAVA_HOME
環境変数を定義します。
場所:
ACMLValidate
ユーティリティは、oracle-apm-agent/bin
ディレクトリの下にあります。
ACMLValidateを実行します。
ACMLValidate
を起動するには、次を使用します。
-
Windows:
ACMLValidate.bat
-
Linuxの場合:
ACMLValidate.sh
ACMLValidate.[bat|sh] <path to the acml file>
oracle-apm-agent/bin % sh ACMLvalidate.sh ../config/1.16.0.560/ProbeConfig.acml
===============================================================================
Testing file: ../config/1.16.0.560/ProbeConfig.acml
ACML Validation Result: PASSED
===============================================================================
oracle-apm-agent/bin % sh ACMLvalidate.sh ../config/1.16.0.560/ProbeConfig.acml
===========================================================================
Testing file: ../config/1.16.0.560/ProbeConfig.acml
ACML Validation Result: FAILED
Exception: Failed to parse line [5][ SERVLET: true]
Caused by: Tab detected in the following line. Please replace '\t' with spaces: [ \tSERVLET: true]
===========================================================================