Kusto Query Language(KQL)は、Azure Data Explorer やその他の Azure データサービスで使用されます。
この記事では、KQL のクエリの基本形式について解説します。
目指すのは下記で、今後の記事に繋がるように、と思っています。
- Grafana で KQL クエリを利用してグラフ化
- Grafana で Azure 上の疑わしい挙動が発生していないか監視
環境
個人で検証用のログを置くにも費用が必要となる可能性があります。
マイクロソフトで提供している下記環境を利用することで Kusto Query Language(KQL)を実際に動かしながら確認を進められます。
KQL の基本概念
KQL はデータを検索、分析するための豊富な操作を提供しますが、基本的には以下の要素から構成されます。
- データベース: KQL クエリを実行する際のデータ格納先です。
- テーブル: データベース内でデータが格納される場所。行と列でデータが構成されます。
- 列: テーブル内のデータの属性を表します。各列は特定のデータ型を持ちます。
- データ型: KQL では、数値、文字列、日付など、さまざまなデータ型がサポートされています。
KQL クエリの基本形
データの参照
基本的な構文は次の通りです。
SQL 知っているとイメージしやすく、かゆい場所には手が届かない、歯がゆい感じです。
// KQLで特定の列を選択
TableName // 参照テーブル
| project Column1, Column2 // 参照列
-- SQLで特定の列を選択
SELECT Column1, Column2 -- 参照列
FROM TableName -- 参照テーブル
データのフィルタリング
KQL では、where
句を使用して特定の条件を満たす行をフィルタリングします。
// KQLで条件に基づくデータのフィルタリング
TableName
| where Column1 == 'Value'
| project Column1, Column2
SQL でもWHERE
句を使用して条件に基づいてデータをフィルタリングします。
-- SQLで条件に基づくデータのフィルタリング
SELECT Column1, Column2
FROM TableName
WHERE Column1 = 'Value'
グループ化と集約関数
KQL では、summarize
ステートメントを使用してデータをグループ化し、集約関数(count
、sum
、avg
など)を適用します。
// KQLで特定の列に基づいてデータをグループ化し、集計
TableName
| summarize Count = count(), sumCount = sum(Column2), Average = avg(Column2) by Column1
SQL では、GROUP BY
句を使用してデータをグループ化し、SELECT
句で集約関数を適用します。
-- SQLで特定の列に基づいてデータをグループ化し、集計
SELECT Column1, COUNT(*) AS Count, SUM(Column2) AS Total, AVG(Column2) AS Average
FROM TableName
GROUP BY Column1
時間に基づくデータ集約
Grafana でグラフ化後、時間を指定した範囲のデータに絞り込みを行うことで把握情報を特定します。
Grafana に情報を連携する場合、「時間に基づくデータ集約」が非常に重要な意味を持ちます。
KQL では、bin()
関数を使用して時系列データを時間間隔ごとにバケット分けします。これにより、データの集約や比較が容易になります。
// 1時間ごとにデータを分け、イベント数をカウント
TrendLogs
| summarize EventCount = count() by bin(TimeGenerated, 1h)
// 30分ごとにデータを分け、平均を計算
TemperatureSensors
| summarize AvgTemp = avg(Temperature) by bin(TimeGenerated, 30m)
SQL では、DATEPART
やFORMAT
などの関数を組み合わせて使用することが一般的です。
-- 1時間ごとにイベント数をカウント
SELECT DATEPART(hour, Timestamp) AS Hour, COUNT(*) AS EventCount
FROM TrendLogs
GROUP BY DATEPART(hour, Timestamp)
-- 一部のSQLデータベースではこのような直接的な方法が利用できない場合があります
SELECT FORMAT(Timestamp, 'yyyy-MM-dd HH:mm:00') AS TimeBucket, AVG(Temperature) AS AvgTemp
FROM TemperatureSensors
GROUP BY FORMAT(Timestamp, 'yyyy-MM-dd HH:mm:00')