public void ShouldFlushOnDispose() { var clock = new DummyClock("11:00:00.000"); var sink = new DictionarySink(); using (var e = new MetricsCollector(sink, clock, oneSecond, TimeSpan.FromSeconds(5), false)) { clock.Set("12:00:01.500"); // 10000 events per second for 10 virtual seconds, using 3 threads var options = new ParallelOptions { MaxDegreeOfParallelism = 5 }; for (int i = 0; i < 10; i++) { Parallel.For(0, 10000, options, (j, s) => { e.IncrementCounter($"myevent-{Thread.CurrentThread.ManagedThreadId}"); }); clock.Advance(oneSecond); } } // Dispose method on event collect ensures all events are flushed immediately Assert.Equal(100000, sink.Counters.Values.Sum()); }
public void HistogramTimingTest() { var sink = new DictionarySink(); var clock = new DummyClock("12:00:00.000"); var windowSize = TimeSpan.FromSeconds(1); var flushInterval = TimeSpan.FromSeconds(1); var metrics = new MetricsCollector(sink, clock, windowSize, flushInterval, false); metrics.RegisterThresholds("h", new[] { 0, 10, 20 }); metrics.RegisterThresholds("g", new[] { 30, 40 }); var window1From = clock.Current.RoundDown(windowSize); var window1To = window1From + windowSize; metrics.IncrementBucket("h", 0); clock.Advance(windowSize); sink.Buckets[new Metric("h", window1From, window1From + windowSize)][(0, 10)].Should().Be(1);