Öğretici: Azure İzleyici'de KQL makine öğrenmesi özelliklerini kullanarak anomalileri algılama ve analiz etme

Kusto Sorgu Dili (KQL), zaman serisi analizi, anomali algılama, tahmin ve kök neden analizi için makine öğrenmesi işleçlerini, işlevlerini ve eklentilerini içerir. Verileri dış makine öğrenmesi araçlarına aktarma yükü olmadan Azure İzleyici'de gelişmiş veri analizi gerçekleştirmek için bu KQL özelliklerini kullanın.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Zaman serisi oluşturma
  • Zaman serisindeki anomalileri tanımlama
  • Sonuçları daraltmak için anomali algılama ayarlarını ayarlama
  • Anomalilerin kök nedenini analiz etme

Not

Bu öğreticide, KQL sorgu örneklerini çalıştırabileceğiniz bir Log Analytics tanıtım ortamına bağlantılar sağlanır. Tanıtım ortamındaki veriler dinamik olduğundan, sorgu sonuçları bu makalede gösterilen sorgu sonuçlarıyla aynı değildir. Ancak, kendi ortamınızda ve KQL kullanan tüm Azure İzleyici araçlarında aynı KQL sorgularını ve sorumlularını uygulayabilirsiniz.

Önkoşullar

Gerekli izinler

Örneğin Log Analytics Okuyucusu yerleşik rolü tarafından sağlandığı gibi sorguladığınız Log Analytics çalışma alanları için izinlere sahip Microsoft.OperationalInsights/workspaces/query/*/read olmanız gerekir.

Zaman serisi oluşturma

Zaman serisi oluşturmak için KQL make-series işlecini kullanın.

Şimdi Kullanım tablosundaki günlükleri temel alan ve çalışma alanında her bir tablonun saatte bir ne kadar veri aldığına ilişkin bilgileri (faturalanabilir ve faturalanamayan veriler dahil) tutan bir zaman serisi oluşturalım.

Bu sorgu, son 21 gün içinde çalışma alanında her gün her tablo tarafından alınan toplam faturalanabilir veri miktarını grafik olarak kullanır make-series :

Sorguyu çalıştırmak için tıklayın

let starttime = 21d; // The start date of the time series, counting back from the current date
let endtime = 0d; // The end date of the time series, counting back from the current date
let timeframe = 1d; // How often to sample data
Usage // The table we’re analyzing
| where TimeGenerated between (startofday(ago(starttime))..startofday(ago(endtime))) // Time range for the query, beginning at 12:00 AM of the first day and ending at 12:00 AM of the last day in the time range
| where IsBillable == "true" // Include only billable data in the result set
| make-series ActualUsage=sum(Quantity) default = 0 on TimeGenerated from startofday(ago(starttime)) to startofday(ago(endtime)) step timeframe by DataType // Creates the time series, listed by data type 
| render timechart // Renders results in a timechart

Sonuçta elde edilen grafikte, ve veri türlerinde AzureDiagnostics SecurityEvent bazı anomalileri açıkça görebilirsiniz:

Çalışma alanında her gün 21 gün boyunca her tablo tarafından alınan toplam verilerin grafiğini gösteren animasyonlu GIF. İmleç, grafikteki üç kullanım anomalisini vurgulamak için hareket eder.

Şimdi, bir zaman serisindeki tüm anomalileri listelemek için bir KQL işlevi kullanacağız.

Not

Söz dizimi ve kullanımı hakkında make-series daha fazla bilgi için bkz . make-series işleci.

Zaman serisindeki anomalileri bulma

işlevi giriş series_decompose_anomalies() olarak bir dizi değer alır ve anomalileri ayıklar.

Zaman serisi sorgumuzun sonuç kümesini işleve series_decompose_anomalies() giriş olarak verelim:

Sorguyu çalıştırmak için tıklayın

let starttime = 21d; // Start date for the time series, counting back from the current date
let endtime = 0d; // End date for the time series, counting back from the current date
let timeframe = 1d; // How often to sample data
Usage // The table we’re analyzing
| where TimeGenerated between (startofday(ago(starttime))..startofday(ago(endtime))) // Time range for the query, beginning at 12:00 AM of the first day and ending at 12:00 AM of the last day in the time range
| where IsBillable == "true" // Includes only billable data in the result set
| make-series ActualUsage=sum(Quantity) default = 0 on TimeGenerated from startofday(ago(starttime)) to startofday(ago(endtime)) step timeframe by DataType // Creates the time series, listed by data type
| extend(Anomalies, AnomalyScore, ExpectedUsage) = series_decompose_anomalies(ActualUsage) // Scores and extracts anomalies based on the output of make-series 
| mv-expand ActualUsage to typeof(double), TimeGenerated to typeof(datetime), Anomalies to typeof(double),AnomalyScore to typeof(double), ExpectedUsage to typeof(long) // Expands the array created by series_decompose_anomalies()
| where Anomalies != 0  // Returns all positive and negative deviations from expected usage
| project TimeGenerated,ActualUsage,ExpectedUsage,AnomalyScore,Anomalies,DataType // Defines which columns to return 
| sort by abs(AnomalyScore) desc // Sorts results by anomaly score in descending ordering

Bu sorgu, son üç haftadaki tüm tablolar için tüm kullanım anomalilerini döndürür:

Çalışma alanı içindeki tüm tablolar için kullanımdaki anomalilerin listesini gösteren tablonun ekran görüntüsü.

Sorgu sonuçlarına baktığınızda işlevinin şu şekilde olduğunu görebilirsiniz:

  • Her tablo için beklenen günlük kullanımı hesaplar.
  • Gerçek günlük kullanımı beklenen kullanımla karşılaştırır.
  • Her veri noktasına, gerçek kullanımın beklenen kullanımdan sapma kapsamını gösteren bir anomali puanı atar.
  • Her tablodaki pozitif (1) ve negatif (-1) anomalileri tanımlar.

Not

Söz dizimi ve kullanımı hakkında series_decompose_anomalies() daha fazla bilgi için bkz . series_decompose_anomalies().

Sonuçları daraltmak için anomali algılama ayarlarını ayarlama

İlk sorgu sonuçlarını gözden geçirmek ve gerekirse sorguda ayarlamalar yapmak iyi bir uygulamadır. Giriş verilerindeki aykırı değerler işlevin öğrenmesini etkileyebilir ve daha doğru sonuçlar elde etmek için işlevin anomali algılama ayarlarını ayarlamanız gerekebilir.

Veri türündeki series_decompose_anomalies() anomaliler AzureDiagnostics için sorgunun sonuçlarını filtreleyin:

anomali algılama sorgusunun sonuçlarını gösteren ve Azure Tanılama veri türünden sonuçlar için filtrelenmiş bir tablo.

Sonuçlar, 14 Haziran ve 15 Haziran'da iki anomali olduğunu göstermektedir. Bu sonuçları, 27 ve 28 Mayıs'ta diğer anomalileri görebileceğiniz ilk make-series sorgumuzdaki grafikle karşılaştırın:

anomalilerin vurgulandığı Azure Tanılama tablosu tarafından alınan toplam verilerin grafiğini gösteren ekran görüntüsü.

Sonuçlardaki fark, işlevin series_decompose_anomalies() beklenen kullanım değerine göre anomalileri puanlamasıdır ve bu değer giriş serisindeki değerlerin tamamına göre hesaplanır.

İşlevden daha iyi sonuçlar elde etmek için, serideki diğer değerlerle karşılaştırıldığında aykırı değer olan 15 Haziran'daki kullanımı işlevin öğrenme sürecinden hariç tutun.

İşlevin series_decompose_anomalies() söz dizimi şöyledir:

series_decompose_anomalies (Series[Threshold,Seasonality,Trend,Test_points,AD_method,Seasonality_threshold])

Test_points öğrenme (regresyon) işleminin dışında tutulacak serinin sonundaki nokta sayısını belirtir.

Son veri noktasını dışlamak için olarak 1ayarlayınTest_points:

Sorguyu çalıştırmak için tıklayın

let starttime = 21d; // Start date for the time series, counting back from the current date
let endtime = 0d; // End date for the time series, counting back from the current date
let timeframe = 1d; // How often to sample data
Usage // The table we’re analyzing
| where TimeGenerated between (startofday(ago(starttime))..startofday(ago(endtime))) // Time range for the query, beginning at 12:00 AM of the first day and ending at 12:00 AM of the last day in the time range
| where IsBillable == "true" // Includes only billable data in the result set
| make-series ActualUsage=sum(Quantity) default = 0 on TimeGenerated from startofday(ago(starttime)) to startofday(ago(endtime)) step timeframe by DataType // Creates the time series, listed by data type
| extend(Anomalies, AnomalyScore, ExpectedUsage) = series_decompose_anomalies(ActualUsage,1.5,-1,'avg',1) // Scores and extracts anomalies based on the output of make-series, excluding the last value in the series - the Threshold, Seasonality, and Trend input values are the default values for the function 
| mv-expand ActualUsage to typeof(double), TimeGenerated to typeof(datetime), Anomalies to typeof(double),AnomalyScore to typeof(double), ExpectedUsage to typeof(long) // Expands the array created by series_decompose_anomalies()
| where Anomalies != 0  // Returns all positive and negative deviations from expected usage
| project TimeGenerated,ActualUsage,ExpectedUsage,AnomalyScore,Anomalies,DataType // Defines which columns to return 
| sort by abs(AnomalyScore) desc // Sorts results by anomaly score in descending ordering

Veri türü için sonuçları filtreleyin AzureDiagnostics :

değiştirilen anomali algılama sorgusunun sonuçlarını gösteren ve Azure Tanılama veri türünden sonuçlar için filtrelenen bir tablo. Sonuçlar artık öğreticinin başında oluşturulan grafikle aynı anomalileri gösterir.

İlk make-series sorgumuzdaki grafikteki anomalilerin tümü artık sonuç kümesinde görünür.

Anomalilerin kök nedenini analiz etme

Beklenen değerleri anormal değerlerle karşılaştırmak, iki küme arasındaki farkların nedenini anlamanıza yardımcı olur.

KQL diffpatterns() eklentisi aynı yapıdaki iki veri kümesini karşılaştırır ve iki veri kümesi arasındaki farkları karakterize eden desenler bulur.

Bu sorgu, örneğimizdeki aşırı aykırı değerler olan 15 Haziran'daki kullanımı diğer günlerdeki tablo kullanımıyla karşılaştırır AzureDiagnostics :

Sorguyu çalıştırmak için tıklayın

let starttime = 21d; // Start date for the time series, counting back from the current date
let endtime = 0d; // End date for the time series, counting back from the current date
let anomalyDate = datetime_add('day',-1, make_datetime(startofday(ago(endtime)))); // Start of day of the anomaly date, which is the last full day in the time range in our example (you can replace this with a specific hard-coded anomaly date)
AzureDiagnostics	
| extend AnomalyDate = iff(startofday(TimeGenerated) == anomalyDate, "AnomalyDate", "OtherDates") // Adds calculated column called AnomalyDate, which splits the result set into two data sets – AnomalyDate and OtherDates
| where TimeGenerated between (startofday(ago(starttime))..startofday(ago(endtime))) // Defines the time range for the query
| project AnomalyDate, Resource // Defines which columns to return
| evaluate diffpatterns(AnomalyDate, "OtherDates", "AnomalyDate") // Compares usage on the anomaly date with the regular usage pattern

Sorgu, tablodaki her girişin AnomalyDate (15 Haziran) veya OtherDates'te gerçekleştiğini tanımlar. Eklenti diffpatterns() daha sonra A (Örneğimizdeki OtherDates) ve B (Örneğimizdeki AnomaliTarihi) adlı bu veri kümelerini böler ve iki kümedeki farklara katkıda bulunan birkaç desen döndürür:

Üç satırı olan bir tabloyu gösteren ekran görüntüsü. Her satır, anormal kullanımdaki kullanım ile temel kullanım arasında bir fark gösterir.

Sorgu sonuçlarına baktığınızda aşağıdaki farkları görebilirsiniz:

  • Sorgu zaman aralığındaki diğer tüm günlerde CH1-GEARAMAAKS kaynağından 24.892.147 veri alımı örneği vardır ve 15 Haziran'da bu kaynaktan veri alınmaz. CH1-GEARAMAAKS kaynağından alınan veriler, sorgu zaman aralığındaki diğer günlerde toplam alımın %73,36'sını ve 15 Haziran'da toplam alımın %0'ını oluşturur.
  • Sorgu zaman aralığındaki diğer tüm günlerde NSG-TESTSQLMI519 kaynağından 2.168.448 veri alımı örneği ve 15 Haziran'da bu kaynaktan 110.544 veri alımı örneği vardır. NSG-TESTSQLMI519 kaynağından alınan veriler, sorgu zaman aralığındaki diğer günlerde toplam alımın %6,39'unu ve 15 Haziran'da alımın %25,61'ini oluşturur.

Diğer gün dönemini oluşturan 20 gün boyunca NSG-TESTSQLMI519 kaynağından ortalama olarak 108.422 alım örneği olduğuna dikkat edin (2.168.448'i 20'ye bölün). Bu nedenle, 15 Haziran'da NSG-TESTSQLMI519 kaynağından alınan alım, diğer günlerde bu kaynaktan alınan alımdan önemli ölçüde farklı değildir. Ancak 15 Haziran'da CH1-GEARAMAAKS'tan veri alımı olmadığından NSG-TESTSQLMI519 alımı, anomali tarihindeki toplam alımın diğer günlere kıyasla önemli ölçüde daha fazla yüzdesini oluşturur.

PercentDiffAB sütunu, A ile B arasındaki mutlak yüzde noktası farkını gösterir (|YüzdeA - YüzdeB|), iki küme arasındaki farkın ana ölçüsüdür. Varsayılan olarak, diffpatterns() eklenti iki veri kümesi arasında %5'in üzerinde bir fark döndürür, ancak bu eşiği değiştirebilirsiniz. Örneğin, iki veri kümesi arasında yalnızca %20 veya daha fazla fark döndürmek için yukarıdaki sorguda ayarlayabilirsiniz | evaluate diffpatterns(AnomalyDate, "OtherDates", "AnomalyDate", "~", 0.20) . Sorgu artık yalnızca bir sonuç döndürür:

Anormal kullanımdaki kullanım ile temel kullanım arasındaki farkı gösteren tek satırlı bir tabloyu gösteren ekran görüntüsü. Bu kez sorgu, iki veri kümesi arasında yüzde 20'den az fark döndürmedi.

Not

Söz dizimi ve kullanımı hakkında diffpatterns() daha fazla bilgi için bkz . fark desenleri eklentisi.

Sonraki adımlar

Aşağıdakiler hakkında daha fazla bilgi edinin: