本番環境の問題を診断する際、標準的なトレースデータには、根本原因を特定するために必要なビジネスコンテキストが不足していることがよくあります。注文 ID、ユーザー ID、トランザクションコードなどでトレースをフィルタリングすることができません。Application Real-Time Monitoring Service (ARMS) は、アプリケーションコードを変更することなく、HTTP リクエスト、レスポンス、および例外から特定のパラメーターをスパンレベルで抽出することで、この問題を解決します。抽出されたパラメーターはスパン属性となり、トレースのフィルタリング、ビジネスロジックエラーの検出、アラートのトリガーに使用できます。
ユースケース
抽出ルールを設定すると、ARMS エージェントはパラメーター値を取得し、スパン属性として記録します。これらの属性により、以下の機能が利用できるようになります。
ビジネスコンテキストによるトレースの絞り込み -- [トレースエクスプローラー] ページで、特定の注文 ID、ユーザー ID、またはトランザクションコードのすべてのリクエストを特定できます。
ビジネスロジックエラーの検出:抽出されたパラメーター値がカスタムエラーコードルールに一致する場合、スパンをエラーとしてマークします。
アラートの設定:抽出されたパラメーターに基づくエラー数がしきい値を超えた場合にアラートをトリガーします。
前提条件
ビジネスパラメーター抽出は、Java アプリケーションにのみ適用されます。
開始する前に、以下を確認してください。
ARMS エージェント V4.1.0 以降がインストールされていること。詳細については、「アプリケーションモニタリングの概要」をご参照ください。V4.1.0 より前のエージェントでは、ルールが設定されていても機能は有効になりません。
V4.2.0 以降:1 つのビジネスパラメーター抽出ルールに、複数の API マッチルールとパラメーター抽出ルールを追加できます。
V4.1.0~V4.2.0:ルールごとに最初のマッチルールのみが有効になります。
次の例では、2 つのルールを設定しています。
最初のルールは、
/api/bookで始まるインターフェースに適用され、パラメーターソースとして [ボディ] を使用し、OGNL 式#this.data.codeを使用します。2番目のルールは、
/api/stationeryで始まり、パラメーターソースとして ボディ を使用し、かつ OGNL 式#this.responseCodeを使用するインターフェイスに適用されます。
サポートするパラメータータイプとソース
ARMS エージェントは、ルールの変更を動的に検出し、有効なすべてのルールに基づいてパラメーターを抽出します。次の表に、サポートするパラメータータイプ、ソース、およびフレームワーク要件を示します。
パラメータータイプ | パラメーターソース | 対応フレームワーク | 備考 |
HTTP サーバーリクエスト | Header、Cookie、Parameter | Tomcat 7.0.4+、Jetty 8.0.0+、Undertow 1.4.0.Final+ | ARMS エージェントは |
HTTP サーバーリクエスト | Body | Spring MVC 4.2.0+ | クラスには @Controller、メソッドには @RequestBody のアノテーションがそれぞれ必要です。 |
HTTP サーバーレスポンス | Header、Cookie | Tomcat 7.0.4+、Jetty 8.0.0+、Undertow 1.4.0.Final+ | - |
HTTP サーバーレスポンス | Body | Spring MVC 4.2.0+ | クラスには @Controller、メソッドには @ResponseBody のアノテーションがそれぞれ必要です。 |
HTTP クライアントリクエスト | Header、Parameter | Apache HttpClient 2.0+、OkHTTP 2.2+ | - |
HTTP クライアントレスポンス | Header | Apache HttpClient 2.0+、OkHTTP 2.2+ | - |
例外情報 | Message | - | クラスは |
抽出ルールページへのアクセス
ARMS コンソールにログインします。左側のナビゲーションペインで、[アプリケーション監視] > [アプリケーションリスト] を選択します。
上部メニューでリージョンを選択し、アプリケーションをクリックします。
説明[言語] 列のアイコンは、アプリケーションのプログラミング言語を示します: -
: Java -
: Go -
: Python - [-] (ハイフン): Managed Service for OpenTelemetry で監視されるアプリケーショントップナビゲーションバーで、[設定] > [ビジネスパラメーター抽出ルール] を選択します。
[ビジネスパラメーター抽出ルール] セクションで、アプリケーションの抽出ルールを作成、表示、または変更します。
ルールリストには、[ルール名]、[属性名]、[パラメーター抽出タイプ]、マッチルール列、抽出されたパラメーター列、[有効化ステータス]、およびアクション列 ( [編集] と [削除] ) が含まれます。リストの上部には、[新規ルール] ボタン、ルール名検索ボックス、パラメーター抽出タイプフィルターがあります。リストの下部には、[一括削除] および [他のアプリケーションへ一括コピー] ボタンがあります。
[カスタムエラー設定] セクションで、抽出されたパラメーター値をフィルター処理するためのカスタムエラーコードの照合ルールを設定します。
[カスタムエラーコード] スイッチをオンにした後、biz.resp.body 属性の値が 200 より大きく、かつ biz.exception 属性の値が 0 より大きい場合にスパンがエラーとしてマークされるように、マッチングルールを追加します。
抽出ルールの作成
ルールを作成して有効化すると、リアルタイムでエージェントに配信されます。最初のルールを有効にするには、アプリケーションの再起動が必要です。その後のルールは、再起動なしで 1~2 分以内に有効になります。
抽出されたパラメーターはスパン属性として記録されます。 [Trace Explorer] ページでクエリできます。
属性名は、デフォルトでプレフィックスとして
biz.が付き、一意である必要があります。スパンデータがレポートされるかどうかは、サンプリングポリシーによって決まります。重要なデータが確実にレポートされるように、サンプリングポリシーを調整してください。詳細については、「V3.2.8 より前の ARMS エージェントのトレースサンプリングモードを選択する」をご参照ください。
抽出されたパラメーターがトレースに表示されない場合は、ルール設定が正しいことを確認してください。
[ビジネスパラメーター抽出ルール] セクションで、[新規ルール] をクリックします。次のパラメーターを設定し、[OK] をクリックします。
パラメーター | 説明 |
[ルール名] | ルールの名前です。 |
[属性名] | 抽出された値のスパン属性キーです。形式: |
[パラメーター抽出タイプ] | 抽出するパラメーターのタイプです。HTTP サーバーリクエスト、HTTP サーバーレスポンス、HTTP クライアントリクエスト、HTTP クライアントレスポンス、または例外情報から選択します。 |
[有効なインターフェース] | ルールが適用される HTTP インターフェースです。ARMS エージェントは、一致したインターフェースからのみパラメーターを抽出します。この機能は、[パラメーター抽出タイプ] が HTTP サーバーリクエストまたは HTTP サーバーレスポンスに設定されている場合にのみ利用可能です。 |
[Exception Class Name] | The exception class names to match. The ARMS agent extracts parameters only from matched exceptions. Available only when [Parameter extraction type] is set to Exception information. |
[テキストエンコーディングタイプ] | 抽出するパラメーターのエンコーディング形式です。 |
[有効化ステータス] | ルールを有効にするかどうかを指定します。 |
パラメーター抽出ルール
抽出するパラメーターを含むソースと抽出方法を指定します。複数のパラメーターソースと処理ステップに対応しています。複数のソースからパラメーターを抽出する場合、定義した順序でステップが実行されます。詳細については、「抽出ルールの例」をご参照ください。
[パラメーターソース]:パラメーターを抽出するソースです。Header、Cookie、または Parameter を選択した場合は、初期抽出のキーを入力します。Body または Message を選択した場合、パラメーターはボディまたはメッセージ全体から抽出されます。
[パラメーター処理ステップを追加]:1 つ以上のソースからパラメーター値を解析するステップを定義します。各ステップの出力は、次のステップの入力になります。ステップが指定されていない場合は、ソースの未加工の JSON テキストが使用されます。詳細については、「パラメーター抽出ステップ」をご参照ください。次の抽出方法がサポートされています。
方法
説明
例
OGNL
入力は Java オブジェクトである必要があります。ドット記法を使用した OGNL 式をサポートします。
#this.data.getCode()JsonPath
入力は JSON 文字列である必要があります。ドット記法を使用した JsonPath 式をサポートします。
$.data.codeRegex
入力は文字列である必要があります。名前付きキャプチャグループを使用し、抽出する部分文字列は
resという名前のキャプチャグループに対応している必要があります。.*from:(?<res>[a-z]+).*
抽出ルールの検証
ルールが有効になったら、[トレースエクスプローラ] ページで関連するトレースを確認してください。対応するインターフェイスのスパンにカスタム属性が表示された場合、ルールは機能しています。
ルールに対応する属性名を確認します。
[ビジネスパラメータ抽出ルール] リストで、作成したルールの [属性名] を見つけます。たとえば、属性が
biz.resp.bodyのルールです。[トレースエクスプローラー] ページで、フィルター条件として
attributes.$attributesNameを追加してスパンをクエリします。高度なクエリ領域に、フィルター条件
attributes.biz.resp.body=211を追加します。トレースをクリックして、スパンのカスタム属性を表示します。
抽出ルールの管理
ルールを有効化または無効化するには、[有効ステータス] スイッチを切り替えます。
ルールを変更または削除するには、「操作」列の [編集] または [削除] をクリックします。
複数のルールを削除するには、ルールを選択し、リストの下にある[一括削除]をクリックします。
ルールを他のアプリケーションにコピーするには、対象のルールを選択して [他のアプリケーションに一括コピー] をクリックします。ダイアログボックスで、ルールをすべてのアプリケーションにコピーするか、特定のアプリケーションにコピーするかを指定します。
変更が有効になるまで 1~2 分お待ちください。
抽出ルールのみがコピーされます。カスタムエラー設定は含まれません。
属性名は一意である必要があります。コピー先のアプリケーションに同じ名前の属性が存在する場合、ルールはコピーされません。
カスタムエラーコードのマッチ設定
抽出されたパラメーター値がカスタムエラーコードルールに一致する場合、スパンは失敗としてマークされます。失敗したスパンは、アラートに使用できる arms_$callType_requests_error_count メトリックをインクリメントします。
サンプリングポリシーは、カスタムエラーコードのデータ収集には影響しません。サンプリングされていない失敗したスパンもカウントされます。
サービスアクセスタイプと使用可能なディメンションについては、「アプリケーションモニタリングメトリック」をご参照ください。
カスタムエラーコードルールの作成
[エラー設定のカスタマイズ] セクションで、[カスタムエラーコード] スイッチをオンにします。
[一致ルールを追加] をクリックします。
抽出ルールを選択し、フィルター条件を設定します。
[カスタムエラーコード] スイッチをオンにした後、
biz.resp.body属性の値が 200 より大きい場合、およびbiz.exception属性の値が 0 より大きい場合にスパンがエラーとしてマークされるように、一致ルールを追加します。[保存] をクリックします。アプリケーションの再起動は不要で、ルールは 1~2 分以内に有効になります。
カスタムエラーコードルールの検証
ルールを設定した後、[トレースエクスプローラー] ページで、ルールの条件に一致する失敗したスパンを確認してください。
ルールで使用される属性名と条件を確認します。
[トレースエクスプローラー] ページで、失敗したスパンを絞り込みます。
[トレースエクスプローラー] ページで、左側のクイックフィルター領域を使用して、ステータスがエラーのスパンをフィルターします。結果のクエリ条件は
serviceName="arms-custom-extraction-demoextracted" AND statusCode IN (2, 3) AND spanName="/api/v1/http_server/body"です。この例では、クエリは期間が 0 ms でエラーステータスの 3,642 件のエラーコールを返します。トレースをクリックして、属性値がルール条件に一致するかどうかを確認します。 次の例では、
biz.resp.body属性値は 670 で、エラーマッチングルールで指定されたしきい値である 499 を超えています。[概要] ページで、エラー数がエラーダッシュボードに正しく反映されていることを確認します。

抽出ルールの例
次の例では、OGNL、JsonPath、および Regex メソッドを連鎖させます。各ステップの出力は、次のステップの入力として使用されます。
OGNL
Object-Graph Navigation Language (OGNL) は、Java オブジェクトのプロパティを読み取り、設定します。@ResponseBody または @RequestBody アノテーションが付与されたオブジェクトからフィールドを抽出するために使用します。結果は文字列に変換されます。抽出された値が 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フィールドを抽出
ResponseBody からcodeフィールドを抽出
getter メソッドを呼び出しgetQueryJsonStr() の結果を抽出します。
getQueryJsonStr() メソッドがクラスに存在することを確認してください。
JsonPath
JsonPath 式は、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=onlineURL からcityCodeの値を抽出
複数ステップの抽出
この例では、OGNL、JsonPath、および Regex を連鎖させて、レスポンスボディからネストされた値を抽出します。
次のクラスには、レスポンスボディオブジェクトが含まれています。
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オブジェクトを取得します。extraInfoフィールドを取得するには、#this.getExtraInfo()(OGNL) を実行します。$.cityInfo(JsonPath) を実行してextraInfoを JSON として解析し、cityInfoサブフィールドを取得します。^from:(?<res>[a-z]+).*(正規表現) を実行すると、resという名前のキャプチャグループがマッチし、hangzhouが返されます。span の属性値として
hangzhouを記述します。
パラメーター抽出ステップ
ステップの仕組み
抽出ステップは、ソースデータから値を取得して解析します。ステップはパイプラインを形成し、各ステップの出力は次のステップの入力として使用されます。
各メソッドには、特定の入力タイプが必要です。入力が一致しない場合、パイプラインは停止し、現在の結果を最終値として記録します。
抽出方法 | 入力データタイプ | 出力データタイプ |
OGNL | Java オブジェクト | 文字列、またはシリアル化された JSON 文字列 |
JsonPath | JSON 文字列 | 文字列 |
Regex | 文字列 | 文字列 |
構文の制限
ARMS は、セキュリティを維持するために、オープンソースの OGNL、JsonPath、および正規表現よりも厳格な構文制限を課しています。
方法 | 構文リファレンス | 制限 | 有効な例 |
OGNL | ドット表記のみ。呼び出すメソッドは |
| |
JsonPath | ドット記法のみがサポートされます。アクセス階層の深さは最大 10 階層です。 |
| |
Regex |
|
|
パフォーマンスに関する考慮事項
抽出ステップには、シリアル化とデシリアル化、Java リフレクション、および正規表現処理が含まれます。これらは、抽出パイプラインで最もリソースを消費する操作です。レイテンシ要件が厳しいインターフェースの場合、次の代替案を検討してください。
ビジネスコードで HTTP ヘッダーにパラメーターを書き込みます (セキュリティコンプライアンス上、許可される場合)。
OpenTelemetry SDK for Java を使用して、属性をスパンに直接書き込みます。詳細については、「OpenTelemetry SDK for Java を使用してアプリケーションにカスタム計装コードを追加する」をご参照ください。
パフォーマンスオーバーヘッド
ビジネスパラメーター抽出は、シリアル化とデシリアル化および Java リフレクションにより、CPU とメモリのオーバーヘッドを発生させます。次のベンチマークは、影響を定量化します。
テスト環境:
Pod の仕様:1 コア、2 GB メモリ
5 つの HTTP インターフェース、各 2,000 QPS
100 回の呼び出しごとに 240 個のカスタムパラメーターを抽出:正規表現ルール 20 個、JsonPath ルール 40 個、OGNL 式 40 個
項目 | 機能無効 (ベースライン) | 機能有効 | 増加 |
CPU | 0.230 c | 0.257 c | +0.027 c |
メモリ (起動 20 分後) | 575 MB | 693 MB | +118 MB |
レスポンス時間 | 101 ms | 101 ms | +0 ms |
抽出には、Java リフレクションとシリアル化とデシリアル化が含まれ、CPU とメモリの使用量が増加します。厳格なレイテンシ要件を持つインターフェースの場合、パラメーターをヘッダーに書き込むか、代わりに OpenTelemetry SDK を使用してください。
よくある質問
パラメーター抽出が失敗した場合はどうすればよいですか?
原因は、パラメーターソースによって異なります。
Body:Spring MVC が使用されているか、クラスに @Controller アノテーションが付与されているか、メソッドに @RequestBody または @ResponseBody アノテーションが付与されているかを確認してください。
レスポンス Cookie:Tomcat v7.0.4-9.x または Undertow v1.4.0.Final+ を使用していることを確認してください。それ以外の場合は、代わりにリクエスト Cookie を使用してください。
例外抽出の範囲は何ですか?
ARMS Agent for Java は、スパンの外側でスローされたカスタム例外のみをキャプチャします。スパン内の主要な呼び出しメソッドから例外を抽出し、エラーとしてマークするには、呼び出しメソッドを計装します。詳細については、「監視用のカスタムメソッドを追加する」をご参照ください。
Spring MVC アノテーションを抽出ルールにマッピングするにはどうすればよいですか?
アノテーション | パラメータータイプ | パラメーターソース |
@RequestParam | HTTP サーバーリクエスト | Parameter |
@RequestHeader | HTTP サーバーリクエスト | Header |
@CookieValue | HTTP サーバーリクエスト | Cookie |
@RequestBody | HTTP サーバーリクエスト | Body |
@ResponseBody | HTTP サーバーレスポンス | Body |
サポートされていないパラメータータイプを抽出するにはどうすればよいですか?
OpenTelemetry SDK を使用してアプリケーションを計装し、パラメーターをスパン属性として直接書き込みます。詳細については、「OpenTelemetry SDK for Java を使用してトレースにカスタム計装コードを追加する」をご参照ください。
抽出は、RequestBodyAdvice および ResponseBodyAdvice を使用した Body オブジェクトをサポートしていますか?
はい。ARMS エージェントは、ユーザー定義の BodyAdvice が実行された後、Spring の組み込み BodyAdvice の前にパラメーターを抽出します。