Partilhar via


Analisar o uso em um espaço de trabalho do Log Analytics

Os custos do Azure Monitor podem variar significativamente com base no volume de dados que está sendo coletado em seu espaço de trabalho do Log Analytics. Esse volume é afetado pelo conjunto de soluções que usam o espaço de trabalho e pela quantidade de dados que cada solução coleta. Este artigo fornece orientação sobre como analisar os dados coletados para ajudar a controlar os custos de ingestão de dados. Ele ajuda a determinar a causa do uso maior do que o esperado. Também o ajuda a prever os seus custos à medida que monitoriza mais recursos e configura diferentes funcionalidades do Azure Monitor.

Gorjeta

Para obter estratégias para reduzir os custos do Azure Monitor, consulte Otimização de custos e Azure Monitor.

Causas para uso acima do esperado

Cada espaço de trabalho do Log Analytics é cobrado como um serviço separado e contribui para a fatura da sua subscrição do Azure. A quantidade de ingestão de dados pode ser considerável, dependendo de:

  • Conjunto de insights e serviços habilitados e sua configuração.
    • Número e tipo de recursos monitorados.
    • Volume de dados recolhidos a partir de cada recurso monitorizado.

Um aumento inesperado em qualquer um desses fatores pode resultar em maiores encargos pela retenção de dados. O restante deste artigo fornece métodos para detetar tal situação e, em seguida, analisar os dados coletados para identificar e mitigar a fonte do aumento do uso.

Enviar alerta quando a coleta de dados for alta

Para evitar faturas inesperadas, deve ser notificado proativamente sempre que tiver uma utilização excessiva. A notificação permite-lhe resolver quaisquer anomalias potenciais antes do final do seu período de faturação.

O exemplo a seguir é uma regra de alerta de pesquisa de log que envia um alerta se o volume de dados faturáveis ingerido nas últimas 24 horas for maior que 50 GB. Modifique a configuração Lógica de alerta para usar um limite diferente com base no uso esperado em seu ambiente. Você também pode aumentar a frequência para verificar o uso várias vezes todos os dias, mas essa opção resultará em uma cobrança mais alta para a regra de alerta.

Definição Value
Scope
Âmbito de aplicação Selecione seu espaço de trabalho do Log Analytics.
Condition
Query Usage | where IsBillable | summarize DataGB = sum(Quantity / 1000)
Medida Medida: DataGB
Tipo de agregação: Total
Granularidade de agregação: 1 dia
Lógica de alerta Operador: Maior que
Valor limite: 50
Frequência da avaliação: 1 dia
Ações Selecione ou adicione um grupo de ações para notificá-lo quando o limite for excedido.
Detalhes
Gravidade Aviso
Nome da regra de alerta Volume de dados faturável superior a 50 GB em 24 horas.

Análise de uso no Azure Monitor

Inicie sua análise com as ferramentas existentes no Azure Monitor. Essas ferramentas não exigem configuração e, muitas vezes, podem fornecer as informações de que você precisa com o mínimo de esforço. Se você precisar de uma análise mais profunda dos dados coletados do que os recursos existentes do Azure Monitor, use qualquer uma das seguintes consultas de log no Log Analytics.

Informações da Área de Trabalho do Log Analytics

O Log Analytics Workspace Insights fornece uma compreensão rápida dos dados em seu espaço de trabalho. Por exemplo, você pode determinar:

  • Tabelas de dados que estão ingerindo o maior volume de dados na tabela principal.
  • Principais recursos que contribuem com dados.
  • Tendência de ingestão de dados.

Consulte a guia Uso para obter um detalhamento da ingestão por solução e tabela. Essas informações podem ajudá-lo a identificar rapidamente as tabelas que contribuem para a maior parte do volume de dados. A guia também mostra a tendência da coleta de dados ao longo do tempo. Você pode determinar se a coleta de dados aumentou constantemente ao longo do tempo ou aumentou repentinamente em resposta a uma alteração de configuração.

Selecione Consultas adicionais para consultas pré-criadas que ajudam a entender melhor seus padrões de dados.

Utilização e custos estimados

O gráfico Ingestão de dados por solução na página Uso e custos estimados para cada espaço de trabalho mostra o volume total de dados enviados e quanto está sendo enviado por cada solução nos 31 dias anteriores. Essas informações ajudam a determinar tendências, como se algum aumento é decorrente do uso geral de dados ou do uso por uma solução específica.

Consultando volumes de dados da tabela Uso

Analise a quantidade de dados faturáveis coletados por um determinado serviço ou solução. Essas consultas usam a tabela Uso que coleta dados de uso para cada tabela no espaço de trabalho.

Nota

A cláusula com TimeGenerated é apenas para garantir que a experiência de consulta no portal do Azure olhe para trás além das 24 horas padrão. Quando você usa o tipo StartTime de dados Uso e EndTime representa os intervalos de tempo para os quais os resultados são apresentados.

Volume de dados faturáveis por tipo no ú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 bin(StartTime, 1d), DataType 
| render columnchart

Volume de dados faturáveis por solução e tipo no ú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

Consultando o volume de dados dos eventos diretamente

Você pode usar consultas de log no Log Analytics se precisar de uma análise mais profunda dos dados coletados. Cada tabela em um espaço de trabalho do Log Analytics tem as seguintes colunas padrão que podem ajudá-lo a analisar dados faturáveis:

  • _IsBillable identifica registros para os quais há uma taxa de ingestão. Use esta coluna para filtrar dados não faturáveis.
  • _BilledSize fornece o tamanho em bytes do registro.

Volume de dados faturável para eventos específicos

Se você achar que um determinado tipo de dados está coletando dados excessivos, convém analisar os dados nessa tabela para determinar registros específicos que estão aumentando. Este exemplo filtra IDs de evento específicas na Event tabela e, em seguida, fornece uma contagem para cada ID. Você pode modificar essa consulta usando as colunas de outras tabelas.

Event
| where TimeGenerated > startofday(ago(31d)) and TimeGenerated < startofday(now()) 
| where EventID == 5145 or EventID == 5156
| where _IsBillable == true
| summarize count(), Bytes=sum(_BilledSize) by EventID, bin(TimeGenerated, 1d)

Volume de dados por recurso do Azure, grupo de recursos ou assinatura

Você pode analisar a quantidade de dados faturáveis coletados de um determinado recurso ou conjunto de recursos. Essas consultas usam as colunas _ResourceId e _SubscriptionId para dados de recursos hospedados no Azure.

Aviso

Use consultas de localização com moderação porque as verificações entre tipos de dados consomem muitos recursos para serem executadas. Se você não precisar de resultados por assinatura, grupo de recursos ou nome de recurso, use a tabela Uso como nas consultas anteriores.

Volume de dados faturáveis por ID de recurso para o último dia completo

find where TimeGenerated between(startofday(ago(1d))..startofday(now())) project _ResourceId, _BilledSize, _IsBillable
| where _IsBillable == true 
| summarize BillableDataBytes = sum(_BilledSize) by _ResourceId 
| sort by BillableDataBytes nulls last

Volume de dados faturáveis por grupo de recursos para o último dia completo

find where TimeGenerated between(startofday(ago(1d))..startofday(now())) project _ResourceId, _BilledSize, _IsBillable
| where _IsBillable == true 
| summarize BillableDataBytes = sum(_BilledSize) by _ResourceId
| extend resourceGroup = tostring(split(_ResourceId, "/")[4] )
| summarize BillableDataBytes = sum(BillableDataBytes) by resourceGroup 
| sort by BillableDataBytes nulls last

Pode ser útil analisar _ResourceId:

| parse tolower(_ResourceId) with "/subscriptions/" subscriptionId "/resourcegroups/" 
    resourceGroup "/providers/" provider "/" resourceType "/" resourceName   

Volume de dados faturáveis por assinatura para o último dia completo

find where TimeGenerated between(startofday(ago(1d))..startofday(now())) project _BilledSize, _IsBillable, _SubscriptionId
| where _IsBillable == true 
| summarize BillableDataBytes = sum(_BilledSize) by _SubscriptionId 
| sort by BillableDataBytes nulls last

Gorjeta

Para espaços de trabalho com grandes volumes de dados, fazer consultas como as mostradas nesta seção, que consultam grandes volumes de dados brutos, pode precisar ser restrito a um único dia. Para acompanhar as tendências ao longo do tempo, considere configurar um relatório do Power BI e usar a atualização incremental para coletar volumes de dados por recurso uma vez por dia.

Volume de dados por computador

Você pode analisar a quantidade de dados faturáveis coletados de uma máquina virtual ou de um conjunto de máquinas virtuais. A tabela Uso não tem a granularidade necessária para mostrar volumes de dados para máquinas virtuais específicas, portanto, essas consultas usam o operador find para pesquisar todas as tabelas que incluem um nome de computador. O tipo Uso é omitido porque essa consulta é apenas para análise de tendências de dados.

Aviso

Use consultas de localização com moderação porque as verificações entre tipos de dados consomem muitos recursos para serem executadas. Se você não precisar de resultados por assinatura, grupo de recursos ou nome de recurso, use a tabela Uso como nas consultas anteriores.

Volume de dados faturáveis por computador para o último dia completo

find where TimeGenerated between(startofday(ago(1d))..startofday(now())) project _BilledSize, _IsBillable, Computer, Type
| where _IsBillable == true and Type != "Usage"
| extend computerName = tolower(tostring(split(Computer, '.')[0]))
| summarize BillableDataBytes = sum(_BilledSize) by  computerName 
| sort by BillableDataBytes desc nulls last

Contagem de eventos faturáveis por computador para o último dia completo

find where TimeGenerated between(startofday(ago(1d))..startofday(now())) project _IsBillable, Computer, Type
| where _IsBillable == true and Type != "Usage"
| extend computerName = tolower(tostring(split(Computer, '.')[0]))
| summarize eventCount = count() by computerName  
| sort by eventCount desc nulls last

Consultando volumes de dados excluindo tipos de dados livres conhecidos

A consulta a seguir retornará o volume de dados mensal em GB, excluindo todos os tipos de dados que devem ser isentos de taxas de ingestão de dados:

let freeTables = dynamic([
"AppAvailabilityResults","AppSystemEvents","ApplicationInsights","AzureActivity","AzureNetworkAnalyticsIPDetails_CL",
"AzureNetworkAnalytics_CL","AzureTrafficAnalyticsInsights_CL","ComputerGroup","DefenderIoTRawEvent","Heartbeat",
"MAApplication","MAApplicationHealth","MAApplicationHealthIssues","MAApplicationInstance","MAApplicationInstanceReadiness",
"MAApplicationReadiness","MADeploymentPlan","MADevice","MADeviceNotEnrolled","MADeviceReadiness","MADriverInstanceReadiness",
"MADriverReadiness","MAProposedPilotDevices","MAWindowsBuildInfo","MAWindowsCurrencyAssessment",
"MAWindowsCurrencyAssessmentDailyCounts","MAWindowsDeploymentStatus","NTAIPDetails_CL","NTANetAnalytics_CL",
"OfficeActivity","Operation","SecurityAlert","SecurityIncident","UCClient","UCClientReadinessStatus",
"UCClientUpdateStatus","UCDOAggregatedStatus","UCDOStatus","UCDeviceAlert","UCServiceUpdateStatus","UCUpdateAlert",
"Usage","WUDOAggregatedStatus","WUDOStatus","WaaSDeploymentStatus","WaaSInsiderStatus","WaaSUpdateStatus"]);
Usage 
| where DataType !in (freeTables) 
| where TimeGenerated > ago(30d) 
| summarize MonthlyGB=sum(Quantity)/1000

Para procurar dados que podem não ter IsBillable definido corretamente (e que podem resultar em faturamento incorreto ou, mais especificamente, subfaturamento), use esta consulta em seu espaço de trabalho:

let freeTables = dynamic([
"AppAvailabilityResults","AppSystemEvents","ApplicationInsights","AzureActivity","AzureNetworkAnalyticsIPDetails_CL",
"AzureNetworkAnalytics_CL","AzureTrafficAnalyticsInsights_CL","ComputerGroup","DefenderIoTRawEvent","Heartbeat",
"MAApplication","MAApplicationHealth","MAApplicationHealthIssues","MAApplicationInstance","MAApplicationInstanceReadiness",
"MAApplicationReadiness","MADeploymentPlan","MADevice","MADeviceNotEnrolled","MADeviceReadiness","MADriverInstanceReadiness",
"MADriverReadiness","MAProposedPilotDevices","MAWindowsBuildInfo","MAWindowsCurrencyAssessment",
"MAWindowsCurrencyAssessmentDailyCounts","MAWindowsDeploymentStatus","NTAIPDetails_CL","NTANetAnalytics_CL",
"OfficeActivity","Operation","SecurityAlert","SecurityIncident","UCClient","UCClientReadinessStatus",
"UCClientUpdateStatus","UCDOAggregatedStatus","UCDOStatus","UCDeviceAlert","UCServiceUpdateStatus","UCUpdateAlert",
"Usage","WUDOAggregatedStatus","WUDOStatus","WaaSDeploymentStatus","WaaSInsiderStatus","WaaSUpdateStatus"]);
Usage 
| where DataType !in (freeTables) 
| where TimeGenerated > ago(30d) 
| where IsBillable == false 
| summarize MonthlyPotentialUnderbilledGB=sum(Quantity)/1000 by DataType

Consultando tipos de dados comuns

Se você achar que tem dados faturáveis excessivos para um tipo de dados específico, talvez seja necessário executar uma consulta para analisar os dados nessa tabela. As consultas a seguir fornecem exemplos para alguns tipos de dados comuns:

Solução de Segurança

SecurityEvent 
| summarize AggregatedValue = count() by EventID
| order by AggregatedValue desc nulls last

Solução de Gestão de Registos

Usage 
| where Solution == "LogManagement" and iff(isnotnull(toint(IsBillable)), IsBillable == true, IsBillable == "true") == true 
| summarize AggregatedValue = count() by DataType
| order by AggregatedValue desc nulls last

Tipo de dados de Desempenho

Perf 
| summarize AggregatedValue = count() by CounterPath
Perf 
| summarize AggregatedValue = count() by CounterName

Tipo de dados de Evento

Event 
| summarize AggregatedValue = count() by EventID
Event 
| summarize AggregatedValue = count() by EventLog, EventLevelName

Tipo de dados de Syslog

Syslog 
| summarize AggregatedValue = count() by Facility, SeverityLevel
Syslog 
| summarize AggregatedValue = count() by ProcessName

Tipo de dados de AzureDiagnostics

AzureDiagnostics 
| summarize AggregatedValue = count() by ResourceProvider, ResourceId

Dados do Application Insights

Há duas abordagens para investigar a quantidade de dados coletados para o Application Insights, dependendo se você tem um aplicativo clássico ou baseado em espaço de trabalho. Use a _BilledSize propriedade disponível em cada evento ingerido para recursos clássicos e baseados em espaço de trabalho. Você também pode usar informações agregadas na tabela systemEvents para recursos clássicos.

Nota

As consultas em tabelas do Application Insights, exceto SystemEvents, funcionarão para um recurso baseado em espaço de trabalho e clássico do Application Insights. A compatibilidade com versões anteriores permite que você continue a usar nomes de tabelas herdadas. Para um recurso baseado em espaço de trabalho, abra Logs no menu do espaço de trabalho do Log Analytics. Para obter um recurso clássico, abra Logs no menu Application Insights .

As operações de dependência geram o maior volume de dados nos últimos 30 dias (baseado em espaço de trabalho ou clássico)

dependencies
| where timestamp >= startofday(ago(30d))
| summarize sum(_BilledSize) by operation_Name
| render barchart  

Volume de dados diário por tipo para este recurso do Application Insights nos últimos 7 dias (somente clássico)

systemEvents
| where timestamp >= startofday(ago(7d)) and timestamp < startofday(now())
| where type == "Billing"
| extend BillingTelemetryType = tostring(dimensions["BillingTelemetryType"])
| extend BillingTelemetrySizeInBytes = todouble(measurements["BillingTelemetrySize"])
| summarize sum(BillingTelemetrySizeInBytes) by BillingTelemetryType, bin(timestamp, 1d)  

Para examinar as tendências de volume de dados para recursos do Application Insights baseados em espaço de trabalho, use uma consulta que inclua todas as tabelas do Application Insights. As consultas a seguir usam os nomes de tabela específicos para recursos baseados em espaço de trabalho.

Volume de dados diário por tipo para todos os recursos do Application Insights em um espaço de trabalho por 7 dias

union AppAvailabilityResults,
      AppBrowserTimings,
      AppDependencies,
      AppExceptions,
      AppEvents,
      AppMetrics,
      AppPageViews,
      AppPerformanceCounters,
      AppRequests,
      AppSystemEvents,
      AppTraces
| where TimeGenerated >= startofday(ago(7d)) and TimeGenerated < startofday(now())
| summarize sum(_BilledSize) by _ResourceId, bin(TimeGenerated, 1d)

Para examinar as tendências de volume de dados para apenas um único recurso do Application Insights, adicione a seguinte linha antes summarize na consulta anterior:

| where _ResourceId contains "<myAppInsightsResourceName>"

Gorjeta

Para espaços de trabalho com grandes volumes de dados, fazer consultas como a anterior, que consulta grandes volumes de dados brutos, pode precisar ser restrito a um único dia. Para acompanhar as tendências ao longo do tempo, considere configurar um relatório do Power BI e usar a atualização incremental para coletar volumes de dados por recurso uma vez por dia.

Compreender os nós que enviam dados

Se você não tiver dados excessivos de nenhuma fonte específica, poderá ter um número excessivo de agentes que estão enviando dados.

Contagem de nós de agente que estão enviando uma pulsação a cada dia no último mês

Heartbeat 
| where TimeGenerated > startofday(ago(31d))
| summarize nodes = dcount(Computer) by bin(TimeGenerated, 1d)    
| render timechart

Aviso

Use consultas de localização com moderação porque as verificações entre tipos de dados consomem muitos recursos para serem executadas. Se você não precisar de resultados por assinatura, grupo de recursos ou nome de recurso, use a tabela Uso como nas consultas anteriores.

Contagem de nós que enviam quaisquer dados nas últimas 24 horas

find where TimeGenerated > ago(24h) project Computer
| extend computerName = tolower(tostring(split(Computer, '.')[0]))
| where computerName != ""
| summarize nodes = dcount(computerName)

Volume de dados enviado por cada nó nas últimas 24 horas

find where TimeGenerated > ago(24h) project _BilledSize, Computer
| extend computerName = tolower(tostring(split(Computer, '.')[0]))
| where computerName != ""
| summarize TotalVolumeBytes=sum(_BilledSize) by computerName

Nós cobrados pelo nível de preço herdado Por Nó

O nível de preço herdado Por Nó cobra por nós com granularidade horária. Ele também não conta nós que estão enviando apenas um conjunto de tipos de dados de segurança. Para obter uma lista de computadores que serão cobrados como nós se o espaço de trabalho estiver na camada de preço herdada Por Nó, procure nós que estão enviando tipos de dados faturados porque alguns tipos de dados são gratuitos. Nesse caso, use o campo mais à esquerda do nome de domínio totalmente qualificado.

As consultas a seguir retornam a contagem de computadores com dados faturados por hora. O número de unidades na sua fatura está em unidades de meses de nó, que é representado por billableNodeMonthsPerDay na consulta. Se o espaço de trabalho tiver a solução Update Management instalada, adicione os tipos de dados Update e UpdateSummary à lista na where cláusula.

find where TimeGenerated >= startofday(ago(7d)) and TimeGenerated < startofday(now()) project Computer, _IsBillable, Type, TimeGenerated
| where Type !in ("SecurityAlert", "SecurityBaseline", "SecurityBaselineSummary", "SecurityDetection", "SecurityEvent", "WindowsFirewall", "MaliciousIPCommunication", "LinuxAuditLog", "SysmonEvent", "ProtectionStatus", "WindowsEvent")
| extend computerName = tolower(tostring(split(Computer, '.')[0]))
| where computerName != ""
| where _IsBillable == true
| summarize billableNodesPerHour=dcount(computerName) by bin(TimeGenerated, 1h)
| summarize billableNodesPerDay = sum(billableNodesPerHour)/24., billableNodeMonthsPerDay = sum(billableNodesPerHour)/24./31.  by day=bin(TimeGenerated, 1d)
| sort by day asc

Nota

Alguma complexidade no algoritmo de faturamento real quando a segmentação de solução é usada não é representada na consulta anterior.

Contagens de nós de segurança e automação

Contagem de nós de segurança distintos

union
(
    Heartbeat
    | where (Solutions has 'security' or Solutions has 'antimalware' or Solutions has 'securitycenter')
    | project Computer
),
(
    ProtectionStatus
    | where Computer !in (Heartbeat | project Computer)
    | project Computer
)
| distinct Computer
| project lowComputer = tolower(Computer)
| distinct lowComputer
| count

Número de nós de automação distintos

 ConfigurationData 
 | where (ConfigDataType == "WindowsServices" or ConfigDataType == "Software" or ConfigDataType =="Daemons") 
 | extend lowComputer = tolower(Computer) | summarize by lowComputer 
 | join (
     Heartbeat 
       | where SCAgentChannel == "Direct"
       | extend lowComputer = tolower(Computer) | summarize by lowComputer, ComputerEnvironment
 ) on lowComputer
 | summarize count() by ComputerEnvironment | sort by ComputerEnvironment asc

Dados que chegam atrasados

Se você observar alta ingestão de dados relatada usando Usage registros, mas não observar os mesmos resultados somando _BilledSize diretamente no tipo de dados, é possível que você tenha dados que chegam tarde. Essa situação ocorre quando os dados são ingeridos com carimbos de data/hora antigos.

Por exemplo, um agente pode ter um problema de conectividade e enviar dados acumulados quando se reconecta. Ou um anfitrião pode ter uma hora incorreta. Qualquer exemplo pode resultar em uma discrepância aparente entre os dados ingeridos relatados pelo tipo de dados Usage e uma consulta somando _BilledSize sobre os dados brutos de um dia específico especificado por TimeGenerated, o carimbo de data/hora quando o evento foi gerado.

Para diagnosticar problemas de dados que chegam tardiamente, use a coluna _TimeReceived e a coluna TimeGerated . A _TimeReceived propriedade é a hora em que o registro foi recebido pelo ponto de ingestão do Azure Monitor na nuvem do Azure.

O exemplo a seguir é em resposta a altos volumes de dados ingeridos de dados do W3CIISLog em 2 de maio de 2021, para identificar os carimbos de data/hora nesses dados ingeridos. A where TimeGenerated > datetime(1970-01-01) instrução é incluída para fornecer a pista para a interface do usuário do Log Analytics examinar todos os dados.

W3CIISLog
| where TimeGenerated > datetime(1970-01-01)
| where _TimeReceived >= datetime(2021-05-02) and _TimeReceived < datetime(2021-05-03) 
| where _IsBillable == true
| summarize BillableDataMB = sum(_BilledSize)/1.E6 by bin(TimeGenerated, 1d)
| sort by TimeGenerated asc 

Próximos passos

  • Consulte Detalhes de preços dos Logs do Azure Monitor para obter informações sobre como as cobranças são calculadas para dados em um espaço de trabalho do Log Analytics e diferentes opções de configuração para reduzir suas cobranças.
  • Consulte Custo e uso do Azure Monitor para obter uma descrição dos diferentes tipos de cobranças do Azure Monitor e como analisá-los em sua fatura do Azure.
  • Consulte Práticas recomendadas do Azure Monitor - Gerenciamento de custos para obter as práticas recomendadas sobre como configurar e gerenciar o Azure Monitor para minimizar suas cobranças.
  • Consulte Transformações de coleta de dados no Azure Monitor (visualização) para obter informações sobre como usar transformações para reduzir a quantidade de dados coletados em um espaço de trabalho do Log Analytics filtrando registros e colunas indesejados.