Parsování textových dat v protokolech služby Azure Monitor

Některá data protokolů shromážděná službou Azure Monitor budou obsahovat několik informací v jedné vlastnosti. Parsování těchto dat do více vlastností usnadňuje použití v dotazech. Běžným příkladem je vlastní protokol , který shromažďuje celý záznam protokolu s více hodnotami do jedné vlastnosti. Vytvořením samostatných vlastností pro různé hodnoty můžete vyhledávat a agregovat je.

Tento článek popisuje různé možnosti analýzy dat protokolu ve službě Azure Monitor při příjmu dat a při jejich načtení v dotazu a porovnává jejich relativní výhody.

Požadovaná oprávnění

Metody analýzy

Data můžete analyzovat buď v době příjmu dat, kdy se data shromažďují, nebo v době dotazu, kdy data analyzujete pomocí dotazu. Každá strategie má jedinečné výhody.

Parsování dat v době shromažďování

Pomocí transformací parsujte data v době shromažďování a definujte sloupce, do kterých se mají parsovaná data odesílat.

Výhody:

  • Snadnější dotazování shromážděných dat, protože do dotazu nemusíte zahrnout příkazy pro analýzu.
  • Lepší výkon dotazů, protože dotaz nemusí provádět analýzu.

Nevýhody:

  • Musí být definováno předem. Nelze zahrnout data, která už byla shromážděna.
  • Pokud změníte logiku parsování, bude platit jenom pro nová data.
  • Zvyšuje latenci shromažďování dat.
  • Zpracování chyb může být obtížné.

Parsování dat v době dotazu

Při analýze dat v době dotazu zahrnete do dotazu logiku, která parsuje data do více polí. Samotná tabulka se nezmění.

Výhody:

  • Platí pro všechna data, včetně dat, která už byla shromážděna.
  • Změny logiky se dají okamžitě použít u všech dat.
  • Flexibilní možnosti analýzy, včetně předdefinované logiky pro konkrétní datové struktury

Nevýhody:

  • Vyžaduje složitější dotazy. Tuto nevýhodu lze zmírnit použitím funkcí pro simulaci tabulky.
  • Musí replikovat logiku parsování ve více dotazech. Může sdílet určitou logiku prostřednictvím funkcí.
  • Může vytvořit režijní náklady, když spustíte složitou logiku pro velmi velké sady záznamů (miliardy záznamů).

Parsování shromažďovaných dat

Další informace o analýze shromažďovaných dat najdete v tématu Struktura transformace ve službě Azure Monitor. Tento přístup vytvoří v tabulce vlastní vlastnosti, které můžou používat dotazy stejně jako jakékoli jiné vlastnosti.

Parsování dat v dotazu pomocí vzorů

Pokud lze data, která chcete analyzovat, identifikovat vzorem opakovaným napříč záznamy, můžete pomocí různých operátorů v dotazovací jazyk Kusto extrahovat konkrétní část dat do jedné nebo více nových vlastností.

Jednoduché textové vzory

Pomocí operátoru parse v dotazu vytvořte jednu nebo více vlastních vlastností, které lze extrahovat z řetězcového výrazu. Určíte vzor, který se má identifikovat, a názvy vlastností, které se mají vytvořit. Tento přístup je užitečný pro data s řetězci klíč-hodnota s formulářem podobným key=value.

Představte si vlastní protokol s daty v následujícím formátu:

Time=2018-03-10 01:34:36 Event Code=207 Status=Success Message=Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
Time=2018-03-10 01:33:33 Event Code=208 Status=Warning Message=Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
Time=2018-03-10 01:35:44 Event Code=209 Status=Success Message=Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
Time=2018-03-10 01:38:22 Event Code=302 Status=Error Message=Application could not connect to database
Time=2018-03-10 01:31:34 Event Code=303 Status=Error Message=Application lost connection to database

Následující dotaz parsuje tato data do jednotlivých vlastností. Řádek s project se přidá tak, aby vrátil pouze počítané vlastnosti, a ne RawData, což je jedna vlastnost, která obsahuje celou položku z vlastního protokolu.

MyCustomLog_CL
| parse RawData with * "Time=" EventTime " Event Code=" Code " Status=" Status " Message=" Message
| project EventTime, Code, Status, Message

Tento příklad rozdělí uživatelské jméno hlavního názvu uživatele (UPN) v tabulce AzureActivity .

AzureActivity
| parse  Caller with UPNUserPart "@" * 
| where UPNUserPart != "" //Remove non UPN callers (apps, SPNs, etc)
| distinct UPNUserPart, Caller

Regulární výrazy

Pokud lze vaše data identifikovat pomocí regulárního výrazu, můžete použít funkce, které používají regulární výrazy k extrahování jednotlivých hodnot. Následující příklad používá extrakci k rozdělení UPN pole ze AzureActivity záznamů a následnému vrácení jedinečných uživatelů.

AzureActivity
| extend UPNUserPart = extract("([a-z.]*)@", 1, Caller) 
| distinct UPNUserPart, Caller

K zajištění efektivní analýzy ve velkém měřítku používá Azure Monitor re2 verzi regulárních výrazů, která je podobná, ale není shodná s některými dalšími variantami regulárních výrazů. Další informace najdete v syntaxi výrazu re2.

Parsování dat oddělených v dotazu

Data s oddělovači oddělují pole společným znakem, například čárkou v souboru CSV. Pomocí funkce split můžete analyzovat data s oddělovači pomocí oddělovače, který zadáte. Tento přístup můžete použít s operátorem extend a vrátit všechna pole v datech nebo zadat jednotlivá pole, která se mají zahrnout do výstupu.

Poznámka

Vzhledem k tomu, že rozdělení vrací dynamický objekt, může být nutné výsledky explicitně přetypovat na datové typy, jako je například řetězec, který se použije v operátorech a filtrech.

Představte si vlastní protokol s daty v následujícím formátu CSV:

2018-03-10 01:34:36, 207,Success,Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
2018-03-10 01:33:33, 208,Warning,Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
2018-03-10 01:35:44, 209,Success,Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
2018-03-10 01:38:22, 302,Error,Application could not connect to database
2018-03-10 01:31:34, 303,Error,Application lost connection to database

Následující dotaz by tato data parsoval a shrnul podle dvou počítaných vlastností. První řádek rozdělí vlastnost na RawData pole řetězců. Každý z dalších řádků pojmenuje jednotlivé vlastnosti a přidá je do výstupu pomocí funkcí, které je převedou na příslušný datový typ.

MyCustomCSVLog_CL
| extend CSVFields  = split(RawData, ',')
| extend EventTime  = todatetime(CSVFields[0])
| extend Code       = toint(CSVFields[1]) 
| extend Status     = tostring(CSVFields[2]) 
| extend Message    = tostring(CSVFields[3]) 
| where getyear(EventTime) == 2018
| summarize count() by Status,Code

Parsování předdefinovaných struktur v dotazu

Pokud jsou data naformátovaná ve známé struktuře, můžete k analýze předdefinovaných struktur použít některou z funkcí v dotazovací jazyk Kusto:

Následující příklad dotazu parsuje Properties pole AzureActivity tabulky, které je strukturované ve formátu JSON. Výsledky uloží do dynamické vlastnosti s názvem parsedProp, která obsahuje jednotlivou pojmenovanou hodnotu ve formátu JSON. Tyto hodnoty slouží k filtrování a sumarizace výsledků dotazu.

AzureActivity
| extend parsedProp = parse_json(Properties) 
| where parsedProp.isComplianceCheck == "True" 
| summarize count() by ResourceGroup, tostring(parsedProp.tags.businessowner)

Tyto funkce analýzy můžou být náročné na procesor. Používejte je pouze v případech, kdy dotaz používá více vlastností z formátovaných dat. Jinak je zpracování jednoduché shody vzorů rychlejší.

Následující příklad ukazuje rozpis typu řadiče TGT Preauth domény. Typ existuje pouze v EventData poli, což je řetězec XML. Žádná další data z tohoto pole nejsou potřeba. V tomto případě se k výběru požadované části dat používá analýza .

SecurityEvent
| where EventID == 4768
| parse EventData with * 'PreAuthType">' PreAuthType '</Data>' * 
| summarize count() by PreAuthType

Použití funkce k simulaci tabulky

Můžete mít více dotazů, které provádějí stejnou analýzu konkrétní tabulky. V takovém případě vytvořte funkci , která vrátí analyzovaná data místo replikace logiky analýzy v každém dotazu. Alias funkce pak můžete použít místo původní tabulky v jiných dotazech.

Podívejte se na předchozí příklad vlastního protokolu s oddělovači. Pokud chcete parsovaná data použít ve více dotazech, vytvořte funkci pomocí následujícího dotazu a uložte ji s aliasem MyCustomCSVLog.

MyCustomCSVLog_CL
| extend CSVFields = split(RawData, ',')
| extend DateTime  = tostring(CSVFields[0])
| extend Code      = toint(CSVFields[1]) 
| extend Status    = tostring(CSVFields[2]) 
| extend Message   = tostring(CSVFields[3]) 

Teď můžete v dotazech použít alias MyCustomCSVLog místo skutečného názvu tabulky jako v následujícím příkladu:

MyCustomCSVLog
| summarize count() by Status,Code

Další kroky

Seznamte se s dotazy na protokoly pro analýzu dat shromážděných ze zdrojů dat a řešení.