Simple Log Serviceは、指定されたフィールドに基づいてログをスキャンして分析結果を返すスキャンベースの分析機能を提供します。 この機能により、ログのインデックスを設定することなく、ログを分析できます。 このトピックでは、スキャンベースの分析機能について説明します。
背景情報
Simple Log Serviceは、インデックスベースのクエリおよび分析機能を提供します。 ただし、一部のシナリオでは、インデックスを作成または使用できません。 例:
一部のフィールドでは、コスト削減のためにインデックスは作成されません。 このシナリオでは、履歴ログをクエリする緊急の必要性が満たされない場合があります。
フィールド値の長さがインデックスでサポートされている上限を超えています。 このシナリオでは、余分な部品は照会できません。
多数のフィールド名が関与し、事前に取得することはできません。 このシナリオでは、フィールドインデックスは作成できません。
フィールドのタイプが変更されます。 このシナリオでは、フィールドを照会できません。
上記の問題に対処するために、Simple Log Serviceはスキャンベースのクエリ機能とスキャンベースの分析機能を提供します。 この機能を使用して、スキャンに使用するフィールドのインデックスを作成する必要なく、ログをクエリおよび分析できます。 スキャンベースのクエリ機能の詳細については、「スキャンベースのクエリの概要」をご参照ください。
基本構文
構文
スキャンベースの分析機能を使用する場合は、標準のSQL構文ベースの分析ステートメントの前に
set session mode=scan;
を追加します。Search statement | set session mode=scan;Analytic statement based on the standard SQL syntax
例:
* and status:200 | set session mode=scan;SELECT api, count(*) AS PV GROUP BY api
制御ポリシー機能の動作
Simple Log Serviceがスキャンベースの分析リクエストを受信すると、Simple Log Serviceは次の手順を実行します。
検索文を実行してログを照会します。
重要検索文にはインデックスが必要です。 たとえば、
status:200 | set session mode=scan;SELECT api, count(*) AS PV GROUP BY api
ステートメントを実行する前に、statusフィールドのインデックスを作成する必要があります。 apiフィールドのインデックスを作成する必要はありません。分析ステートメントで指定されたフィールドに基づいて検索ステートメントのクエリ結果をスキャンし、フィールドのデータを抽出します。
分析ステートメントを実行して、抽出されたデータを集計および分析し、分析結果を返します。
インデックスベースの分析とスキャンベースの分析の比較
項目 | インデックスベースの分析 | スキャンベースの分析 |
構文 |
|
|
インデックスを設定する必要があるかどうか | フィールドのインデックスを設定し、フィールドのログ分析機能を有効にする必要があります。 | インデックスを設定したり、機能を有効にする必要はありません。 重要 垂直バー (|) の前の検索文にはインデックスが必要です。 |
SQL 構文 | 幅広いSQL構文とSQL関数がサポートされています。 詳細については、「関数の概要」をご参照ください。 | インデックスベースの分析でサポートされているSQL構文とSQL関数がサポートされています。 いくつかのシナリオでは、使用制限が課される。 詳細については、「制限事項」をご参照ください。 |
分析 | 数億行のログを分析できます。 詳細については、「ログ分析の概要」をご参照ください。 専用SQL機能を有効にして、拡張分析を実行できます。 | 数百万行のログを分析できます。 大量のデータを分析する場合は、まず検索文を使用してログをフィルタリングすることをお勧めします。 検索文にはインデックスが必要です。 |
料金 | インデックストラフィックとインデックスストレージに対して課金されます。 詳細については、「機能課金の課金項目」をご参照ください。 | スキャンの料金は、スキャン後に返されたデータ量に相当するスキャントラフィックに基づいて課金されます。 システムは、インデックスベースのクエリの結果に基づいてログを識別します。 |
制限事項
スキャンベースの分析モードでは、すべてのフィールドがvarchar型と見なされます。
他のデータ型のフィールドを分析する必要がある場合は、cast関数を使用してデータ型を変換できます。 詳細については、「キャスト関数」をご参照ください。
たとえば、API操作の平均レイテンシを計算する場合、avg関数には数値入力が必要なため、cast関数を使用してレイテンシフィールドの型をbigint型に変換する必要があります。
status:200 | set session mode=scan;SELECT avg(cast(latency AS bigint)) AS 'Average latency', api GROUP BY api
スキャンベースの分析モードでは、Simple Log Serviceはログをスキャンして、分析ステートメントで指定されたフィールドのデータを抽出します。 既存のフィールドインデックスは有効になりません。
たとえば、statusフィールドに長いタイプのインデックスを作成したとします。 次の文を実行してスキャンベースの分析を実行した場合、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
スキャンベースの分析モードでは、分析できるデータの量は限られています。 シャードでは、最大500,000のログを分析でき、最大1,000万のログをスキャンできます。 検索文を使用する場合、検索文によって返されるログの数を参照します。 上記の制限のいずれかを超えた場合、システムは一部のログの分析結果のみを返し、分析結果が不正確であることを確認します。
不正確な結果を防ぐには、次の方法を使用できます。
大規模な構造化データには、インデックスベースの分析を使用することを推奨します。 フィールドインデックスを作成し、ログ分析機能を有効にする必要があります。
検索文を使用してログをフィルタリングし、スキャンする必要のあるデータ量を減らすことを推奨します。 検索文で指定されているフィールドのインデックスが作成されていることを確認してください。
スキャンする必要があるデータの量を減らすために、クエリの時間範囲を減らすことを推奨します。
スキャンベースの分析モードでは、
* | select *
はサポートされません。スキャンベース分析モードでJOIN句を使用して複数のLogstoreのデータを分析する場合は、フィールドの前にLogstore名を追加する必要があります。 形式:
LogstoreName.key