Analisar dados de texto nos registos do Azure Monitor

Alguns dados de registo recolhidos pelo Azure Monitor incluirão várias informações numa única propriedade. Analisar estes dados em várias propriedades facilita a utilização em consultas. Um exemplo comum é um registo personalizado que recolhe uma entrada de registo completa com vários valores numa única propriedade. Ao criar propriedades separadas para os diferentes valores, pode procurar e agregar em cada um deles.

Este artigo descreve diferentes opções para analisar dados de registo no Azure Monitor quando os dados são ingeridos e quando são obtidos numa consulta, comparando as vantagens relativas de cada um.

Permissões necessárias

  • Para analisar dados no momento da recolha, precisa de Microsoft.Insights/dataCollectionRuleAssociations/* permissões, conforme fornecido pela função incorporada Contribuidor do Log Analytics, por exemplo.
  • Para analisar dados no momento da consulta, precisa de Microsoft.OperationalInsights/workspaces/query/*/read permissões, conforme fornecido pela função incorporada Leitor do Log Analytics, por exemplo.

Analisar métodos

Pode analisar dados no momento da ingestão quando os dados são recolhidos ou no momento da consulta quando analisa os dados com uma consulta. Cada estratégia tem vantagens únicas.

Analisar dados no momento da recolha

Utilize transformações para analisar dados no momento da recolha e definir para que colunas enviar os dados analisados.

Vantagens:

  • É mais fácil consultar os dados recolhidos porque não precisa de incluir comandos de análise na consulta.
  • Melhor desempenho das consultas, porque a consulta não precisa de efetuar a análise.

Desvantagens:

  • Tem de ser definido com antecedência. Não é possível incluir dados que já foram recolhidos.
  • Se alterar a lógica de análise, esta só será aplicada a novos dados.
  • Aumenta o tempo de latência para recolher dados.
  • Os erros podem ser difíceis de processar.

Analisar dados no momento da consulta

Quando analisa dados no momento da consulta, inclui lógica na consulta para analisar dados em vários campos. A tabela propriamente dita não é modificada.

Vantagens:

  • Aplica-se a quaisquer dados, incluindo dados que já foram recolhidos.
  • As alterações lógicas podem ser aplicadas imediatamente a todos os dados.
  • Opções de análise flexíveis, incluindo lógica predefinida para estruturas de dados específicas.

Desvantagens:

  • Requer consultas mais complexas. Esta desvantagem pode ser mitigada ao utilizar funções para simular uma tabela.
  • Tem de replicar a lógica de análise em várias consultas. Pode partilhar alguma lógica através de funções.
  • Pode criar sobrecarga quando executa lógica complexa em conjuntos de registos muito grandes (milhares de milhões de registos).

Analisar dados à medida que são recolhidos

Para obter mais informações sobre a análise de dados à medida que são recolhidos, veja Estrutura da transformação no Azure Monitor. Esta abordagem cria propriedades personalizadas na tabela que podem ser utilizadas por consultas como qualquer outra propriedade.

Analisar dados numa consulta com padrões

Quando os dados que pretende analisar podem ser identificados por um padrão repetido em todos os registos, pode utilizar operadores diferentes no Linguagem de Pesquisa Kusto para extrair a parte específica dos dados para uma ou mais novas propriedades.

Padrões de texto simples

Utilize o operador de análise na consulta para criar uma ou mais propriedades personalizadas que podem ser extraídas de uma expressão de cadeia. Especifique o padrão a identificar e os nomes das propriedades a criar. Esta abordagem é útil para dados com cadeias de chave-valor com um formulário semelhante a key=value.

Considere um registo personalizado com dados no seguinte formato:

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

A consulta seguinte analisaria estes dados em propriedades individuais. A linha com project é adicionada para devolver apenas as propriedades calculadas e não RawData, que é a única propriedade que contém toda a entrada do registo personalizado.

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

Este exemplo divide o nome de utilizador de um UPN na AzureActivity tabela.

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

Expressões regulares

Se os seus dados puderem ser identificados com uma expressão regular, pode utilizar funções que utilizam expressões regulares para extrair valores individuais. O exemplo seguinte utiliza extração para dividir o campo dos UPNAzureActivity registos e, em seguida, devolver utilizadores distintos.

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

Para permitir uma análise eficiente em grande escala, o Azure Monitor utiliza a versão re2 das Expressões Regulares, que é semelhante, mas não idêntica a algumas das outras variantes de expressão regulares. Para obter mais informações, veja a sintaxe de expressão re2.

Analisar dados delimitados numa consulta

Os dados delimitados separam campos com um caráter comum, como uma vírgula num ficheiro CSV. Utilize a função split para analisar dados delimitados com um delimitador que especificar. Pode utilizar esta abordagem com o operador extend para devolver todos os campos nos dados ou para especificar campos individuais a serem incluídos na saída.

Nota

Uma vez que a divisão devolve um objeto dinâmico, os resultados podem ter de ser explicitamente convertidos em tipos de dados, como cadeia para ser utilizada em operadores e filtros.

Considere um registo personalizado com dados no seguinte formato 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

A consulta seguinte analisaria estes dados e resumiria duas das propriedades calculadas. A primeira linha divide a RawData propriedade numa matriz de cadeia. Cada uma das linhas seguintes dá um nome a propriedades individuais e adiciona-as à saída ao utilizar funções para convertê-las para o tipo de dados adequado.

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

Analisar estruturas predefinidas numa consulta

Se os seus dados estiverem formatados numa estrutura conhecida, poderá utilizar uma das funções no Linguagem de Pesquisa Kusto para analisar estruturas predefinidas:

A consulta de exemplo seguinte analisa o Properties campo da AzureActivity tabela, que está estruturado em JSON. Guarda os resultados numa propriedade dinâmica chamada parsedProp, que inclui o valor com nome individual no JSON. Estes valores são utilizados para filtrar e resumir os resultados da consulta.

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

Estas funções de análise podem ser intensivas em termos de processador. Utilize-as apenas quando a consulta utiliza várias propriedades dos dados formatados. Caso contrário, o processamento de correspondência de padrões simples é mais rápido.

O exemplo seguinte mostra a discriminação do tipo de controlador TGT Preauth de domínio. O tipo só existe no EventData campo, que é uma cadeia XML. Não são necessários outros dados deste campo. Neste caso, a análise é utilizada para escolher a parte de dados necessária.

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

Utilizar uma função para simular uma tabela

Pode ter várias consultas que executam a mesma análise de uma tabela específica. Neste caso, crie uma função que devolva os dados analisados em vez de replicar a lógica de análise em cada consulta. Em seguida, pode utilizar o alias de função em vez da tabela original noutras consultas.

Considere o exemplo de registo personalizado delimitado por vírgulas anterior. Para utilizar os dados analisados em várias consultas, crie uma função com a seguinte consulta e guarde-a com o alias 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]) 

Agora, pode utilizar o alias MyCustomCSVLog em vez do nome real da tabela em consultas como no exemplo seguinte:

MyCustomCSVLog
| summarize count() by Status,Code

Passos seguintes

Saiba mais sobre as consultas de registo para analisar os dados recolhidos a partir de origens de dados e soluções.