AnalysisServices Azure

Azure Analysis Cube verification

This power Shell scripts gives each table processing date on mail .

This power Shell Scripts will fetch the data from Azure analysis services and send email to email id with each cube table process date like below :-

#Install Join Module

#connectionstring = "Provider=MSOLAP;Data Source=<Servername>;Initial Catalog=cube name;User ID=app:XXX;Password=<>.;Persist Security Info=True;Impersonation Level=Impersonate"

$cred = Get-AutomationPSCredential -Name 'aasautomationcred'
$ServerName = "servername"
#$DatabaseNames = "cubename"
$TenantId = "XXX"

$FIRSTDAYOFMONTH=GET-DATE -Format o -Day 1 -Hour 0 -Minute 0 -Second 0 | ForEach-Object { $_ -replace “:”, “.” }
$FIRSTDAYOFMONTH

$table = ''
$tableCubeStruct = ''
$htmlBody = "
<html>
<style>
table, th, td {
  border:1px solid black;
}
</style>
<body>
<h1>Monitor Current Status of Cube Processing.<br><br></h1>"

$tablebody = "<table style=`"width:50%`">"

$tableCaption = ''
$tableHeader = "<tr>
    <th>TableName</th>
    <th>PartitionName</th>
    <th>RefreshDate</th>
  </tr>"

#$tableNameAndCount = ''

$htmlfooter = "
</body>
</html>"


foreach ($DatabaseName in $DatabaseNames)
{
    Write-Output $DatabaseNam
    #Read all Tables in the Cubes
    [xml]$TableList = Invoke-ASCmd -Server $ServerName -Database $DatabaseName -Credential $cred -Query "select [ID],[Name] AS TableName from `$SYSTEM.TMSCHEMA_Tables"
    $lookupList = [PSCustomObject]$TableList.return.root.row | Select-Object -Property ID, TableName 

    #Read all partition in the Cube
    [xml]$XmlPartition = Invoke-ASCmd -Server $ServerName -Database $DatabaseName -Credential $cred -Query "SELECT [ID] AS [PartID],[Name],tableID,ModifiedTime,RefreshedTime  FROM `$SYSTEM.TMSCHEMA_PARTITIONS"
    $partitionlist = [PSCustomObject]$XmlPartition.return.root.row  | Select-Object -Property PartID,Name,tableID,ModifiedTime,RefreshedTime  

    $finallist = $partitionlist  | Group-Object -Property tableID |ForEach-Object{$_.Group | Sort-Object ModifiedTime | Select-Object -Last 1} | Select-Object -Property PartID,Name,tableID,ModifiedTime,RefreshedTime
    $TableCount = @($finallist).Count
    $tableBodytag = ''
    $tableCaption = "<caption style=`"text-align:left`"><b>$($DatabaseName) : $($TableCount)</b></caption>"
    $tableBodytag = $tablebody + $tableCaption + $tableHeader
    $tableOutput = Join-Object -Left $lookupList -Right $finallist -LeftJoinProperty 'ID' -RightJoinProperty 'tableID' -Type 'OnlyIfInBoth' | Select-Object -Property PartID,Name,ModifiedTime,RefreshedTime,TableName


    $tableOutput | ForEach-Object -Process { 
    if ($_.RefreshedTime -lt $FIRSTDAYOFMONTH){
            $table = $table + "  <tr>
            <td>$($_.TableName)</td>
            <td>$($_.Name)</td>
            <td bgcolor=`"red`">$($_.RefreshedTime)</td>
            </tr>"

        }
        else{
            $table = $table + "  <tr>
            <td>$($_.TableName)</td>
            <td>$($_.Name)</td>
            <td bgcolor=`"green`">$($_.RefreshedTime)</td>
            </tr>"
        } }
    $tableCubeStruct = $tableCubeStruct + $tableBodytag + $table +"</table> <br><br>"
    $table = ''
}

$ServerName = "second server name if you have "
$DatabaseNames = "cubename"
foreach ($DatabaseName in $DatabaseNames)
{
    Write-Output $DatabaseNam
    #Read all Tables in the Cubes
    [xml]$TableList = Invoke-ASCmd -Server $ServerName -Database $DatabaseName -Credential $cred -Query "select [ID],[Name] AS TableName from `$SYSTEM.TMSCHEMA_Tables"
    $lookupList = [PSCustomObject]$TableList.return.root.row | Select-Object -Property ID, TableName 

    #Read all partition in the Cube
    [xml]$XmlPartition = Invoke-ASCmd -Server $ServerName -Database $DatabaseName -Credential $cred -Query "SELECT [ID] AS [PartID],[Name],tableID,ModifiedTime,RefreshedTime  FROM `$SYSTEM.TMSCHEMA_PARTITIONS"
    $partitionlist = [PSCustomObject]$XmlPartition.return.root.row  | Select-Object -Property PartID,Name,tableID,ModifiedTime,RefreshedTime  

    $finallist = $partitionlist  | Group-Object -Property tableID |ForEach-Object{$_.Group | Sort-Object ModifiedTime | Select-Object -Last 1} | Select-Object -Property PartID,Name,tableID,ModifiedTime,RefreshedTime
    $TableCount = @($finallist).Count
    $tableBodytag = ''
    $tableCaption = "<caption style=`"text-align:left`"><b>$($DatabaseName) : $($TableCount)</b></caption>"
    $tableBodytag = $tablebody + $tableCaption + $tableHeader
    $tableOutput = Join-Object -Left $lookupList -Right $finallist -LeftJoinProperty 'ID' -RightJoinProperty 'tableID' -Type 'OnlyIfInBoth' | Select-Object -Property PartID,Name,ModifiedTime,RefreshedTime,TableName


    $tableOutput | ForEach-Object -Process { 
    if ($_.RefreshedTime -lt $FIRSTDAYOFMONTH){
            $table = $table + "  <tr>
            <td>$($_.TableName)</td>
            <td>$($_.Name)</td>
            <td bgcolor=`"red`">$($_.RefreshedTime)</td>
            </tr>"

        }
        else{
            $table = $table + "  <tr>
            <td>$($_.TableName)</td>
            <td>$($_.Name)</td>
            <td bgcolor=`"green`">$($_.RefreshedTime)</td>
            </tr>"
        } }
    $tableCubeStruct = $tableCubeStruct + $tableBodytag + $table +"</table> <br><br>"
    $table = ''
}




$htmltext = $($htmlBody) + $($tableCubeStruct) + $($htmlfooter)

#Write-Output $htmltext
#,"emailid","emailid2","emailid3"

$Parameters = @{
    FromAddress = "donotreply@notreply.com"
    ToAddress   = "email address"
    Subject     = "Important : Production Cube Processing Status"
    BodyAsHTML  = $htmltext
    Token       = "SG.XXX"
    FromName    = "Monitoring"
}
Send-PSSendGridMail @Parameters

Leave a Reply

Your email address will not be published. Required fields are marked *

Back To Top