power bi with powershell data source log

Merhabalar, iyi günler.

Bugün Microsoft’un birbirinden bağımsız veri kaynaklarınızı tutarlı, görsel olarak sürükleyici ve etkileşimli öngörülere dönüştürmenizi sağlamak için birlikte çalışan yazılım hizmetlerinden, uygulamalardan ve bağlayıcılardan oluşan bir koleksiyonu olan Power BI’ın PowerShell üzerinde veri kaynağı bilgi ve işlem takibi adına neler yapılabileceğine yönelik aktarımlarda bulunmaya çalışacağım.

Şimdiden iyi okumalar.

***

Geçmiş PowerShell yazılarımızda;

  • PowerShell üzerinde Power BI kullanımı, (EK)
  • PowerShell üzerinden Power BI kaynakları listesi elde edilmesi, (EK)
  • PowerShell üzerinden Power BI kullanıcı listesi elde edilmesi, (EK)
  • PowerShell üzerinden Power BI Kullanıcı dökümleri/özetleri elde edilmesi, (EK)
  • PowerShell üzerinden Power BI kullanıcı eylemleri/işlemleri elde edilmesi (EK)

konularına yönelik aktarımlarda bulunmuştuk.

Bu yazıda sistem ve işlem geçmişi takiplerimize devam ederek;

  • Mevcut kaynaklar listesi, 
  • Kaynakların çalışma durumlarının dökümleri/özetleri

konularını ele almaya çalışacağız.

Dilerseniz hızlıca önceki yazılarımızla edindiğimiz bilgiler dahilinde işlemlere başlayalım.

Kurgu olarak; Power BI üzerindeki çalışma alanlarına, oradanda ilgili rapor kaynakları (Veri Kaynakları) bilgilerine ulaşıp servis üzerinden bu bilgiler ile kaynak bazlı geçmişleri elde etmeye çalışacağız. 

Öncelikle Power BI hizmetine bağlanalım;

Connect-PowerBIServiceAccount
login power bi service with powershell

Dilerseniz parametrik olarakta erişimde bulunabilirsiniz;
*Görev (Task) oluşturulacak ise zorunlu olacaktır.

$PBIAdminUPN=" ORGANIZASYON YONETICI KULLANICINIZ          "
$PBIAdminPW =" ORGANIZASYON YONETICI KULLANICISI PAROLANIZ "

$Security     = ConvertTo-SecureString $PBIAdminPW -AsPlainText -Force
$Credential   = New-Object System.Management.Automation.PSCredential($PBIAdminUPN,$Security)

Connect-PowerBIServiceAccount -Credential $Credential

Görüntülendiği gibi servise erişebiliyoruz, ikinci adım olarak ise çalışma alanlarımıza ulaşmamız gerekiyor.
Önceki çalışmalarımızdan edindiğimiz bilgiler dahilinde çalışma alanı sayısı ve listesine ulaşalım;

$Workspaces = Get-PowerBIWorkspace

"CALISMA ALANI SAYISI: " + $Workspaces.Id.Count
"*********************"
"CALISMA ALANLARI;"
$Workspaces.Name
power bi service with powershell workspace list and number of workspace

Şuan çalışma alanlarına da ulaşabilir durumdayız.
Peki; verikaynaklarına ulaşmayı deneyelim.
Önceki çalışmamızda yer alan kaynak erişim formatımız üzerinden listelemede bulunalım;

$DataSets = Get-PowerBIDataset
"VERI KAYNAGI SAYISI: " + $DataSets.Id.Count
"*********************"
"VERI KAYNAKLARI;"
$DataSets.Name
power bi service with powershell datset list and number of dataset all workspace

Şimdide çalışma alanlarında yer alan ilgili verikaynaklarına ulaşmayı deneyelim.
Bunun için verikaynağı erişim yönteminde; çalışma alanına ait tekil erişim değerini kullanmalıyız. (Id)
*Yani veri kaynağı erişiminde bulunurken ilgili çalışma alanına yönelik belirteçte bulunmamız gerekmektedir.

Bunu atama ile kullandığımız parametrik değerimizi çalışma alanına yönelik çağırarak deneyelim;

$DataSets = Get-PowerBIDataset -WorkspaceId $workspace.Id
power bi service with powershell datset list and number of dataset

Görüldüğü üzere veri kaynaklarına ulaşabiliyoruz fakat bunu ilgili çalışma alanı altında ilgili rapora ulaşmayı deneyerek gerçekleştirmemiz gerekmektedir.
Önceki çalışmalarımız da kulladığımız döngü yöntemleri ile bunu gerçekleştirmeye çalışalım.
Yani;

foreach($workspace in $Workspaces)
{
    "DONGU SORGULAMASI"
}

formunda oluşturmaya çalışalım.
Bu format üzerinde çalışma alanı ve ilgili veri kaynaklarını parametrik olarak düzenlediğimizde;

foreach($workspace in $Workspaces)
{
    $DataSets = Get-PowerBIDataset -WorkspaceId $workspace.Id
    $DataSets
}
power bi service with powershell all dataset list all workspace list

ilgili çalışma alanı altındaki veri kaynaklarına da ulaşabiliyoruz.
Şimdi Microsoft’un sağladığı veri kaynağı yenileme geçmişi API hizmetine göz atmamız gerekmektedir.
Bağlantı: Datasets – Get Refresh History

İlgili API hizmeti erişim formatı;

GET https://api.powerbi.com/v1.0/myorg/datasets/{datasetId}/refreshes

şeklindedir.
Fakat Power BI servis üzerindeki bir veri kaynağına erişim bağlantısını incelediğimizde ise formatı;

power bi service with new dataset url

şeklinde görüntülenmektedir.
Yani aslında kullanacağımız API formatı;

.../groups/workspaceId/datasets/{datasetId}/refreshes

özet şeklinde olacaktır.
O halde istemci ana gövdesi;

$Results = Invoke-PowerBIRestMethod -Url $URL -Method Get | ConvertFrom-Json

şeklinde, parametrik olarak yer alacak URL ise;

$URL = "groups/" + $workspace.id + "/datasets/" + $dataset.id + "/refreshes"

şeklinde olacaktır.
Fakat bu sorgulamayı veri kaynağı seviyesinde yapmamız gerekmektedir.
Yani tekrar çalıştırdığımızda üst kısımdaki örneğimizdeki gibi tekbir kaynak için bilgi geri döndürecektir.
*Microsoft 365 Usage Analytics örneği gibi.

Tekrardan bir döngü oluşturarak bunu kurgulamamız gerekiyor.
Yani;

foreach($workspace in $Workspaces)
{
     "CALISMA ALANI SORGULAMASI" 
    foreach($dataset in $DataSets)
    {
     "VERI KAYNAGI SORGULAMASI"  
    }
}

formunda planlamamız gerekmektedir.
Bu format üzerinde çalışma alanı ve ilgili veri kaynaklarını parametrik olarak düzenleyip, istemcimizi de eklediğimizde;

foreach($workspace in $Workspaces)
{
    $DataSets = Get-PowerBIDataset -WorkspaceId $workspace.Id | where {$_.isRefreshable -eq $true}
    foreach($dataset in $DataSets)
    {
        $URL = "groups/" + $workspace.id + "/datasets/" + $dataset.id + "/refreshes"
        #$OutFile = $ExportFolder + '\' + $workspace.Name + '-' + $dataset.Name + '.json'
        $Results = Invoke-PowerBIRestMethod -Url $URL -Method Get | ConvertFrom-Json

        $Results
    }
}

çıktısına ulaşmaktayız.
İlgili kod çıktımızı çalıştırıp, kontrol ettiğimizde API üzerinden kaynak bilgilerine erişebildiğimiz görüntülenmektedir.

power bi service dataset history values

Buraya kadar olan konsol çıktımızda son aldığımız görüntü dahilinde eksik bazı bilgiler yer almaktadır.
Bunlar;

  • Çalışma alanı adı (Workspace Name),
  • Veri kaynağı adı (Dataset Name),
  • Hata çıktıları (Error Code and Error Description)

bilgileri olarak görüntülenmektedir.
Bu bilgilerin hepsini tek işlemde kullanabilmek için bir obje modellemesinde bulunmamız gerekmektedir.
Sonrasında bu obje ile ilgili işlemler adına obje üzerinde dönerek ilgili çıktıları istenilen formatlarda kullanabiliriz.
(MsSQL tablo içi aktarımı, .csv çıktısı, .json çıktısı vb.)

Öneri:PowerShell objeleri hakkında Microsoft bilgilendirmelerine göz atabilirsiniz.
İlgili bağlantı için lütfen tıklayınız…

Kullanacağımız örnek obje formatımız;

$column= New-Object psobject
$column| Add-Member -Name "SUTUN ADI" -Value $DEGERI -MemberType NoteProperty

kullanım görünümü ise;

$column= New-Object psobject
$column| Add-Member -Name "Workspace" -Value $workspace.Name -MemberType NoteProperty

şeklinde olacaktır.
Burada oluşturulacak nesne için -MemberType (Üye-Alan Türü) belirteci belirtilmelidir.
Aksi halde;

power bi service dataset history membertype values

derleyici her işlem adımında sizden ilgili alanın türünü belirtmenizi isteyecektir.
Buraya kadar ilgili çalışma alanlarındaki veri kaynaklarının geçmişlerine ulaşabildiğimiz görüntülenmektedir.
Bu çalışma alanlarında yer alan bilgileri tek bir obje üzerinde derleyip sonrasında işlemde bulunabilmemiz için tekrar bir döngü oluşturmamız gerekmektedir.

Yeni kurgulanacak yapımız;

foreach($workspace in $Workspaces)
{
  "CALISMA ALANI SORGULAMASI" 
    foreach($workspace in $Workspaces)
    {
      "VERI KAYNAGI SORGULAMASI"
        foreach($result in $Results.value)
        {
          "VERI KAYNAGI YENILEME GECMISI SORGULAMASI"  
        }
    }
}

şeklinde olacaktır.
Bu kurguda kullanılacak obje formatımız ise;

$column= New-Object psobject
$column| Add-Member -Name "Workspace"   Value $workspace.Name     MemberType NoteProperty
$column| Add-Member -Name "Dataset"     Value $dataset.Name       MemberType NoteProperty
$column| Add-Member -Name "refreshType" Value $result.refreshType MemberType NoteProperty
$column| Add-Member -Name "startTime"   Value $result.startTime   MemberType NoteProperty
$column| Add-Member -Name "endTime"     Value $result.endTime     MemberType NoteProperty
$column| Add-Member -Name "status"      Value $result.status      MemberType NoteProperty

şeklinde olacaktır.
Burada yenileme geçmişine yönelik hata çıktıları eksik görüntülenmektedir.
Onu da yenileme geçmişi geri dönüş parametresi üzerinden edinip;

$result.serviceExceptionJson | ConvertFrom-Json -ErrorAction SilentlyContinue

parametreye atayarak kullanabiliriz;

$errorDetails = $result.serviceExceptionJson | ConvertFrom-Json -ErrorAction SilentlyContinue

O halde son obje görünümüz;

$column= New-Object psobject
$column| Add-Member -Name "Workspace"        -Value $workspace.Name                -MemberType NoteProperty
$column| Add-Member -Name "Dataset"          -Value $dataset.Name                  -MemberType NoteProperty
$column| Add-Member -Name "refreshType"      -Value $result.refreshType            -MemberType NoteProperty
$column| Add-Member -Name "startTime"        -Value $result.startTime              -MemberType NoteProperty
$column| Add-Member -Name "endTime"          -Value $result.endTime                -MemberType NoteProperty
$column| Add-Member -Name "status"           -Value $result.status                 -MemberType NoteProperty
$column| Add-Member -Name "errorCode"        -Value $errorDetails.errorCode        -MemberType NoteProperty
$column| Add-Member -Name "errorDescription" -Value $errorDetails.errorDescription -MemberType NoteProperty

şeklindedir.
Hızlıca kodumuzu çalıştırıp çıktıya göz atalım;
*Kod öngörünümü için çıktı alanı daraltılmıştır.

power bi service dataset history all values

Konsol alanında çıktı elde edebildiğimiz görüntülenmektedir.
Bu işlemleri sonuç odaklı olarak daha anlamlı ve kullanımı kolay hale getirelim.
Önceki çalışmamızdan esinlenerek bu bilgileri bir MsSQL veritabanı üzerindeki tabloya yazalım.

Öncelikle ilgili çıktılarımıza yönelik bir tablo oluşturalım;
*Bireysel SQL formatı görünümü.

USE [PowerBIServiceLog]
GO

/****** Object:  Table [dbo].[DataSetRefreshHistory]    Script Date: 20.11.2022 19:12:01 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[DataSetRefreshHistory](
	[Workspace] [nvarchar](500) NULL,
	[Dataset] [nvarchar](250) NULL,
	[RefreshType] [nvarchar](50) NULL,
	[StartTime] [datetime] NULL,
	[EndTime] [datetime] NULL,
	[Status] [nvarchar](250) NULL,
	[ErrorCode] [nvarchar](250) NULL,
	[ErrorDescription] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Kayıt altına alınacak parametreleri obje üzerinden kullanabilmek için ise;

$Workspace1       =$column.Workspace
$Dataset1         =$column.Dataset
$RefreshType1     =$column.refreshType
$StartTime1       =$column.startTime
$EndTime1         =$column.endTime
$Status1          =$column.status
$Status1          =$column.errorCode
$ErrorDescription1=$column.errorDescription

formatına dönüştürelim, ve son olarak tablo aktarımı için kullanılacak sorgu ve ADO.Net tanımlamalarını oluşturalım;

$insertquery="
INSERT INTO 
$tableName
          (
                   [Workspace]
                  ,[Dataset]
                  ,[RefreshType]
                  ,[StartTime]
                  ,[EndTime]
                  ,[Status]
                  ,[ErrorCode]
                  ,[ErrorDescription]
                  )
                  VALUES
                  (
                  '$Workspace1',
                  '$Dataset1',
                  '$RefreshType1',
                  '$StartTime1',
                  '$EndTime1',
                  '$Status1',
                  '$ErrorCode1',
                  '$ErrorDescription1'
               )"
$Command.CommandText = $insertquery
$Command.ExecuteNonQuery()  

Aynı alanları MsSQL üzerinde tablo formatında oluşturduğumuzda ise;

power bi service dataset history all mssql fields

şeklinde görüntülemekteyiz.
Son genel kod görünümü ise;

Connect-PowerBIServiceAccount
$Workspaces = Get-PowerBIWorkspace

$serverName   = "SUNUCU ADINIZ    "
$databaseName = "ILGILI VERITABANI"
$tableName    = "ILGILI TABLO     "

$Connection                  = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString = "server='$serverName';database='$databaseName';trusted_connection=true;"

$Connection.Open()

$Command             = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection  = $Connection

foreach($workspace in $Workspaces)
{
    
    $DataSets = Get-PowerBIDataset -WorkspaceId $workspace.Id
    foreach($dataset in $DataSets)
    {
        $URL = "groups/" + $workspace.id + "/datasets/" + $dataset.id + "/refreshes"
        $Results = Invoke-PowerBIRestMethod -Url $URL -Method Get | ConvertFrom-Json
        foreach($result in $Results.value)
        {

            $errorDetails = $result.serviceExceptionJson | ConvertFrom-Json -ErrorAction SilentlyContinue
            $column= New-Object psobject
            $column| Add-Member -Name "Workspace"        -Value $workspace.Name                -MemberType NoteProperty
            $column| Add-Member -Name "Dataset"          -Value $dataset.Name                  -MemberType NoteProperty
            $column| Add-Member -Name "refreshType"      -Value $result.refreshType            -MemberType NoteProperty
            $column| Add-Member -Name "startTime"        -Value $result.startTime              -MemberType NoteProperty
            $column| Add-Member -Name "endTime"          -Value $result.endTime                -MemberType NoteProperty
            $column| Add-Member -Name "status"           -Value $result.status                 -MemberType NoteProperty
            $column| Add-Member -Name "errorCode"        -Value $errorDetails.errorCode        -MemberType NoteProperty
            $column| Add-Member -Name "errorDescription" -Value $errorDetails.errorDescription -MemberType NoteProperty

            $Workspace1       =$column.Workspace
            $Dataset1         =$column.Dataset
            $RefreshType1     =$column.refreshType
            $StartTime1       =$column.startTime
            $EndTime1         =$column.endTime
            $Status1          =$column.status
            $Status1          =$column.errorCode
            $ErrorDescription1=$column.errorDescription

            $insertquery="
                  INSERT INTO 
                  $tableName
                  (
                   [Workspace]
                  ,[Dataset]
                  ,[RefreshType]
                  ,[StartTime]
                  ,[EndTime]
                  ,[Status]
                  ,[ErrorCode]
                  ,[ErrorDescription]
                  )
                  VALUES
                  (
                  '$Workspace1',
                  '$Dataset1',
                  '$RefreshType1',
                  '$StartTime1',
                  '$EndTime1',
                  '$Status1',
                  '$ErrorCode1',
                  '$ErrorDescription1'
                  )"
                  $Command.CommandText = $insertquery
                  $Command.ExecuteNonQuery()  
        }
        $Connection.Close()
    }
}

şeklindedir.
Herşey hazır olduğuna göre ana PowerShell kod ekranımıza dönüp ilgili kodumuzu çalıştıralım;

power bi service dataset history code script

Önceki yazılarımızdan aşina olduğumuz herbir log kaydı için 1’lerin olduğu bir çıktı görüntülüyoruz.
Peki MsSQL üzerindeki tablomuza dönecek olursak;

power bi service dataset history all mssql data view

mevcut verikaynağı yenileme geçmişi bilgilerinin kayıt altına alınmış olduğunu görüntülüyoruz. (Bilgi içerenleri.)
Burada unutulmaması gereken ise bu kayıtların genel olarak alındığıdır. (Hepsi)
Burada sorgulama kısmına çeşitli kıstaslar belirleyip geçmişe erişebilirsiniz.
Sonrasında ise bu formatı bir System Task (Sistem Görevi) üzerinde periyordik olarak (Günlük gibi.) çalıştırdığınızda hep bir gün öncesine ait kayıt bilgilerini sisteme aktarıyor olacaktır.
*İlgili format gün içerisinde çalıştırılırsa; ilgili değerlerin silinmesi gerekecektedir, aksi halde sistem üzerinde çift kayıt bilgisi problemi oluşacaktır.

Bugün; PowerShell üzerinde Power BI organizasyonda yer alan verikaynakları yenileme geçmişi dökümlerine yönelik bilgilere ulaşmaya çalıştık.

Bir sonraki PowerShell yazımızda/yazılarımızda;

  • Hata Çıktıları,
  • Öğelerin Dışarı Aktarılması,
  • Veri Kaynağı Yenilemesi

gibi başlıkları ele alıp, ek işlemlerde bulunuyor olacağız.

Tüm işlemlere yönelik kod dökümünü;
https://github.com/miracozturk17/PowerShellQueryChallenge
bağlantısı üzerinden elde edebilirsiniz.

Gelecek yazılarda görüşmek üzere.

İyi çalışmalar…

, ,

İlgili Yazılar