Simple Log Serviceでは、SQL文を使用して検索結果のデータを分析できます。 このトピックでは、SQL分析ステートメントの基本構文について説明します。
基本構文
各クエリステートメントは、検索ステートメントと分析ステートメントで構成されます。 検索文と分析文は縦棒 (|
) で区切られています。 形式:
Search statement|Analytic statement
検索文は独立して実行できます。 分析ステートメントは、検索ステートメントと一緒に実行する必要があります。 ログ分析機能は、検索結果のデータまたはLogstoreのすべてのデータを分析するために使用されます。
検索文には、最大30の検索条件を指定することを推奨します。
分析ステートメントでFROM句またはWHERE句を指定しない場合、現在のLogstoreのすべてのデータが自動的に分析されます。 分析ステートメントはオフセットをサポートせず、大文字と小文字を区別しません。 セミコロン (;) を分析ステートメントに追加する必要はありません。
ステートメント | 説明 |
検索文 | 検索文は、1つ以上の検索条件を指定する。 検索ステートメントには、キーワード、数値、数値範囲、スペース、またはアスタリスク (*) を使用できます。 検索文としてスペースまたはアスタリスク (*) を指定した場合、検索に条件は使用されず、すべてのログが返されます。 |
分析ステートメント | 分析ステートメントは、検索結果のデータまたはLogstoreのすべてのデータを集計または分析するために使用されます。 Simple Log Serviceでサポートされているログ分析用の機能と構文の詳細については、以下のトピックを参照してください。 |
サンプルSQL分析ステートメント:
* | SELECT status, count(*) AS PV GROUP BY status
SQL関数とSQL句
ほとんどの場合、SQL関数はデータの計算、変換、およびフォーマットに使用されます。 詳細については、「SQL関数」をご参照ください。 たとえば、SQL関数を使用して、値の合計と平均を計算したり、文字列に対する操作を実行したり、日付を処理したりできます。 ほとんどの場合、SQL関数はSQL句に埋め込まれます。
SQL句は、完全なSQL検索文またはデータ処理文を作成して、データのソース、条件、グループ、および順序を識別するために使用されます。 詳細は、「SQL句」をご参照ください。
例1。 前日のクエリログ
current_date関数は、現在の日付を返します。 date_add関数は、現在の日付から特定の間隔を減算します。 結果はテーブルに表示され、直感的にデータを表示できます。 (デモ)
クエリ文
* | SELECT * FROM log WHERE __time__ < to_unixtime(current_date) AND __time__ > to_unixtime(date_add('day', -1, current_date))
結果
例2。 ログの送信元IPアドレスの分布を照会する
ip_to_province関数は、IPアドレスで省を返します。 GROUP BY
条項は、州を集約します。 次に、count関数は各州からのリクエスト数を計算します。 結果は円グラフで表示されます。 (デモ)
クエリ文
* | select count(1) as c, ip_to_province(remote_addr) as address group by address limit 100
例3。 受信および送信NGINXトラフィックの照会
date_trunc関数は、__time__
フィールドの値を時間単位で切り捨てます。 __time__
フィールドは、ログ収集時間を指定するシステムフィールドです。 __time__フィールドのデフォルト値は、秒単位のタイムスタンプです。 date_format関数は、切り捨てられた時間値をフォーマットします。 GROUP BY
句は、時間値を集計します。 sum関数は、1時間あたりの総トラフィック量を計算します。 結果は折れ線グラフで表示され、x軸はtime
に設定され、左側のy軸はnet_out
およびnet_in
に設定されます。 (デモ)
クエリ文
* | select sum(body_bytes_sent) as net_out, sum(request_length) as net_in, date_format(date_trunc('hour', __time__), '%m-%d %H:%i') as time group by date_format(date_trunc('hour', __time__), '%m-%d %H:%i') order by time limit 10000
結果
例4. NGINXで最もアクセスされた上位10のURLを照会する
split_part関数は、疑問符 (?
) を使用してrequest_uri
フィールドを配列
に分割し、配列の最初の文字列からリクエストパスを取得します。 GROUP BY
句は、リクエストパスを集約します。 count関数は、各パスがアクセスされた回数を計算します。 ORDER BY
句は、各パスがアクセスされた回数に基づいて、パスを降順にソートします。 結果は縦棒グラフに表示されます。 (デモ)
クエリ文
* | select count(1) as pv, split_part(request_uri, '?', 1) as path group by path order by pv desc limit 10
結果
例5。 リクエストメソッドのカテゴリとPVトレンドを照会する
date_trunc関数は、時間値を分単位で切り捨てます。 GROUP BY句は、切り捨てられた時間値を集計およびグループ化して、request_method
によるページビュー (PV) の数を計算します。 ORDER BY句は、時間値を昇順でソートします。 結果はフローチャートで表示されます。 チャートにおいて、x軸は時間値を示し、y軸はPVの数を示す。 集計列はrequest_method
です。 (デモ)
クエリ文
* | select date_format(date_trunc('minute', __time__), '%m-%d %H:%i') as t, request_method, count(*) as pv group by t, request_method order by t asc limit 10000
結果
例6. 当日のPVの数と、当日と前日のPVの1日間の比較を照会します。
count関数は、当日のPVの数を計算します。 compare関数は、現在の日と前日の間のPVでの日々の比較を返します。 (デモ)
クエリ文
* | select diff [1] as today, round((diff [3] -1.0) * 100, 2) as growth FROM ( SELECT compare(pv, 86400) as diff FROM ( SELECT COUNT(1) as pv FROM log ) )
結果
例7. NGINXアクセスログに基づくPV数の予測
time - time % 60
式は、時間値から60で割った時間値の余りを減算して、分単位の正確なタイムスタンプ
を取得します。 GROUP BY
句は、タイムスタンプ
を集約します。 count関数は1分あたりのPV数を計算し、その結果は新しいクエリのサブクエリとして使用されます。 ts_predicate_simple関数は、次の6分以内のPVの数を予測します。 結果は時系列チャートに表示されます。 (デモ)
クエリ文
* | select ts_predicate_simple(stamp, value, 6) from ( select __time__ - __time__ % 60 as stamp, COUNT(1) as value from log GROUP BY stamp order by stamp ) LIMIT 1000
結果
例8。 http_user_agentフィールドに基づいてデータを収集し、PVの数でデータを並べ替えて表示します
データは、http_user_agent
フィールドに基づいてグループ化および集約されます。 各エージェントからの要求の数とクライアントに返される合計応答サイズが照会されます。 総レスポンスサイズの単位はバイト
です。 round関数は、バイト単位のサイズをMB
単位のサイズに変換し、サイズを小数点以下2桁に丸めます。 CASE EXPRESSION
式は、status
文字列を2xx
、3xx
、4xx
、5xx
などのレイヤーに分類し、各レイヤーの割合を計算します。 結果はテーブルに表示され、データとデータの意味を直感的に表示できます。 (デモ)
クエリ文
* | select http_user_agent as "User agent", count(*) as pv, round(sum(request_length) / 1024.0 / 1024, 2) as "Request traffic (MB)", round(sum(body_bytes_sent) / 1024.0 / 1024, 2) as "Response traffic (MB)", round( sum( case when status >= 200 and status < 300 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Percentage of status code 2xx (%)", round( sum( case when status >= 300 and status < 400 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Percentage of status code 3xx (%)", round( sum( case when status >= 400 and status < 500 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Percentage of status code 4xx (%)", round( sum( case when status >= 500 and status < 600 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Percentage of status code 5xx (%)" group by "User agent" order by pv desc limit 100
例9. NGINXログのエラーリクエスト数の割合を照会する
ステータスコードが400を超えるエラーリクエストの数とリクエストの総数は、SQL文に基づいて取得されます。 次に、エラー要求の数に対するパーセンテージが計算される。 結果は統計チャートに表示されます。 (デモ)
クエリ文
* | select round((errorCount * 100.0 / totalCount), 2) as errorRatio from ( select sum( case when status >= 400 then 1 else 0 end ) as errorCount, count(1) as totalCount from log )
結果