public void CreateAggregateUnsafe() { var aggregationManager = new MetricAggregationManager(); var seriesConfig = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: true); IEnumerable <KeyValuePair <string, string> > setDimensionNamesValues = new KeyValuePair <string, string>[] { new KeyValuePair <string, string>("Dim 1", "DV1"), new KeyValuePair <string, string>("Dim 2", "DV2"), new KeyValuePair <string, string>("Dim 3", "DV3"), new KeyValuePair <string, string>("Dim 2", "DV2a") }; IEnumerable <KeyValuePair <string, string> > expectedDimensionNamesValues = new KeyValuePair <string, string>[] { new KeyValuePair <string, string>("Dim 1", "DV1"), new KeyValuePair <string, string>("Dim 2", "DV2a"), new KeyValuePair <string, string>("Dim 3", "DV3") }; var metric = new MetricSeries( aggregationManager, new MetricIdentifier(String.Empty, "Cows Sold", expectedDimensionNamesValues.Select(nv => nv.Key).ToArray()), setDimensionNamesValues, seriesConfig); var aggregator = new MeasurementAggregator( (MetricSeriesConfigurationForMeasurement)metric.GetConfiguration(), metric, CycleKind.Custom); CommonSimpleDataSeriesAggregatorTests.CreateAggregateUnsafe(aggregator, metric, expectedDimensionNamesValues); }
public MeasurementAggregator(MetricSeriesConfigurationForMeasurement configuration, MetricSeries dataSeries, MetricAggregationCycleKind aggregationCycleKind) : base(MetricValuesBufferFactory, configuration, dataSeries, aggregationCycleKind) { Util.ValidateNotNull(configuration, nameof(configuration)); this.restrictToUInt32Values = configuration.RestrictToUInt32Values; this.ResetAggregate(); }
public void ResetAggregationDateTimeOffset() { // 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); IMetricSeriesConfiguration config = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false); MetricSeries series = manager.CreateNewSeries("ns", "Foo Bar", config); series.TrackValue(0.4); series.TrackValue(2); series.TrackValue(-2); Thread.Sleep(TimeSpan.FromMilliseconds(1500)); DateTimeOffset resetTS = DateTimeOffset.Now; series.ResetAggregation(resetTS); series.TrackValue(0.17); series.TrackValue(0.32); series.TrackValue(-0.15); series.TrackValue(1.07); Assert.AreEqual(0, aggregateCollector.Count); manager.Flush(); Assert.AreEqual(1, aggregateCollector.Count); DateTimeOffset endTS = DateTimeOffset.Now; TestUtil.ValidateNumericAggregateValues(aggregateCollector[0], ns: "ns", name: "Foo Bar", count: 4, sum: 1.41, max: 1.07, min: -0.15, stdDev: 0.447681527427702, aggKindMoniker: "Microsoft.Azure.Measurement"); // The following might break sometimes! // There is a little chance that second boundary is crossed between startTS and the aggregation timestamps are snapped. // rerun the test if it happens. Assert.AreNotEqual( new DateTimeOffset(startTS.Year, startTS.Month, startTS.Day, startTS.Hour, startTS.Minute, startTS.Second, 0, startTS.Offset), aggregateCollector[0].AggregationPeriodStart); Assert.AreEqual( new DateTimeOffset(resetTS.Year, resetTS.Month, resetTS.Day, resetTS.Hour, resetTS.Minute, resetTS.Second, 0, resetTS.Offset), aggregateCollector[0].AggregationPeriodStart); TestUtil.CompleteDefaultAggregationCycle(manager); }
public void Properties() { var manager = new MetricManager(new MemoryMetricTelemetryPipeline()); IMetricSeriesConfiguration config = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false); MetricSeries series = manager.CreateNewSeries("Foo Bar", config); Assert.AreEqual("Foo Bar", series.MetricId); Assert.AreEqual(config, series.GetConfiguration()); Assert.AreSame(config, series.GetConfiguration()); Util.CompleteDefaultAggregationCycle(manager); }
public void Flush() { { var metricsCollector = new MemoryMetricTelemetryPipeline(); var manager = new MetricManager(metricsCollector); manager.Flush(); Assert.AreEqual(0, metricsCollector.Count); TestUtil.CompleteDefaultAggregationCycle(manager); } { var metricsCollector = new MemoryMetricTelemetryPipeline(); var manager = new MetricManager(metricsCollector); IMetricSeriesConfiguration measurementConfig = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false); MetricSeries series1 = manager.CreateNewSeries("Test Metrics", "Measurement 1", measurementConfig); MetricSeries series2 = manager.CreateNewSeries("Test Metrics", "Measurement 2", measurementConfig); series1.TrackValue(1); series1.TrackValue(1); series1.TrackValue(1); series2.TrackValue(-1); series2.TrackValue(-1); series2.TrackValue(-1); manager.Flush(); Assert.AreEqual(2, 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"]); metricsCollector.Clear(); Assert.AreEqual(0, metricsCollector.Count); manager.Flush(); Assert.AreEqual(0, metricsCollector.Count); TestUtil.CompleteDefaultAggregationCycle(manager); } }
public void CompleteAggregation() { var aggregationManager = new MetricAggregationManager(); var mesurementConfig = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: true); var measurementMetric = new MetricSeries(aggregationManager, new MetricIdentifier("Cows Sold"), null, mesurementConfig); var measurementAggregator = new MeasurementAggregator( (MetricSeriesConfigurationForMeasurement)measurementMetric.GetConfiguration(), measurementMetric, CycleKind.Custom); CommonSimpleDataSeriesAggregatorTests.CompleteAggregation_NonpersistentAggregator(measurementAggregator); }
/// <summary>Checks whether this configuration is semantically equat to a specified configuration.</summary> /// <param name="other">Some configuration objects.</param> /// <returns><c>true</c> if the specified object is a configutation that is semantically equal to this configuration; /// <c>false</c> otherwise.</returns> public bool Equals(MetricSeriesConfigurationForMeasurement other) { if (other == null) { return(false); } if (Object.ReferenceEquals(this, other)) { return(true); } return(this.RestrictToUInt32Values == other.RestrictToUInt32Values); }
public void TrackValueDouble() { DateTimeOffset startTS = DateTimeOffset.Now; var aggregateCollector = new MemoryMetricTelemetryPipeline(); var manager = new MetricManager(aggregateCollector); IMetricSeriesConfiguration config = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false); MetricSeries series = manager.CreateNewSeries("ns", "Foo Bar", config); Thread.Sleep(1500); series.TrackValue(0.4); series.TrackValue(0.8); series.TrackValue(-0.04); Assert.AreEqual(0, aggregateCollector.Count); manager.Flush(); Assert.AreEqual(1, aggregateCollector.Count); DateTimeOffset endTSRounded = DateTimeOffset.Now; endTSRounded = new DateTimeOffset(endTSRounded.Year, endTSRounded.Month, endTSRounded.Day, endTSRounded.Hour, endTSRounded.Minute, endTSRounded.Second, 0, endTSRounded.Offset); TestUtil.ValidateNumericAggregateValues(aggregateCollector[0], ns: "ns", name: "Foo Bar", count: 3, sum: 1.16, max: 0.8, min: -0.04, stdDev: 0.343058142140496, aggKindMoniker: "Microsoft.Azure.Measurement"); // Timestamp checks have to be approximate, since we have no possibilityt to get exact timetamps snapped internally. // The following might break sometimes! // There is a little chance that second boundary is crossed between startTS 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), aggregateCollector[0].AggregationPeriodStart); const int millisecsTollerance = 50; long durationMs = (long)aggregateCollector[0].AggregationPeriodDuration.TotalMilliseconds; Assert.IsTrue(Math.Abs(durationMs - (endTSRounded - aggregateCollector[0].AggregationPeriodStart).TotalMilliseconds) < millisecsTollerance); Assert.AreEqual(1, aggregateCollector.Count); aggregateCollector.Clear(); Assert.AreEqual(0, aggregateCollector.Count); manager.Flush(); Assert.AreEqual(0, aggregateCollector.Count); TestUtil.CompleteDefaultAggregationCycle(manager); }
public void GetDataSeries() { var aggregationManager = new MetricAggregationManager(); var seriesConfig = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: true); var metric = new MetricSeries(aggregationManager, new MetricIdentifier("Cows Sold"), null, seriesConfig); var aggregatorForConcreteSeries = new MeasurementAggregator( (MetricSeriesConfigurationForMeasurement)metric.GetConfiguration(), dataSeries: metric, aggregationCycleKind: CycleKind.Custom); var aggregatorForNullSeries = new MeasurementAggregator( new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: true), dataSeries: null, aggregationCycleKind: CycleKind.Custom); CommonSimpleDataSeriesAggregatorTests.GetDataSeries(aggregatorForConcreteSeries, aggregatorForNullSeries, metric); }
public void CreateNewSeries() { var manager = new MetricManager(new MemoryMetricTelemetryPipeline()); IMetricSeriesConfiguration config = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false); Assert.ThrowsException <ArgumentNullException>(() => manager.CreateNewSeries(null, config)); Assert.ThrowsException <ArgumentNullException>(() => manager.CreateNewSeries("Foo Bar", null)); MetricSeries series = manager.CreateNewSeries("Foo Bar", config); Assert.IsNotNull(series); Assert.AreEqual(config, series.GetConfiguration()); Assert.AreSame(config, series.GetConfiguration()); Assert.AreEqual("Foo Bar", series.MetricId); Util.CompleteDefaultAggregationCycle(manager); }
public void CompleteAggregation() { var aggregationManager = new MetricAggregationManager(); var mesurementConfig = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false); var measurementMetric = new MetricSeries(aggregationManager, new MetricIdentifier("Animal Metrics", "Cows Sold"), null, mesurementConfig); var measurementAggregator = new MeasurementAggregator( (MetricSeriesConfigurationForMeasurement)measurementMetric.GetConfiguration(), measurementMetric, CycleKind.Custom); var accumulatorConfig = new MetricSeriesConfigurationForTestingAccumulatorBehavior(); var accumulatorMetric = new MetricSeries(aggregationManager, new MetricIdentifier("Animal Metrics", "Cows Sold"), null, accumulatorConfig); var accumulatorAggregator = new MetricSeriesConfigurationForTestingAccumulatorBehavior.Aggregator( (MetricSeriesConfigurationForTestingAccumulatorBehavior)accumulatorMetric.GetConfiguration(), accumulatorMetric, CycleKind.Custom); CommonSimpleDataSeriesAggregatorTests.CompleteAggregation_NonpersistentAggregator(measurementAggregator); CommonSimpleDataSeriesAggregatorTests.CompleteAggregation_PersistentAggregator(accumulatorAggregator); }
/// <summary>@ToDo: Complete documentation before stable release. {928}</summary> /// <param name="seriesCountLimit">@ToDo: Complete documentation before stable release. {466}</param> /// <param name="valuesPerDimensionLimit">@ToDo: Complete documentation before stable release. {730}</param> /// <param name="seriesConfig">@ToDo: Complete documentation before stable release. {977}</param> public MetricConfigurationForMeasurement(int seriesCountLimit, int valuesPerDimensionLimit, MetricSeriesConfigurationForMeasurement seriesConfig) : base(seriesCountLimit, valuesPerDimensionLimit, seriesConfig) { }
/// <summary>Creates a new instance of <c>MetricConfiguration</c>.</summary> /// <param name="seriesCountLimit">How many data time series a metric can contain as a maximum. /// Once this limit is reached, calls to <c>TrackValue(..)</c>, <c>TryGetDataSeries(..)</c> and similar /// that would normally result in new series will return <c>false</c>.</param> /// <param name="valuesPerDimensionLimits">How many different values each of the dimensions of a metric can /// have as a maximum. If this enumeration contains less elements than the number of supported dimensions, /// then the last specified element is replicated for subsequent dimensions. If this enumeration contains /// too many elements, superfluous elements are ignored. /// Once this limit is reached, calls to <c>TrackValue(..)</c>, <c>TryGetDataSeries(..)</c> and similar /// that would normally result in new series will return <c>false</c>.</param> /// <param name="seriesConfig">The configuration for how each series of this metric should be aggregated.</param> public MetricConfigurationForMeasurement(int seriesCountLimit, IEnumerable <int> valuesPerDimensionLimits, MetricSeriesConfigurationForMeasurement seriesConfig) : base(seriesCountLimit, valuesPerDimensionLimits, seriesConfig) { }
public void GetCurrentAggregateUnsafe_MetricAggregationCycleKind_DateTimeOffset_Measurement() { IMetricSeriesConfiguration seriesConfig = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false); const string aggregationKindMoniker = "Microsoft.Azure.Measurement"; // 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); TestUtil.ValidateNumericAggregateValues(aggregate, ns: "ns", name: "Foo Bar", count: 3, sum: 0.4, max: 2, min: -2, stdDev: 1.64384373412506, 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.IsFalse(seriesConfig.RequiresPersistentAggregation); aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Custom, stepTS); Assert.IsNull(aggregate); aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.QuickPulse, stepTS); Assert.IsNull(aggregate); } } 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); TestUtil.ValidateNumericAggregateValues(aggregate, ns: "ns", name: "Foo Bar", count: 7, sum: 1.81, max: 2, min: -2, stdDev: 1.13330652229191, 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.IsFalse(seriesConfig.RequiresPersistentAggregation); TestUtil.ValidateNumericAggregateValues(aggregate, ns: "ns", name: "Foo Bar", count: 4, sum: 1.41, max: 1.07, min: -0.15, stdDev: 0.447681527427702, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(customCycleStartTS.Year, customCycleStartTS.Month, customCycleStartTS.Day, customCycleStartTS.Hour, customCycleStartTS.Minute, customCycleStartTS.Second, 0, customCycleStartTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.QuickPulse, stepTS); { Assert.IsFalse(seriesConfig.RequiresPersistentAggregation); Assert.IsNull(aggregate); } } 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.IsFalse(seriesConfig.RequiresPersistentAggregation); Assert.IsNull(aggregate); } aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Custom, stepTS); { Assert.IsFalse(seriesConfig.RequiresPersistentAggregation); // Custom was not cycled by Flush. TestUtil.ValidateNumericAggregateValues(aggregate, ns: "ns", name: "Foo Bar", count: 4, sum: 1.41, max: 1.07, min: -0.15, stdDev: 0.447681527427702, aggKindMoniker: aggregationKindMoniker); // This might break: Second boundary might be crossed between snapping test and the aggregation timestamps. Try re-running. Assert.AreEqual( new DateTimeOffset(customCycleStartTS.Year, customCycleStartTS.Month, customCycleStartTS.Day, customCycleStartTS.Hour, customCycleStartTS.Minute, customCycleStartTS.Second, 0, customCycleStartTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); manager.StartOrCycleAggregators(MetricAggregationCycleKind.Custom, flushTS, null); aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Custom, stepTS); Assert.IsNull(aggregate); } aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.QuickPulse, stepTS); { Assert.IsFalse(seriesConfig.RequiresPersistentAggregation); // We started QP cycle now, but we did not write values since then. Assert.IsNull(aggregate); } } series.TrackValue(0); 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.IsFalse(seriesConfig.RequiresPersistentAggregation); TestUtil.ValidateNumericAggregateValues(aggregate, ns: "ns", name: "Foo Bar", count: 1, sum: 0, max: 0, min: 0, 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(flushTS.Year, flushTS.Month, flushTS.Day, flushTS.Hour, flushTS.Minute, flushTS.Second, 0, flushTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.Custom, stepTS); { Assert.IsFalse(seriesConfig.RequiresPersistentAggregation); Assert.IsNull(aggregate); } aggregate = series.GetCurrentAggregateUnsafe(MetricAggregationCycleKind.QuickPulse, stepTS); { Assert.IsFalse(seriesConfig.RequiresPersistentAggregation); TestUtil.ValidateNumericAggregateValues(aggregate, ns: "ns", name: "Foo Bar", count: 1, sum: 0, max: 0, min: 0, 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(quickPulseCycleStartTS.Year, quickPulseCycleStartTS.Month, quickPulseCycleStartTS.Day, quickPulseCycleStartTS.Hour, quickPulseCycleStartTS.Minute, quickPulseCycleStartTS.Second, 0, quickPulseCycleStartTS.Offset), aggregate.AggregationPeriodStart); Assert.AreEqual( (stepTSRounded - aggregate.AggregationPeriodStart).TotalMilliseconds, aggregate.AggregationPeriodDuration.TotalMilliseconds); } } TestUtil.CompleteDefaultAggregationCycle(manager); }
public void GetCurrentAggregateUnsafe_Measurement() { IMetricSeriesConfiguration seriesConfig = new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false); const string aggregationKindMoniker = "Microsoft.Azure.Measurement"; // 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(); TestUtil.ValidateNumericAggregateValues(aggregate, ns: "NS", name: "Foo Bar", count: 3, sum: 0.4, max: 2, min: -2, stdDev: 1.64384373412506, 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(); TestUtil.ValidateNumericAggregateValues(aggregate, ns: "NS", name: "Foo Bar", count: 7, sum: 1.81, max: 2, min: -2, stdDev: 1.13330652229191, 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.IsFalse(seriesConfig.RequiresPersistentAggregation); MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(); Assert.IsNull(aggregate); } series.TrackValue(0); { MetricAggregate aggregate = series.GetCurrentAggregateUnsafe(); Assert.IsFalse(seriesConfig.RequiresPersistentAggregation); TestUtil.ValidateNumericAggregateValues(aggregate, ns: "NS", name: "Foo Bar", count: 1, sum: 0, max: 0, min: 0, 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(flushTS.Year, flushTS.Month, flushTS.Day, flushTS.Hour, flushTS.Minute, flushTS.Second, 0, flushTS.Offset), aggregate.AggregationPeriodStart); } TestUtil.CompleteDefaultAggregationCycle(manager); }