/// <inheritdoc />
 public IReservoirSnapshot GetSnapshot()
 {
     return(new WavefrontHistogramSnapshot(
                wavefrontHistogram.GetSnapshot(),
                WavefrontHistogramImpl.Serialize(wavefrontHistogram.FlushDistributions())
                ));
 }
Esempio n. 2
0
        public void TestFlushDistributions()
        {
            var currentTime = DateTime.UtcNow;

            long clockMillis() => DateTimeUtils.UnixTimeMilliseconds(currentTime);

            var  wavefrontHistogram = CreatePowHistogram(clockMillis);
            long minute0ClockMillis = clockMillis() / 60000 * 60000;

            // Test that nothing in the current minute bin gets flushed
            var distributions = wavefrontHistogram.FlushDistributions();

            Assert.Equal(0, distributions.Count);

            // Test that prior minute bins get flushed
            currentTime = currentTime.AddMinutes(1);
            long minute1ClockMillis = clockMillis() / 60000 * 60000;

            wavefrontHistogram.Update(0.01);

            currentTime = currentTime.AddMinutes(1);

            distributions = wavefrontHistogram.FlushDistributions();
            var actualDict = DistributionsToDictionary(distributions);

            var expectedDict = new Dictionary <long, Dictionary <double, int> > {
                { minute0ClockMillis, new Dictionary <double, int> {
                      { 0.1, 1 }, { 1, 1 }, { 10, 2 }, { 100, 1 }, { 1000, 1 }, { 10000, 2 }, { 100000, 1 }
                  } },
                { minute1ClockMillis, new Dictionary <double, int> {
                      { 0.01, 1 }
                  } }
            };

            Assert.Equal(expectedDict, actualDict);

            // Test serialization
            var serializedPair = WavefrontHistogramImpl.Serialize(distributions);

            string expectedTimestamps = distributions
                                        .Select(distribution => distribution.Timestamp.ToString())
                                        .Aggregate((result, item) => result + ';' + item);

            string expectedCentroids = distributions
                                       .Select(distribution => distribution.Centroids
                                               .Select(centroid => centroid.Key.ToString() + ' ' + centroid.Value)
                                               .Aggregate((result, item) => result + ',' + item))
                                       .Aggregate((result, item) => result + ';' + item);

            Assert.Equal(expectedTimestamps, serializedPair.Key);
            Assert.Equal(expectedCentroids, serializedPair.Value);

            // Test deserialization
            var deserializedDistributions = WavefrontHistogramImpl.Deserialize(serializedPair);

            Assert.Equal(actualDict, DistributionsToDictionary(deserializedDistributions));

            // Test that prior minute bins get cleared
            distributions = wavefrontHistogram.FlushDistributions();
            Assert.Equal(0, distributions.Count);
        }