Simple Log Service は、指定されたフィールドに基づいてログをスキャンし、分析結果を返す「スキャンベース分析」機能を提供します。この機能により、ログに対してインデックスを事前に設定することなく分析を実行できます。本トピックでは、スキャンベース分析の基本構文について説明します。
仕組み
Simple Log Service がスキャンベース分析リクエストを受信すると、以下の手順で処理を行います。
検索文を実行してログを照会します。
重要検索文にはインデックスが必要です。たとえば、
status:200 | set session mode=scan;SELECT api, count(*) AS PV GROUP BY apiを実行する前に、status フィールドに対してインデックスを作成する必要があります。api フィールドについては、インデックスの作成は不要です。検索文の照会結果を、分析文で指定されたフィールドに基づいてスキャンし、該当フィールドのデータを抽出します。
抽出したデータに対して分析文を実行し、集計・分析を行い、分析結果を返します。
基本構文
スキャンベース分析機能を利用する際は、標準 SQL 構文に基づく分析文の前に set session mode=scan; を追加します。
検索文 | set session mode=scan;標準 SQL 構文に基づく分析文例
* and status:200 | set session mode=scan;SELECT api, count(*) AS PV GROUP BY api制限事項
スキャンベース分析モードでは、すべてのフィールドが varchar 型として扱われます。
他のデータの型でフィールドを分析する必要がある場合は、cast 関数を使用してデータの型を変換できます。詳細については、「cast 関数」をご参照ください。
たとえば、API オペレーションの平均レイテンシーを計算する場合、avg 関数は数値入力を必要とするため、latency フィールドのデータの型を cast 関数で bigint 型に変換する必要があります。
status:200 | set session mode=scan;SELECT avg(cast(latency AS bigint)) AS '平均レイテンシー', api GROUP BY apiスキャンベース分析モードでは、Simple Log Service が分析文で指定されたフィールドを対象にログをスキャンしてデータを抽出します。既存のフィールドインデックスは効果を発揮しません。
たとえば、status フィールドに対して long 型のインデックスを作成済みの場合でも、以下のステートメントでスキャンベース分析を実行すると、status フィールドのインデックスは効果を発揮しません。
* | set session mode=scan;SELECT count(1) AS pv, api WHERE cast(status AS bigint) = 200 GROUP BY apiこの場合、以下のステートメントの使用を推奨します。
説明フィールドに対してインデックスを作成済みの場合は、そのフィールドを縦棒 (|) の前にフィルター条件として配置することを推奨します。
status:200 | set session mode=scan;SELECT count(1) as pv, api GROUP BY apiスキャンベース分析モードでは、分析可能なデータ量に制限があります。1 つのシャード内で分析可能なログ数は最大 500,000 件、スキャン可能なログ数は最大 1,000 万件です。検索文が使用されている場合、スキャン制限は検索文によって返されるログ数を指します。上記いずれかの制限を超えると、システムは一部のログのみを対象に分析結果を返し、「分析結果が不正確である」というメッセージを表示します。
不正確な結果を回避するための対策は以下のとおりです。
大規模な構造化データについては、インデックスベース分析の利用を推奨します。この場合、フィールドインデックスを作成し、ログ分析機能を有効化する必要があります。
検索文を活用してログをフィルタリングし、スキャン対象となるデータ量を削減することを推奨します。検索文で指定するフィールドには、あらかじめインデックスを作成しておく必要があります。
クエリの時間範囲を短縮することで、スキャン対象となるデータ量を削減することを推奨します。
スキャンベース分析モードでは、
*|select *ステートメントはサポートされていません。-
スキャンモードで JOIN 句を用いて複数の Logstore を分析する場合、各フィールド名には Logstore 名をプレフィックスとして付与する必要があります(形式:
LogstoreName.key)。
インデックスベース分析とスキャンベース分析の比較
項目 | インデックスベース分析 | スキャンベース分析 |
構文 |
|
|
インデックスの設定が必要か | フィールドに対してインデックスを作成し、そのフィールドのログ分析機能を有効化する必要があります。 | インデックスの設定や機能の有効化は不要です。 重要 ただし、縦棒 (|) の前の検索文にはインデックスが必要です。 |
SQL 構文 | 幅広い SQL 構文および SQL 関数がサポートされています。詳細については、「関数の概要」をご参照ください。 | インデックスベース分析でサポートされる SQL 構文および SQL 関数がサポートされます。ただし、一部のシナリオでは使用制限が適用されます。詳細については、「制限事項」をご参照ください。 |
分析 | 数億件のログを分析できます。詳細については、「ログのクエリと分析の概要」をご参照ください。 強化された分析を実行するには、専用 SQL 機能を有効化できます。 | 数百万件のログを分析できます。 大量のデータを分析する場合は、まず検索文を用いてログをフィルタリングすることを推奨します。検索文にはインデックスが必要です。 |
課金 | インデックストラフィックおよびインデックスストレージに対して課金されます。詳細については、「機能別課金モデルの課金対象項目」をご参照ください。 | スキャントラフィックに基づき課金されます。これは、スキャン後に返されるデータ量に相当します。システムは、インデックスベースのクエリ結果に基づいてログを識別します。 |