Public/Deploy/Monitor/serviceAlerts/New-CmAzMonitorServiceHealthAlerts.ps1

function New-CmAzMonitorServiceHealthAlerts {

    <#
        .Synopsis
         Allows definition and deployment of service health alerts.
 
        .Description
         Deploys service health alerts, which in turn are linked to specified action groups.
 
        .Parameter SettingsFile
         File path for the settings file to be converted into a settings object.
 
        .Parameter SettingsObject
         Object containing the configuration values required to run this cmdlet.
 
        .Parameter TagSettingsFile
         File path for the tag settings file to be converted into a tag settings object.
 
        .Component
         Monitor
 
        .Example
         New-CmAzMonitorServiceHealthAlerts -SettingsFile "c:\directory\settingsFile.yml" -Confirm:$false
 
        .Example
         New-CmAzMonitorServiceHealthAlerts -SettingsObject $settings
    #>


    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Medium")]
    param(
        [parameter(Mandatory = $true, ParameterSetName = "Settings File")]
        [string]$SettingsFile,
        [parameter(Mandatory = $true, ParameterSetName = "Settings Object")]
        [object]$SettingsObject,
        [String]$TagSettingsFile
    )

    $ErrorActionPreference = "Stop"

    try {

        Write-CommandStatus -CommandName $MyInvocation.MyCommand.Name

        $SettingsObject = Get-Settings -SettingsFile $SettingsFile -SettingsObject $SettingsObject -CmdletName (Get-CurrentCmdletName -ScriptRoot $PSCommandPath)

        if ($PSCmdlet.ShouldProcess((Get-CmAzSubscriptionName), "Deploy service health alerts")) {

            $resourceGroup = Check-MonitorResourceGroup -AlertType "ServiceHealth"

            $alerts = @()

            foreach ( $alert in $SettingsObject.alerts ) {

                Write-Verbose "Working on Alert group $($alert.name)"

                Set-GlobalServiceValues -GlobalServiceContainer $SettingsObject -ServiceKey "actionGroups" -ResourceServiceContainer $alert -IsDependency

                $alert.actionGroups = @()

                foreach ($actionGroup in $alert.service.dependencies.actionGroups) {
                    $alert.actionGroups += @{
                        actionGroupId = (Get-CmAzService -Service $actionGroup -ThrowIfUnavailable -ThrowIfMultiple).resourceId
                    }
                }

                $alert.description ??= "Service health alert"
                $alert.enabled ??= $true

                $alert.name = Get-CmAzResourceName -Resource "Alert" -Architecture "Monitor" -Location $SettingsObject.location -Name $alert.name

                $alert.condition = @{
                    allOf = @(
                        @{
                            field  = "category"
                            equals = "ServiceHealth"
                        }
                    )
                }

                $trackedEvents = @()

                foreach ( $eventType in $alert.eventTypes ) {

                    $trackedEvents += @{
                        field =  "properties.incidentType"
                        equals = $eventType
                    }
                }

                if ( !$trackedEvents ) {

                    $trackedEvents += @{
                        field =  "properties.incidentType"
                        equals = "Incident"
                    }
                }

                $alert.condition.allOf += @{ anyOf = $trackedEvents }

                $alert.condition.allOf += @{
                    field = "properties.impactedServices[*].ImpactedRegions[*].RegionName"
                    containsAny = $alert.regions
                }

                if ( !$alert.services ) {
                    $alert.condition.allOf += @{
                        field = "properties.impactedServices[*].ServiceName"
                        containsAny = @($alert.services)
                    }
                }

                Set-GlobalServiceValues -GlobalServiceContainer $SettingsObject -ServiceKey "serviceHealthAlert" -ResourceServiceContainer $alert

                $alerts += $alert

                Write-Verbose "Alert: $($alert.name) will be created.."
            }

            $deploymentName = Get-CmAzResourceName -Resource "Deployment" -Architecture "Monitor" -Location $resourceGroup.location -Name "New-CmAzMonitorServiceHealthAlerts"

            New-AzResourceGroupDeployment `
                -Name $deploymentName `
                -TemplateFile "$PSScriptRoot\New-CmAzMonitorServiceHealthAlerts.json" `
                -ResourceGroupName $resourceGroup.resourceGroupName `
                -TemplateParameterObject @{
                    Alerts = $alerts
                } `
                -Mode "Complete"

            Set-DeployedResourceTags -TagSettingsFile $TagSettingsFile -ResourceGroupIds $resourceGroup.resourceGroupName

            Write-CommandStatus -CommandName $MyInvocation.MyCommand.Name -Start $false
        }
    }
    catch {
        $PSCmdlet.ThrowTerminatingError($PSItem);
    }
}