Optimera aviseringsfrågor för loggsökning

Den här artikeln beskriver hur du skriver och konverterar loggsökningsaviseringar för att uppnå optimala prestanda. Optimerade frågor minskar svarstiden och belastningen på aviseringar, som körs ofta.

Börja skriva en aviseringsloggfråga

Aviseringsfrågor börjar med att köra frågor mot loggdata i Log Analytics som anger problemet. Information om vad du kan upptäcka finns i Använda frågor i Azure Monitor Log Analytics. Du kan också komma igång med att skriva en egen fråga.

Frågor som anger problemet och inte aviseringen

Aviseringsflödet skapades för att transformera resultaten som indikerar problemet till en avisering. När det till exempel gäller en fråga som:

SecurityEvent
| where EventID == 4624

Om avsikten med användaren är att avisera läggs aviseringslogik count till i frågan när den här händelsetypen inträffar. Frågan som körs är:

SecurityEvent
| where EventID == 4624
| count

Du behöver inte lägga till aviseringslogik i frågan och det kan till och med orsaka problem. I föregående exempel, om du inkluderar count i din fråga, resulterar det alltid i värdet 1, eftersom aviseringstjänsten kommer att göra count av count.

Undvik gräns och ta operatorer

Att använda limit och take i frågor kan öka svarstiden och belastningen på aviseringar eftersom resultaten inte är konsekventa över tid. Använd dem endast om det behövs.

Loggfrågebegränsningar

Loggfrågor i Azure Monitor börjar med antingen en tabell, searcheller union en operator.

Frågor om aviseringsregler för loggsökning bör alltid börja med en tabell för att definiera ett tydligt omfång, vilket förbättrar frågeprestanda och resultatets relevans. Frågor i aviseringsregler körs ofta. Att använda search och union kan resultera i för höga kostnader som lägger till svarstid i aviseringen eftersom det kräver genomsökning i flera tabeller. Dessa operatorer minskar också möjligheten för aviseringstjänsten att optimera frågan.

Vi stöder inte att skapa eller ändra aviseringsregler för loggsökning som använder search eller union operatorer, förutom frågor mellan resurser.

Följande aviseringsfråga är till exempel begränsad till tabellen SecurityEvent och söker efter ett specifikt händelse-ID. Det är den enda tabell som frågan måste bearbeta.

SecurityEvent
| where EventID == 4624

Aviseringsregler för loggsökning med hjälp av frågor mellan resurser påverkas inte av den här ändringen eftersom frågor mellan resurser använder en typ av union, som begränsar frågeomfånget till specifika resurser. Följande exempel är en giltig aviseringsfråga för loggsökning:

union
app('00000000-0000-0000-0000-000000000001').requests,
app('00000000-0000-0000-0000-000000000002').requests,
workspace('00000000-0000-0000-0000-000000000003').Perf 

Kommentar

Frågor mellan resurser stöds i det nya scheduledQueryRules-API:et. Om du fortfarande använder det äldre Log Analytics-aviserings-API:et för att skapa loggsökningsaviseringar kan du läsa Uppgradera äldre regelhantering till det aktuella API:et för schemalagda frågor i Azure Monitor för att lära dig mer om växling.

Exempel

Följande exempel är loggfrågor som använder search och union. De innehåller steg som du kan använda för att ändra dessa frågor för användning i aviseringsregler.

Exempel 1

Du vill skapa en varningsregel för loggsökning med hjälp av följande fråga som hämtar prestandainformation med hjälp av search:

search *
| where Type == 'Perf' and CounterName == '% Free Space'
| where CounterValue < 30
  1. Om du vill ändra den här frågan börjar du med att använda följande fråga för att identifiera tabellen som egenskaperna tillhör:

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

    Resultatet av den här frågan skulle visa att egenskapen CounterName kom från tabellen Perf .

  2. Använd det här resultatet för att skapa följande fråga som du skulle använda för aviseringsregeln:

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

Exempel 2

Du vill skapa en varningsregel för loggsökning med hjälp av följande fråga som hämtar prestandainformation med hjälp av 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)  
  1. Om du vill ändra den här frågan börjar du med att använda följande fråga för att identifiera tabellen som egenskaperna tillhör:

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

    Resultatet av den här frågan skulle visa att egenskaperna ObjectName och CounterName kom från tabellen Perf .

  2. Använd det här resultatet för att skapa följande fråga som du skulle använda för aviseringsregeln:

    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)
    

Exempel 3

Du vill skapa en varningsregel för loggsökning med hjälp av följande fråga som använder både search och union för att hämta prestandainformation:

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
  1. Om du vill ändra den här frågan börjar du med att använda följande fråga för att identifiera tabellen som egenskaperna i den första delen av frågan tillhör:

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

    Resultatet av den här frågan skulle visa att alla dessa egenskaper kom från tabellen Perf .

  2. Använd union med withsource kommandot för att identifiera vilken källtabell som har bidragit med varje rad:

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

    Resultatet av den här frågan skulle visa att dessa egenskaper också kom från tabellen Perf .

  3. Använd dessa resultat för att skapa följande fråga som du skulle använda för aviseringsregeln:

    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
    

Exempel 4

Du vill skapa en varningsregel för loggsökning med hjälp av följande fråga som kopplar resultatet av två search frågor:

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
  1. Om du vill ändra frågan börjar du med att använda följande fråga för att identifiera tabellen som innehåller egenskaperna till vänster om kopplingen:

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

    Resultatet anger att egenskaperna på vänster sida av kopplingen tillhör tabellen SecurityEvent .

  2. Använd följande fråga för att identifiera tabellen som innehåller egenskaperna till höger om kopplingen:

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

    Resultatet anger att egenskaperna till höger om kopplingen tillhör tabellen Pulsslag .

  3. Använd dessa resultat för att skapa följande fråga som du skulle använda för aviseringsregeln:

    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
    

Nästa steg

  • Läs mer om aviseringar för loggsökning i Azure Monitor.
  • Läs mer om loggfrågor.