public void NewMetricAlertRuleV2WithWebtestConditionProcessing() { var webtestCriteria = new WebtestLocationAvailabilityCriteria("webTestId", "componentId", 4); _cmdlet.TargetResourceId = "webTestId"; _cmdlet.Condition = new List <IPSMultiMetricCriteria>() { new PSWebtestLocationAvailabilityCriteria(webtestCriteria) }; _cmdlet.ExecuteCmdlet(); Func <MetricAlertResource, bool> verify = metricAlert => { Assert.Contains(_cmdlet.TargetResourceId, metricAlert.Scopes); Assert.Contains(webtestCriteria.ComponentId, metricAlert.Scopes); Assert.Contains($"hidden-link:{webtestCriteria.WebTestId}", metricAlert.Tags.Keys); Assert.Contains($"hidden-link:{webtestCriteria.ComponentId}", metricAlert.Tags.Keys); Assert.NotStrictEqual(webtestCriteria, metricAlert.Criteria); return(true); }; this._insightsMetricAlertsOperationsMock.Verify(o => o.CreateOrUpdateWithHttpMessagesAsync(It.IsAny <string>(), It.IsAny <string>(), It.Is <MetricAlertResource>(r => verify(r)), It.IsAny <Dictionary <string, List <string> > >(), It.IsAny <CancellationToken>()), Times.Once); }
public void NewMetricAlertRuleV2WithTwoWebtestConditionsShouldThrow() { var webtestCriteria = new WebtestLocationAvailabilityCriteria("webTestId", "componentId", 4); _cmdlet.TargetResourceId = "webTestId"; _cmdlet.Condition.Add(new PSWebtestLocationAvailabilityCriteria(webtestCriteria)); Assert.Throws <PSInvalidOperationException>(() => _cmdlet.ExecuteCmdlet()); }
protected override void ProcessRecordInternal() { List <MetricDimension> metricDimensions = new List <MetricDimension>(); if (this.DimensionSelection != null && this.DimensionSelection.Length > 0) { foreach (var dimension in this.DimensionSelection) { if (dimension.IncludeValues != null && dimension.IncludeValues.Count() > 0) { metricDimensions.Add(new MetricDimension(dimension.Dimension, "Include", dimension.IncludeValues)); } if (dimension.ExcludeValues != null && dimension.ExcludeValues.Count() > 0) { metricDimensions.Add(new MetricDimension(dimension.Dimension, "Exclude", dimension.ExcludeValues)); } } } else { metricDimensions = null; } IPSMultiMetricCriteria result; if (this.WebTest.IsPresent || !string.IsNullOrWhiteSpace(this.WebTestId)) { WebtestLocationAvailabilityCriteria webtestMetricCriteria = new WebtestLocationAvailabilityCriteria(this.WebTestId, this.ApplicationInsightsId, this.FailedLocationCount); result = new PSWebtestLocationAvailabilityCriteria(webtestMetricCriteria); } else if (this.DynamicThreshold.IsPresent) { DynamicThresholdFailingPeriods failingPeriods = new DynamicThresholdFailingPeriods(this.ExaminedAggregatedPointCount, this.ViolationCount); DynamicMetricCriteria dynamicMetricCriteria = new DynamicMetricCriteria(name: "metric1", metricName: this.MetricName, operatorProperty: this.Operator, timeAggregation: this.TimeAggregation, metricNamespace: this.MetricNamespace, dimensions: metricDimensions, failingPeriods: failingPeriods, alertSensitivity: this.ThresholdSensitivity, ignoreDataBefore: this.IsParameterBound(c => c.IgnoreDataBefore) ? (DateTime?)this.IgnoreDataBefore : null, skipMetricValidation: this.SkipMetricValidation ); result = new PSDynamicMetricCriteria(dynamicMetricCriteria); } else { MetricCriteria metricCriteria = new MetricCriteria(name: "metric1", metricName: this.MetricName, operatorProperty: this.Operator, timeAggregation: this.TimeAggregation, threshold: this.Threshold, metricNamespace: this.MetricNamespace, dimensions: metricDimensions, skipMetricValidation: this.SkipMetricValidation); result = new PSMetricCriteria(metricCriteria); } WriteObject(sendToPipeline: result); }
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); } } }
/// <summary> /// Initializes a PS object for dynamic metric criteria /// </summary> /// <param name="webtestLocationAvailabilityCriteria">The original webtest criteria object</param> public PSWebtestLocationAvailabilityCriteria(WebtestLocationAvailabilityCriteria webtestLocationAvailabilityCriteria) : base(componentId: webtestLocationAvailabilityCriteria.ComponentId, failedLocationCount: webtestLocationAvailabilityCriteria.FailedLocationCount, webTestId: webtestLocationAvailabilityCriteria.WebTestId) { }