Skip to content

Commit acd2fbf

Browse files
authored
[Monitor]fix metric alert rule v2 to support web tests (#22468)
* fix metric alert rule v2 to support web tests * update test case accordingly
1 parent f04a2c8 commit acd2fbf

File tree

5 files changed

+54
-33
lines changed

5 files changed

+54
-33
lines changed

src/Monitor/Monitor.Test/Alerts/AddAzureRmMetricAlertRuleV2Tests.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,6 @@ public void NewMetricAlertRuleV2WithWebtestConditionProcessing()
203203

204204
Func<MetricAlertResource, bool> verify = metricAlert =>
205205
{
206-
Assert.Contains(_cmdlet.TargetResourceId, metricAlert.Scopes);
207-
Assert.Contains(webtestCriteria.ComponentId, metricAlert.Scopes);
208-
209206
Assert.Contains($"hidden-link:{webtestCriteria.WebTestId}", metricAlert.Tags.Keys);
210207
Assert.Contains($"hidden-link:{webtestCriteria.ComponentId}", metricAlert.Tags.Keys);
211208

src/Monitor/Monitor/Alerts/AddAzureRmMetricAlertRuleV2Command.cs

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters;
1717
using Microsoft.Azure.Management.Monitor;
1818
using Microsoft.Azure.Management.Monitor.Models;
19-
using Microsoft.Azure.Management.Monitor.Management.Models;
2019
using System;
2120
using System.Collections.Generic;
2221
using System.Linq;
@@ -80,15 +79,13 @@ public class AddAzureRmMetricAlertRuleV2Command : ManagementCmdletBase
8079
/// <summary>
8180
/// Gets or sets the TargetResourceType parameter
8281
/// </summary>
83-
[Parameter(ParameterSetName = CreateAlertByScopes, Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = "The target resource type for rule")]
84-
[ValidateNotNullOrEmpty]
82+
[Parameter(ParameterSetName = CreateAlertByScopes, ValueFromPipelineByPropertyName = true, HelpMessage = "The target resource type for rule")]
8583
public string TargetResourceType { get; set; }
8684

8785
/// <summary>
8886
/// Gets or sets the TargetResourceRegion parameter
8987
/// </summary>
90-
[Parameter(ParameterSetName = CreateAlertByScopes, Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = "The target resource region for rule")]
91-
[ValidateNotNullOrEmpty]
88+
[Parameter(ParameterSetName = CreateAlertByScopes, ValueFromPipelineByPropertyName = true, HelpMessage = "The target resource region for rule")]
9289
public string TargetResourceRegion { get; set; }
9390

9491
/// <summary>
@@ -159,42 +156,64 @@ protected override void ProcessRecordInternal()
159156
}
160157

161158
IDictionary<string, string> tags = null;
162-
if (this.TargetResourceScope == null)//Single Resource Metric Alert Rule
159+
if (this.Condition.Any(c => c.CriterionType == CriterionType.WebtestLocationAvailabilityCriterion))
163160
{
164-
var scopes = new List<string> {this.TargetResourceId};
165-
161+
var scopes = this.TargetResourceScope?.ToList<string>() ?? new List<string> { this.TargetResourceId };
166162
MetricAlertCriteria criteria;
167-
168-
if (this.Condition.Any(c => c.CriterionType == CriterionType.WebtestLocationAvailabilityCriterion))
163+
if (this.Condition.Count > 1)
169164
{
170-
if (this.Condition.Count > 1)
171-
{
172-
throw new ArgumentException("Only single Webtest location availability criterion is supported");
173-
}
165+
throw new ArgumentException("Only single Webtest location availability criterion is supported");
166+
}
174167

175-
var psWebtestCriteria = this.Condition.First() as PSWebtestLocationAvailabilityCriteria ;
168+
var psWebtestCriteria = this.Condition.First() as PSWebtestLocationAvailabilityCriteria;
176169

177-
criteria = new WebtestLocationAvailabilityCriteria(psWebtestCriteria.WebTestId, psWebtestCriteria.ComponentId, psWebtestCriteria.FailedLocationCount);
170+
criteria = new WebtestLocationAvailabilityCriteria(psWebtestCriteria.WebTestId, psWebtestCriteria.ComponentId, psWebtestCriteria.FailedLocationCount);
171+
if (!scopes.Contains(psWebtestCriteria.ComponentId))
172+
{
178173
scopes.Add(psWebtestCriteria.ComponentId);
174+
}
179175

180-
tags = new Dictionary<string, string>()
176+
tags = new Dictionary<string, string>()
181177
{
182178
{$"hidden-link:{psWebtestCriteria.WebTestId}", "Resource" },
183179
{$"hidden-link:{psWebtestCriteria.ComponentId}", "Resource" }
184180
};
181+
var metricAlertResource = new MetricAlertResource(
182+
description: this.Description ?? Utilities.GetDefaultDescription("new Metric alert rule"),
183+
severity: this.Severity,
184+
location: "global",
185+
enabled: !this.DisableRule,
186+
scopes: this.TargetResourceScope,
187+
evaluationFrequency: this.Frequency,
188+
windowSize: this.WindowSize,
189+
criteria: criteria,
190+
autoMitigate: this.AutoMitigate,
191+
actions: actions,
192+
tags: tags
193+
);
194+
if (ShouldProcess(
195+
target: $"Create/update an alert rule: {this.Name} from resource group: {this.ResourceGroupName}",
196+
action: "Create/update an alert rule"))
197+
{
198+
var result = this.MonitorManagementClient.MetricAlerts.CreateOrUpdateAsync(resourceGroupName: this.ResourceGroupName, ruleName: this.Name, parameters: metricAlertResource).Result;
199+
WriteObject(result);
185200
}
186-
else
201+
}
202+
else if (this.TargetResourceScope == null)//Single Resource Metric Alert Rule
203+
{
204+
var scopes = new List<string> {this.TargetResourceId};
205+
206+
MetricAlertCriteria criteria;
207+
208+
var metricCriteria = new List<MetricCriteria>();
209+
foreach (var metricCondition in this.Condition)
187210
{
188-
var metricCriteria = new List<MetricCriteria>();
189-
foreach (var metricCondition in this.Condition)
190-
{
191-
var condition = metricCondition as PSMetricCriteria;
192-
metricCriteria.Add(new MetricCriteria(name: condition.Name, metricName: condition.MetricName, operatorProperty: condition.OperatorProperty.ToString(), timeAggregation: condition.TimeAggregation.ToString(), threshold: condition.Threshold, metricNamespace: condition.MetricNamespace, dimensions: condition.Dimensions, skipMetricValidation: condition.SkipMetricValidation));
193-
}
194-
criteria = new MetricAlertSingleResourceMultipleMetricCriteria(
195-
allOf: metricCriteria
196-
);
211+
var condition = metricCondition as PSMetricCriteria;
212+
metricCriteria.Add(new MetricCriteria(name: condition.Name, metricName: condition.MetricName, operatorProperty: condition.OperatorProperty.ToString(), timeAggregation: condition.TimeAggregation.ToString(), threshold: condition.Threshold, metricNamespace: condition.MetricNamespace, dimensions: condition.Dimensions, skipMetricValidation: condition.SkipMetricValidation));
197213
}
214+
criteria = new MetricAlertSingleResourceMultipleMetricCriteria(
215+
allOf: metricCriteria
216+
);
198217

199218
var metricAlertResource = new MetricAlertResource(
200219
description: this.Description ?? Utilities.GetDefaultDescription("new Metric alert rule"),

src/Monitor/Monitor/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
-->
2020

2121
## Upcoming Release
22+
* Fixed `Add-AzMetriAlertRuleV2` and `Get-AzMetricAlertRuleV2` to support web tests criteria [#22350]
2223
* Added parameter `Dimension` for `Get-AzMetric` to easily filter metrics by dimensions [#22320]
2324

2425
## Version 4.5.0

src/Monitor/Monitor/OutputClasses/PSMetricAlertRuleV2.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ public PSMetricAlertRuleV2(MetricAlertResource metricAlertResource)
5353
else
5454
{
5555
//Web-Test
56+
if (metricAlertResource.Criteria is WebtestLocationAvailabilityCriteria)
57+
{
58+
Criteria.Add(new PSWebtestLocationAvailabilityCriteria(metricAlertResource.Criteria as WebtestLocationAvailabilityCriteria));
59+
}
5660
}
5761
Actions = new Microsoft.Azure.Management.Monitor.Management.Models.ActivityLogAlertActionGroup[metricAlertResource.Actions.Count];
5862
for(int i = 0; i < metricAlertResource.Actions.Count;i++)

src/Monitor/Monitor/help/Add-AzMetricAlertRuleV2.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Add-AzMetricAlertRuleV2 -Name <String> -ResourceGroupName <String> -WindowSize <
2525
### CreateAlertByScopes
2626
```
2727
Add-AzMetricAlertRuleV2 -Name <String> -ResourceGroupName <String> -WindowSize <TimeSpan> -Frequency <TimeSpan>
28-
-TargetResourceScope <String[]> -TargetResourceType <String> -TargetResourceRegion <String>
28+
-TargetResourceScope <String[]> [-TargetResourceType <String>] [-TargetResourceRegion <String>]
2929
-Condition <System.Collections.Generic.List`1[Microsoft.Azure.Commands.Insights.OutputClasses.IPSMultiMetricCriteria]>
3030
[-AutoMitigate <Boolean>] [-ActionGroup <ActivityLogAlertActionGroup[]>] [-ActionGroupId <String[]>]
3131
[-DisableRule] [-Description <String>] -Severity <Int32> [-DefaultProfile <IAzureContextContainer>] [-WhatIf]
@@ -346,7 +346,7 @@ Type: System.String
346346
Parameter Sets: CreateAlertByScopes
347347
Aliases:
348348

349-
Required: True
349+
Required: False
350350
Position: Named
351351
Default value: None
352352
Accept pipeline input: True (ByPropertyName)
@@ -376,7 +376,7 @@ Type: System.String
376376
Parameter Sets: CreateAlertByScopes
377377
Aliases:
378378

379-
Required: True
379+
Required: False
380380
Position: Named
381381
Default value: None
382382
Accept pipeline input: True (ByPropertyName)

0 commit comments

Comments
 (0)