Azure Monitor pozwala na konfigurację alertów, które zostaną wyzwolone w przypadku zwiększonego wykorzystania zasobów wybranego obiektu infrastruktury, np. przeciążonego CPU, dysku sieci, ale także w oparciu o przekroczenie licznika pewnych zdarzeń, jak np. liczba nieudanych logowań w określonym czasie. Poniżej możesz zobaczyć, jak stworzyć taki alert przy pomocy powershella.
Na początek należy się zalogować do Azure i w razie potrzeby wybrać subskrypcję:
Connect-AZAccount $subscription_name = 'XXX enter subscription name here XXX' Select-AzSubscription -SubscriptionName "$subscription_name" | Out-Null
$action_group_name = 'DBAADMIN' # limit 12 characters
$emails = ('one@example.com', 'two@example.com')
$description = "Please have a look at this issue!"
Teraz pora na zdefiniowanie kilku metryk. Dla własnej wygody robię to poprzez zdefiniowanie listy słowników:
$metric_alerts = @()
$condition = @{
'metric_name' = 'CPU Credits Consumed';
'threshold' = 80;
'window_size' = New-TimeSpan -Minutes 5;
'frequency' = New-TimeSpan -Minutes 1;
'aggregation' = 'Average';
'severity' = 3
}
$metric_alerts += $condition
$condition = @{
'metric_name' = 'CPU Credits Consumed';
'threshold' = 90;
'window_size' = New-TimeSpan -Minutes 5;
'aggregation' = 'Average';
'frequency' = New-TimeSpan -Minutes 1;
'severity' = 3
}
$metric_alerts += $condition
$object_RG = 'XXX enter servers resource group here XXX' $object_name = 'XXX enter servers name here XXX' $object = Get-AzVM -Name $object_name -ResourceGroupName $object_RG
foreach($condition in $metric_alerts){
set-metric_alert -object_RG $object_RG `
-object_name $object_name `
-object_id $object.Id `
-condition $condition `
-description $description `
-action_group_name $action_group_name `
-emails $emails
}
function set-metric_alert{
param(
[string]$object_RG,
[string]$object_name,
[string]$object_id,
$condition,
[string]$action_group_name, # limit 12 characters
[string[]]$emails,
[string]$description
)
Write-Output "Setting $object_name $($condition['metric_name']) $($condition['threshold'])"
# Condition
$metric_name = $condition['metric_name']
$threshold = $condition['threshold']
$window_size = $condition['window_size']
$aggregation = $condition['aggregation']
$frequency = $condition['frequency']
$severity = $condition['severity']
# Alert
$alert_RG = $object_RG
$alert_rule_name = "$metric_name $threshold ($severity $object_name)"
# Action
Write-Output " getting receiver"
$email_receiver_list = @()
foreach ($address in $emails){
$email_receiver_list += New-AzActionGroupReceiver -Name "Notify $address" `
-EmailReceiver -EmailAddress $address `
-UseCommonAlertSchema
}
# Action group
Write-Output " getting action group"
$action_group = Set-AzActionGroup -Name $action_group_name `
-ResourceGroupName $alert_RG `
-ShortName $action_group_name `
-Receiver $email_receiver_list `
-WarningAction SilentlyContinue
#Creates an ActionGroup reference object in memory
Write-Output " getting action group id"
$action_group_id = New-AzActionGroup -ActionGroupId $action_group.id
# Condition
Write-Output " getting condition"
$condition_rule = New-AzMetricAlertRuleV2Criteria -MetricName $metric_name `
-TimeAggregation $aggregation `
-Operator GreaterThan `
-Threshold $threshold `
-WarningAction SilentlyContinue
# Alert
Write-Output " setting alert"
Add-AzMetricAlertRuleV2 -Name $alert_rule_name `
-ResourceGroupName $alert_RG `
-WindowSize $window_size `
-Frequency $frequency `
-Description $description `
-TargetResourceId $object_id `
-Condition $condition_rule `
-ActionGroup $action_group_id `
-Severity $severity `
-WarningAction SilentlyContinue | Out-null
}
Oto komentarz do poszczególnych kroków:
- Na początku przyjmujemy parametry. Na uwagę zasługuje ewentualnie adres email – u nas jest to lista napisów [string[]]
- Dla wygody wyciągam definicję warunku wyzwolenia alertu do zmiennych lokalnych
- Każdy alert musi mieć nazwę i musi być umieszczony w jakiejś grupie zasobów. Tutaj założyłem, że alert powstanie w tej samej grupie zasobów, co monitorowany zasób, a nazwa będzie ustalona dynamicznie
- Alert będzie wysyłał powiadomienia, a tych powiadomień może być więcej. Wszystkie one będą umieszczone w action group. Dlatego:
- definiuję 'action group receiver’ polegającą na powiadomieniu administratora o sytuacji zaistniałej na serwerze. Tutaj jest to zrobione dla adresu email, ale możliwe jest dodanie także powiadomienia przez SMS, a idąc jeszcze dalej zamiast zwykłego powiadamiania, możnaby uruchamiać job-a, który być może zaistniały problem jest w stanie rozwiązać
- tworzę 'action group’, który łączy w sobie aktywności, które należy wykonać. Ze względów technicznych potrzebny jest obiekt w pamięci wskazujący na action group. Można go uzyskać za pomocą polecenia New-AzActionGroup
- W oparciu o przesłane warunki, budujemy obiekt Alert Rule. Podczas tworzenia tego obiektu, może być wyświetlany dodatkowy komunikat o zależnościach między obiektami, które są ukryte przed nami. Jeśli nie chcesz widzieć tych ostrzeżeń, dodaj do polecenia WarningAction
- Kluczowa sprawa – utworzenie alertu. Jedno polecenie, które łączy w sobie warunki wyzwolenia alertu z action group, obiektem, który ma być monitorowany, sposobem pomiaru wartości
I to w sumie tyle – od tej pory, gdy zostanie przekroczona wartość metryki, wyzwoli się alert, który wyśle maila. Oto cała zawartość skryptu:
function set-metric_alert{
param(
[string]$object_RG,
[string]$object_name,
[string]$object_id,
$condition,
[string]$action_group_name, # limit 12 characters
[string[]]$emails,
[string]$description
)
Write-Output "Setting $object_name $($condition['metric_name']) $($condition['threshold'])"
# Condition
$metric_name = $condition['metric_name']
$threshold = $condition['threshold']
$window_size = $condition['window_size']
$aggregation = $condition['aggregation']
$frequency = $condition['frequency']
$severity = $condition['severity']
# Alert
$alert_RG = $object_RG
$alert_rule_name = "$metric_name $threshold ($severity $object_name)"
# Action
Write-Output " getting receiver"
$email_receiver_list = @()
foreach ($address in $emails){
$email_receiver_list += New-AzActionGroupReceiver -Name "Notify $address" `
-EmailReceiver -EmailAddress $address `
-UseCommonAlertSchema
}
# Action group
Write-Output " getting action group"
$action_group = Set-AzActionGroup -Name $action_group_name `
-ResourceGroupName $alert_RG `
-ShortName $action_group_name `
-Receiver $email_receiver_list `
-WarningAction SilentlyContinue
#Creates an ActionGroup reference object in memory
Write-Output " getting action group id"
$action_group_id = New-AzActionGroup -ActionGroupId $action_group.id
# Condition
Write-Output " getting condition"
$condition_rule = New-AzMetricAlertRuleV2Criteria -MetricName $metric_name `
-TimeAggregation $aggregation `
-Operator GreaterThan `
-Threshold $threshold `
-WarningAction SilentlyContinue
# Alert
Write-Output " setting alert"
Add-AzMetricAlertRuleV2 -Name $alert_rule_name `
-ResourceGroupName $alert_RG `
-WindowSize $window_size `
-Frequency $frequency `
-Description $description `
-TargetResourceId $object_id `
-Condition $condition_rule `
-ActionGroup $action_group_id `
-Severity $severity `
-WarningAction SilentlyContinue | Out-null
}
Connect-AZAccount
$subscription_name = 'XXX enter subscription name XXX'
Select-AzSubscription -SubscriptionName "$subscription_name" | Out-Null
$action_group_name = 'DBAADMIN' # limit 12 characters
$emails = ('one@example.com', 'two@example.com')
$description = "Please have a look at this issue!"
$metric_alerts = @()
$condition = @{
'metric_name' = 'CPU Credits Consumed';
'threshold' = 80;
'window_size' = New-TimeSpan -Minutes 5;
'frequency' = New-TimeSpan -Minutes 1;
'aggregation' = 'Average';
'severity' = 3
}
$metric_alerts += $condition
$condition = @{
'metric_name' = 'CPU Credits Consumed';
'threshold' = 90;
'window_size' = New-TimeSpan -Minutes 5;
'aggregation' = 'Average';
'frequency' = New-TimeSpan -Minutes 1;
'severity' = 3
}
$metric_alerts += $condition
$object_RG = 'XXX enter VM resource group XXX'
$object_name = 'XXX enter VM name'
$object = Get-AzVM -Name $object_name -ResourceGroupName $object_RG
foreach($condition in $metric_alerts){
set-metric_alert -object_RG $object_RG `
-object_name $object_name `
-object_id $object.Id `
-condition $condition `
-description $description `
-action_group_name $action_group_name `
-emails $emails
}





























