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, search
eller 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
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 .
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)
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 .
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
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 .
Använd
union
medwithsource
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 .
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
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 .
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 .
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.