src/Get-DefaultAlertRules.ps1

function Get-DefaultAlertRules {
    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    Param()

    @(
        [PSCustomObject]@{
            ResourceType         = 'Microsoft.Web/Sites'
            # Filter is expression that matches resource is it applicaple or not.
            # This can be used to extend alerts to specific resource instead of all instances of one type.
            Name                 = 'Few Server errors'
            Description          = 'Too many server errors!'
            AlertValidationSteps = @("https://todo/Insights+-+Server+errors")
            AlertFixSteps        = @("https://todo/Fixing+web+app")
            Criteria             = { New-AzMetricAlertRuleV2Criteria -MetricName 'Http5xx' -TimeAggregation Total -Operator GreaterThan -Threshold 5 }
            Severity             = "Warning"
            WindowSize           = New-TimeSpan -Minutes 5
            Frequency            = New-TimeSpan -Minutes 5
        }
        [PSCustomObject]@{
            ResourceType         = 'Microsoft.Web/Sites'
            Name                 = 'Many Server errors'
            Description          = 'Way too many server errors!'
            AlertValidationSteps = @("https://todo/Insights+-+Server+errors")
            AlertFixSteps        = @("https://todo/Fixing+web+app")
            Criteria             = { New-AzMetricAlertRuleV2Criteria -MetricName 'Http5xx' -TimeAggregation Total -Operator GreaterThan -Threshold 100 }
            Severity             = "Critical"
            WindowSize           = New-TimeSpan -Minutes 5
            Frequency            = New-TimeSpan -Minutes 5
        }
        [PSCustomObject]@{
            ResourceType  = 'Microsoft.Web/serverFarms'
            Name          = 'CPU percentage'
            Description   = 'CPU Usage too high!'
            AlertFixSteps = @("https://todo/Performance+scaling+-+WebApp")
            Criteria      = { New-AzMetricAlertRuleV2Criteria -MetricName 'CpuPercentage' -TimeAggregation Average -Operator GreaterThan -Threshold 80 }
            Severity      = "Warning"
            WindowSize    = New-TimeSpan -Minutes 5
            Frequency     = New-TimeSpan -Minutes 5
        }
        [PSCustomObject]@{
            ResourceType = 'Microsoft.Web/serverFarms'
            Name         = 'Memory percentage'
            Description  = 'Memory Usage too high!'
            Criteria     = { New-AzMetricAlertRuleV2Criteria -MetricName 'MemoryPercentage' -TimeAggregation Average -Operator GreaterThan -Threshold 80 }
            Severity     = "Warning"
            WindowSize   = New-TimeSpan -Minutes 5
            Frequency    = New-TimeSpan -Minutes 5
        }
        [PSCustomObject]@{
            ResourceType = 'Microsoft.Sql/servers/databases'
            Name         = 'CPU Percentage'
            Description  = 'CPU Usage too high!'
            Criteria     = { New-AzMetricAlertRuleV2Criteria -MetricName 'cpu_percent' -TimeAggregation Average -Operator GreaterThan -Threshold 80 }
            Severity     = "Information"
            WindowSize   = New-TimeSpan -Minutes 5
            Frequency    = New-TimeSpan -Minutes 5
        }
        [PSCustomObject]@{
            ResourceType = 'Microsoft.Sql/servers/databases'
            Name         = 'DTU consumption'
            Description  = 'DTU consumption too high!'
            Criteria     = { New-AzMetricAlertRuleV2Criteria -MetricName 'dtu_consumption_percent' -TimeAggregation Average -Operator GreaterThan -Threshold 80 }
            Severity     = "Information"
            WindowSize   = New-TimeSpan -Minutes 5
            Frequency    = New-TimeSpan -Minutes 5
        }
        [PSCustomObject]@{
            ResourceType  = 'Microsoft.Sql/servers/databases'
            Name          = 'SQL Storage'
            Description   = 'SQL storage space is getting low!'
            AlertFixSteps = @("https://todo/Database+-+Storage+size")
            Criteria      = { New-AzMetricAlertRuleV2Criteria -MetricName 'storage_percent' -TimeAggregation Average -Operator GreaterThan -Threshold 80 }
            Severity      = "Error"
            WindowSize    = New-TimeSpan -Minutes 5
            Frequency     = New-TimeSpan -Minutes 5
        }
        [PSCustomObject]@{
            ResourceType = 'Microsoft.Cache/Redis'
            Name         = 'Server load'
            Description  = 'Server load too high!'
            Criteria     = { New-AzMetricAlertRuleV2Criteria -MetricName 'serverLoad' -TimeAggregation Average -Operator GreaterThan -Threshold 80 }
            Severity     = "Information"
            WindowSize   = New-TimeSpan -Minutes 5
            Frequency    = New-TimeSpan -Minutes 5
        }
        [PSCustomObject]@{
            ResourceType = 'Microsoft.Cache/Redis'
            Name         = 'Server memory'
            Description  = 'Server memory percentace too high!'
            Criteria     = { New-AzMetricAlertRuleV2Criteria -MetricName 'usedmemorypercentage' -TimeAggregation Average -Operator GreaterThan -Threshold 80 }
            Severity     = "Information"
            WindowSize   = New-TimeSpan -Minutes 5
            Frequency    = New-TimeSpan -Minutes 5
        }
        [PSCustomObject]@{
            ResourceType = 'Microsoft.Cache/Redis'
            Name         = 'Redis processor'
            Description  = 'Redis processor load too high!'
            Criteria     = { New-AzMetricAlertRuleV2Criteria -MetricName 'percentProcessorTime' -TimeAggregation Average -Operator GreaterThan -Threshold 80 }
            Severity     = "Information"
            WindowSize   = New-TimeSpan -Minutes 5
            Frequency    = New-TimeSpan -Minutes 5
        }
        [PSCustomObject]@{
            ResourceType         = 'Microsoft.Insights/webtests'
            Name                 = "Availability percent"
            Description          = "Web app didn't respond multiple times in timely manner!"
            AlertValidationSteps = @("https://todo/Insights+-+Server+errors")
            AlertFixSteps        = @("https://todo/Fixing+web+app")
            Criteria             = {
                New-AzMetricAlertRuleV2DimensionSelection -DimensionName "availabilityResult/name" -ValuesToInclude $($_.Name) |
                New-AzMetricAlertRuleV2Criteria -MetricName "availabilityResults/availabilityPercentage" -TimeAggregation Average -Operator LessThan -Threshold 90
            }
            Severity             = "Critical"
            WindowSize           = New-TimeSpan -Minutes 5
            Frequency            = New-TimeSpan -Minutes 5
        }
    )
}