public AccumulatorAggregator(MetricSeriesConfigurationForAccumulator configuration, MetricSeries dataSeries, MetricAggregationCycleKind aggregationCycleKind) : base(MetricValuesBufferFactory, configuration, dataSeries, aggregationCycleKind) { Util.ValidateNotNull(configuration, nameof(configuration)); _restrictToUInt32Values = configuration.RestrictToUInt32Values; ResetAggregate(); }
/// <summary /> /// <param name="other"></param> /// <returns></returns> public bool Equals(MetricSeriesConfigurationForAccumulator other) { if (other == null) { return(false); } if (Object.ReferenceEquals(this, other)) { return(true); } return(this.RestrictToUInt32Values == other.RestrictToUInt32Values); }
public void CompleteAggregation() { var aggregationManager = new MetricAggregationManager(); var mesurementConfig = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false); var measurementMetric = new MetricSeries(aggregationManager, "Cows Sold", null, mesurementConfig); var measurementAggregator = new MeasurementAggregator( (MetricSeriesConfigurationForMeasurement)measurementMetric.GetConfiguration(), measurementMetric, CycleKind.Custom); var accumulatorConfig = new MetricSeriesConfigurationForAccumulator(restrictToUInt32Values: false); var accumulatorMetric = new MetricSeries(aggregationManager, "Cows Sold", null, accumulatorConfig); var accumulatorAggregator = new AccumulatorAggregator( (MetricSeriesConfigurationForAccumulator)accumulatorMetric.GetConfiguration(), accumulatorMetric, CycleKind.Custom); CommonSimpleDataSeriesAggregatorTests.CompleteAggregation_NonpersistentAggregator(measurementAggregator); CommonSimpleDataSeriesAggregatorTests.CompleteAggregation_PersistentAggregator(accumulatorAggregator); }
public void Flush() { { var metricsCollector = new MemoryMetricTelemetryPipeline(); var manager = new MetricManager(metricsCollector); manager.Flush(); Assert.AreEqual(0, metricsCollector.Count); Util.CompleteDefaultAggregationCycle(manager); } { var metricsCollector = new MemoryMetricTelemetryPipeline(); var manager = new MetricManager(metricsCollector); IMetricSeriesConfiguration measurementConfig = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false); IMetricSeriesConfiguration accumulatorConfig = new MetricSeriesConfigurationForAccumulator(restrictToUInt32Values: false); MetricSeries series1 = manager.CreateNewSeries("Test Metrics", "Measurement 1", measurementConfig); MetricSeries series2 = manager.CreateNewSeries("Test Metrics", "Measurement 2", measurementConfig); MetricSeries series3 = manager.CreateNewSeries("Other Test Metrics", "Accumulator 1", accumulatorConfig); series1.TrackValue(1); series1.TrackValue(1); series1.TrackValue(1); series2.TrackValue(-1); series2.TrackValue(-1); series2.TrackValue(-1); series3.TrackValue(-2); series3.TrackValue(1); series3.TrackValue(1); manager.Flush(); Assert.AreEqual(3, metricsCollector.Count); Assert.AreEqual(1, metricsCollector.Where((item) => item.MetricId.Equals("Measurement 1")).Count()); Assert.AreEqual("Test Metrics", (metricsCollector.First((item) => item.MetricId.Equals("Measurement 1"))).MetricNamespace); Assert.AreEqual(3, (metricsCollector.First((item) => item.MetricId.Equals("Measurement 1"))).Data["Count"]); Assert.AreEqual(3.0, (metricsCollector.First((item) => item.MetricId.Equals("Measurement 1"))).Data["Sum"]); Assert.AreEqual(1, metricsCollector.Where((item) => item.MetricId.Equals("Measurement 2")).Count()); Assert.AreEqual("Test Metrics", (metricsCollector.First((item) => item.MetricId.Equals("Measurement 2"))).MetricNamespace); Assert.AreEqual(3, (metricsCollector.First((item) => item.MetricId.Equals("Measurement 2"))).Data["Count"]); Assert.AreEqual(-3.0, (metricsCollector.First((item) => item.MetricId.Equals("Measurement 2"))).Data["Sum"]); Assert.AreEqual(1, metricsCollector.Where((item) => item.MetricId.Equals("Accumulator 1")).Count()); Assert.AreEqual("Other Test Metrics", (metricsCollector.First((item) => item.MetricId.Equals("Accumulator 1"))).MetricNamespace); Assert.AreEqual(0.0, (metricsCollector.First((item) => item.MetricId.Equals("Accumulator 1"))).Data["Sum"]); metricsCollector.Clear(); Assert.AreEqual(0, metricsCollector.Count); manager.Flush(); Assert.AreEqual(1, metricsCollector.Count); Assert.AreEqual(1, metricsCollector.Where((item) => item.MetricId.Equals("Accumulator 1")).Count()); Assert.AreEqual(0.0, (metricsCollector.First((item) => item.MetricId.Equals("Accumulator 1"))).Data["Sum"]); Util.CompleteDefaultAggregationCycle(manager); } }
/// <summary /> /// <param name="seriesCountLimit"></param> /// <param name="valuesPerDimensionLimit"></param> /// <param name="seriesConfig"></param> public MetricConfigurationForAccumulator(int seriesCountLimit, int valuesPerDimensionLimit, MetricSeriesConfigurationForAccumulator seriesConfig) : base(seriesCountLimit, valuesPerDimensionLimit, seriesConfig) { }
public void GetCurrentAggregateUnsafe_MetricAggregationCycleKind_DateTimeOffset_Accumulator() { IMetricSeriesConfiguration seriesConfig = new MetricSeriesConfigurationForAccumulator(restrictToUInt32Values: false); const string aggregationKindMoniker = "Microsoft.Azure.Accumulator"; // Do not start this test in the last 10 secs or first 2 secs of a minute, to make sure the timings below are likely to work out. while (DateTimeOffset.Now.Second >= 49 || DateTimeOffset.Now.Second < 3) { Thread.Sleep(TimeSpan.FromMilliseconds(500)); } DateTimeOffset startTS = DateTimeOffset.Now; var aggregateCollector = new MemoryMetricTelemetryPipeline(); var manager = new MetricManager(aggregateCollector); MetricSeries series = manager.CreateNewSeries("ns", "Foo Bar", seriesConfig); DateTimeOffset stepTS = startTS.AddMinutes(2); DateTimeOffset stepTSRounded = new DateTimeOffset(stepTS.Year, stepTS.Month, stepTS.Day, stepTS.Hour, stepTS.Minute, stepTS.Second, 0, stepTS.Offset); { MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Default, stepTS); Assert.IsNull(aggregate); aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Custom, stepTS); Assert.IsNull(aggregate); aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.QuickPulse, stepTS); Assert.IsNull(aggregate); } series.TrackValue(0.4); series.TrackValue(2); series.TrackValue(-2); stepTS = stepTS.AddMinutes(2); stepTSRounded = new DateTimeOffset(stepTS.Year, stepTS.Month, stepTS.Day, stepTS.Hour, stepTS.Minute, stepTS.Second, 0, stepTS.Offset); { MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Default, stepTS); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 0.4, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); { Assert.IsTrue(seriesConfig.RequiresPersistentAggregation); aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Custom, stepTS); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 0.4, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.QuickPulse, stepTS); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 0.4, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } } DateTimeOffset customCycleStartTS = stepTS.AddMinutes(1); manager.StartOrCycleAggregators(MetricAggregationCycleKind.Custom, customCycleStartTS, futureFilter: null); series.TrackValue(0.17); series.TrackValue(0.32); series.TrackValue(-0.15); series.TrackValue(1.07); stepTS = stepTS.AddMinutes(2); stepTSRounded = new DateTimeOffset(stepTS.Year, stepTS.Month, stepTS.Day, stepTS.Hour, stepTS.Minute, stepTS.Second, 0, stepTS.Offset); { MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Default, stepTS); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 1.81, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Custom, stepTS); { Assert.IsTrue(seriesConfig.RequiresPersistentAggregation); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 1.81, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.QuickPulse, stepTS); { Assert.IsTrue(seriesConfig.RequiresPersistentAggregation); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 1.81, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } } Thread.Sleep(1500); DateTimeOffset flushTS = DateTimeOffset.Now; manager.Flush(); DateTimeOffset quickPulseCycleStartTS = stepTS.AddMinutes(1); manager.StartOrCycleAggregators(MetricAggregationCycleKind.QuickPulse, quickPulseCycleStartTS, futureFilter: null); stepTS = stepTS.AddMinutes(2); stepTSRounded = new DateTimeOffset(stepTS.Year, stepTS.Month, stepTS.Day, stepTS.Hour, stepTS.Minute, stepTS.Second, 0, stepTS.Offset); { MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Default, stepTS); { Assert.IsTrue(seriesConfig.RequiresPersistentAggregation); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 1.81, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Custom, stepTS); { Assert.IsTrue(seriesConfig.RequiresPersistentAggregation); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 1.81, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.QuickPulse, stepTS); { Assert.IsTrue(seriesConfig.RequiresPersistentAggregation); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 1.81, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } } series.TrackValue(0); series.TrackValue(-10); stepTS = stepTS.AddMinutes(2); stepTSRounded = new DateTimeOffset(stepTS.Year, stepTS.Month, stepTS.Day, stepTS.Hour, stepTS.Minute, stepTS.Second, 0, stepTS.Offset); manager.StopAggregators(MetricAggregationCycleKind.Custom, stepTS); { MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Default, stepTS); { Assert.IsTrue(seriesConfig.RequiresPersistentAggregation); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: -8.19, max: 2.4, min: -8.19, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Custom, stepTS); if (seriesConfig.RequiresPersistentAggregation) { Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: -8.19, max: 2.4, min: -8.19, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } else { Assert.IsNull(aggregate); } aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.QuickPulse, stepTS); { Assert.IsTrue(seriesConfig.RequiresPersistentAggregation); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: -8.19, max: 2.4, min: -8.19, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } } Util.CompleteDefaultAggregationCycle(manager); }
public void GetCurrentAggregateUnsafe_Accumulator() { IMetricSeriesConfiguration seriesConfig = new MetricSeriesConfigurationForAccumulator(restrictToUInt32Values: false); const string aggregationKindMoniker = "Microsoft.Azure.Accumulator"; // Do not start this test in the last 10 secs or first 2 secs of a minute, to make sure the timings below are likely to work out. while (DateTimeOffset.Now.Second >= 49 || DateTimeOffset.Now.Second < 3) { Thread.Sleep(TimeSpan.FromMilliseconds(500)); } DateTimeOffset startTS = DateTimeOffset.Now; var aggregateCollector = new MemoryMetricTelemetryPipeline(); var manager = new MetricManager(aggregateCollector); MetricSeries series = manager.CreateNewSeries("ns", "Foo Bar", seriesConfig); { MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(); Assert.IsNull(aggregate); } series.TrackValue(0.4); series.TrackValue(2); series.TrackValue(-2); { MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 0.4, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // The following might break sometimes! // There is a little chance that second boundary is crossed between test TS and the aggregation timestamps are snapped. // rerun the test if it happens. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); } series.TrackValue(0.17); series.TrackValue(0.32); series.TrackValue(-0.15); series.TrackValue(1.07); { MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 1.81, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // The following might break sometimes! // There is a little chance that second boundary is crossed between test TS and the aggregation timestamps are snapped. // rerun the test if it happens. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); } Thread.Sleep(1500); DateTimeOffset flushTS = DateTimeOffset.Now; manager.Flush(); { Assert.IsTrue(seriesConfig.RequiresPersistentAggregation); MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 1.81, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // The following might break sometimes! // There is a little chance that second boundary is crossed between test TS and the aggregation timestamps are snapped. // rerun the test if it happens. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); } series.TrackValue(0); { MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(); Assert.IsTrue(seriesConfig.RequiresPersistentAggregation); Util.ValidateNumericAggregateValues(aggregate, name: "Foo Bar", count: 0, sum: 1.81, max: 2.4, min: 0.4, stdDev: 0, aggKindMoniker: aggregationKindMoniker); // The following might break sometimes! // There is a little chance that second boundary is crossed between test TS and the aggregation timestamps are snapped. // rerun the test if it happens. Assert.AreEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregate.AggregationPeriodStart); } Util.CompleteDefaultAggregationCycle(manager); }