Exemplos de consulta de registo do Azure Monitor

Este artigo inclui vários exemplos de consultas usando a linguagem de consulta Kusto para recuperar diferentes tipos de dados de registo do Azure Monitor. Diferentes métodos são usados para consolidar e analisar dados, para que você possa usar estas amostras para identificar diferentes estratégias que você pode usar para seus próprios requisitos.

Consulte a referência linguística de Kusto para obter detalhes sobre as diferentes palavras-chave utilizadas nestas amostras. Passe por uma lição sobre a criação de consultas se for novo no Azure Monitor.

Eventos

Eventos de nível de aplicação de pesquisa descritos como "Criptográfico"

Este exemplo procura a tabela Eventos para registos em que o EventLog é Aplicação e ADescriptação Renderizada contém criptográfico. Inclui registos das últimas 24 horas.

Event
| where EventLog == "Application" 
| where TimeGenerated > ago(24h) 
| where RenderedDescription contains "cryptographic"

Tabelas de pesquisa Evento e SecurityEvents para registos que mencionam unmarshaling.

search in (Event, SecurityEvent) "unmarshaling"

Heartbeat

Gráfico uma visão semana-ao-semana do número de computadores que enviam dados

O exemplo a seguir traça o número de computadores distintos que enviam batimentos cardíacos, todas as semanas.

Heartbeat
| where TimeGenerated >= startofweek(ago(21d))
| summarize dcount(Computer) by endofweek(TimeGenerated) | render barchart kind=default

Encontre computadores velhos

O exemplo a seguir encontra computadores que estavam ativos no último dia, mas não enviaram batimentos cardíacos na última hora.

Heartbeat
| where TimeGenerated > ago(1d)
| summarize LastHeartbeat = max(TimeGenerated) by Computer
| where isnotempty(Computer)
| where LastHeartbeat < ago(1h)

Obtenha o mais recente registo de batimentos cardíacos por computador IP

Este exemplo devolve o último registo de batimentos cardíacos para cada IP do computador.

Heartbeat
| summarize arg_max(TimeGenerated, *) by ComputerIP

Combine registos de estado protegido com registos de batimentos cardíacos

Este exemplo encontra registos de estado de proteção relacionados e registos de batimentos cardíacos, combinados tanto no Computador como no tempo. Note que o campo de tempo é arredondado para o minuto mais próximo. Usamos o cálculo do caixote do tempo de execução para fazer isso: round_time=bin(TimeGenerated, 1m) .

let protection_data = ProtectionStatus
    | project Computer, DetectionId, round_time=bin(TimeGenerated, 1m);
let heartbeat_data = Heartbeat
    | project Computer, Category, round_time=bin(TimeGenerated, 1m);
protection_data | join (heartbeat_data) on Computer, round_time

Taxa de disponibilidade do servidor

Calcular a taxa de disponibilidade do servidor com base nos registos de batimentos cardíacos. A disponibilidade é definida como "pelo menos 1 batimento cardíaco por hora". Assim, se um servidor estava disponível 98 de 100 horas, a taxa de disponibilidade é de 98%.

let start_time=startofday(datetime("2018-03-01"));
let end_time=now();
Heartbeat
| where TimeGenerated > start_time and TimeGenerated < end_time
| summarize heartbeat_per_hour=count() by bin_at(TimeGenerated, 1h, start_time), Computer
| extend available_per_hour=iff(heartbeat_per_hour>0, true, false)
| summarize total_available_hours=countif(available_per_hour==true) by Computer 
| extend total_number_of_buckets=round((end_time-start_time)/1h)+1
| extend availability_rate=total_available_hours*100/total_number_of_buckets

Vários tipos de dados

Cartografe a contagem de recordes por tabela

O exemplo seguinte recolhe todos os registos de todas as tabelas das últimas cinco horas e conta quantos registos estavam em cada mesa. Os resultados são apresentados num timechart.

union withsource=sourceTable *
| where TimeGenerated > ago(5h) 
| summarize count() by bin(TimeGenerated,10m), sourceTable
| render timechart

Conte todos os registos recolhidos na última hora por tipo

O exemplo a seguir procura tudo relatado na última hora e conta os registos de cada tabela por Tipo. Os resultados são apresentados num gráfico de barras.

search *
| where TimeGenerated > ago(1h) 
| summarize CountOfRecords = count() by Type
| render barchart

AzureDiagnostics

Registos de diagnóstico do Conde Azure por categoria

Este exemplo conta todos os registos de diagnóstico da Azure para cada categoria única.

AzureDiagnostics 
| where TimeGenerated > ago(1d)
| summarize count() by Category

Obtenha um registo aleatório para cada categoria única

Este exemplo obtém um único registo de diagnósticos Azure aleatório para cada categoria única.

AzureDiagnostics
| where TimeGenerated > ago(1d) 
| summarize any(*) by Category

Obtenha o último recorde por categoria

Este exemplo obtém o mais recente registo de diagnósticos Azure em cada categoria única.

AzureDiagnostics
| where TimeGenerated > ago(1d) 
| summarize arg_max(TimeGenerated, *) by Category

Monitorização de rede

Computadores com latência pouco saudável

Este exemplo cria uma lista de computadores distintos com latência pouco saudável.

NetworkMonitoring 
| where LatencyHealthState <> "Healthy" 
| where Computer != "" 
| distinct Computer

Desempenho

Junte os registos de perf do computador para correlacionar a memória e CPU

Este exemplo correlaciona os registos perf de um determinado computador e cria dois gráficos de tempo, o CPU médio e a memória máxima.

let StartTime = now()-5d;
let EndTime = now()-4d;
Perf
| where CounterName == "% Processor Time"  
| where TimeGenerated > StartTime and TimeGenerated < EndTime
| project TimeGenerated, Computer, cpu=CounterValue 
| join kind= inner (
   Perf
    | where CounterName == "% Used Memory"  
    | where TimeGenerated > StartTime and TimeGenerated < EndTime
    | project TimeGenerated , Computer, mem=CounterValue 
) on TimeGenerated, Computer
| summarize avgCpu=avg(cpu), maxMem=max(mem) by TimeGenerated bin=30m  
| render timechart

Gráfico de utilização do CPU perf por computador

Este exemplo calcula e traça a utilização do CPU de computadores que começam com Contoso.

Perf
| where TimeGenerated > ago(4h)
| where Computer startswith "Contoso" 
| where CounterName == @"% Processor Time"
| summarize avg(CounterValue) by Computer, bin(TimeGenerated, 15m) 
| render timechart

Estado de proteção

Computadores com duração do estado de proteção não reportando

Este exemplo lista computadores que tinham um estado de proteção de Não Reportar e a duração em que estavam neste estado.

ProtectionStatus
| where ProtectionStatus == "Not Reporting"
| summarize count(), startNotReporting = min(TimeGenerated), endNotReporting = max(TimeGenerated) by Computer, ProtectionStatusDetails
| join ProtectionStatus on Computer
| summarize lastReporting = max(TimeGenerated), startNotReporting = any(startNotReporting), endNotReporting = any(endNotReporting) by Computer
| extend durationNotReporting = endNotReporting - startNotReporting

Combine registos de estado protegido com registos de batimentos cardíacos

Este exemplo encontra registos de estado de proteção relacionados e registos de batimentos cardíacos compatíveis tanto no Computador como no tempo. O campo de tempo é arredondado para o minuto mais próximo usando o caixote do lixo.

let protection_data = ProtectionStatus
    | project Computer, DetectionId, round_time=bin(TimeGenerated, 1m);
let heartbeat_data = Heartbeat
    | project Computer, Category, round_time=bin(TimeGenerated, 1m);
protection_data | join (heartbeat_data) on Computer, round_time

Registos de segurança

Conte eventos de segurança por ID de atividade

Este exemplo baseia-se na estrutura fixa da coluna Atividade: <ID> - <Name> . Analisa o valor da Atividade em duas novas colunas, e conta a ocorrência de cada atividadeID.

SecurityEvent
| where TimeGenerated > ago(30m) 
| project Activity 
| parse Activity with activityID " - " activityDesc
| summarize count() by activityID

Este exemplo mostra o número de registos securityEvent, nos quais a coluna Atividade contém todo o termo Permissões. A consulta aplica-se aos registos criados nos últimos 30 minutos.

SecurityEvent
| where TimeGenerated > ago(30m)
| summarize EventCount = countif(Activity has "Permissions")

Encontre contas que não conseguiram entrar nos computadores com uma deteção de segurança

Este exemplo encontra e conta contas que não conseguiram entrar em computadores nos quais identificamos uma deteção de segurança.

let detections = toscalar(SecurityDetection
| summarize makeset(Computer));
SecurityEvent
| where Computer in (detections) and EventID == 4624
| summarize count() by Account

Os meus dados de segurança estão disponíveis?

Iniciar a exploração de dados começa frequentemente com a verificação da disponibilidade de dados. Este exemplo mostra o número de registos securityEvent nos últimos 30 minutos.

SecurityEvent 
| where TimeGenerated  > ago(30m) 
| count

Nome de atividade de parse e ID

Os dois exemplos a seguir baseiam-se na estrutura fixa da coluna Atividade: <ID> - <Name> . O primeiro exemplo utiliza o operador de parse para atribuir valores a duas novas colunas: actividadeID e actividadeDesc.

SecurityEvent
| take 100
| project Activity 
| parse Activity with activityID " - " activityDesc

Este exemplo usa o operador dividido para criar uma matriz de valores separados

SecurityEvent
| take 100
| project Activity 
| extend activityArr=split(Activity, " - ") 
| project Activity , activityArr, activityId=activityArr[0]

Processos de credenciais explícitas

O exemplo a seguir mostra um gráfico de tartes de processos que usou credenciais explícitas na última semana

SecurityEvent
| where TimeGenerated > ago(7d)
// filter by id 4648 ("A logon was attempted using explicit credentials")
| where EventID == 4648
| summarize count() by Process
| render piechart 

Principais processos de execução

O exemplo a seguir mostra uma linha temporal de atividade para os cinco processos mais comuns, nos últimos três dias.

// Find all processes that started in the last three days. ID 4688: A new process has been created.
let RunProcesses = 
    SecurityEvent
    | where TimeGenerated > ago(3d)
    | where EventID == "4688";
// Find the 5 processes that were run the most
let Top5Processes =
RunProcesses
| summarize count() by Process
| top 5 by count_;
// Create a time chart of these 5 processes - hour by hour
RunProcesses 
| where Process in (Top5Processes) 
| summarize count() by bin (TimeGenerated, 1h), Process
| render timechart

Encontre tentativas de login falhadas repetidas pela mesma conta de diferentes IPs

O exemplo a seguir encontra tentativas falhadas de login pela mesma conta de mais de cinco IPs diferentes nas últimas seis horas.

SecurityEvent 
| where AccountType == "User" and EventID == 4625 and TimeGenerated > ago(6h) 
| summarize IPCount = dcount(IpAddress), makeset(IpAddress)  by Account
| where IPCount > 5
| sort by IPCount desc

Encontre contas de utilizador que não conseguiram fazer login

O exemplo a seguir identifica as contas de utilizadores que não conseguiram entrar mais de cinco vezes no último dia e quando tentaram entrar pela última vez.

let timeframe = 1d;
SecurityEvent
| where TimeGenerated > ago(1d)
| where AccountType == 'User' and EventID == 4625 // 4625 - failed log in
| summarize failed_login_attempts=count(), latest_failed_login=arg_max(TimeGenerated, Account) by Account 
| where failed_login_attempts > 5
| project-away Account1

Usando a join, e deixe declarações que podemos verificar se as mesmas contas suspeitas foram mais tarde capazes de entrar com sucesso.

let timeframe = 1d;
let suspicious_users = 
    SecurityEvent
    | where TimeGenerated > ago(timeframe)
    | where AccountType == 'User' and EventID == 4625 // 4625 - failed login
    | summarize failed_login_attempts=count(), latest_failed_login=arg_max(TimeGenerated, Account) by Account 
    | where failed_login_attempts > 5
    | project-away Account1;
let suspicious_users_that_later_logged_in = 
    suspicious_users 
    | join kind=innerunique (
        SecurityEvent
        | where TimeGenerated > ago(timeframe)
        | where AccountType == 'User' and EventID == 4624 // 4624 - successful login,
        | summarize latest_successful_login=arg_max(TimeGenerated, Account) by Account
    ) on Account
    | extend was_login_after_failures = iif(latest_successful_login>latest_failed_login, 1, 0)
    | where was_login_after_failures == 1
;
suspicious_users_that_later_logged_in

Utilização

O Usage tipo de dados pode ser usado para rastrear o volume de dados ingerido por solução ou tipo de dados. Existem outras técnicas para estudar volumes de dados ingeridos por subscrição de computador ou Azure, grupo de recursos ou recursos.

Volume de dados por solução

A consulta utilizada para visualizar o volume de dados facturante por solução ao longo do último mês (excluindo o último dia parcial) é:

Usage 
| where TimeGenerated > ago(32d)
| where StartTime >= startofday(ago(31d)) and EndTime < startofday(now())
| where IsBillable == true
| summarize BillableDataGB = sum(Quantity) / 1000. by bin(StartTime, 1d), Solution | render barchart

Note que a cláusula where IsBillable = true filtra tipos de dados de determinadas soluções para as quais não há carga de ingestão. Também a cláusula com TimeGenerated é apenas para garantir que a experiência de consulta no portal Azure olhará para trás para além do padrão 24 horas. Ao utilizar o tipo de dados de StartTime utilização, e representar os EndTime baldes de tempo para os quais os resultados são apresentados.

Volume de dados por tipo

Pode perfurar mais para ver as tendências de dados por tipo de dados:

Usage 
| where TimeGenerated > ago(32d)
| where StartTime >= startofday(ago(31d)) and EndTime < startofday(now())
| where IsBillable == true
| summarize BillableDataGB = sum(Quantity) / 1000. by bin(StartTime, 1d), DataType | render barchart

Ou ver uma mesa por solução e tipo para o último mês,

Usage 
| where TimeGenerated > ago(32d)
| where StartTime >= startofday(ago(31d)) and EndTime < startofday(now())
| where IsBillable == true
| summarize BillableDataGB = sum(Quantity) / 1000. by Solution, DataType
| sort by Solution asc, DataType asc

Nota

Alguns dos campos do tipo de dados de utilização, ainda no esquema, foram depreciados e os seus valores deixarão de ser povoados. Estes são Computador, bem como campos relacionados com a ingestão (TotalBatches, BatchesWithinSla, BatchesOutsideSla, BatchesCapped e AverageProcessingTimeMs.

Atualizações

Computadores ainda em falta atualizações

Este exemplo mostra uma lista de computadores que faltavam uma ou mais atualizações críticas há alguns dias e ainda estão a faltar atualizações.

let ComputersMissingUpdates3DaysAgo = Update
| where TimeGenerated between (ago(30d)..ago(1h))
| where Classification !has "Critical" and UpdateState =~ "Needed"
| summarize makeset(Computer);
Update
| where TimeGenerated > ago(1d)
| where Classification has "Critical" and UpdateState =~ "Needed"
| where Computer in (ComputersMissingUpdates3DaysAgo)
| summarize UniqueUpdatesCount = dcount(Product) by Computer, OSType

Passos seguintes