public Application() { InitializeComponent(); metrics = new MetricsStorage("http://localhost:8086", "writer", "develop"); }
private MetricsStorage metricsStorage;//基于接口而非实现编程 //依赖注入 public MetricsCollector(MetricsStorage metricsStorage) { this.metricsStorage = metricsStorage; }
public ConsoleReporter(MetricsStorage metricsStorage) { this.metricsStorage = metricsStorage; }
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(); }