Пример #1
0
 public Application()
 {
     InitializeComponent();
     metrics = new MetricsStorage("http://localhost:8086", "writer", "develop");
 }
Пример #2
0
        private MetricsStorage metricsStorage;//基于接口而非实现编程

        //依赖注入
        public MetricsCollector(MetricsStorage metricsStorage)
        {
            this.metricsStorage = metricsStorage;
        }
Пример #3
0
 public ConsoleReporter(MetricsStorage metricsStorage)
 {
     this.metricsStorage = metricsStorage;
 }
Пример #4
0
        public async Task TestUploadMaxAge()
        {
            /* Make fake data */
            DateTime baseTime = DateTime.UtcNow;

            // This will create 20 fake scrapes of 10 metrics each.
            // Each has an offset equal to the hours since they were scraped.
            IEnumerable <(long offset, IEnumerable <Metric> metrics)> fakeScrapes = Enumerable.Range(0, 20).Select(hoursAgo =>
            {
                DateTime scrapeTime       = baseTime.AddHours(-1 * hoursAgo);
                IEnumerable <Metric> data = Enumerable.Range(1, 10).Select(i => new Metric(scrapeTime, $"metric_{i}", 0, new Dictionary <string, string>()));

                return(((long offset, IEnumerable <Metric> metrics))(hoursAgo, data));
            }).ToArray();

            /* Setup mocks */
            var sequentialStoreMock = new Mock <ISequentialStore <IEnumerable <Metric> > >();

            // mock retrieving data
            sequentialStoreMock.Setup(s => s.GetBatch(It.IsAny <long>(), It.IsAny <int>(), It.IsAny <CancellationToken>())).ReturnsAsync(fakeScrapes);

            // mock removing data
            List <int> offsetsRemoved = new List <int>();

            void GetOffsetToRemove(Func <long, IEnumerable <Metric>, Task <bool> > func)
            {
                // Note: .Result was used b/c moq `Callback` does not handle tasks.
                IEnumerable <int> newOffsetsRemoved = AsyncEnumerable.Range(0, 100).WhereAwait(async i => await func(i, null)).ToListAsync().Result;

                offsetsRemoved.AddRange(newOffsetsRemoved);
            }

            sequentialStoreMock.Setup(s => s.RemoveFirst(It.IsAny <Func <long, IEnumerable <Metric>, Task <bool> > >())).Callback((Action <Func <long, IEnumerable <Metric>, Task <bool> > >)GetOffsetToRemove).ReturnsAsync(false);

            /* Test */
            // No max age
            var storageNoLimit = new MetricsStorage(sequentialStoreMock.Object, TimeSpan.FromDays(50));

            // When metrics are returned, all 200 are there and none are removed from db.
            var noLimitReturnedMetrics = (await storageNoLimit.GetAllMetricsAsync()).ToList();

            Assert.Equal(200, noLimitReturnedMetrics.Count);
            Assert.Empty(offsetsRemoved);

            // all metrics are removed
            await storageNoLimit.RemoveAllReturnedMetricsAsync();

            TestUtilities.OrderlessCompare(Enumerable.Range(0, 20), offsetsRemoved);
            offsetsRemoved.Clear();

            // Only keep last 7 hours
            var storageLast7Hours = new MetricsStorage(sequentialStoreMock.Object, TimeSpan.FromHours(7));

            // When metrics are returned, all only last 7 scrapes of 10 are returned. Remaining 13 scrapes are deleted
            var last7ReturnedMetrics = (await storageLast7Hours.GetAllMetricsAsync()).ToList();

            Assert.Equal(70, last7ReturnedMetrics.Count);
            TestUtilities.OrderlessCompare(Enumerable.Range(7, 13), offsetsRemoved);
            offsetsRemoved.Clear();

            // only returned metrics are removed
            await storageLast7Hours.RemoveAllReturnedMetricsAsync();

            TestUtilities.OrderlessCompare(Enumerable.Range(0, 7), offsetsRemoved);
            offsetsRemoved.Clear();

            // Only keep last 12 hours
            var storageLast12Hours = new MetricsStorage(sequentialStoreMock.Object, TimeSpan.FromHours(12));

            // When metrics are returned, all only last 12 scrapes of 10 are returned. Remaining 8 scrapes are deleted
            var last12ReturnedMetrics = (await storageLast12Hours.GetAllMetricsAsync()).ToList();

            Assert.Equal(120, last12ReturnedMetrics.Count);
            TestUtilities.OrderlessCompare(Enumerable.Range(12, 8), offsetsRemoved);
            offsetsRemoved.Clear();

            // only returned metrics are removed
            await storageLast12Hours.RemoveAllReturnedMetricsAsync();

            TestUtilities.OrderlessCompare(Enumerable.Range(0, 12), offsetsRemoved);
            offsetsRemoved.Clear();
        }