Udostępnij za pośrednictwem


Analizowanie użycia w obszarze roboczym usługi Log Analytics

Koszty usługi Azure Monitor mogą się znacznie różnić w zależności od ilości danych zbieranych w obszarze roboczym usługi Log Analytics. Ten wolumin ma wpływ na zestaw rozwiązań korzystających z obszaru roboczego i ilość danych zbieranych przez każde rozwiązanie. Ten artykuł zawiera wskazówki dotyczące analizowania zebranych danych w celu ułatwienia kontrolowania kosztów pozyskiwania danych. Pomaga określić przyczynę wyższego niż oczekiwano użycia. Ułatwia również przewidywanie kosztów podczas monitorowania większej liczby zasobów i konfigurowania różnych funkcji usługi Azure Monitor.

Napiwek

Aby uzyskać strategie zmniejszenia kosztów usługi Azure Monitor, zobacz Optymalizacja kosztów i Usługa Azure Monitor.

Przyczyny wyższego niż oczekiwanego użycia

Każdy obszar roboczy usługi Log Analytics jest naliczany jako oddzielna usługa i współtworzy rachunek za subskrypcję platformy Azure. Ilość pozyskiwania danych może być znaczna, w zależności od:

  • Zestaw szczegółowych informacji i usług jest włączony i ich konfiguracja.
    • Liczba i typ monitorowanych zasobów.
    • Ilość danych zebranych z każdego monitorowanego zasobu.

Nieoczekiwany wzrost dowolnego z tych czynników może spowodować zwiększenie opłat za przechowywanie danych. W pozostałej części tego artykułu przedstawiono metody wykrywania takiej sytuacji, a następnie analizowanie zebranych danych w celu zidentyfikowania i ograniczenia źródła zwiększonego użycia.

Wysyłanie alertu, gdy zbieranie danych jest wysokie

Aby uniknąć nieoczekiwanych rachunków, należy proaktywnie otrzymywać powiadomienia w dowolnym momencie, w którym występuje nadmierne użycie. Powiadomienie umożliwia rozwiązanie wszelkich potencjalnych anomalii przed końcem okresu rozliczeniowego.

Poniższy przykład to reguła alertu przeszukiwania dzienników, która wysyła alert, jeśli rozliczany wolumin danych pozyskany w ciągu ostatnich 24 godzin był większy niż 50 GB. Zmodyfikuj ustawienie Logika alertów, aby użyć innego progu na podstawie oczekiwanego użycia w danym środowisku. Możesz również zwiększyć częstotliwość sprawdzania użycia wiele razy dziennie, ale ta opcja spowoduje zwiększenie opłaty za regułę alertu.

Ustawienie Wartość
Scope
Zakres docelowy Wybierz obszar roboczy usługi Log Analytics.
Warunek
Query Usage | where IsBillable | summarize DataGB = sum(Quantity / 1000)
Miara Miara: DataGB
Typ agregacji: Suma
Stopień szczegółowości agregacji: 1 dzień
Logika alertów Operator: większe niż
Wartość progowa: 50
Częstotliwość oceny: 1 dzień
Akcje Wybierz lub dodaj grupę akcji, aby powiadomić Cię o przekroczeniu progu.
Szczegóły
Ważność Ostrzeżenie
Nazwa reguły alertu Rozliczany wolumin danych większy niż 50 GB w ciągu 24 godzin.

Analiza użycia w usłudze Azure Monitor

Rozpocznij analizę przy użyciu istniejących narzędzi w usłudze Azure Monitor. Te narzędzia nie wymagają żadnej konfiguracji i często mogą udostępniać potrzebne informacje przy minimalnym nakładzie pracy. Jeśli potrzebujesz dokładniejszej analizy zebranych danych niż istniejące funkcje usługi Azure Monitor, użyj dowolnego z następujących zapytań dziennika w usłudze Log Analytics.

Obszar roboczy usługi Log Analytics — szczegółowe informacje

Szczegółowe informacje o obszarze roboczym usługi Log Analytics zapewniają szybką wiedzę na temat danych w obszarze roboczym. Można na przykład określić następujące elementy:

  • Tabele danych, które są pozyskiwane najwięcej woluminów danych w tabeli głównej.
  • Najważniejsze zasoby współtworzenia danych.
  • Trend pozyskiwania danych.

Zobacz kartę Użycie , aby uzyskać podział pozyskiwania według rozwiązania i tabeli. Te informacje mogą pomóc w szybkim zidentyfikowaniu tabel, które współtworzyją większość woluminu danych. Karta pokazuje również trendy zbierania danych w czasie. Możesz określić, czy zbieranie danych stale rośnie wraz z upływem czasu lub nagle zwiększa się w odpowiedzi na zmianę konfiguracji.

Wybierz pozycję Dodatkowe zapytania dla wstępnie utworzonych zapytań , które ułatwiają dalsze zrozumienie wzorców danych.

Użycie i szacunkowe koszty

Wykres Pozyskiwanie danych na rozwiązanie na stronie Użycie i szacowane koszty dla każdego obszaru roboczego przedstawia łączną ilość wysyłanych danych i ilość wysyłanych przez każde rozwiązanie w ciągu ostatnich 31 dni. Te informacje pomagają określić trendy, takie jak to, czy jakikolwiek wzrost wynika z ogólnego użycia danych, czy użycia przez określone rozwiązanie.

Wykonywanie zapytań dotyczących woluminów danych z tabeli Użycie

Przeanalizuj ilość rozliczanych danych zebranych przez określoną usługę lub rozwiązanie. Te zapytania używają tabeli Użycie , która zbiera dane użycia dla każdej tabeli w obszarze roboczym.

Uwaga

Klauzula z parametrem TimeGenerated polega tylko na upewnieniu się, że środowisko zapytań w witrynie Azure Portal wykracza poza domyślne 24 godziny. Jeśli używasz typu danych Użycie i EndTime reprezentujesz przedziały czasu, StartTime dla których są prezentowane wyniki.

Rozliczany wolumin danych według typu w ciągu ostatniego miesiąca

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

Rozliczany wolumin danych według rozwiązania i typ w ciągu ostatniego miesiąca

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

Wykonywanie zapytań dotyczących woluminu danych bezpośrednio ze zdarzeń

Zapytania dzienników można używać w usłudze Log Analytics, jeśli potrzebujesz dokładniejszej analizy zebranych danych. Każda tabela w obszarze roboczym usługi Log Analytics ma następujące standardowe kolumny, które mogą pomóc w analizowaniu rozliczanych danych:

  • _IsBillable identyfikuje rekordy, dla których jest naliczana opłata za pozyskiwanie. Użyj tej kolumny, aby odfiltrować dane niezwiązane z rozliczaniem.
  • _BilledSize zapewnia rozmiar w bajtach rekordu.

Rozliczany wolumin danych dla określonych zdarzeń

Jeśli okaże się, że określony typ danych zbiera nadmierne ilości danych, możesz chcieć przeanalizować dane w tej tabeli, aby określić określone rekordy, które rosną. Ten przykład filtruje określone identyfikatory zdarzeń w Event tabeli, a następnie udostępnia liczbę dla każdego identyfikatora. To zapytanie można zmodyfikować przy użyciu kolumn z innych tabel.

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)

Ilość danych według zasobu platformy Azure, grupy zasobów lub subskrypcji

Możesz przeanalizować ilość rozliczanych danych zebranych z określonego zasobu lub zestawu zasobów. Te zapytania używają kolumn _ResourceId i _SubscriptionId dla danych z zasobów hostowanych na platformie Azure.

Ostrzeżenie

Używaj zapytań wyszukiwania oszczędnie, ponieważ skanowania między typami danych intensywnie korzystają z zasobów do wykonania. Jeśli nie potrzebujesz wyników dla subskrypcji, grupy zasobów lub nazwy zasobu, użyj tabeli Użycie , jak w poprzednich zapytaniach.

Rozliczany wolumin danych według identyfikatora zasobu w ciągu ostatniego pełnego dnia

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

Rozliczany wolumin danych według grupy zasobów w ciągu ostatniego pełnego dnia

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

Pomocne może być przeanalizowanie _ResourceIdelementu :

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

Rozliczany wolumin danych według subskrypcji w ciągu ostatniego pełnego dnia

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

Napiwek

W przypadku obszarów roboczych z dużymi ilościami danych wykonywanie zapytań, takich jak te pokazane w tej sekcji, które wykonuje zapytania dotyczące dużych ilości danych pierwotnych, może być konieczne ograniczenie do jednego dnia. Aby śledzić trendy w czasie, rozważ skonfigurowanie raportu usługi Power BI i użycie odświeżania przyrostowego w celu zbierania woluminów danych na zasób raz dziennie.

Wolumin danych według komputera

Możesz przeanalizować ilość rozliczanych danych zebranych z maszyny wirtualnej lub zestawu maszyn wirtualnych. Tabela Użycie nie ma szczegółowości wyświetlania woluminów danych dla określonych maszyn wirtualnych, dlatego te zapytania używają operatora znajdowania do przeszukiwania wszystkich tabel zawierających nazwę komputera. Typ użycia jest pomijany, ponieważ to zapytanie służy tylko do analizy trendów danych.

Ostrzeżenie

Używaj zapytań wyszukiwania oszczędnie, ponieważ skanowania między typami danych intensywnie korzystają z zasobów do wykonania. Jeśli nie potrzebujesz wyników dla subskrypcji, grupy zasobów lub nazwy zasobu, użyj tabeli Użycie , jak w poprzednich zapytaniach.

Rozliczany wolumin danych według komputera w ciągu ostatniego pełnego dnia

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

Liczba rozliczanych zdarzeń według komputera w ciągu ostatniego pełnego dnia

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

Wykonywanie zapytań dotyczących typowych typów danych

Jeśli okaże się, że masz nadmierne rozliczane dane dla określonego typu danych, może być konieczne wykonanie zapytania w celu przeanalizowania danych w tej tabeli. Następujące zapytania zawierają przykłady dla niektórych typowych typów danych:

Rozwiązanie zabezpieczające

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

Rozwiązanie do zarządzania dziennikami

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

Typ danych Perf

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

Typ danych Event

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

Typ danych Syslog

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

Typ danych AzureDiagnostics

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

Dane usługi Application Insights

Istnieją dwa podejścia do badania ilości danych zebranych w usłudze Application Insights, w zależności od tego, czy masz aplikację klasyczną, czy opartą na obszarze roboczym. Użyj właściwości dostępnej _BilledSize dla każdego pozyskanego zdarzenia zarówno dla zasobów klasycznych, jak i opartych na obszarze roboczym. Można również użyć zagregowanych informacji w tabeli systemEvents dla zasobów klasycznych.

Uwaga

Zapytania względem tabel usługi Application Insights, z wyjątkiem SystemEvents, będą działać zarówno dla zasobu opartego na obszarze roboczym, jak i klasycznego zasobu usługi Application Insights. Zgodność z poprzednimi wersjami umożliwia dalsze używanie starszych nazw tabel. W przypadku zasobu opartego na obszarze roboczym otwórz menu Dzienniki w menu obszaru roboczego usługi Log Analytics. W przypadku zasobu klasycznego otwórz pozycję Dzienniki w menu usługi Application Insights .

Operacje zależności generują najwięcej danych w ciągu ostatnich 30 dni (opartych na obszarze roboczym lub klasycznym)

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

Dzienny wolumin danych według typu dla tego zasobu usługi Application Insights w ciągu ostatnich 7 dni (tylko wersja klasyczna)

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)  

Aby przyjrzeć się trendom ilości danych dla zasobów usługi Application Insights opartych na obszarze roboczym, użyj zapytania zawierającego wszystkie tabele usługi Application Insights. Poniższe zapytania używają nazw tabel specyficznych dla zasobów opartych na obszarze roboczym.

Dzienny wolumin danych według typu dla wszystkich zasobów usługi Application Insights w obszarze roboczym przez 7 dni

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)

Aby przyjrzeć się trendom woluminu danych tylko dla pojedynczego zasobu usługi Application Insights, dodaj następujący wiersz przed summarize w poprzednim zapytaniu:

| where _ResourceId contains "<myAppInsightsResourceName>"

Napiwek

W przypadku obszarów roboczych z dużymi ilościami danych wykonywanie zapytań, takich jak poprzednie, które wykonuje zapytania dotyczące dużych ilości danych pierwotnych, może być konieczne ograniczenie do jednego dnia. Aby śledzić trendy w czasie, rozważ skonfigurowanie raportu usługi Power BI i użycie odświeżania przyrostowego w celu zbierania woluminów danych na zasób raz dziennie.

Informacje o węzłach wysyłających dane

Jeśli nie masz nadmiernych danych z żadnego konkretnego źródła, może istnieć nadmierna liczba agentów wysyłających dane.

Liczba węzłów agenta wysyłających puls każdego dnia w ostatnim miesiącu

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

Ostrzeżenie

Używaj zapytań wyszukiwania oszczędnie, ponieważ skanowania między typami danych intensywnie korzystają z zasobów do wykonania. Jeśli nie potrzebujesz wyników dla subskrypcji, grupy zasobów lub nazwy zasobu, użyj tabeli Użycie , jak w poprzednich zapytaniach.

Liczba węzłów wysyłających dowolne dane w ciągu ostatnich 24 godzin

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

Wolumin danych wysyłany przez każdy węzeł w ciągu ostatnich 24 godzin

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

Węzły rozliczane według starszej warstwy cenowej Na węzeł

Starsze opłaty za warstwę cenową Na węzeł są naliczane za węzły z godzinowym stopniem szczegółowości. Nie zlicza również węzłów, które wysyłają tylko zestaw typów danych zabezpieczeń. Aby uzyskać listę komputerów, które będą rozliczane jako węzły, jeśli obszar roboczy znajduje się w starszej warstwie cenowej Na węzeł, poszukaj węzłów wysyłających rozliczane typy danych, ponieważ niektóre typy danych są bezpłatne. W tym przypadku użyj lewego pola w pełni kwalifikowanej nazwy domeny.

Następujące zapytania zwracają liczbę komputerów z rozliczanymi danymi na godzinę. Liczba jednostek na rachunku wynosi w jednostkach miesięcy węzła, które są reprezentowane przez billableNodeMonthsPerDay zapytanie. Jeśli obszar roboczy ma zainstalowane rozwiązanie Update Management, dodaj typy danych Update i UpdateSummary do listy w klauzuli where .

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

Uwaga

Pewna złożoność rzeczywistego algorytmu rozliczeń, gdy używane jest rozwiązanie, nie jest reprezentowane w poprzednim zapytaniu.

Liczba węzłów zabezpieczeń i automatyzacji

Liczba unikatowych węzłów zabezpieczeń

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

Liczba odrębnych węzłów automatyzacji

 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

Dane opóźnione

Jeśli obserwujesz wysokie pozyskiwanie danych zgłoszone przy użyciu Usage rekordów, ale nie obserwujesz tego samego wyniku sumowania _BilledSize bezpośrednio na typie danych, możliwe jest, że masz opóźnione dane. Taka sytuacja występuje, gdy dane są pozyskiwane ze starymi znacznikami czasu.

Na przykład agent może mieć problem z łącznością i wysyłać skumulowane dane podczas ponownego nawiązywania połączenia. Albo host może mieć niepoprawny czas. Jeden z przykładów może spowodować pozorną rozbieżność między pozyskanymi danymi zgłoszonymi przez typ danych Użycie i zapytanie sumujące _BilledSize danych pierwotnych dla określonego dnia określonego przez TimeGenerated, znacznik czasu wygenerowania zdarzenia.

Aby zdiagnozować problemy z danymi z opóźnieniem, użyj kolumny _TimeReceived i kolumny TimeGenerated . Właściwość _TimeReceived to czas odebrania rekordu przez punkt pozyskiwania usługi Azure Monitor w chmurze platformy Azure.

Poniższy przykład jest odpowiedzią na duże ilości pozyskanych danych w danych W3CIISLog w dniu 2 maja 2021 r., aby zidentyfikować znaczniki czasu na tych pozyskanych danych. Instrukcja where TimeGenerated > datetime(1970-01-01) jest zawarta w celu udostępnienia wskazówek dla interfejsu użytkownika usługi Log Analytics w celu przyjrzenia się wszystkim danym.

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 

Następne kroki