示例#1
0
        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);
        }
示例#2
0
        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)
 {
 }