Analysera användning på en Log Analytics-arbetsyta

Azure Monitor-kostnaderna kan variera avsevärt beroende på mängden data som samlas in på Din Log Analytics-arbetsyta. Den här volymen påverkas av den uppsättning lösningar som använder arbetsytan och mängden data som varje lösning samlar in. Den här artikeln innehåller vägledning om hur du analyserar dina insamlade data för att styra dina datainmatningskostnader. Det hjälper dig att fastställa orsaken till högre användning än förväntat. Det hjälper dig också att förutsäga dina kostnader när du övervakar fler resurser och konfigurerar olika Azure Monitor-funktioner.

Dricks

Strategier för att minska dina Azure Monitor-kostnader finns i Kostnadsoptimering och Azure Monitor.

Orsaker till högre användning än förväntat

Varje Log Analytics-arbetsyta debiteras som en separat tjänst och bidrar till fakturan för din Azure-prenumeration. Mängden datainmatning kan vara betydande, beroende på följande:

  • Uppsättning insikter och tjänster aktiverade och deras konfiguration.
  • Antal och typ av övervakade resurser.
  • Mängden data som samlas in från varje övervakad resurs.

En oväntad ökning av någon av dessa faktorer kan leda till ökade avgifter för datakvarhållning. Resten av den här artikeln innehåller metoder för att identifiera en sådan situation och sedan analysera insamlade data för att identifiera och minimera källan till den ökade användningen.

Skicka avisering när datainsamlingen är hög

För att undvika oväntade fakturor bör du meddelas proaktivt när du upplever överdriven användning. Med meddelandet kan du åtgärda eventuella avvikelser före faktureringsperiodens slut.

Följande exempel är en varningsregel för loggsökning som skickar en avisering om den fakturerbara datavolymen som matats in under de senaste 24 timmarna var större än 50 GB. Ändra inställningen Aviseringslogik för att använda ett annat tröskelvärde baserat på förväntad användning i din miljö. Du kan också öka frekvensen för att kontrollera användningen flera gånger varje dag, men det här alternativet resulterar i en högre avgift för aviseringsregeln.

Inställning Värde
Definitionsområde
Målomfång Välj din Log Analytics-arbetsyta.
Condition
Fråga Usage | where IsBillable | summarize DataGB = sum(Quantity / 1000)
Mått Mått: DataGB
Sammansättningstyp: Totalt
Sammansättningskornighet: 1 dag
Aviseringslogik Operator: Större än
Tröskelvärde: 50
Utvärderingsfrekvens: 1 dag
Åtgärder Välj eller lägg till en åtgärdsgrupp för att meddela dig när tröskelvärdet överskrids.
Detaljer
Allvarlighet Varning
Namn på aviseringsregel Fakturerbar datavolym som är större än 50 GB på 24 timmar.

Användningsanalys i Azure Monitor

Starta analysen med befintliga verktyg i Azure Monitor. Dessa verktyg kräver ingen konfiguration och kan ofta ge den information du behöver med minimal ansträngning. Om du behöver djupare analys av dina insamlade data än befintliga Azure Monitor-funktioner använder du någon av följande loggfrågor i Log Analytics.

Insikter om Log Analytics-arbetsyta

Log Analytics Workspace Insights ger dig en snabb förståelse av data på din arbetsyta. Du kan till exempel fastställa följande:

  • Datatabeller som matar in mest datavolym i huvudtabellen.
  • De viktigaste resurserna som bidrar med data.
  • Trend för datainmatning.

Se fliken Användning för en uppdelning av inmatning efter lösning och tabell. Den här informationen kan hjälpa dig att snabbt identifiera de tabeller som bidrar till huvuddelen av din datavolym. Fliken visar också trender för datainsamling över tid. Du kan avgöra om datainsamlingen ökar stadigt med tiden eller plötsligt ökar som svar på en konfigurationsändring.

Välj Ytterligare frågor för fördefinierade frågor som hjälper dig att ytterligare förstå dina datamönster.

Användning och uppskattade kostnader

Diagrammet Datainmatning per lösningsidan Användning och uppskattade kostnader för varje arbetsyta visar den totala mängden data som skickats och hur mycket som skickas av varje lösning under de senaste 31 dagarna. Den här informationen hjälper dig att fastställa trender, till exempel om en ökning beror på den totala dataanvändningen eller användningen av en viss lösning.

Köra frågor mot datavolymer från tabellen Användning

Analysera mängden fakturerbara data som samlas in av en viss tjänst eller lösning. Dessa frågor använder tabellen Användning som samlar in användningsdata för varje tabell på arbetsytan.

Kommentar

-satsen med TimeGenerated är bara för att säkerställa att frågeupplevelsen i Azure-portalen ser tillbaka efter standardtiden på 24 timmar. När du använder datatypen StartTime Användning och EndTime representerar de tidsintervall som resultaten presenteras för.

Fakturerbar datavolym efter typ under den senaste månaden

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

Fakturerbar datavolym efter lösning och typ under den senaste månaden

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

Köra frågor mot datavolym från händelserna direkt

Du kan använda loggfrågor i Log Analytics om du behöver djupare analys av dina insamlade data. Varje tabell på en Log Analytics-arbetsyta har följande standardkolumner som kan hjälpa dig att analysera fakturerbara data:

  • _IsBillable identifierar poster som det finns en inmatningsavgift för. Använd den här kolumnen för att filtrera bort icke-fakturerbara data.
  • _BilledSize ger postens storlek i byte.

Fakturerbar datavolym för specifika händelser

Om du upptäcker att en viss datatyp samlar in överdrivna data kanske du vill analysera data i tabellen för att fastställa specifika poster som ökar. Det här exemplet filtrerar specifika händelse-ID:t i Event tabellen och ger sedan ett antal för varje ID. Du kan ändra den här frågan med hjälp av kolumnerna från andra tabeller.

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)

Datavolym efter Azure-resurs, resursgrupp eller prenumeration

Du kan analysera mängden fakturerbara data som samlas in från en viss resurs eller uppsättning resurser. Dessa frågor använder kolumnerna _ResourceId och _SubscriptionId för data från resurser som finns i Azure.

Varning

Använd sökfrågor sparsamt eftersom genomsökningar mellan datatyper är resursintensiva att köra. Om du inte behöver resultat per prenumeration, resursgrupp eller resursnamn använder du tabellen Användning som i föregående frågor.

Fakturerbar datavolym efter resurs-ID för den senaste hela dagen

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

Fakturerbar datavolym per resursgrupp för den senaste hela dagen

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

Det kan vara bra att parsa _ResourceId:

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

Fakturerbar datavolym per prenumeration för den senaste hela dagen

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

Dricks

För arbetsytor med stora datavolymer kan frågor som de som visas i det här avsnittet, som kör frågor mot stora volymer rådata, behöva begränsas till en enda dag. Om du vill spåra trender över tid kan du överväga att konfigurera en Power BI-rapport och använda inkrementell uppdatering för att samla in datavolymer per resurs en gång om dagen.

Datavolym per dator

Du kan analysera mängden fakturerbara data som samlas in från en virtuell dator eller en uppsättning virtuella datorer. Tabellen Användning har inte kornigheten för att visa datavolymer för specifika virtuella datorer, så dessa frågor använder sökoperatorn för att söka i alla tabeller som innehåller ett datornamn. Användningstypen utelämnas eftersom den här frågan endast är avsedd för analys av datatrender.

Varning

Använd sökfrågor sparsamt eftersom genomsökningar mellan datatyper är resursintensiva att köra. Om du inte behöver resultat per prenumeration, resursgrupp eller resursnamn använder du tabellen Användning som i föregående frågor.

Fakturerbar datavolym per dator för den senaste hela dagen

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

Antal fakturerbara händelser per dator för den senaste hela dagen

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

Fråga efter datavolymer exklusive kända kostnadsfria datatyper

Följande fråga returnerar den månatliga datavolymen i GB, exklusive alla datatyper som ska vara fria från avgifter för datainmatning:

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

Om du vill söka efter data som kanske inte har IsBillable korrekt inställda (och som kan resultera i felaktig fakturering eller mer specifikt underfakturering) använder du den här frågan på din arbetsyta:

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

Fråga efter vanliga datatyper

Om du upptäcker att du har för stora fakturerbara data för en viss datatyp kan du behöva utföra en fråga för att analysera data i tabellen. Följande frågor innehåller exempel på några vanliga datatyper:

Security-lösningen

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

Log Management-lösningen

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

Perf-datatypen

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

Event-datatypen

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

Syslog-datatypen

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

Datatypen AzureDiagnostics

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

Application Insights-data

Det finns två metoder för att undersöka mängden data som samlas in för Application Insights, beroende på om du har ett klassiskt eller arbetsytebaserat program. Använd egenskapen _BilledSize som är tillgänglig för varje inmatad händelse för både arbetsytebaserade och klassiska resurser. Du kan också använda aggregerad information i tabellen systemEvents för klassiska resurser.

Kommentar

Frågor mot Application Insights-tabeller, förutom SystemEvents, fungerar för både en arbetsytebaserad och klassisk Application Insights-resurs. Med bakåtkompatibilitet kan du fortsätta att använda äldre tabellnamn. För en arbetsytebaserad resurs öppnar du LoggarLog Analytics-arbetsytans meny. Öppna LoggarApplication Insights-menyn för en klassisk resurs.

Beroendeåtgärder genererar mest datavolym under de senaste 30 dagarna (arbetsytebaserad eller klassisk)

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

Daglig datavolym efter typ för den här Application Insights-resursen under de senaste 7 dagarna (endast klassisk)

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)  

Om du vill titta på datavolymtrenderna för arbetsytebaserade Application Insights-resurser använder du en fråga som innehåller alla Application Insights-tabeller. Följande frågor använder tabellnamnen som är specifika för arbetsytebaserade resurser.

Daglig datavolym efter typ för alla Application Insights-resurser på en arbetsyta i 7 dagar

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)

Om du bara vill titta på datavolymtrenderna för en enda Application Insights-resurs lägger du till följande rad tidigare summarize i föregående fråga:

| where _ResourceId contains "<myAppInsightsResourceName>"

Dricks

För arbetsytor med stora datavolymer kan frågor som den föregående, som kör frågor mot stora volymer rådata, behöva begränsas till en enda dag. Om du vill spåra trender över tid kan du överväga att konfigurera en Power BI-rapport och använda inkrementell uppdatering för att samla in datavolymer per resurs en gång om dagen.

Förstå noder som skickar data

Om du inte har överdrivna data från någon viss källa kan du ha ett överdrivet antal agenter som skickar data.

Antal agentnoder som skickar ett pulsslag varje dag under den senaste månaden

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

Varning

Använd sökfrågor sparsamt eftersom genomsökningar mellan datatyper är resursintensiva att köra. Om du inte behöver resultat per prenumeration, resursgrupp eller resursnamn använder du tabellen Användning som i föregående frågor.

Antal noder som skickar data under de senaste 24 timmarna

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

Datavolym som skickats av varje nod under de senaste 24 timmarna

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

Noder som faktureras av den äldre prisnivån per nod

Den äldre prisnivån per nod faktureras för noder med kornighet per timme. Den räknar inte heller noder som bara skickar en uppsättning säkerhetsdatatyper. Om du vill hämta en lista över datorer som debiteras som noder om arbetsytan finns på den äldre prisnivån Per nod letar du efter noder som skickar fakturerade datatyper eftersom vissa datatyper är kostnadsfria. I det här fallet använder du fältet längst till vänster i det fullständigt kvalificerade domännamnet.

Följande frågor returnerar antalet datorer med fakturerade data per timme. Antalet enheter på din faktura finns i enheter med nodmånader, vilket representeras av billableNodeMonthsPerDay i frågan. Om arbetsytan har lösningen Uppdateringshantering installerad lägger du till datatyperna Update och UpdateSummary i listan i where -satsen.

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

Kommentar

Viss komplexitet i den faktiska faktureringsalgoritmen när lösningsmål används representeras inte i föregående fråga.

Antal säkerhets- och automatiseringsnoder

Antal distinkta säkerhetsnoder

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

Antal distinkta automationsnoder

 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

Data som inkommer sent

Om du ser hög datainmatning som rapporterats med hjälp Usage av poster, men du inte ser samma resultat som summeras _BilledSize direkt på datatypen, är det möjligt att du har för sent ankommande data. Den här situationen uppstår när data matas in med gamla tidsstämplar.

En agent kan till exempel ha ett anslutningsproblem och skicka ackumulerade data när den återansluter. Eller så kan en värd ha en felaktig tid. Båda exemplen kan resultera i en uppenbar avvikelse mellan inmatade data som rapporterats av datatypen Användning och en fråga som summerar _BilledSize över rådata för en viss dag som anges av TimeGenerated, tidsstämpeln när händelsen genererades.

Om du vill diagnostisera problem med sena data använder du kolumnen _TimeReceived och kolumnen TimeGenerated . Egenskapen _TimeReceived är den tid då posten togs emot av Azure Monitor-inmatningspunkten i Azure-molnet.

Följande exempel är ett svar på stora inmatade datavolymer med W3CIISLog-data den 2 maj 2021 för att identifiera tidsstämplarna för dessa inmatade data. Instruktionen where TimeGenerated > datetime(1970-01-01) ingår för att ge ledtråden till Log Analytics-användargränssnittet för att titta över alla data.

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 

Nästa steg