Azure Log Analytics – Yeni Query Language
Azure Log Analytics son zamanlarda yeni bir sorgu dili ile çalışacak şekilde geliştirildi. Sorgu dili kendisi aslında hiç de yeni değildir ve bir süredir Application Insights tarafından kapsamlı bir şekilde kullanılmıştır. Son zamanlarda üzerinde çalıştığı dil ve platform, yeni yetenekler zenginliği sunmamızı sağlayan Log Analytics’e ve gelişmiş analitik için tasarlanmış yeni bir portala entegre edilmiştir.
Pipe-away
Sorgular bir veya daha fazla tabloda saklanan verileri toplar. Bu temel sorgu:
Event
Alabileceğiniz kadar basit, ancak etkinlik tablosundaki her şeyi yalnızca geri döndüren geçerli bir sorgulamadır. Tabloda her kaydı tutmak genellikle çok fazla sonuç anlamına gelir. Verileri analiz ederken, ortak bir ilk adım, bir tablodan yalnızca bir grup kaydı incelemek ve ilgili verileri nasıl yakınlaştıracağınızı planlamaktır. Bu, “take” ile kolayca yapılır:
Event
| take 10
Sorguların genel yapısı – pipe’lara ayrılmış birden fazla öğedir. İlk öğenin çıktısı (diğer bir deyişle, Etkinlik tablosunun tamamı), bir sonraki öğenin girişi olur. Bu durumda, son sorgu çıktısı Olay tablosundan 10 kayıt olacaktır. Onları inceledikten sonra, sorguyu daha spesifik hale getireceğimize karar verebilirsiniz. Çoğu zaman, burada olduğu gibi belirli bir koşulla filtrelenecek yerleri kullanırız:
Event
| where EventLevelName == “Error”
Bu sorgu, EventLevelName equals “Error” (büyük küçük harf duyarlı) ile aynı olduğu, tablodaki tüm kayıtları döndürür.
Sorgumuz yine de çok sayıda kayıt döndürüyor gibi görünüyor. Tüm bu verileri anlamaya gelmek için özetlerimizi kullanabiliriz. Özet metni, kayıt gruplarını ortak bir değere göre tanımlar ve her gruba toplamalar da uygulayabilir.
Event
| where EventLevelName == “Error”
| summarize count() by Computer
Bu örnek, Hata olarak işaretlenen, bilgisayar tarafından gruplandırılan Olay kayıtlarının sayısını döndürür.
Search
Bazen, sorguyu belirli bir tabloyla sınırlamak yerine, tüm verilerimiz arasında arama yapmamız gerekir. Bu tür bir sorgu için, “search” anahtar kelimesini kullanın:
search “212.92.108.214”
| where TimeGenerated > ago(1h)
Yukarıdaki örnek, belirli bir IP adresini içeren son saatteki tüm kayıtları arar.
Tüm verilerin taranması çalışması biraz zaman alabilir. Bir grup tablo arasında bir terim aramak için, aramayı şu şekilde kapsamlandırın:
search in (ConfigurationData, ApplicationInsights) “logon” or “login”
Bu örnek, “logon” veya “login” terimlerini içeren kayıtlar için yalnızca ConfigurationData ve ApplicationInsights tablolarını arar.
Query-time
Genellikle, özel alanları, anında hesaplamak ve analizimizde kullanmak isteyebilirz. Bunu yapmanın bir yolu, ErrorsCount gibi otomatik olarak oluşturulmuş sütunlara kendi adınızı atamaktır:
Event
| where EventLevelName == “Error”
| summarize ErrorsCount=count() by Computer
| sort by ErrorsCount
Fakat alanlar eklemek özetleri kullanmayı gerektirmez. Bunu yapmanın en kolay yolu genişletme yöntemidir:
Event
| where TimeGenerated > datetime(2017-09-16)
| where EventLevelName == “Error”
| extend PST_time = TimeGenerated-8h
| where PST_time between (datetime(2017-09-17T04:00:00) .. datetime(2017-09-18T04:00:00))
Bu örnek, TimeGenerated’e dayanan, ancak UTC’den PST saat dilimine uyarlanan PST_time’ı hesaplar. Sorgu, yalnızca 2017-09-17 saatleri arasında saat 4’te ve 2017-09-18 saatlerinde saat 4’de PST saatinde oluşturulan kayıtları filtrelemek için yeni alanı kullanmaktadır.
Hesaplanan alanı sonuç kümesine eklemek yerine proje yalnızca yansıtılan alanları korur. Bu örnekte, sonuçların yalnızca dört sütunu olacaktır:
Event
| where EventLevelName == “Error”
| project TimeGenerated, Computer, EventID, RenderedDescription
Joins
Join , belirtilen sütunların değerlerini eşleyerek iki veri kümesinin kayıtlarını birleştirir. Bu, farklı veri kaynakları arasındaki korelasyona dayanan daha zengin analizlere olanak tanır.
Aşağıdaki örnek, iki tablodaki kayıtları birleştirir: Update ve SecurityEvent:
Update
| where TimeGenerated > ago(1d)
| where Classification == “Security Updates” and UpdateState == “Needed”
| summarize missing_updates=makeset(Title) by Computer
| join (
SecurityEvent
| where TimeGenerated > ago(1h)
| summarize count() by Computer
) on Computer
Eşleştirilen iki veri kümesini gözden geçirelim. İlk veri seti:
Update
| where TimeGenerated > ago(1d)
| where Classification == “Security Updates” and UpdateState == “Needed”
| summarize missing_updates=makeset(Title) by Computer
Bu, gerekli güncelleştirmeleri açıklayan son günün kayıtlarını alır. Daha sonra bilgisayar başına gerekli güncelleme kümesini özetler.
İkinci veri seti:
SecurityEvent
| where TimeGenerated > ago(1h)
| summarize count() by Computer
Bu, bilgisayar başına son saatte kaç tane SecurityEvent kaydı oluşturulduğunu belirtir.
Eşleştirdiğimiz ortak alan Computer’dır, bu yüzden sonunda her biri eksik güvenlik güncelleştirmesinin bir listesini ve son bir saatteki toplam güvenlik olaylarının sayısını içeren bir bilgisayar listesi elde ediyoruz.
Çoğu sorgu için varsayılan görselleştirme bir tablodur. Verileri grafik olarak görselleştirmek için, sorgunun sonuna “| render barchart” ekleyin veya sonuçların üstünde gösterilen Grafik düğmesini seçin. Sonuç, bir sonraki güncellemelerimizi nasıl yöneteceğimize karar vermemize yardımcı olabilir: