예제 #1
0
        private void GetMetricAlertRule(MonitorManagementClient insightsClient)
        {
            MetricAlertResource expectedParameters = GetCreateOrUpdateRuleParameters();
            MetricAlertResource alertRule          = insightsClient.MetricAlerts.Get(resourceGroupName: ResourceGroupName, ruleName: RuleName);

            Utilities.AreEqual(expectedParameters, alertRule);
        }
        protected override void ProcessRecordInternal()
        {
            if (this.IsParameterBound(c => c.ResourceId))
            {
                var resourceIdentifier = new ResourceIdentifier(this.ResourceId);
                this.ResourceGroupName = resourceIdentifier.ResourceGroupName;
                this.Name = resourceIdentifier.ResourceName;
            }

            if (!string.IsNullOrWhiteSpace(this.Name))
            {
                MetricAlertResource result = this.MonitorManagementClient.MetricAlerts.GetAsync(resourceGroupName: this.ResourceGroupName, ruleName: this.Name).Result;
                PSMetricAlertRuleV2 finalResult;
                if (result.Criteria is MetricAlertSingleResourceMultipleMetricCriteria)
                {
                    finalResult = new PSMetricAlertRuleV2SingleResource(result);
                }
                else
                {
                    finalResult = new PSMetricAlertRuleV2(result);
                }
                WriteObject(sendToPipeline: finalResult);
            }
            else if (!string.IsNullOrWhiteSpace(this.ResourceGroupName))
            {
                IEnumerable <MetricAlertResource> result      = this.MonitorManagementClient.MetricAlerts.ListByResourceGroupAsync(resourceGroupName: this.ResourceGroupName).Result;
                List <PSMetricAlertRuleV2>        finalResult = new List <PSMetricAlertRuleV2>();
                result.ToArray().ForEach((metricAlertResource) =>
                {
                    if (metricAlertResource.Criteria is MetricAlertSingleResourceMultipleMetricCriteria)
                    {
                        finalResult.Add(new PSMetricAlertRuleV2SingleResource(metricAlertResource));
                    }
                    else
                    {
                        finalResult.Add(new PSMetricAlertRuleV2(metricAlertResource));
                    }
                }
                                         );
                WriteObject(sendToPipeline: finalResult.ToList(), enumerateCollection: true);
            }
            else
            {
                IEnumerable <MetricAlertResource> result      = this.MonitorManagementClient.MetricAlerts.ListBySubscriptionAsync().Result;
                List <PSMetricAlertRuleV2>        finalResult = new List <PSMetricAlertRuleV2>();
                result.ToArray().ForEach((metricAlertResource) =>
                {
                    if (metricAlertResource.Criteria is MetricAlertSingleResourceMultipleMetricCriteria)
                    {
                        finalResult.Add(new PSMetricAlertRuleV2SingleResource(metricAlertResource));
                    }
                    else
                    {
                        finalResult.Add(new PSMetricAlertRuleV2(metricAlertResource));
                    }
                }
                                         );
                WriteObject(sendToPipeline: finalResult.ToList(), enumerateCollection: true);
            }
        }
예제 #3
0
 public PSMetricAlertRuleV2SingleResource(MetricAlertResource metricAlertResource)
     : base(metricAlertResource)
 {
     if (metricAlertResource.Criteria is MetricAlertSingleResourceMultipleMetricCriteria)
     {
         this.TargetResourceId = metricAlertResource.Scopes[0];
     }
 }
예제 #4
0
        public async Task Get()
        {
            var alertName = Recording.GenerateAssetName("testMetricAlert-");
            var alert     = await CreateMetricAlertAsync(alertName);

            MetricAlertResource actionGroup2 = await alert.GetAsync();

            ResourceDataHelper.AssertMetricAlert(alert.Data, actionGroup2.Data);
        }
예제 #5
0
        private void CreateOrUpdateMetricAlertRule(MonitorManagementClient insightsClient)
        {
            MetricAlertResource expectedParameters = GetCreateOrUpdateRuleParameters();
            MetricAlertResource result             = insightsClient.MetricAlerts.CreateOrUpdate(
                resourceGroupName: ResourceGroupName,
                ruleName: RuleName,
                parameters: expectedParameters);

            Utilities.AreEqual(expectedParameters, result);
        }
 private void AreEqual(MetricAlertResource exp, MetricAlertResource act)
 {
     Assert.AreEqual(exp.AutoMitigate, act.AutoMitigate);
     Assert.AreEqual(exp.Description, act.Description);
     Assert.AreEqual(exp.Enabled, act.Enabled);
     Assert.AreEqual(exp.EvaluationFrequency, act.EvaluationFrequency);
     Assert.AreEqual(exp.Id, act.Id);
     Assert.AreEqual(exp.LastUpdatedTime, act.LastUpdatedTime);
     Assert.AreEqual(exp.Location, act.Location);
     Assert.AreEqual(exp.Name, act.Name);
     Assert.AreEqual(exp.Severity, act.Severity);
     Assert.AreEqual(exp.TargetResourceRegion, act.TargetResourceRegion);
     Assert.AreEqual(exp.TargetResourceType, act.TargetResourceType);
     Assert.AreEqual(exp.Type, act.Type);
     Assert.AreEqual(exp.WindowSize, act.WindowSize);
 }
        public async Task Get()
        {
            var resourceGroup = await CreateResourceGroupAsync().ConfigureAwait(false);

            var metricAlertCollection = resourceGroup.GetMetricAlerts();
            var actionGroupCollection = resourceGroup.GetActionGroups();

            var actionGroupName = Recording.GenerateAssetName("testActionGroup-");
            var actionGroupData = ResourceDataHelper.GetBasicActionGroupData("Global");
            var actionGroup     = (await actionGroupCollection.CreateOrUpdateAsync(WaitUntil.Completed, actionGroupName, actionGroupData).ConfigureAwait(false)).Value;

            var metricAlertData        = ResourceDataHelper.GetBasicMetricAlertData("global", actionGroup);
            var metricAlertName        = Recording.GenerateAssetName("testMetricAlert");
            var alert1                 = (await metricAlertCollection.CreateOrUpdateAsync(WaitUntil.Completed, metricAlertName, metricAlertData)).Value;
            MetricAlertResource alert2 = await metricAlertCollection.GetAsync(metricAlertName);

            ResourceDataHelper.AssertMetricAlert(alert1.Data, alert2.Data);
        }
        public void CreateUpdateDynamicMetricAlertRuleTest()
        {
            MetricAlertResource expectedParams = GetSampleDynamicMetricRuleResourceParams();
            var handler          = new RecordedDelegatingHandler();
            var insightClient    = GetMonitorManagementClient(handler);
            var serializedObject = Microsoft.Rest.Serialization.SafeJsonConvert.SerializeObject(expectedParams, insightClient.SerializationSettings);

            var expectedResponse = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(serializedObject)
            };

            handler       = new RecordedDelegatingHandler(expectedResponse);
            insightClient = GetMonitorManagementClient(handler);

            var result = insightClient.MetricAlerts.CreateOrUpdate(resourceGroupName: "rg1", ruleName: "Rule1", parameters: expectedParams);

            Utilities.AreEqual(expectedParams, result);
        }
 public static void AreEqual(MetricAlertResource exp, MetricAlertResource act)
 {
     if (exp != null)
     {
         Assert.Equal(exp.Description, act.Description);
         Assert.Equal(exp.Location, act.Location);
         Assert.Equal(exp.Severity, act.Severity);
         Assert.Equal(exp.Enabled, act.Enabled);
         AreEqual(exp.Scopes, act.Scopes);
         Assert.Equal(exp.EvaluationFrequency, act.EvaluationFrequency);
         Assert.Equal(exp.WindowSize, act.WindowSize);
         AreEqual(exp.Criteria, act.Criteria);
         Assert.Equal(exp.AutoMitigate, act.AutoMitigate);
         AreEqual(exp.Actions, act.Actions);
     }
     else
     {
         Assert.Null(act);
     }
 }
예제 #10
0
        public PSMetricAlertRuleV2(MetricAlertResource metricAlertResource)
            : base(location: metricAlertResource.Location, description: metricAlertResource.Description, severity: metricAlertResource.Severity, enabled: metricAlertResource.Enabled, evaluationFrequency: metricAlertResource.EvaluationFrequency, windowSize: metricAlertResource.WindowSize, criteria: metricAlertResource.Criteria, id: metricAlertResource.Id, name: metricAlertResource.Name, type: metricAlertResource.Type, tags: metricAlertResource.Tags, scopes: metricAlertResource.Scopes, autoMitigate: metricAlertResource.AutoMitigate, actions: metricAlertResource.Actions, lastUpdatedTime: metricAlertResource.LastUpdatedTime, targetResourceRegion: metricAlertResource.TargetResourceRegion, targetResourceType: metricAlertResource.TargetResourceType)
        {
            Criteria = new List <IPSMultiMetricCriteria>();
            if (metricAlertResource.Criteria is MetricAlertSingleResourceMultipleMetricCriteria)
            {
                var criteria = metricAlertResource.Criteria as MetricAlertSingleResourceMultipleMetricCriteria;
                foreach (var condition in criteria.AllOf)
                {
                    Criteria.Add(new PSMetricCriteria(condition));
                }
            }
            else if (metricAlertResource.Criteria is MetricAlertMultipleResourceMultipleMetricCriteria)
            {
                var criteria = metricAlertResource.Criteria as MetricAlertMultipleResourceMultipleMetricCriteria;
                foreach (var condition in criteria.AllOf)
                {
                    if (condition is MetricCriteria)
                    {
                        Criteria.Add(new PSMetricCriteria(condition as MetricCriteria));
                    }
                    else
                    {
                        Criteria.Add(new PSDynamicMetricCriteria(condition as DynamicMetricCriteria));
                    }
                }
            }
            else
            {
                //Web-Test
            }
            Actions = new ActivityLogAlertActionGroup[metricAlertResource.Actions.Count];
            for (int i = 0; i < metricAlertResource.Actions.Count; i++)
            {
                Actions[i] = new ActivityLogAlertActionGroup(metricAlertResource.Actions[i].ActionGroupId, metricAlertResource.Actions[i].WebhookProperties);
            }

            var resourceIdentifier = new ResourceIdentifier(metricAlertResource.Id);

            ResourceGroup = resourceIdentifier.ResourceGroupName;
        }
 protected override void ProcessRecordInternal()
 {
     if (this.TargetResourceScope == null)//Single Resource Metric Alert Rule
     {
         var scopes = new List <string>();
         scopes.Add(this.TargetResourceId);
         var metricCriteria = new List <MetricCriteria>();
         foreach (var condition in this.Condition)
         {
             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));
         }
         var criteria = new MetricAlertSingleResourceMultipleMetricCriteria(
             allOf: metricCriteria
             );
         var actions = new List <MetricAlertAction>();
         foreach (var actionGroup in this.ActionGroup)
         {
             actions.Add(new MetricAlertAction(actionGroupId: actionGroup.ActionGroupId, webhookProperties: actionGroup.WebhookProperties));
         }
         var metricAlertResource = new MetricAlertResource(
             description: this.Description ?? Utilities.GetDefaultDescription("new Metric alert rule"),
             severity: this.Severity,
             location: "global",
             enabled: !this.DisableRule,
             scopes: scopes,
             evaluationFrequency: this.Frequency,
             windowSize: this.WindowSize,
             criteria: criteria,
             actions: actions
             );
         if (ShouldProcess(
                 target: string.Format("Create/update an alert rule: {0} from resource group: {1}", this.Name, this.ResourceGroupName),
                 action: "Create/update an alert rule"))
         {
             var result = this.MonitorManagementClient.MetricAlerts.CreateOrUpdateAsync(resourceGroupName: this.ResourceGroupName, ruleName: this.Name, parameters: metricAlertResource).Result;
             WriteObject(result);
         }
     }
     else// Multi Resource Metric Alert Rule
     {
         List <MultiMetricCriteria> multiMetricCriterias = new List <MultiMetricCriteria>();
         foreach (var condition in this.Condition)
         {
             multiMetricCriterias.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));
         }
         MetricAlertMultipleResourceMultipleMetricCriteria metricCriteria = new MetricAlertMultipleResourceMultipleMetricCriteria(
             allOf: multiMetricCriterias
             );
         var actions = new List <MetricAlertAction>();
         foreach (var actionGroup in this.ActionGroup)
         {
             actions.Add(new MetricAlertAction(actionGroupId: actionGroup.ActionGroupId, webhookProperties: actionGroup.WebhookProperties));
         }
         var metricAlertResource = new MetricAlertResource(
             description: this.Description ?? Utilities.GetDefaultDescription("New multi resource Metric alert rule"),
             severity: this.Severity,
             location: "global",
             enabled: !this.DisableRule,
             scopes: this.TargetResourceScope,
             targetResourceRegion: this.TargetResourceRegion,
             targetResourceType: this.TargetResourceType,
             evaluationFrequency: this.Frequency,
             windowSize: this.WindowSize,
             criteria: metricCriteria,
             actions: actions
             );
         if (ShouldProcess(
                 target: string.Format("Create/update an alert rule: {0} from resource group: {1}", this.Name, this.ResourceGroupName),
                 action: "Create/update an alert rule"))
         {
             var result = this.MonitorManagementClient.MetricAlerts.CreateOrUpdateAsync(resourceGroupName: this.ResourceGroupName, ruleName: this.Name, parameters: metricAlertResource).Result;
             WriteObject(result);
         }
     }
 }
 /// <summary>
 /// Create or update an metric alert definition.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group.
 /// </param>
 /// <param name='ruleName'>
 /// The name of the rule.
 /// </param>
 /// <param name='parameters'>
 /// The parameters of the rule to create or update.
 /// </param>
 /// <param name='cancellationToken'>
 /// The cancellation token.
 /// </param>
 public static async Task <MetricAlertResource> CreateOrUpdateAsync(this IMetricAlertsOperations operations, string resourceGroupName, string ruleName, MetricAlertResource parameters, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var _result = await operations.CreateOrUpdateWithHttpMessagesAsync(resourceGroupName, ruleName, parameters, null, cancellationToken).ConfigureAwait(false))
     {
         return(_result.Body);
     }
 }
 /// <summary>
 /// Create or update an metric alert definition.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group.
 /// </param>
 /// <param name='ruleName'>
 /// The name of the rule.
 /// </param>
 /// <param name='parameters'>
 /// The parameters of the rule to create or update.
 /// </param>
 public static MetricAlertResource CreateOrUpdate(this IMetricAlertsOperations operations, string resourceGroupName, string ruleName, MetricAlertResource parameters)
 {
     return(operations.CreateOrUpdateAsync(resourceGroupName, ruleName, parameters).GetAwaiter().GetResult());
 }
        protected override void ProcessRecordInternal()
        {
            var actions = new List <MetricAlertAction>();

            if (this.ActionGroup != null && this.ActionGroup.Length > 0)
            {
                actions.AddRange(this.ActionGroup.Select(actionGroup => new MetricAlertAction(actionGroupId: actionGroup.ActionGroupId, webHookProperties: actionGroup.WebhookProperties)));
            }

            if (this.ActionGroupId != null && this.ActionGroupId.Length > 0)
            {
                var newActionGroupIds = this.ActionGroupId.Where(id => !actions.Exists(action => action.ActionGroupId == id));
                actions.AddRange(newActionGroupIds.Select(actionGroupId => new MetricAlertAction(actionGroupId: actionGroupId)));
            }

            if (this.Condition.Any(c => c.CriterionType == CriterionType.DynamicThresholdCriterion))
            {
                this.TargetResourceScope = this.TargetResourceScope ?? new string[] { this.TargetResourceId };
            }

            IDictionary <string, string> tags = null;

            if (this.TargetResourceScope == null)//Single Resource Metric Alert Rule
            {
                var scopes = new List <string> {
                    this.TargetResourceId
                };

                MetricAlertCriteria criteria;

                if (this.Condition.Any(c => c.CriterionType == CriterionType.WebtestLocationAvailabilityCriterion))
                {
                    if (this.Condition.Count > 1)
                    {
                        throw new ArgumentException("Only single Webtest location availability criterion is supported");
                    }

                    var psWebtestCriteria = this.Condition.First() as PSWebtestLocationAvailabilityCriteria;

                    criteria = new WebtestLocationAvailabilityCriteria(psWebtestCriteria.WebTestId, psWebtestCriteria.ComponentId, psWebtestCriteria.FailedLocationCount);
                    scopes.Add(psWebtestCriteria.ComponentId);

                    tags = new Dictionary <string, string>()
                    {
                        { $"hidden-link:{psWebtestCriteria.WebTestId}", "Resource" },
                        { $"hidden-link:{psWebtestCriteria.ComponentId}", "Resource" }
                    };
                }
                else
                {
                    var metricCriteria = new List <MetricCriteria>();
                    foreach (var metricCondition in this.Condition)
                    {
                        var condition = metricCondition as PSMetricCriteria;
                        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));
                    }
                    criteria = new MetricAlertSingleResourceMultipleMetricCriteria(
                        allOf: metricCriteria
                        );
                }

                var metricAlertResource = new MetricAlertResource(
                    description: this.Description ?? Utilities.GetDefaultDescription("new Metric alert rule"),
                    severity: this.Severity,
                    location: "global",
                    enabled: !this.DisableRule,
                    scopes: scopes,
                    evaluationFrequency: this.Frequency,
                    windowSize: this.WindowSize,
                    criteria: criteria,
                    actions: actions,
                    tags: tags
                    );
                if (ShouldProcess(
                        target: $"Create/update an alert rule: {this.Name} from resource group: {this.ResourceGroupName}",
                        action: "Create/update an alert rule"))
                {
                    var result = this.MonitorManagementClient.MetricAlerts.CreateOrUpdateAsync(resourceGroupName: this.ResourceGroupName, ruleName: this.Name, parameters: metricAlertResource).Result;
                    WriteObject(result);
                }
            }
            else// Multi Resource Metric Alert Rule
            {
                List <MultiMetricCriteria> multiMetricCriteria = new List <MultiMetricCriteria>();
                foreach (var condition in this.Condition)
                {
                    if (condition is PSMetricCriteria)
                    {
                        var psStaticMetricCriteria = condition as PSMetricCriteria;
                        multiMetricCriteria.Add(new MetricCriteria(name: psStaticMetricCriteria.Name, metricName: psStaticMetricCriteria.MetricName, operatorProperty: psStaticMetricCriteria.OperatorProperty.ToString(), timeAggregation: psStaticMetricCriteria.TimeAggregation.ToString(), threshold: psStaticMetricCriteria.Threshold, metricNamespace: psStaticMetricCriteria.MetricNamespace, dimensions: psStaticMetricCriteria.Dimensions, skipMetricValidation: psStaticMetricCriteria.SkipMetricValidation));
                    }
                    else
                    {
                        var psDynamicMetricCriteria = condition as PSDynamicMetricCriteria;
                        multiMetricCriteria.Add(new DynamicMetricCriteria(name: psDynamicMetricCriteria.Name, metricName: psDynamicMetricCriteria.MetricName, operatorProperty: psDynamicMetricCriteria.OperatorProperty.ToString(), timeAggregation: psDynamicMetricCriteria.TimeAggregation.ToString(), metricNamespace: psDynamicMetricCriteria.MetricNamespace, dimensions: psDynamicMetricCriteria.Dimensions, alertSensitivity: psDynamicMetricCriteria.AlertSensitivity, failingPeriods: psDynamicMetricCriteria.FailingPeriods, ignoreDataBefore: psDynamicMetricCriteria.IgnoreDataBefore, skipMetricValidation: psDynamicMetricCriteria.SkipMetricValidation));
                    }
                }

                MetricAlertMultipleResourceMultipleMetricCriteria metricCriteria = new MetricAlertMultipleResourceMultipleMetricCriteria(
                    allOf: multiMetricCriteria
                    );
                var metricAlertResource = new MetricAlertResource(
                    description: this.Description ?? Utilities.GetDefaultDescription("New multi resource Metric alert rule"),
                    severity: this.Severity,
                    location: "global",
                    enabled: !this.DisableRule,
                    scopes: this.TargetResourceScope,
                    targetResourceRegion: this.TargetResourceRegion,
                    targetResourceType: this.TargetResourceType,
                    evaluationFrequency: this.Frequency,
                    windowSize: this.WindowSize,
                    criteria: metricCriteria,
                    actions: actions
                    );
                if (ShouldProcess(
                        target: string.Format("Create/update an alert rule: {0} from resource group: {1}", this.Name, this.ResourceGroupName),
                        action: "Create/update an alert rule"))
                {
                    var result = this.MonitorManagementClient.MetricAlerts.CreateOrUpdateAsync(resourceGroupName: this.ResourceGroupName, ruleName: this.Name, parameters: metricAlertResource).Result;
                    WriteObject(result);
                }
            }
        }
예제 #15
0
 public virtual async Task <Response <MetricAlertResource> > CreateOrUpdateAsync(string resourceGroupName, string ruleName, MetricAlertResource parameters, CancellationToken cancellationToken = default)
 {
     using var scope = _clientDiagnostics.CreateScope("MetricAlertsOperations.CreateOrUpdate");
     scope.Start();
     try
     {
         return(await RestClient.CreateOrUpdateAsync(resourceGroupName, ruleName, parameters, cancellationToken).ConfigureAwait(false));
     }
     catch (Exception e)
     {
         scope.Failed(e);
         throw;
     }
 }
        protected override void ProcessRecordInternal()
        {
            if (this.Condition.Any(c => c.CriterionType == CriterionType.DynamicThresholdCriterion))
            {
                this.TargetResourceScope = this.TargetResourceScope ?? new string[] { this.TargetResourceId };
            }

            var actions = new List <MetricAlertAction>();

            if (this.ActionGroup != null)
            {
                actions.AddRange(this.ActionGroup.Select(actionGroup => new MetricAlertAction(actionGroupId: actionGroup.ActionGroupId, webhookProperties: actionGroup.WebhookProperties)));
            }

            if (this.ActionGroupId != null)
            {
                actions.AddRange(this.ActionGroupId.Select(actionGroupId => new MetricAlertAction(actionGroupId: actionGroupId)));
            }

            if (this.TargetResourceScope == null)//Single Resource Metric Alert Rule
            {
                var scopes = new List <string>();
                scopes.Add(this.TargetResourceId);
                var metricCriteria = new List <MetricCriteria>();
                foreach (var metricCondition in this.Condition)
                {
                    var condition = metricCondition as PSMetricCriteria;
                    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));
                }
                var criteria = new MetricAlertSingleResourceMultipleMetricCriteria(
                    allOf: metricCriteria
                    );
                var metricAlertResource = new MetricAlertResource(
                    description: this.Description ?? Utilities.GetDefaultDescription("new Metric alert rule"),
                    severity: this.Severity,
                    location: "global",
                    enabled: !this.DisableRule,
                    scopes: scopes,
                    evaluationFrequency: this.Frequency,
                    windowSize: this.WindowSize,
                    criteria: criteria,
                    actions: actions
                    );
                if (ShouldProcess(
                        target: string.Format("Create/update an alert rule: {0} from resource group: {1}", this.Name, this.ResourceGroupName),
                        action: "Create/update an alert rule"))
                {
                    var result = this.MonitorManagementClient.MetricAlerts.CreateOrUpdateAsync(resourceGroupName: this.ResourceGroupName, ruleName: this.Name, parameters: metricAlertResource).Result;
                    WriteObject(result);
                }
            }
            else// Multi Resource Metric Alert Rule
            {
                List <MultiMetricCriteria> multiMetricCriteria = new List <MultiMetricCriteria>();
                foreach (var condition in this.Condition)
                {
                    if (condition is PSMetricCriteria)
                    {
                        var psStaticMetricCriteria = condition as PSMetricCriteria;
                        multiMetricCriteria.Add(new MetricCriteria(name: psStaticMetricCriteria.Name, metricName: psStaticMetricCriteria.MetricName, operatorProperty: psStaticMetricCriteria.OperatorProperty.ToString(), timeAggregation: psStaticMetricCriteria.TimeAggregation.ToString(), threshold: psStaticMetricCriteria.Threshold, metricNamespace: psStaticMetricCriteria.MetricNamespace, dimensions: psStaticMetricCriteria.Dimensions));
                    }
                    else
                    {
                        var psDynamicMetricCriteria = condition as PSDynamicMetricCriteria;
                        multiMetricCriteria.Add(new DynamicMetricCriteria(name: psDynamicMetricCriteria.Name, metricName: psDynamicMetricCriteria.MetricName, operatorProperty: psDynamicMetricCriteria.OperatorProperty.ToString(), timeAggregation: psDynamicMetricCriteria.TimeAggregation.ToString(), metricNamespace: psDynamicMetricCriteria.MetricNamespace, dimensions: psDynamicMetricCriteria.Dimensions, alertSensitivity: psDynamicMetricCriteria.AlertSensitivity, failingPeriods: psDynamicMetricCriteria.FailingPeriods, ignoreDataBefore: psDynamicMetricCriteria.IgnoreDataBefore));
                    }
                }

                MetricAlertMultipleResourceMultipleMetricCriteria metricCriteria = new MetricAlertMultipleResourceMultipleMetricCriteria(
                    allOf: multiMetricCriteria
                    );
                var metricAlertResource = new MetricAlertResource(
                    description: this.Description ?? Utilities.GetDefaultDescription("New multi resource Metric alert rule"),
                    severity: this.Severity,
                    location: "global",
                    enabled: !this.DisableRule,
                    scopes: this.TargetResourceScope,
                    targetResourceRegion: this.TargetResourceRegion,
                    targetResourceType: this.TargetResourceType,
                    evaluationFrequency: this.Frequency,
                    windowSize: this.WindowSize,
                    criteria: metricCriteria,
                    actions: actions
                    );
                if (ShouldProcess(
                        target: string.Format("Create/update an alert rule: {0} from resource group: {1}", this.Name, this.ResourceGroupName),
                        action: "Create/update an alert rule"))
                {
                    var result = this.MonitorManagementClient.MetricAlerts.CreateOrUpdateAsync(resourceGroupName: this.ResourceGroupName, ruleName: this.Name, parameters: metricAlertResource).Result;
                    WriteObject(result);
                }
            }
        }