Analysieren der Nutzung im Log Analytics-Arbeitsbereich

Azure Monitor-Kosten können sich erheblich auf Grundlage des Datenvolumens unterscheiden, das in Ihrem Log Analytics-Arbeitsbereich gesammelt wird. Dieses Volumen hängt von der Gruppe von Lösungen ab, die den Arbeitsbereich verwenden, sowie von der von jeder Lösung gesammelten Menge an Daten. In diesem Artikel finden Sie Anleitungen zur Analyse Ihrer gesammelten Daten, um Ihnen bei der Steuerung Ihrer Datenerfassungskosten zu helfen. Es hilft Ihnen zu ermitteln, warum die Nutzung höher ist als erwartet. Außerdem hilft es Ihnen, Ihre Kosten vorherzusagen, wenn Sie zusätzliche Ressourcen überwachen und andere Azure Monitor-Features konfigurieren.

Tipp

Strategien zum Reduzieren Ihrer Azure Monitor-Kosten finden Sie unter Kostenoptimierung und Azure Monitor.

Ursachen einer höher als erwartet ausgefallenen Nutzung

Jeder Log Analytics-Arbeitsbereich wird als separater Dienst abgerechnet und auf der Rechnung für Ihr Azure-Abonnement aufgeführt. Die bei der Erfassung anfallende Datenmenge kann erheblich sein und hängt von Folgendem ab:

  • Aktivierten Erkenntnissen und Diensten sowie deren Konfiguration.
    • Anzahl und Typ der überwachten Ressourcen.
    • Volumen der von jeder überwachten Ressource gesammelten Daten.

Ein unerwarteter Anstieg eines dieser Faktoren kann zu erhöhten Gebühren für die Aufbewahrung von Daten führen. Der Rest dieses Artikels bietet Methoden zum Erkennen einer solchen Situation und für die anschließende Analyse der gesammelten Daten, um die Quelle der gestiegenen Nutzung zu identifizieren und zu verringern.

Senden einer Warnung, wenn die Datensammlung hoch ist

Um unerwartete Rechnungen zu vermeiden, sollten Sie sich bei übermäßiger Nutzung proaktiv benachrichtigen lassen. Durch die Benachrichtigung können Sie potenzielle Anomalien vor dem Ende Ihres Abrechnungszeitraums beheben.

Im folgenden Beispiel sehen Sie eine Warnungsregel für die Protokollsuche, die eine Warnung sendet, wenn das in den letzten 24 Stunden erfasste abrechenbare Datenvolumen größer als 50 GB war. Ändern Sie die Einstellung Warnungslogik, um einen anderen Schwellenwert auf Grundlage der erwarteten Nutzung in Ihrer Umgebung zu verwenden. Sie können auch die Häufigkeit erhöhen, um die Nutzung täglich mehrmals zu überprüfen, doch diese Option führt zu einer höheren Gebühr für die Warnungsregel.

Einstellung Wert
Bereich
Zielbereich Wählen Sie Ihren Log Analytics-Arbeitsbereich aus.
Condition
Abfrage Usage | where IsBillable | summarize DataGB = sum(Quantity / 1000)
Messung Measure: DataGB
Aggregationstyp: Summe
Aggregationsgranularität:1 Tag
Warnungslogik Operator: Größer als
Schwellenwert: 50
Häufigkeit der Auswertung: 1 Tag
Aktionen Wählen Sie eine Aktionsgruppe aus, um Sie zu benachrichtigen, wenn der Schwellenwert überschritten wird, oder fügen Sie eine hinzu.
Details
severity Warnung
Name der Warnungsregel Abrechenbares Datenvolumen größer als 50 GB in 24 Stunden

Nutzungsanalyse in Azure Monitor

Beginnen Sie Ihre Analyse mit vorhandenen Tools in Azure Monitor. Diese Tools müssen nicht konfiguriert werden und können häufig die erforderlichen Informationen mit minimalem Aufwand bereitstellen. Wenn Sie eine tiefergehende Analyse Ihrer gesammelten Daten benötigen, als sie mit den vorhandene Azure Monitor-Features möglich ist, verwenden Sie eine der folgenden Protokollabfragen in Log Analytics.

Log Analytics-Arbeitsbereich Insights

Log Analytics-Arbeitsbereich Insights bietet Ihnen ein schnelles Verständnis der Daten in Ihrem Arbeitsbereich. Sie können z. B. Folgendes bestimmen:

  • Datentabellen, die das größte Datenvolumen in der Haupttabelle erfassen.
  • Top-Ressourcen, die Daten beitragen.
  • Trend der Datenerfassung.

Eine Aufschlüsselung der Erfassung nach Lösung und Tabelle finden Sie auf der Registerkarte Verwendung. Mit diesen Informationen können Sie schnell die Tabellen identifizieren, die zum Großteil Ihres Datenvolumens beitragen. Auf der Registerkarte wird zudem der Trend der Datensammlung im Laufe der Zeit angezeigt. Sie können ermitteln, ob die Datensammlung im Laufe der Zeit stetig erhöht wird, oder ob sie als Reaktion auf eine geänderte Konfiguration plötzlich erhöht wird.

Wählen Sie Zusätzliche Abfragen für vordefinierte Abfragen aus, die Ihnen beim weiteren Verständnis Ihrer Datenmuster helfen.

Nutzung und geschätzte Kosten

Auf der Seite Nutzung und geschätzte Kosten zeigt das Diagramm Datenerfassung pro Lösung für jeden Arbeitsbereich die Gesamtmenge an gesendeten Daten sowie die von jeder Lösung während der letzten 31 Tage gesendete Datenmenge an. Mit diesen Informationen können Sie Trends ermitteln, z. B. ob ein Anstieg von der gesamten Datennutzung oder der Nutzung durch eine bestimmte Lösung verursacht wird.

Abfragen von Datenvolumes aus der Tabelle „Verbrauch“

Analysieren der Menge an abrechenbaren Daten, die von einem bestimmten Dienst oder einer bestimmten Lösung gesammelt werden. Diese Abfragen verwenden die Tabelle Verwendung, die Nutzungsdaten für jede Tabelle im Arbeitsbereich sammelt.

Hinweis

Mit der Klausel mit TimeGenerated wird nur sichergestellt, dass die Abfrage im Azure-Portal über den Standardwert von 24 Stunden hinausgeht. Bei Verwendung des Datentyps Nutzung stellen StartTime und EndTime die Zeitrahmen dar, für die Ergebnisse angezeigt werden.

Abrechenbares Datenvolumen nach Typ im letzten Monat

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

Abrechenbares Datenvolumen nach Lösung und Typ im letzten Monat

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

Direktes Abfragen des Datenvolumes aus den Ereignissen

Sie können Protokollabfragen in Log Analytics verwenden, wenn Sie eine tiefere Analyse Ihrer gesammelten Daten benötigen. Jede Tabelle in einem Log Analytics-Arbeitsbereich verfügt über die folgenden Standardspalten, die Sie bei der Analyse von abrechenbaren Daten unterstützen können:

  • _IsBillable identifiziert Datensätze, für die eine Erfassungsgebühr anfällt. Verwenden Sie diese Spalte, um nicht abrechenbare Daten auszufiltern.
  • _BilledSize stellt die Größe des Datensatzes in Bytes bereit.

Abrechenbares Datenvolumen für bestimmte Ereignisse

Wenn Sie feststellen, dass ein bestimmter Datentyp übermäßig viele Daten sammelt, können Sie die Daten in dieser Tabelle analysieren, um bestimmte Datensätze zu ermitteln, die größer werden. In diesem Beispiel werden bestimmte Ereignis-IDs in der Tabelle Event gefiltert; anschließend wird eine Anzahl für jede ID bereitgestellt. Sie können diese Abfrage mithilfe der Spalten aus anderen Tabellen ändern.

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)

Datenmenge nach Azure-Ressource, Ressourcengruppe oder Abonnement

Sie können die Menge an abrechenbaren Daten analysieren, die von einer bestimmten Ressource oder einer bestimmten Ressourcengruppe gesammelt werden. Diese Abfragen verwenden die Spalten _ResourceId und _SubscriptionId für Daten aus Ressourcen, die in Azure gehostet werden.

Warnung

Verwenden Sie find-Abfragen mit Bedacht, da umfassende Überprüfungen verschiedener Datentypen ressourcenintensiv sind. Wenn Sie keine Ergebnisse pro Abonnement, Ressourcengruppe oder Ressourcennamen benötigen, verwenden Sie die Tabelle Verwendung wie in den oben genannten Abfragen.

Abrechenbares Datenvolumen nach Ressourcen-ID für den letzten vollständigen Tag

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

Abrechenbares Datenvolumen nach Ressourcengruppe für den letzten vollständigen Tag

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

Es kann hilfreich sein, die _ResourceId zu analysieren:

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

Abrechenbares Datenvolumen nach Abonnement für den letzten vollständigen Tag

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

Tipp

Bei Arbeitsbereichen mit großen Datenvolumen kann es erforderlich sein, Abfragen wie die in diesem Abschnitt gezeigten, die große Mengen an Rohdaten abfragen, auf einen einzigen Tag zu beschränken. Um Trends im Zeitverlauf nachzuverfolgen, sollten Sie einen Power BI-Bericht einrichten und die inkrementelle Aktualisierung verwenden, um die Datenvolumen nach Ressource einmal pro Tag zu sammeln.

Datenmenge nach Computer

Sie können die Menge der abrechenbaren Daten analysieren, die von einem virtuellen Computer oder einer Gruppe von virtuellen Computern gesammelt werden. Die Tabelle Verwendung verfügt nicht über ausreichend Granularität, um Datenvolumen für bestimmte VMs anzuzeigen. Deshalb verwenden diese Abfragen den Suchoperator (find), um alle Tabellen zu durchsuchen, die einen Computernamen enthalten. Der Typ Nutzung wird weggelassen, da es bei dieser Abfrage nur um die Analyse von Datentrends geht.

Warnung

Verwenden Sie find-Abfragen mit Bedacht, da umfassende Überprüfungen verschiedener Datentypen ressourcenintensiv sind. Wenn Sie keine Ergebnisse pro Abonnement, Ressourcengruppe oder Ressourcennamen benötigen, verwenden Sie die Tabelle Verwendung wie in den oben genannten Abfragen.

Abrechenbares Datenvolumen nach Computer für den letzten vollständigen Tag

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

Anzahl der abrechenbaren Ereignisse nach Computer für den letzten vollständigen Tag

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

Abfragen von häufig verwendeten Datentypen

Wenn Sie feststellen, dass Sie über übermäßige abrechenbare Daten für einen bestimmten Datentyp verfügen, müssen Sie möglicherweise eine Abfrage ausführen, um Daten in dieser Tabelle zu analysieren. Die folgenden Abfragen bieten Beispiele für einige gängige Datentypen:

Sicherheitslösung

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

Protokollverwaltungslösung

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

Datentyp Perf

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

Datentyp Event

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

Datentyp Syslog

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

Datentyp AzureDiagnostics

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

Application Insights-Daten

Es gibt zwei Ansätze zur Untersuchung der für Application Insights gesammelten Datenmenge, je nachdem, ob Sie über eine klassische oder eine arbeitsbereichsbasierte Anwendung verfügen. Verwenden Sie die Eigenschaft _BilledSize, die für jedes Erfassungsereignis sowohl für arbeitsbereichsbasierte als auch für klassische Ressourcen verfügbar ist. Sie können auch aggregierte Informationen in der SystemEvents-Tabelle für klassische Ressourcen verwenden.

Hinweis

Abfragen für Application Insights-Tabellen mit Ausnahme von SystemEvents funktionieren sowohl bei einer arbeitsbereichsbasierten als auch bei einer klassischen Application Insights-Ressource. Mit der Abwärtskompatibilität können Sie weiterhin Legacytabellennamen verwenden. Öffnen Sie für eine arbeitsbereichsbasierte Ressource Protokolle im Menü Log Analytics-Arbeitsbereich. Öffnen Sie für eine klassische Ressource Protokolle im Menü Application Insights.

Abhängigkeitsvorgänge, die das meiste Datenvolumen in den letzten 30 Tagen generiert haben (arbeitsbereichsbasiert oder klassisch)

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

Tägliches Datenvolumen nach Typ für diese Application Insights-Ressource in den letzten 7 Tagen (nur klassisch)

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)  

Verwenden Sie eine Abfrage, die alle Application Insights-Tabellen umfasst, um die Datenvolumentrends für arbeitsbereichsbasierte Application Insights-Ressourcen zu betrachten. Die folgenden Abfragen verwenden die Tabellennamen, die für arbeitsbereichsbasierte Ressourcen spezifisch sind.

Tägliches Datenvolumen nach Typ für alle Application Insights-Ressourcen in einem Arbeitsbereich für 7 Tage

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)

Wenn Sie nur die Datenvolumentrends für eine einzelne Application Insights-Ressource betrachten möchten, fügen Sie die folgende Zeile vor summarize in der oben genannten Abfrage ein:

| where _ResourceId contains "<myAppInsightsResourceName>"

Tipp

Bei Arbeitsbereichen mit großen Datenvolumen kann es erforderlich sein, Abfragen wie diese, die große Mengen an Rohdaten abfragen, auf einen einzigen Tag zu beschränken. Um Trends im Zeitverlauf nachzuverfolgen, sollten Sie einen Power BI-Bericht einrichten und die inkrementelle Aktualisierung verwenden, um die Datenvolumen nach Ressource einmal pro Tag zu sammeln.

Ermitteln der Knoten, die Daten senden

Wenn Sie keine übermäßigen Daten aus einer bestimmten Quelle haben, haben Sie möglicherweise eine übermäßige Anzahl von Agents, die Daten senden.

Anzahl der Agentknoten, die jeden Tag im letzten Monat einen Heartbeat gesendet haben

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

Warnung

Verwenden Sie find-Abfragen mit Bedacht, da umfassende Überprüfungen verschiedener Datentypen ressourcenintensiv sind. Wenn Sie keine Ergebnisse pro Abonnement, Ressourcengruppe oder Ressourcennamen benötigen, verwenden Sie die Tabelle Verwendung wie in den oben genannten Abfragen.

Anzahl der Knoten, die in den letzten 24 Stunden Daten gesendet haben

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

Datenvolumen, das von jedem Knoten in den letzten 24 Stunden gesendet wurde

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

Nach Legacytarif „Pro Knoten“ abgerechnete Knoten

Die älteren Tarifrechnungen pro Knoten für Knoten mit stündlichem Granularitätstarif. Knoten, die nur eine Gruppe von Sicherheitsdatentypen senden, werden ebenfalls nicht gezählt. Um eine Liste von Computern abzurufen, die als Knoten berechnet werden, wenn für den Arbeitsbereich der Legacytarif „Pro Knoten“ gilt, suchen Sie Knoten, die kostenpflichtige Datentypen senden, da einige Datentypen kostenlos sind. In diesem Fall verwenden Sie das ganz linke Feld des vollqualifizierten Domänennamens (FQDN).

Die folgenden Abfragen geben die Anzahl der Computer mit kostenpflichtigen Daten pro Stunde zurück. Die Anzahl der Einheiten auf der Rechnung ist in Knotenmonaten angegeben, die durch billableNodeMonthsPerDay in der Abfrage dargestellt ist. Wenn im Arbeitsbereich die Lösung für die Updateverwaltung installiert ist, fügen Sie die Datentypen Update und UpdateSummary der Liste in der where-Klausel hinzu.

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

Hinweis

Wenn eine Zielgruppenadressierung verwendet wird, die in der obigen Abfrage nicht dargestellt ist, ist diese recht komplex.

Anzahl der Sicherheits- und Automatisierungsknoten

Anzahl der unterschiedlichen Sicherheitsknoten

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

Anzahl der unterschiedlichen Automatisierungsknoten

 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

Spät eintreffende Daten

Wenn Sie eine hohe Datenerfassungsrate beobachten, die anhand der Usage-Datensätze gemeldet wird, Sie aber nicht dieselben Ergebnisse bei der direkten Summierung von _BilledSize für den Datentyp feststellen, liegen möglicherweise spät eintreffende Daten vor. Dies ist der Fall, wenn Daten mit alten Zeitstempeln erfasst werden.

Ein Agent kann beispielsweise ein Konnektivitätsproblem haben und akkumulierte Daten senden, sobald wieder eine Verbindung besteht. Oder ein Host hat möglicherweise eine falsche Zeit. In beiden Fällen kann es zu einer offensichtlichen Diskrepanz kommen zwischen den erfassten Daten, die vom Datentyp Nutzung gemeldet werden, und einer Abfrage, die _BilledSize über die Rohdaten für einen bestimmten Tag summiert, der durch TimeGenerated, dem Zeitstempel für den Generierungszeitpunkt des Ereignisses, angegeben wird.

Verwenden Sie zum Diagnostizieren von Problemen mit spät eintreffenden Daten neben der Spalte TimeGenerated auch die Spalte _TimeReceived. Die Eigenschaft _TimeReceived ist die Zeit, zu der der Datensatz vom Azure Monitor-Erfassungspunkt in der Azure-Cloud empfangen wurde.

Im folgenden Beispiel handelt es sich um eine Reaktion auf hohe erfasste Datenvolumen von W3CIISLog-Daten am 2. Mai 2021, um die Zeitstempel dieser erfassten Daten zu identifizieren. Die Anweisung where TimeGenerated > datetime(1970-01-01) ist enthalten, um der Log Analytics-Benutzeroberfläche den Hinweis zu geben, dass alle Daten zu überprüfen sind.

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ächste Schritte