Application Real-Time Monitoring Service (ARMS) では、コードを変更することなく、リクエストとレスポンスから特定のパラメーターを抽出できます。これにより、問題の根本原因の特定とリクエスト情報の追跡に役立ちます。ビジネス パラメーター抽出ルールと、抽出されたパラメーターの構成に基づいてカスタム エラーコードの一致ルールを構成できます。
ビジネス パラメーター抽出ルールには、Java リフレクションとシリアル化またはデシリアル化が関係しています。これにより、ビジネスに余分なオーバーヘッドが発生する可能性があります。オーバーヘッドの詳細については、このトピックのパフォーマンス オーバーヘッドセクションをご参照ください。
前提条件
現在、この機能は Java アプリケーションにのみ適用されます。
ARMS エージェント V4.1.0 以降がインストールされています。詳細については、「アプリケーション監視の概要」をご参照ください。V4.1.0 より前の ARMS エージェントを使用している場合、この機能は構成されていても有効になりません。
ARMS エージェント V4.2.0 以降では、単一のビジネス パラメーター抽出ルールに複数の API 一致ルールとパラメーター抽出ルールを追加できます。
4.1.0 より後で 4.2.0 より前のバージョンの ARMS エージェントでは、最初に一致したルールのみが有効になります。

ビジネス パラメーター抽出ルール ページに移動する
ARMS コンソールにログオンします。左側のナビゲーション ウィンドウで、 を選択します。
上部のナビゲーション バーでリージョンを選択し、アプリケーションをクリックします。
説明[言語] 列のアイコンは、アプリケーションのプログラミング言語を示しています。
: Java
: Go
: Python-(ハイフン): Managed Service for OpenTelemetry で監視されるアプリケーション
上部のナビゲーション バーで、 を選択します。
[ビジネスパラメーター抽出ルール] セクションでは、アプリケーションのビジネスパラメーター抽出ルールを作成、表示、または変更できます。
ARMS エージェントは、ビジネス パラメーター抽出ルールの変更を動的に識別し、有効になっているすべてのルールに基づいてビジネス パラメーターを抽出します。

[カスタムエラー設定] セクションでは、カスタム エラーコードの マッチング ルールを設定して、抽出された ビジネス パラメーターの値をフィルターできます。

ビジネス パラメーター 抽出ルール
サポートされているパラメーター タイプとソース
ビジネス パラメーター抽出ルールは、フレームワークと使用方法に要件を課します。次の表に、ビジネス パラメーター抽出ルールでサポートされているパラメーター タイプとソースを示します。
パラメーター タイプ | パラメーター ソース | サポートされているフレームワーク | 備考 |
HTTP サーバー リクエスト |
|
| ARMS エージェントは、 |
本文 | Spring MVC 4.2.0+ | クラス名には @Controller アノテーションを付ける必要があり、メソッドには @RequestBody アノテーションを付ける必要があります。 | |
HTTP サーバー レスポンス |
|
| - |
本文 | Spring MVC 4.2.0+ | クラス名には @Controller アノテーションを付ける必要があり、メソッドには @ResponseBody アノテーションを付ける必要があります。 | |
HTTP クライアント リクエスト |
|
| - |
HTTP クライアント レスポンス | ヘッダー |
| - |
例外情報 | メッセージ | - | クラスは java.lang.Exception を継承する必要があります。 |
ルールの作成
ルールは、作成および有効化されると、クライアント エージェントにリアルタイムで配信されます。最初のルールは有効にするためにアプリケーションの再起動が必要ですが、後続のルールはアプリケーションを再起動せずに 1 ~ 2 分で有効になります。
抽出されたビジネスパラメーターは、スパンの属性に記録されます。[Trace Explorer] ページでパラメーターをクエリできます。
デフォルトでは、属性名にはプレフィックス
biz.が付いており、一意である必要があります。スパンデータがレポートされるかどうかは、サンプリングポリシーの影響を受けます。重要なデータが正しくレポートされるように、サンプリングポリシーを変更できます。詳細については、「V3.2.8 より前の ARMS エージェントのトレースサンプリングモードを選択する」をご参照ください。
抽出したいビジネス パラメーターがトレースで見つからない場合は、ビジネス パラメーター抽出ルールの構成が有効かどうかを確認します。
[ビジネスパラメーター抽出ルール] セクションで、[新規ルール] をクリックします。表示されたページで、パラメーターを設定し、[OK] をクリックします。

ルール名: ルールの名前。
属性名: スパン内のルールによって抽出された値に対応する属性の名前。デフォルトでは、値はプレフィックス biz. と複数の単語で構成されます。各単語には、文字、数字、ハイフン(-)、およびアンダースコア(_)のみを含めることができ、ピリオド(.)で区切る必要があります。属性名には最大 10 個の単語を使用できます。
パラメーター抽出タイプ: 抽出するパラメーターのタイプ。
有効インターフェイス: ルールが適用される HTTP インターフェイス。ARMS エージェントは、一致するインターフェイスからのみパラメーターを抽出します。このパラメーターは、パラメーター抽出タイプ パラメーターが HTTP サーバー リクエストまたは HTTP サーバー 応答に設定されている場合にのみ有効です。
例外クラス名: 例外に関連するクラス名。ARMS エージェントは、一致する例外からのみパラメーターを抽出します。このパラメーターは、パラメーター抽出タイプ パラメーターが例外情報に設定されている場合にのみ有効です。
テキスト エンコード タイプ: 抽出するパラメーターのエンコード形式。
パラメーター抽出ルール: 抽出するパラメーターを含むソースと、パラメーターの抽出に使用するメソッド。複数のパラメーター ソースとパラメーター抽出ステップを指定できます。複数ソースからパラメーターを抽出できる場合、パラメーターはパラメーター抽出ステップの順序に基づいて抽出されます。詳細については、このトピックのビジネス パラメーター抽出ルールの例セクションをご参照ください。
パラメーター ソース: パラメーターを抽出するソース。ドロップダウン リストからヘッダー、Cookie、またはパラメーターを選択した場合は、初期抽出のキーを入力する必要があります。ドロップダウン リストから本文またはメッセージを選択した場合は、本文またはメッセージ全体からパラメーターが抽出されます。
パラメーター処理ステップを追加する: パラメーターを抽出するためのステップ。この構成は、1 つ以上のソースから取得するパラメーター値を解析するために使用されます。複数のパラメーター抽出ステップを指定できます。ステップの解析結果は、次のステップの入力になります。パラメーター抽出ステップを指定しない場合、取得されるパラメーター値は、ソースの JSON テキストです。詳細については、このトピックのパラメーター抽出ステップのベスト プラクティスセクションをご参照ください。
次のパラメーター抽出メソッドがサポートされています。
Ognl: 入力パラメーターはオブジェクトである必要があります。ドット表記を使用する Object-Graph Navigation Language(OGNL)式がサポートされています。例:
#this.data.getCode()。JsonPath: 入力パラメーターは JSON 文字列である必要があります。ドット表記を使用する JsonPath 式がサポートされています。例:
$.data.code。Regex: 入力パラメーターは文字列である必要があります。名前付きキャプチャ グループに基づく正規表現がサポートされています。抽出される部分文字列は、res という名前のキャプチャ グループに対応します。例:
.*from:(?<res>[a-z]+).*。
有効化ステータス: ルールを有効にするかどうかを指定します。
ルールの検証
アプリケーションのビジネス・パラメーター抽出ルールを設定した後、アプリケーションを再起動しなくてもルールは有効になります。 [トレースエクスプローラー] ページに移動して、関連するトレースを表示できます。対応するインターフェイスの スパン にカスタム属性が追加されている場合、ビジネス・パラメーター抽出ルールは有効になります。
作成したルールに対応する属性の名前を見つけます。

[トレースエクスプローラー] ページで、
attributes.$attributesNameをフィルター条件として追加して、スパンをクエリします。
トレースをクリックして、スパンのカスタム属性を表示します。

ルールを管理する
ルールを有効または無効にするには、ルールの 有効化ステータス スイッチをオンまたはオフにします。
ルールを変更または削除するには、ルールの [操作] 列で [編集] または [削除] をクリックします。
複数のルールを一度に削除するには、ルールを選択し、ルール リストの下にある [一括削除] をクリックします。
複数のルールを一度に他のアプリケーションに同期するには、ルールを選択し、ルール リストの下にある [他のアプリケーションに一括コピー] をクリックします。 表示されるダイアログボックスで、ルールを他のすべてのアプリケーションに同期するか、特定のアプリケーションに同期するかを指定します。
説明操作が有効になるまで 1 ~ 2 分待ちます。
ビジネス パラメーター抽出ルールのみが同期されます。 関連するエラーは同期されません。
ビジネス パラメーター抽出ルールに対応する属性の名前は一意である必要があります。 同じ名前の属性が宛先アプリケーションに既に存在する場合、ルールはアプリケーションに同期されません。

ビジネス パラメーター抽出ルールの例
OGNL
OGNL は、Java オブジェクトのプロパティを取得および設定するための式言語です。 @ResponseBody または @RequestBody アノテーションが付加された Java オブジェクトを抽出できます。抽出結果は文字列に変換されます。 Java オブジェクトが抽出された場合は、JSON 文字列が返され、さらに抽出が行われます。例:
@RestController
@RequestMapping("/components/api/v1/mall")
public class MallController {
@RequestMapping("/product")
@ResponseBody
public ResponseBody product(@RequestBody RequestBody req) {
// ビジネス コード
}
static class RequestBody {
String requestId;
Map<String, String> queryParam;
public String getQueryJsonStr() {
return JSON.toJsonString(queryParam);
}
}
static class ResponseBody {
int code;
boolean success;
String message;
}
}次の図に示すように、RequestBody から requestId フィールドを抽出します。

次の図に示すように、RequestBody から code フィールドを抽出します。

OGNL を使用すると、オブジェクトの get メソッドを使用してフィールドを取得できます。次の図に示すように、RequestBody の getQueryJsonStr() メソッドの実行結果を抽出します。
getQueryJsonStr() メソッドがクラスに事前に存在することを確認してください。

JsonPath
JsonPath 式を使用すると、JSON 文字列を抽出し、JSON 文字列からプロパティを取得できます。例:
{
"code": 200,
"message": "Query success.",
"success": true,
"data": {
"name": "John",
"age": 21
}
}前の JSON データから data.age フィールドを抽出します(次の図を参照)。

正規表現
正規表現(regex)は、文字列内の文字の組み合わせを照合するために使用されるテキスト文字列です。「res」という名前のキャプチャ グループを抽出結果として使用できます。例:
デフォルトでは、正規表現は文字列の先頭から照合を開始します。ランダムな照合を指定するには、式の前に .* を追加します。
https://test.aliyun.com/v2/workitem#requestId=0c978f115b6f7&cityCode=34&env=online上記の URL から cityCode フィールドを抽出します(次の図を参照)。

サンプル クラス
次のクラスには、アプリケーションの Body オブジェクトが含まれています。
class DemoResponse {
int code = 200;
boolean success = true;
String message = "text content";
String extraInfo = "{\"id\": 15, \"cityInfo\": \"from:hangzhou,to:beijing\"}";
public String getExtraInfo() {
return this.extraInfo;
}
}extraInfo フィールドの cityInfo サブフィールドで「from」によって示される都市名を抽出します(次の図を参照)。

ARMS エージェントは、次の手順を実行してパラメーターを抽出します。
レスポンスから DemoResponse オブジェクトを取得します。
#this.getExtraInfo()文を実行して、extraInfo フィールドを取得します。$.cityInfo文を実行して、extraInfo フィールドの値を JSON 文字列として解析し、cityInfo サブフィールドを取得します。^from:(?<res>[a-z]+).*文を実行して、cityInfo サブフィールドの値を文字列として解析し、hangzhou部分文字列である「res」という名前のキャプチャ グループと照合します。抽出結果として
hangzhouを span の属性に書き込みます。
パラメータ抽出ステップ
仕組み
パラメータ抽出ステップを指定して、ソースから必要な情報をさらに取得および検索できます。これらのステップは、前のステップの出力が次のステップの入力として使用されるストリームマッピングルールと見なすことができます。
各パラメータ抽出メソッドは、入力データ型に固有の要件を課します。入力データ型が要件を満たしていない場合、後続の処理は終了し、現在の結果が最終値として記録されます。
パラメータ抽出メソッド | 入力データ型 | 出力データ型 |
OGNL | Java オブジェクト | 文字列またはシリアル化後の JSON 文字列 |
JsonPath | JSON 文字列 | 文字列 |
Regex | 文字列 | 文字列 |
パフォーマンスオーバーヘッド
パラメータ抽出ステップの実行は、シリアル化または逆シリアル化、Java リフレクション、および正規表現がこれらのステップに含まれるため、ビジネスパラメータ抽出プロセスで最も高いパフォーマンスオーバーヘッドが発生します。応答時間 ( RT ) とパフォーマンスに高い要件があるインターフェイスには、多数のステップを指定しないことをお勧めします。 RT とパフォーマンスに高い要件があるインターフェイスのパラメータを抽出する場合は、ビジネスコードを変更できます。
たとえば、セキュリティコンプライアンス要件が満たされている場合は、ビジネスコードのヘッダーにパラメータを書き込むことができます。
OpenTelemetry SDK for Java を使用してスパンの属性に手動でパラメータを書き込む方法については、「OpenTelemetry SDK for Java を使用してアプリケーションのカスタムイベントトラッキングコードを追加する」をご参照ください。
パラメータ抽出の有効な文
抽出ロジックのセキュリティを確保するために、ARMS は、オープンソースの OGNL、JsonPath、および正規表現よりもパラメータを抽出するための文に厳しい制限を課しています。
パラメータ抽出メソッド | 構文リファレンス | 追加の構文制限 | 有効な例 |
OGNL | ドット表記を使用するフィールドからパラメータを抽出し、メソッドを呼び出すことができます。呼び出しメソッドからパラメータを抽出する場合、呼び出しメソッドは get で始まる必要があります。解析のアクセス深度は 10 です。 | #this.extraInfo.getPid() | |
JsonPath | ドット表記を使用するフィールドのみを抽出できます。解析のアクセス深度は 10 です。 | $.cityInfo | |
Regex | 抽出結果を指定するには、res という名前のキャプチャグループを 1 つだけ含める必要があります。 | ^from:(?<res>[a-z]+).* |
カスタムエラーコードの照合ルール
抽出されたパラメーターがカスタムエラーコードの照合ルールをトリガーした場合、パラメーターを含むスパンは失敗したと見なされます。arms_$callType_requests_error_count メトリックを使用して、サービスアクセス中にエラーが発生した場合、エラーが収集されます。この場合、照合ルールのアラートを設定できます。
サンプリングポリシーは、カスタムエラーコードのデータ収集と、サンプリングされていない失敗したスパンには影響しません。
サービスアクセスタイプと使用可能なディメンションについては、「アプリケーションモニタリングメトリックの説明」をご参照ください。
カスタムエラーコードの照合ルールを設定する
[カスタムエラー設定] セクションで、[カスタムエラーコード] スイッチをオンにし、カスタムエラーコードのデータ収集を有効にします。
[照合ルールの追加] をクリックしてルールを追加します。
ビジネスパラメーター抽出ルールを選択し、フィルター条件を設定します。

[保存] をクリックします。ルールは、アプリケーションを再起動することなく、1~2 分以内に有効になります。
ルールを確認する
ルールを設定すると、そのルールはアプリケーションを再起動することなく有効になります。[トレースエクスプローラー] ページに移動して、一致するルールで指定された条件を満たす失敗したスパンが存在するかどうかを確認できます。
ルールの照合に使用する属性の名前と条件を確認します。

[トレースエクスプローラー] ページで、クエリ条件としてすべての失敗したスパンを選択すると、すべての失敗したスパンが表示されます。

トレースをクリックし、属性が設定されたルールと一致するかどうかを確認します。
以下の例では、biz.resp.body 属性の値は 670 であり、これはエラーマッチングルールで指定された条件である 499 を超えています。

[概要] ページに移動して、エラー数がエラーダッシュボードに正しく追加されているかどうかを確認します。

パフォーマンスのオーバーヘッド
ビジネス・パラメーター抽出機能は、アプリケーションに余分なオーバーヘッドをもたらします。追加のオーバーヘッドのほとんどは、パラメーター抽出中のシリアル化またはデシリアライズと Java リフレクションから発生します。このセクションでは、ビジネス・パラメーター抽出機能のオーバーヘッドを検証するためのデモを構築します。準備:
Pod の仕様:1 コア、2 GB メモリ。
サーバー上に 5 つの HTTP インターフェースが存在します。ストレステスターは各インターフェースを 2,000 クエリ/秒 (QPS) で呼び出してスパンを生成します。各インターフェースは、パラメーターが抽出されるソースに対応します。
テスト構成:240 のカスタム・パラメーターが抽出され、20 の正規表現、40 の JsonPath 式、および 40 の OGNL 式が 100 回の呼び出しごとに処理されます。
次の表は、ビジネス・パラメーター抽出ルールが有効になる前と後に発生するオーバーヘッドを示しています。
項目 | 機能無効(ベースライン) | 機能有効 | オーバーヘッドの増加 |
CPU | 0.230 c | 0.257 c | +0.027 c |
メモリ(起動後 20 分) | 575 MB | 693 MB | +118 MB |
RT | 101 ms | 101 ms | +0 ms |
よくある質問
パラメーターの抽出に失敗した場合はどうすればよいですか?
Body オブジェクトからパラメーターを抽出する場合、アプリケーションで Spring MVC が使用されているかどうか、メソッドのクラスに @Controller が追加されているかどうか、およびメソッドとパラメーターに @RequestBody と @ResponseBody アノテーションが追加されているかどうかを確認します。
レスポンス Cookie からパラメーターを抽出する場合、Tomcat v7.0.4-9.x または Undertow v1.4.0.Final+ を使用しているかどうかを確認します。使用していない場合は、代わりにリクエスト Cookie を使用することをお勧めします。
例外抽出の有効範囲は何ですか?
Java 用 ARMS エージェントは、スパン外でスローされたカスタム例外のみをブロックします。スパン内の主要な呼び出しメソッドから例外を抽出し、例外をエラーとしてマークする場合は、呼び出しメソッドをインストルメント化できます。詳細については、「監視用のカスタムメソッドを追加する」をご参照ください。
Spring MVC アプリケーションの共通アノテーションのビジネスパラメーター抽出ルールを構成するにはどうすればよいですか?
次の表は、ビジネスパラメーター抽出ルールでサポートされている Spring MVC アノテーションとルール構成間のマッピングを示しています。
アノテーション | パラメータータイプ | パラメーターソース |
@RequestParam | HTTP サーバーリクエスト | パラメーター |
@RequestHeader | HTTP サーバーリクエスト | ヘッダー |
@CookieValue | HTTP サーバーリクエスト | Cookie |
@RequestBody | HTTP サーバーリクエスト | 本文 |
@ResponseBody | HTTP サーバーレスポンス | 本文 |
サポートされていないビジネスパラメーターを抽出するにはどうすればよいですか?
OpenTelemetry SDK を使用してアプリケーションをインストルメント化し、抽出するビジネスパラメーターを属性としてスパンに書き込むことができます。詳細については、「OpenTelemetry SDK for Java を使用してトレースにカスタムインストルメンテーションコードを追加する」をご参照ください。
RequestBodyAdvice および ResponseBodyAdvice でデコレートされた Body オブジェクトからの抽出はサポートされていますか?
はい、サポートされています。ARMS エージェントは、ユーザー定義の BodyAdvice の後、組み込みの Spring BodyAdvice の前に、Body オブジェクトからパラメーターを抽出します。