すべてのプロダクト
Search
ドキュメントセンター

Application Real-Time Monitoring Service:ARMS 収束ポリシー

最終更新日:Feb 18, 2025

収束とは

Application Real-Time Monitoring Service (ARMS) エージェントは、リクエスト数、エラー数、応答時間など、さまざまな種類のメトリックデータを収集します。モニタリングデータの多様性と精度を向上させるために、IPアドレス、SQL文、URLなどのディメンションがメトリックと共に提供されます。ただし、一部のディメンションは高いカーディナリティを示す場合があります。高いカーディナリティとは何かを説明するために、ここに例を示します。RESTful APIがユーザー情報を照会するための /api/v1/users/{ID}/info URLテンプレートを提供するとします。メトリックデータには、さまざまなユーザーIDを持つ多数のリクエストURLが表示され、カーディナリティが高くなり、メトリックデータの表示が複雑になります。高いカーディナリティはストレージに大きな負荷をかけ、書き込み損失とスロークエリを引き起こし、莫大なコストが発生します。高いカーディナリティを解決し、可観測性を向上させるために、ARMSはさまざまな収束ポリシーを採用しています。このトピックでは、収束ポリシー、シナリオ、およびフォーマットについて説明します。

収束フォーマットとシナリオ

次の表に、収束フォーマットとシナリオを示します。

フォーマット

シナリオ

{ARMS_IP}:80

同じポートにアクセスする IP アドレスの数がしきい値(デフォルトは 50)を超えています。

{ARMS_STATIC_REQ} または {ARMS_S_XXX}

URLは静的リソースに関連しています。

{ARMS_ATTACK_REQ}

URL には、攻撃者が悪用できる文字列が含まれています。

{ARMS_PARAMED_REQ}

URL にはパラメーターが含まれています。

{ARMS_OTHERS}

一定期間内に記録されたディメンション値がしきい値を超えています。

説明

デフォルトのしきい値については、「カーディナリティ空間の収束」をご参照ください。

{ARMS_NUMBER}

URL 内の / で分割された用語はすべて数字です。数字が長すぎるか、さまざまな数字が存在します。

{ARMS_WORD}

URL 内の / で分割された用語はすべて単語です。単語が長すぎるか、さまざまな単語が存在します。

{ARMS_ANY}

URL 内の / で分割された用語は、文字と数字で構成される文字列です。文字列が長すぎるか、さまざまな文字列が存在します。

{XXX}

URL は Spring Controller アノテーションを使用しています。

* を含む文字列

説明

このフォーマットは、V4.x より前の ARMS エージェントにのみ適用されます。

ARMS エージェントのメモリ統計に基づく収束が使用されます。

収束ポリシー

カーディナリティ空間の収束を除き、すべての収束ポリシーはデフォルトで有効になっており、手動で無効にすることができます。

説明

ポリシーごとにサポートされるデータ型が異なるため、各ポリシーでサポートされるデータ型が明確に指定されています。

Spring アノテーションベースの収束

RESTful API 以外の Web API の場合、リクエスト URL をディメンション値として使用することは可能です。ただし、変数を持つ RESTful API の場合、リクエスト URL を直接記録すると、ディメンションの拡散につながります。したがって、ARMS は Spring Web フレームワークを使用するアプリケーションのディメンション値として、アノテーション(@RequestMapping など)から情報を抽出します。

ロジック

Spring URL のルーティングアノテーションからパス情報を読み取ります。

フォーマット

ルーティングアノテーションで構成された値が使用されます。

サポートされるデータ型

URL: 外部システムにサービスを提供する URL のみがサポートされます。外部 URL はサポートされていません。

場所

ARMS エージェント

サポートされるエージェントバージョン

2.9.1.2 以降

次の APIController は、パス変数を使用して、ユーザー情報を取得するための RESTful インターフェースを定義しています。インターフェースパスは、アノテーション @RequestMapping("/api/v1/user/{userId}/info") によって定義され、ユーザー ID を持つリクエストを受信するための URL パターンを指定します。インターフェースからデータを収集する場合、実際の URL は /api/v1/user/{userId}/info であり、{userId} は特定のユーザー ID に置き換えられます。

@RestController
@RequestMapping("/api/v1")
public class APIController {

    @RequestMapping("/user/{userId}/info")
    public String getUserInfo(@PathVariable("userId") String userId) {
        return "hello " + userId;
    }
}

結果:

/api/v1/user/1234/info/api/v1/user/{userId}/info に収束されます。

メモリ統計ベースの収束

Spring Web フレームワークを使用しないアプリケーション、またはアノテーションが失敗するシナリオでは、メモリ統計に基づく収束が使用されます。

説明

このポリシーは、V4.x より前の ARMS エージェントにのみ適用されます。

ロジック

  1. 定義済みのデリミタ( "/" や "=" など)を使用して各入力を分割し、単語のセット N を識別します。

  2. 単語の各位置について、異なる出現回数をカウントします。これはカーディナリティです。カーディナリティが定義済みのしきい値を超えると、その位置の単語は * に置き換えられます。

フォーマット

* を含む文字列

サポートされるデータ型

すべて

場所

ARMS エージェント

サポートされるエージェントバージョン

2.x、および 2.x 以降 4.x より前のバージョン

アプリケーション A は、ユーザー情報を照会するための URL テンプレート /api/v1/user/${userId}/info を提供します。ここで、$userId は特定のユーザー ID を指定します。メモリ統計モジュールは、ユーザー ID の拡散を検出します。これを処理するために、URL を

/api/v1/user/*/info に収束させます。

カスタム収束

このポリシーを使用すると、特定のニーズに合わせてカスタム収束ルールを定義できます。

ロジック

カスタム収束ルールを 1 つずつ照合します。一致したルールが適用されます。

フォーマット

フォーマットは特定の構成によって異なります。

サポートされるデータ型

URL

場所

ARMS エージェント V4.x 以降: エージェント

ARMS エージェント V4.x より前: サーバー

サポートされるエージェントバージョン

すべて

カスタムルール: /api/v1/user/[\d]+/info に一致するすべての URL を /api/v1/getUserInfo に収束させます。

/api/v1/user/[\d]+/info 正規表現に一致するすべての URL は、/api/v1/getUserInfo に収束されます。

静的リソースの収束

ARMS エージェントの一部の古いバージョンは、静的リソースに関するメトリックを監視します。URL は頻繁に変更されるため、これらのメトリックの収束はデフォルトで有効になっています。

ロジック

URL のサフィックスがデフォルトの静的リソース拡張子と一致するかどうかを確認します。一致する場合は、URL が収束されます。

デフォルトの静的リソース拡張子: .log .7z .tgz .jpg .jpeg .png .gif .css .js .ico .woff2 .xml .svg .pdf .txt .text .ppt .word .xlsx .tar.gz .tar.bz2 .sh .yml .yaml .zip .log .gz .ttf .woff .eot .rar .properties

フォーマット

デフォルトのフォーマットは {ARMS_STATIC_REQ} です。詳細設定を有効にするためにチケットを送信した場合、フォーマットにはリソースサフィックスが含まれます。

サポートされるデータ型

URL

場所

ARMS エージェント V4.x 以降: エージェント

ARMS エージェント V4.x より前: サーバー

サポートされるエージェントバージョン

すべて

デフォルトでは、/api/v1/hello.jpg{ARMS_STATIC_REQ} に収束されます。詳細設定が有効になっている場合は、{ARMS_S_JPG} に収束されます。

サイバー攻撃リクエストの収束

サービスは、サイバー攻撃リクエスト(/etc/passwd ファイルを読み取ろうとする試みなど)に遭遇する可能性があります。これらのリクエストは攻撃者によって作成され、頻繁に変更されます。すべてを記録すると、ストレージリソースに大きな負担がかかります。

ロジック

URL にサイバー攻撃に悪用される可能性のある文字が含まれているかどうかを確認します。含まれている場合は、URL が収束されます。

デフォルトの文字: ' $ \ ' !

フォーマット

{ARMS_ATTACK_REQ}

サポートされるデータ型

URL

場所

ARMS エージェント V4.x 以降: エージェント

ARMS エージェント V4.x より前: サーバー

サポートされるエージェントバージョン

すべて

/app/v1/user/info?cmd='more /etc/passwd'{ARMS_ATTACK_REQ} に収束されます。

クエリパラメーターの収束

デフォルトでは、ARMS エージェントは URL を収集するときにパラメーター情報を取得しません。ただし、一部のシナリオでは、URL にクエリパラメーターが含まれており、ディメンションの拡散につながる可能性があります。

ロジック

URL にクエリパラメーターが含まれているかどうかを確認します。含まれている場合は、URL が収束されます。

デフォルトのクエリパラメーターデリミタ: ; ? &

フォーマット

デフォルトの結果は {ARMS_PARAMED_REQ} です。詳細設定を有効にするためにチケットを送信した場合、収束結果は URL を保持し、パラメーターを {ARMS_REQ_PARAMS} に置き換えます。

サポートされるデータ型

URL

場所

ARMS エージェント V4.x 以降: エージェント

ARMS エージェント V4.x より前: サーバー

サポートされるエージェントバージョン

すべて

デフォルトでは、/api/v1/user/info?userId=12345{ARMS_PARAMED_REQ} に収束されます。詳細設定が有効になっている場合は、/api/v1/user/info?{ARMS_REQ_PARAMS} に収束されます。

無意味な単語の収束

長すぎる単語または数字を含む URL は、拡散する可能性があります。デフォルトでは、ARMS は長すぎる単語または数字を置き換えます。

ロジック

スラッシュ(/)で URL を用語の配列に分割し、配列内の各用語をチェックして、指定された長さのしきい値を超える用語があるかどうかを確認します。超える場合は、用語が置き換えられます。

  • 単語の最大長: 64

  • 数字の最大長: 10

  • 単語内の数字の最大長: 10

フォーマット

  • 長すぎる数字は {ARMS_NUMBER} に収束されます。

  • 長すぎる単語は {ARMS_WORD} に収束されます。

  • 単語内の長すぎる数字は {ARMS_ANY} に収束されます。

サポートされるデータ型

URL

場所

ARMS エージェント V4.x 以降: エージェント

ARMS エージェント V4.x より前: サーバー

サポートされるエージェントバージョン

すべて

/api/2024040710/hello2024040710/api/{ARMS_NUMBER}/{ARMS_ANY} に収束されます。

インテリジェント収束

上記の収束ポリシーを適用した後も、多数の拡散 URL が記録される可能性があります。ARMS は、アルゴリズムを使用して定期的に収束ルールを生成し、これらの URL を置き換えます。

ロジック

ロジックは複雑です。ここでは簡単な説明のみを提供します。

  1. アルゴリズムを使用してサンプル URL をグループ化します。

  2. 各グループの URL パターンに基づいて URL を収束させ、収束ルールを生成します。

  3. 異なるグループの収束ルールをマージします。

フォーマット

  • 拡散した純粋な数字は {ARMS_NUMBER} に置き換えられます。

  • 拡散した純粋な文字は {ARMS_WORD} に置き換えられます。

  • 拡散した数字と文字の混合は {ARMS_ANY} に置き換えられます。

サポートされるデータ型

URL

場所

ARMS エージェント V4.x 以降: エージェント

ARMS エージェント V4.x より前: サーバー

サポートされるエージェントバージョン

すべて

/api/product/1/info
/api/product/2/info
....
/api/product/N/info

この例の URL について、サーバーは照合に /api/product/[\d]+/info 正規表現を使用します。

収束結果: /api/product/{ARMS_NUMBER}/info

正規表現に一致する URL は、/api/product/{ARMS_NUMBER}/info に収束されます。

SQL 正規化

ARMS エージェントは、シャーディング、アノテーション、またはプレーンテキストが原因で、多数の SQL 文を収集する場合があります。デフォルトでは、ARMS は各 SQL 文を処理し、拡散する可能性のある数字または文字を置き換えます。

ロジック

ロジックは複雑です。ここでは簡単な説明のみを提供します。

  1. アノテーションを削除します。

  2. プレーンテキストを置き換えます。

  3. シャーディングされたデータベースまたはテーブルの名前を置き換えます。

...

フォーマット

拡散した数字または文字が置き換えられます。

サポートされるデータ型

SQL

場所

ARMS エージェント

サポートされるエージェントバージョン

4.X 以降

select * from cache_0 where ckey='23'

結果:

select * from cache_{NUM} where ckey=?

IP アドレスの収束

アプリケーションが IP アドレスを介してアクセスされる多くの外部サービスに依存している場合、ARMS エージェントは多数の IP アドレスを収集する可能性があり、拡散につながります。

ロジック

  1. ポート別に IP アドレスをグループ化します。

  2. グループ内の IP アドレスの数が指定されたしきい値(デフォルトは 50)を超えると、収束が適用されます。

フォーマット

{ARMS_IP}:ポート

サポートされるデータ型

IP

場所

ARMS エージェント V4.x 以降: エージェント

ARMS エージェント V4.x より前: サーバー

サポートされるエージェントバージョン

すべて

1.1.1.1:8080
...
1.1.1.255:8080

上記の IP アドレスは {ARMS_IP}:8080 に収束されます。

カーディナリティ空間の収束

上記の収束ポリシーは、URL の高いカーディナリティの問題を効果的に解決します。ただし、SQL 文の場合、依然として多数のディメンション値が記録される可能性があります。この問題を解決するために、ARMS は一定期間内に記録されるディメンション値の数を制限します。

ロジック

ロジックは複雑です。ここでは簡単な説明のみを提供します。

  1. 固定サイズのカーディナリティ空間を定期的に生成します。

  2. ディメンション値がカーディナリティ空間に存在するかどうかを確認します。存在する場合は、値はそのまま返されます。存在しない場合は、値がカーディナリティ空間に追加されます。値を追加できる場合は、そのまま返されます。それ以外の場合は、{ARMS_OTHERS} が返されます。

フォーマット

カーディナリティ空間のしきい値を超えるディメンション値は、{ARMS_OTHERS} に収束されます。

デフォルトのしきい値

項目

1 時間あたりのしきい値

URL インターフェース

500

スケジュールタスク

1,000

RPC インターフェース

1,000

アップストリームインターフェース

200

通常の SQL 呼び出し

100

スロー SQL 呼び出し

100

外部リクエスト URL

200

外部リクエストアドレス

100

サポートされるデータ型

すべて

場所

ARMS エージェント V4.x 以降: エージェント

ARMS エージェント V4.x より前: サーバー

サポートされるエージェントバージョン

すべて

カーディナリティ空間のサイズが 1 時間あたり 100 レコードに設定されているとします。外部サービスの IP アドレス:

www.a1.com
www.a2.com
....
www.a1000.com

1 時間あたり最初の 100 個の IP アドレスのみが記録され、後続の IP アドレスは {ARMS_OTHERS} に収束されます。

実行順序

V4.x より前の ARMS エージェント

エージェント

  • URL

    Spring アノテーションベースの収束 > メモリ統計ベースの収束

  • SQL

    メモリ統計ベースの収束

  • IP アドレスなど

    メモリ統計ベースの収束

サーバー

  • URL

    カスタム収束 > サイバー攻撃リクエストの収束 > クエリパラメーターの収束 > 静的リソースの収束 > 無意味な単語の収束 > インテリジェント収束 > カーディナリティ空間の収束

  • SQL

    カスタム収束 > カーディナリティ空間の収束

  • IP アドレスなど

    カスタム収束 > IP アドレスの収束 > カーディナリティ空間の収束

ARMS エージェント V4.x 以降

エージェント

  • URL

    Spring アノテーションベースの収束 > カスタム収束 > サイバー攻撃リクエストの収束 > クエリパラメーターの収束 > 静的リソースの収束 > 無意味な単語の収束 > インテリジェント収束 > カーディナリティ空間の収束

  • SQL

    カスタム収束 > SQL 正規化 > カーディナリティ空間の収束

  • IP アドレスなど

    カスタム収束 > IP アドレスの収束 > カーディナリティ空間の収束

サーバー

該当なし

説明

収束は、上記の順序に基づいて順番に実行されます。ディメンション値がポリシーによって収束されると、実行は終了します。

よくある質問

収束前の元の値をどのように照会しますか?

  • ARMS エージェント V4.x 以降: 元の値と収束された値の両方がトレースデータに記録されます。トレースエクスプローラー機能を使用して元の値を表示できます。詳細については、「トレースエクスプローラー」をご参照ください。

  • V4.x より前の ARMS エージェント: ほとんどの収束がサーバーで発生するため、元の値を表示することはできません。

収束結果が満足できない場合はどうすればよいですか?

カスタム収束ルールを作成して収束を定義できます。

ARMS コンソールのアプリケーション詳細ページで、上部ナビゲーションバーの [構成] > [収束] を選択します。

image

例:

/api/v1/user/\d+/info 正規表現を指定して、一致するすべての URL を /api/v1/user/userId/info に収束させます。例: /api/v1/user/124343543/info/api/v1/user/userId/info に収束されます。

誤って一致した URL を収束から除外するにはどうすればよいですか?

ARMS コンソールで、収束したくない URL を指定します。詳細については、質問 2 を参照してください。

例:

/api/v1/user/9999/info を収束から除外するとします。/api/v1/user/9999/info/api/v1/user/userId/info に収束されません。

エージェント側の収束とサーバー側の収束の違いは何ですか?

エージェント側の収束とは、ARMS エージェントで収束が実装されることを意味し、既に収束されたデータがサーバーに報告されます。これにより、サーバーの処理負荷が大幅に軽減され、100% のデータ精度が保証されます。

エージェントのバージョンが古い場合、多くの収束ポリシーはサポートされていません。拡散が発生した場合、サーバー側で収束を実行する必要があります。エージェント側では収束が適用されないため、サーバーに送信されるデータパケットが非常に大きくなる可能性があります。まず、パケットが大きすぎて拒否された場合、データが失われる可能性があります。次に、サーバー側の処理の制限により、収束されたデータの精度が影響を受ける可能性があります。したがって、最新バージョンの ARMS エージェントにアップグレードすることをお勧めします。