Src/Private/Report/Get-AbrAzDataCollectionRule.ps1

function Get-AbrAzDataCollectionRule {
    <#
    .SYNOPSIS
        Used by As Built Report to retrieve Azure Data Collection Rule information
    .DESCRIPTION
        Documents the configuration of Azure Data Collection Rules including data sources,
        Log Analytics destinations, and data flows.
    .NOTES
        Version: 0.1.0
        Author: Tim Carman
        Twitter: @tpcarman
        Github: tpcarman
    .EXAMPLE
 
    .LINK
 
    #>

    [CmdletBinding()]
    param ()

    begin {
        $LocalizedData = $reportTranslate.GetAbrAzDataCollectionRule
        Write-PScriboMessage ($LocalizedData.InfoLevel -f $InfoLevel.DataCollectionRule)
    }

    process {
        try {
            if ($InfoLevel.DataCollectionRule -ge 1) {
                $AzDcrs = Get-AzDataCollectionRule -ErrorAction SilentlyContinue | Sort-Object Name
                if ($AzDcrs) {
                    Write-PScriboMessage $LocalizedData.Collecting
                    Section -Style Heading4 $LocalizedData.Heading {
                        if ($Options.ShowSectionInfo) {
                            Paragraph $LocalizedData.SectionInfo
                            BlankLine
                        }

                        $AzDcrInfo = @()
                        foreach ($AzDcr in $AzDcrs) {
                            $DataSourceTypes = @()
                            if ($AzDcr.DataSourcePerformanceCounter) { $DataSourceTypes += $LocalizedData.PerformanceCounters }
                            if ($AzDcr.DataSourceWindowsEventLog)    { $DataSourceTypes += $LocalizedData.WindowsEventLogs }
                            if ($AzDcr.DataSourceSyslog)             { $DataSourceTypes += $LocalizedData.Syslog }
                            if ($AzDcr.DataSourceExtension)          { $DataSourceTypes += $LocalizedData.Extensions }
                            if ($AzDcr.DataSourceLogFile)            { $DataSourceTypes += $LocalizedData.LogFiles }
                            $DataSourceSummary = if ($DataSourceTypes) { $DataSourceTypes -join ', ' } else { $LocalizedData.None }

                            $DestinationCount = if ($AzDcr.DestinationLogAnalytic) { $AzDcr.DestinationLogAnalytic.Count } else { 0 }

                            $InObj = [Ordered]@{
                                $LocalizedData.Name                       = $AzDcr.Name
                                $LocalizedData.ResourceGroup              = $AzDcr.ResourceGroupName
                                $LocalizedData.Location                   = $AzLocationLookup."$($AzDcr.Location)"
                                $LocalizedData.Subscription               = "$($AzSubscriptionLookup.(($AzDcr.Id).split('/')[2]))"
                                $LocalizedData.SubscriptionID             = ($AzDcr.Id).split('/')[2]
                                $LocalizedData.Description                = if ($AzDcr.Description) { $AzDcr.Description } else { $LocalizedData.None }
                                $LocalizedData.DataSources                = $DataSourceSummary
                                $LocalizedData.LogAnalyticsDestinations   = $DestinationCount
                                $LocalizedData.ProvisioningState          = $AzDcr.ProvisioningState
                            }

                            if ($Options.ShowTags) {
                                $InObj[$LocalizedData.Tags] = if ($null -eq $AzDcr.Tag -or $AzDcr.Tag.Count -eq 0) {
                                    $LocalizedData.None
                                } else {
                                    ($AzDcr.Tag.Keys | ForEach-Object { "$_`:`t$($AzDcr.Tag[$_])" }) -join [Environment]::NewLine
                                }
                            }

                            $AzDcrInfo += [PSCustomObject]$InObj
                        }

                        if ($Healthcheck.DataCollectionRule.ProvisioningState) {
                            $AzDcrInfo | Where-Object { $_.$($LocalizedData.ProvisioningState) -ne 'Succeeded' } | Set-Style -Style Critical -Property $LocalizedData.ProvisioningState
                        }

                        if ($InfoLevel.DataCollectionRule -ge 2) {
                            Paragraph ($LocalizedData.ParagraphDetail -f $AzSubscription.Name)
                            foreach ($AzDcrItem in $AzDcrInfo) {
                                $DcrName = $AzDcrItem.($LocalizedData.Name)
                                $DcrRg   = $AzDcrItem.($LocalizedData.ResourceGroup)
                                $FullDcr = $AzDcrs | Where-Object { $_.Name -eq $DcrName -and $_.ResourceGroupName -eq $DcrRg }
                                Section -Style NOTOCHeading5 -ExcludeFromTOC $DcrName {
                                    $TableParams = @{
                                        Name         = "$($LocalizedData.TableHeading) - $DcrName"
                                        List         = $true
                                        ColumnWidths = 40, 60
                                    }
                                    if ($Report.ShowTableCaptions) {
                                        $TableParams['Caption'] = "- $($TableParams.Name)"
                                    }
                                    $AzDcrItem | Table @TableParams

                                    if ($FullDcr.DestinationLogAnalytic) {
                                        Section -Style NOTOCHeading6 -ExcludeFromTOC $LocalizedData.Destinations {
                                            $DestInfo = @()
                                            foreach ($Dest in $FullDcr.DestinationLogAnalytic) {
                                                $InObj = [Ordered]@{
                                                    $LocalizedData.DestinationName = $Dest.Name
                                                    $LocalizedData.WorkspaceId     = $Dest.WorkspaceResourceId
                                                }
                                                $DestInfo += [PSCustomObject]$InObj
                                            }
                                            $TableParams = @{
                                                Name         = "$($LocalizedData.Destinations) - $DcrName"
                                                List         = $false
                                                ColumnWidths = 35, 65
                                            }
                                            if ($Report.ShowTableCaptions) {
                                                $TableParams['Caption'] = "- $($TableParams.Name)"
                                            }
                                            $DestInfo | Table @TableParams
                                        }
                                    }

                                    if ($FullDcr.DataFlow) {
                                        Section -Style NOTOCHeading6 -ExcludeFromTOC $LocalizedData.DataFlows {
                                            $FlowInfo = @()
                                            foreach ($Flow in $FullDcr.DataFlow) {
                                                $InObj = [Ordered]@{
                                                    $LocalizedData.Streams      = ($Flow.Stream -join ', ')
                                                    $LocalizedData.Destinations = ($Flow.Destination -join ', ')
                                                }
                                                $FlowInfo += [PSCustomObject]$InObj
                                            }
                                            $TableParams = @{
                                                Name         = "$($LocalizedData.DataFlows) - $DcrName"
                                                List         = $false
                                                ColumnWidths = 55, 45
                                            }
                                            if ($Report.ShowTableCaptions) {
                                                $TableParams['Caption'] = "- $($TableParams.Name)"
                                            }
                                            $FlowInfo | Table @TableParams
                                        }
                                    }
                                }
                            }
                        } else {
                            Paragraph ($LocalizedData.ParagraphSummary -f $AzSubscription.Name)
                            BlankLine
                            $TableParams = @{
                                Name         = "$($LocalizedData.TableHeading) - $($AzSubscription.Name)"
                                List         = $false
                                Columns      = $LocalizedData.Name, $LocalizedData.ResourceGroup, $LocalizedData.Location, $LocalizedData.LogAnalyticsDestinations, $LocalizedData.ProvisioningState
                                ColumnWidths = 25, 20, 15, 25, 15
                            }
                            if ($Report.ShowTableCaptions) {
                                $TableParams['Caption'] = "- $($TableParams.Name)"
                            }
                            $AzDcrInfo | Table @TableParams
                        }
                    }
                }
            }
        } catch {
            Write-PScriboMessage -IsWarning "$($LocalizedData.ErrorMessage) $($_.Exception.Message)"
        }
    }

    end {}
}