ログ アラート クエリの最適化

この記事では、最適なパフォーマンスを実現するためにログ アラート クエリを記述して変換する方法について説明します。 最適化されたクエリを使用すると、頻繁に実行されるアラートの待機時間と負荷が軽減されます。

アラート ログ クエリの記述を開始する方法

アラート クエリは、問題を示すログ分析のログ データを照会することから開始します。 何が検出できるかを理解するには、アラートのクエリ例に関するトピックを使用できます。 また、独自のクエリの記述を記述することから開始することもできます。

アラートでなく問題を示すクエリ

アラート フローは、問題を示す結果をアラートに変換するために構築されました。 たとえば、次のようなクエリの場合を考えてみましょう。

SecurityEvent
| where EventID == 4624

ユーザーの意図がアラートを発することの場合は、この種類のイベントが発生すると、アラート ロジックによってクエリに count が追加されます。 実行されるクエリは次のようになります。

SecurityEvent
| where EventID == 4624
| count

クエリにアラート ロジックを追加する必要はなく、それを行うと問題を引き起こす可能性さえあります。 上の例では、クエリに count を含めると、アラート サービスによって countcount が行われるため、常に値 1 が返されます。

limit 演算子と take 演算子の回避

クエリで limittake を使用すると、結果が時間の経過とともに一貫しないため、待機時間とアラートの負荷が増加する可能性があります。 必要な場合にのみ使用することをお勧めします。

ログ クエリの制約

Azure Monitor のログ クエリは、テーブルか、search 演算子または union 演算子のいずれかで始まります。

ログ アラート ルールのクエリは、常に明確な範囲を定義するテーブルで始める必要があります。これにより、クエリのパフォーマンスと結果の関連性の両方が向上します。 アラート ルール内のクエリは頻繁に実行されるので、searchunion を使用すると、複数のテーブルにわたるスキャンが必要になるため、アラートの待機時間が増加するオーバーヘッドが過剰に生じる可能性があります。 また、これらの演算子は、アラート サービスがクエリを最適化する機能を低下させます。

リソース間のクエリが想定される search 演算子または union 演算子を使用するログ アラート ルールの作成または変更は、サポートされていません。

たとえば、次のアラート クエリは SecurityEvent テーブルが対象であり、特定のイベント ID を検索します。 これは、このクエリが処理する必要のある唯一のテーブルです。

SecurityEvent
| where EventID == 4624

リソース間のクエリは union 型を使用し、これによりクエリの範囲が特定のリソースに制限されるため、リソース間のクエリを使用するログ アラート ルールはこの変更による影響は受けません。 次の例は、ログ アラート クエリで有効です。

union
app('Contoso-app1').requests,
app('Contoso-app2').requests,
workspace('Contoso-workspace1').Perf 

注意

リソース間のクエリは、新しい scheduledQueryRules API でサポートされています。 まだ従来の Log Analytics Alert API を使用してログ アラートを作成する場合は、切り替えについてここを参照してください。

次の例には、searchunion を使用するログ クエリが含まれていて、アラート ルールで使用するためにこれらのクエリを変更する際に使用できる手順を示しています。

例 1

search を使用してパフォーマンス情報を取得する次のクエリを使用して、ログ アラート ルールを作成するとします。

search *
| where Type == 'Perf' and CounterName == '% Free Space'
| where CounterValue < 30

このクエリを変更するには、まず次のクエリを使用して、プロパティが属しているテーブルを特定します。

search *
| where CounterName == '% Free Space'
| summarize by $table

このクエリの結果として、CounterName プロパティが Perf テーブルから取得されたことが示されます。

この結果を使用して、アラート ルールに使用する次のクエリを作成することができます。

Perf
| where CounterName == '% Free Space'
| where CounterValue < 30

例 2

search を使用してパフォーマンス情報を取得する次のクエリを使用して、ログ アラート ルールを作成するとします。

search ObjectName =="Memory" and CounterName=="% Committed Bytes In Use"
| summarize Avg_Memory_Usage =avg(CounterValue) by Computer
| where Avg_Memory_Usage between(90 .. 95)  

このクエリを変更するには、まず次のクエリを使用して、プロパティが属しているテーブルを特定します。

search ObjectName=="Memory" and CounterName=="% Committed Bytes In Use"
| summarize by $table

このクエリの結果として、ObjectName プロパティと CounterName プロパティが Perf テーブルから取得されたことが示されます。

この結果を使用して、アラート ルールに使用する次のクエリを作成することができます。

Perf
| where ObjectName =="Memory" and CounterName=="% Committed Bytes In Use"
| summarize Avg_Memory_Usage=avg(CounterValue) by Computer
| where Avg_Memory_Usage between(90 .. 95)

例 3

searchunion の両方を使用してパフォーマンス情報を取得する次のクエリを使用して、ログ アラート ルールを作成するとします。

search (ObjectName == "Processor" and CounterName == "% Idle Time" and InstanceName == "_Total")
| where Computer !in (
    union *
    | where CounterName == "% Processor Utility"
    | summarize by Computer)
| summarize Avg_Idle_Time = avg(CounterValue) by Computer

このクエリを変更するには、まず次のクエリを使用して、クエリの最初の部分のプロパティが属しているテーブルを特定します。

search (ObjectName == "Processor" and CounterName == "% Idle Time" and InstanceName == "_Total")
| summarize by $table

このクエリの結果として、これらのすべてのプロパティが Perf テーブルから取得されたことが示されます。

ここで、withsource コマンドで union を使用して、各行の基になっているソース テーブルを特定します。

union withsource=table *
| where CounterName == "% Processor Utility"
| summarize by table

このクエリの結果として、これらのプロパティも Perf テーブルから取得されたことが示されます。

これらの結果を使用して、アラート ルールに使用する次のクエリを作成することができます。

Perf
| where ObjectName == "Processor" and CounterName == "% Idle Time" and InstanceName == "_Total"
| where Computer !in (
    (Perf
    | where CounterName == "% Processor Utility"
    | summarize by Computer))
| summarize Avg_Idle_Time = avg(CounterValue) by Computer

例 4

2 つの search クエリの結果を結合する次のクエリを使用して、ログ アラート ルールを作成するとします。

search Type == 'SecurityEvent' and EventID == '4625'
| summarize by Computer, Hour = bin(TimeGenerated, 1h)
| join kind = leftouter (
    search in (Heartbeat) OSType == 'Windows'
    | summarize arg_max(TimeGenerated, Computer) by Computer , Hour = bin(TimeGenerated, 1h)
    | project Hour , Computer
) on Hour

このクエリを変更するには、まず次のクエリを使用して、結合の左側にあるプロパティが含まれているテーブルを特定します。

search Type == 'SecurityEvent' and EventID == '4625'
| summarize by $table

結果は、結合の左側にあるプロパティが SecurityEvent テーブルに属していることを示しています。

ここで、次のクエリを使用して、結合の右側にあるプロパティが含まれているテーブルを特定します。

search in (Heartbeat) OSType == 'Windows'
| summarize by $table

結果は、結合の右側にあるプロパティが Heartbeat テーブルに属していることを示しています。

これらの結果を使用して、アラート ルールに使用する次のクエリを作成することができます。

SecurityEvent
| where EventID == '4625'
| summarize by Computer, Hour = bin(TimeGenerated, 1h)
| join kind = leftouter (
    Heartbeat
    | where OSType == 'Windows'
    | summarize arg_max(TimeGenerated, Computer) by Computer , Hour = bin(TimeGenerated, 1h)
    | project Hour , Computer
) on Hour

次のステップ