Azure Data Factory ile Power BI Service Denetim Raporu Oluşturma

Ataberk Teknekaya
PEAKUP Tech News
Published in
7 min readJan 26, 2024

Şirketlerin Power BI ekosistemi rapor sayısı ve kullanıcılarının artmasıyla giderek büyüyor. Yeni çıkan pipeline, warehouse, lakehouse vb. MS Fabric hizmetleri de giderek bu ekosistemin daha fazla denetime ihtiyaç duymasını sağlıyor.

Bu denetimi sağlamak için Power BI Service üzerindeki aktivite kayıtlarını periyodik olarak incelemek gerekiyor. Bunun bir yöntemi Admin Portal sayfası içindeki audit log ekranını kullanmaktır. Fakat bu yöntem sadece bir csv dosyası verir ve bu dosya analize hazır değildir. Bu yöntemi otomatize edebilmek için Microsoft bize çeşitli Power BI REST API’ları sunuyor. Bu REST API’lardan en kolay veri çekmenin yolu ise Microsoft’un bulut tabanlı ETL ve orkestrasyon aracı olan Azure Data Factory (ADF) ‘dir. Bu yazıda tüm detaylarıyla ADF’te bir denetim ETL pipeline’ı tasarlayacağız.

Power BI REST API Nedir?

Power BI REST API’ları ekleme, yönetim, denetim ve kullanıcı kaynakları için hizmet uç noktaları sağlar.

Power BI REST API’ları ile aşağıdakileri yapabilirsiniz:

  • Power BI içeriğini yönetme
  • Denetim işlemleri gerçekleştirme
  • Power BI İçeriği Ekleme (embed)

Biz bu yazıda Get Activity Events adlı REST API’ı inceleyeceğiz.

Bu REST API’ın sonucunu elde etmek için aşağıdaki URI’a GET metoduyla çağrı atmamız gerekiyor:

https://api.powerbi.com/v1.0/myorg/admin/activityevents?startDateTime={startDateTime}&endDateTime={endDateTime}

Kalın yazılmış kısım Power BI REST API’ların Base URL’i , geri kalan kısım ise Relative URL olarak adlandırılıyor. Bu API’ın çalışması için minimum olarak başlangıç ve bitiş denetim tarih aralığı belirtmek gerekiyor. Ayrıca API ile sadece 1 günlük veri çekebiliyoruz. Bu yüzden sadece tek bir gün için saat aralığı vererek ilerleyebiliyoruz. Örnek URL aşağıdaki gibidir:

https://api.powerbi.com/v1.0/myorg/admin/activityevents?startDateTime='2019-08-13T07:55:00.000Z'&endDateTime='2019-08-13T08:55:00.000Z'

İstediğimiz gün aralığındaki veriyi çekmek için API’a parametrik olarak bir döngü içinde çağrı atmamız gerekiyor. ETL paketimizde bu yapıyı dizayn edeceğiz ama öncelikle Azure Data Factory ile REST API arasında bir iletişim kurmamız gerekiyor. Bunu sağlamak için birkaç önkoşulumuz var. Bunlardan bahsederek demomuza geçebiliriz.

Demo

Yetki Tanımlama

Çoğu organizasyonda Power BI Tenant’ına erişim için MS 365 Admin’inden onay almak gerekiyor. Biz de bir App kaydı yaparak istediğimiz Power BI yetkisini tanımlayıp MS 365 admininden bu app için onay alacağız.

Öncelikle Azure Portal’a girerek App registrations bölümüne giriyoruz ve New registration butonuna tıklıyoruz. Açıklayıcı bir app adı girerek uygulamamızı oluşturuyoruz.

Uygulamayı oluşturduktan sonra Overview sekmesine gelip Application (client) ID’yi bir yere not alıyoruz. Sonrasında certifications & secrets bölümünden New client secret butonuna basarak app için bir secret yaratıyoruz.

Bu secret’ın value’sunu sadece bir defaya mahsus görebiliyoruz. Bunu da bir yere not almamız gerekiyor. Bu iki not ettiğimiz kısmı sonrasında Azure Data Factory’de kullanacağız.

Notlarımızı aldıktan sonra API permissions sekmesine tıklayarak Power BI Service’i seçip Tenant.Read.All yetkisi talep ediyoruz.

MS 365 admini bu yetkiyi onayladıktan sonra bu app’i bir security group’a kaydetmemiz gerekiyor. Yeni bir security group açmak için Azure Portal’dan Microsoft Entra ID sekmesine girerek organizasyonumuzun sırasıyla Groups ve New Group butonuna tıklayarak yeni grup yaratma ekranına geliyoruz. Burada Security tipi grup seçip ad ve açıklama girerek grubumuzu oluşturuyoruz.

Grubu oluşturduktan sonra Members sekmesinden Add members butonuna tıklayarak oluşturduğumuz app’i member olarak gruba kaydediyoruz.

Son olarak Power BI Service üzerinde Admin Portal’a girerek Tenant settings butonuna tıklıyoruz. Allow service principals to use read-only admin APIs ayarını bularak ilgili security group’u ekliyoruz.

Artık erişim için tüm yetkilerimiz hazır. Azure Data Factory ile bağlantıyı sağlayıp ETL pipeline’ımızı oluşturmaya başlayabiliriz.

ETL Pipeline

Öncelikle bağlantı için bir linked service oluşturmamız gerekiyor. ADF’in Manage sekmesinden REST tipinde bir linked service seçiyoruz.

Linked service’in adını ve açıklamasını girdikten sonra sırasıyla aşağıdaki bilgileri dolduruyoruz:

Base URL: https://api.powerbi.com/v1.0/myorg/admin/

Authentication type: Service Principal

Service Principal ID: Application (client) ID (Not aldığımız)

Service principal key: Client Secret Value (Not aldığımız)

Tenant: Power BI Service Tenant Id

Microsoft Entra ID resource: https://analysis.windows.net/powerbi/api

Tüm bilgileri doldurduktan sonra linked service’imizi oluşturuyoruz. Kaynak bağlantımızı oluşturduk. Tüm aktivite verilerini bir Azure SQL veri tabanına aktaracağız. Bunun için de bir linked service oluşturuyoruz.

Bu veri tabanında oluşturacağımız tablonun metadatasına hakim değiliz. Bu yüzden parametrik olmayacak şekilde bir kereliğine tabloyu oluşturmak için son 30 gün içindeki herhangi bir günü seçip Copy Data aktivitesi oluşturmamız gerekiyor. Öncelikle bir REST tipinde kaynak dataseti oluşturalım. Oluşturduğumuz REST linked service’i seçelim ve Relative URL bölümüne activityevents?startDateTime=’2024–01–17T00:00:00.000Z’&endDateTime=’2024–01–17T23:59:59.999Z’ gibi rastgele bir gün için URL’imizi yazalım.

Datasetimizi oluşturduktan sonra bir pipeline yaratıp Copy data aktivitesi ekleyelim. Source kısmında kaynak datasetimizi seçerek preview data butonuna tıklayalım.

Preview data sekmesinde metadatayı gösteren tek satırlık bir output göreceksiniz. Tek kayıt output’un gelmesi bu REST API’ın sayfalandırılmış olarak verildiğini gösteriyor. Bir sonraki sayfanın URL’ıini continuationUri olarak REST API bize veriyor.

Tüm verileri elde etmek için bu continuationUri’ı Copy data aktivitesinin Pagination rules bölümünde belirtmemiz gerekiyor. Bu pagination rule default olarak RFC5988'dir. Bunu Absolute URL olarak değiştiriyoruz ve bu URL’in Body alanındaki continuationUri olduğunu belirtiyoruz. Böylelikle ilgili RelativeURL için tüm kayıtları almış bulunuyoruz.

Source sekmemizi tamamladığımız için sink datasetimizi oluşturmaya geçiyoruz. Azure SQL Database tipi bir dataset seçerek ilgili tablo adımızı manuel olarak yazıp datasetimizi oluşturuyoruz. Oluşturduktan sonra Table option olarak Auto create table seçiyoruz.

Mapping sekmesinde Import schemas butonuna basarak ve Collection reference’ı belirterek mapping işlemini tamamlıyoruz. Mapping işleminde sadece kayıt bilgilerini mapping’e alıyoruz. Diğer ekstra bilgileri (continuationUri vb.) mapping’den kaldırıyoruz.

Pipeline’ımızı çalıştırarak tablomuzu oluşturmuş oluyoruz. Şimdi parametrik olacak şekilde ETL pipeline’ımızı modifiye edebiliriz. Oluşturduğumuz tabloyu öncesinde truncate ederek boşaltabiliriz.

Öncelikle kaç günlük veri çekmek istediğimizi belirtecek Days adlı bir variable tanımlıyoruz. 30 gün geriye kadar veri aktarabiliyoruz.

Bir ForEach loop aktivitesi ekliyoruz. Copy data aktivitemizi ForEach’in içine kesip yapıştırıyoruz ve ayarlar kısmında Items seçeneğine @range(1,variables(‘Days’)) fonksiyonunu yazıyoruz. Bu range fonksiyonu 1'den girdiğimiz variable gününe kadar bir array yaratmış oluyor.

Array içindeki her bir gün için bir RelativeURL dizayn edeceğiz. Şimdi source datasetimize geliyoruz. RelativeURL adlı string tipinde bir parametre oluşturuyoruz. Sonrsında Relative URL sekmesine bu parametreyi alacağını belirtiyoruz.

Pipeline’ımıza tekrar gelerek RelativeURL parametresi için bir expression tanımlıyoruz.

activityevents?startDateTime='@{getPastTime(int(item()), 'Day', 'yyyy-MM-dd')}T00:00:00.000Z'&endDateTime='@{getPastTime(int(item()), 'Day', 'yyyy-MM-dd')}T23:59:59.999Z'

@{getPastTime(int(item()), ‘Day’, ‘yyyy-MM-dd’) fonksiyonunun ilk parametresinde foreach array’inden gelen item’ı integer’a çeviriyoruz. getPastTime’ın ilk parametresi zaman aralığı bakımından ne kadar geriye gideceğini gösteriyor. İkinci parametre olan ‘Day’ ise bu zaman aralığının gün olduğunu belirtiyor. Üçüncü parametre olan ‘yyyy-MM-dd’ ise sonucun formatını belirtmiş oluyor.

Expression’da zamanı kendimiz belirliyoruz. Bu zaman UTC olarak baz alınır. UTC +3 zaman dilimine çevirmek için SQL’de modifikasyon işlemleri yapabilirsiniz.

Tablonun sadece son 15 günü tutmasını istediğimiz için bir Script aktivitesi ekleyerek pipeline her çalıştığında tabloyu boşaltıp tekrar veri yükleyen bir pipeline oluşturmuş oluyoruz.

Artık pipeline’ınızı çalıştırarak ve bir scheduled trigger ekleyerek tüm paketinizi otomatize edebilirsiniz.

Not: Alternatif olarak bu pipeline’ı modifiye ederek incremental load ETL metoduna da çevirebilirsiniz. Böylelikle her gün çalışarak sadece 1 günlük veri çekmiş olur ve pipeline operasyonel giderleri daha da azalabilir.

Oluşturduğumuz tablo üzerinden çeşitli view’lar hazırlayıp Power BI üzerinden bir denetim raporu tasarlayarak PBI Service üzerinden raporu ilgili paydaşlarla paylaşabilirsiniz.

Referanslar

--

--

Ataberk Teknekaya
PEAKUP Tech News

As a BI consultant with a passion for Azure Data Platform, SQL and Power BI, I write about real-life scenarios to help others in the field.