public void CreateOpen()
        {
            var path = Path.GetTempFileName();

            DatapointDatabase.Create(path, 0.5f, DownsamplingMethod.Sum,
                                     new RetentionPolicy {
                { TimeSpan.FromSeconds(1), TimeSpan.FromMinutes(1) },
                { TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(5) },
                { TimeSpan.FromSeconds(20), TimeSpan.FromMinutes(20) }
            });

            var database = DatapointDatabase.Open(path);

            Assert.AreEqual(0.5f, database.DownsamplingFactor);
            Assert.AreEqual(DownsamplingMethod.Sum, database.DownsamplingMethod);

            Assert.AreEqual(3, database.Archives.Count);

            Assert.AreEqual((TimeSpan)database.Archives[0].Retention.Precision, TimeSpan.FromSeconds(1));
            Assert.AreEqual((TimeSpan)database.Archives[0].Retention.History, TimeSpan.FromMinutes(1));

            Assert.AreEqual((TimeSpan)database.Archives[1].Retention.Precision, TimeSpan.FromSeconds(10));
            Assert.AreEqual((TimeSpan)database.Archives[1].Retention.History, TimeSpan.FromMinutes(5));

            Assert.AreEqual((TimeSpan)database.Archives[2].Retention.Precision, TimeSpan.FromSeconds(20));
            Assert.AreEqual((TimeSpan)database.Archives[2].Retention.History, TimeSpan.FromMinutes(20));
        }
示例#2
0
        public Metric ReadMetric(string metricName, DateTime @from, DateTime until, TimeSpan?precision = null)
        {
            var databaseFilePath = GetDatabaseFiles(metricName).FirstOrDefault();

            if (databaseFilePath == null)
            {
                return(null);
            }

            var database = DatapointDatabase.Open(databaseFilePath.FullName);
            var series   = database.ReadSeries(from, until, precision);

            return(new Metric(metricName, series));
        }
        public void WriteDatapoints()
        {
            var n    = 0;
            var date = new DateTime(1971, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            Timestamp.DebuggerDisplayFormatter = t => ((DateTime)t).ToString("HH:mm:ss");

            // ReSharper disable once AccessToModifiedClosure
            Func <DateTime> currentTimeProvider = () => date.AddSeconds(n);

            var path     = Path.GetTempFileName();
            var database =
                DatapointDatabase.Create(path, 0, DownsamplingMethod.Average,
                                         new RetentionPolicy {
                { TimeSpan.FromSeconds(1), TimeSpan.FromMinutes(1) },
                { TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(10) },
                { TimeSpan.FromSeconds(20), TimeSpan.FromMinutes(60) }
            },
                                         currentTimeProvider);

            database.WriteDatapoints(
                Enumerable.
                Range(0, 3600).
                Select(i => new Datapoint(currentTimeProvider(), ++n)).
                ToList());

            n--;
            var now = currentTimeProvider();

            var datapoints = database.ReadSeries(now.AddSeconds(-10), now, TimeSpan.FromSeconds(1)).Datapoints.Select(d => d.Value).OrderByDescending(v => v).ToArray();

            CollectionAssert.AreEqual(
                new double[] { 3600, 3599, 3598, 3597, 3596, 3595, 3594, 3593, 3592, 3591 },
                datapoints);

            datapoints = database.ReadSeries(now.AddMinutes(-1), now, TimeSpan.FromSeconds(10)).Datapoints.Select(d => d.Value).OrderByDescending(v => v).ToArray();
            CollectionAssert.AreEqual(
                new[] { 3595.5, 3585.5, 3575.5, 3565.5, 3555.5, 3545.5 },
                datapoints);

            datapoints = database.ReadSeries(now.AddMinutes(-1), now, TimeSpan.FromSeconds(20)).Datapoints.Select(d => d.Value).OrderByDescending(v => v).ToArray();
            CollectionAssert.AreEqual(
                new[] { 3590.5, 3570.5, 3550.5 },
                datapoints);
        }
        public void Create()
        {
            var n    = 0;
            var date = new DateTime(1971, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            // ReSharper disable once AccessToModifiedClosure
            Func <DateTime> currentTimeProvider = () => date.AddSeconds(n);

            var database =
                DatapointDatabase.Create(Path.GetTempFileName(), 0.5f, DownsamplingMethod.Last,
                                         new RetentionPolicy {
                { TimeSpan.FromSeconds(1), TimeSpan.FromMinutes(1) },
                { TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(1) },
                { TimeSpan.FromSeconds(20), TimeSpan.FromMinutes(1) }
            },
                                         currentTimeProvider);

            for (n = 0; n < 120; ++n)
            {
                database.WriteDatapoint(currentTimeProvider(), n);
            }

            n -= 1;
            var now = currentTimeProvider();

            var series = database.ReadSeries(now.AddSeconds(-60), now);

            CollectionAssert.AreEqual(
                Enumerable.Range(60, 60).Select(v => (double?)v).ToArray(),
                series.Datapoints.Select(d => d.Value).ToArray());

            series = database.ReadSeries(now.AddSeconds(-60), now, TimeSpan.FromSeconds(10));
            CollectionAssert.AreEqual(
                new double?[] { 69, 79, 89, 99, 109, 119 },
                series.Datapoints.Select(d => d.Value).ToArray());

            series = database.ReadSeries(now.AddSeconds(-60), now, TimeSpan.FromSeconds(20));
            CollectionAssert.AreEqual(
                new double?[] { 79, 99, 119 },
                series.Datapoints.Select(d => d.Value).ToArray());
        }
示例#5
0
        public DatapointDatabase ResolveDatapointDatabase(string metric)
        {
            var fullPath  = Path.Combine(configuration.Storage.Path, metric.Replace('.', Path.DirectorySeparatorChar) + ".db");
            var directory = Path.GetDirectoryName(fullPath);

            if (directory != null && !Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }

            var downsampling = configuration.Downsampling.FirstOrDefault(d => Regex.IsMatch(metric, d.Pattern));

            if (downsampling == null)
            {
                return(null);
            }

            var storage = configuration.Storage.FirstOrDefault(a => {
                if (!string.IsNullOrWhiteSpace(a.IgnorePattern) && Regex.IsMatch(metric, a.IgnorePattern))
                {
                    return(false);
                }

                return(Regex.IsMatch(metric, a.Pattern));
            });

            if (storage == null)
            {
                return(null);
            }

            log.Trace("creating Datapoint Database for Metric '{0}' using Downsampling settings '{1}' and Storage settings '{2}'",
                      metric, downsampling.Name, storage.Name);

            var retentonPolicy = new RetentionPolicy(storage.Retentions);
            var database       = DatapointDatabase.OpenOrCreate(fullPath, downsampling.Factor, downsampling.Method, retentonPolicy);

            return(database);
        }