public void SetUp() { _collector = (DotNetRuntimeStatsCollector)ConfigureBuilder(DotNetRuntimeStatsBuilder.Customize()) .StartCollecting(Prometheus.Metrics.NewCustomRegistry()); MetricProducer = (TMetricProducer)_collector.ServiceProvider.GetServices <IMetricProducer>().Single(x => x is TMetricProducer); // wait for event listener thread to spin up var waitingFor = Stopwatch.StartNew(); var waitFor = TimeSpan.FromSeconds(10); while (!_collector.EventListeners.All(x => x.StartedReceivingEvents)) { Thread.Sleep(10); Console.Write("Waiting for event listeners to be active.. "); if (waitingFor.Elapsed > waitFor) { Assert.Fail($"Waited {waitFor} and still not all event listeners were ready! Event listeners not ready: {string.Join(", ", _collector.EventListeners.Where(x => !x.StartedReceivingEvents))}"); return; } } Console.WriteLine("All event listeners should be active now."); }
public async Task After_Recycling_Then_Events_Can_Still_Be_Processed_Correctly() { // arrange var parser = new RuntimeEventParser() { RefreshIntervalSeconds = 1 }; var eventAssertion = TestHelpers.ArrangeEventAssertion <IncrementingCounterValue>(e => parser.ExceptionCount += e); var services = new ServiceCollection(); var parserRego = ListenerRegistration.Create(CaptureLevel.Counters, _ => parser); parserRego.RegisterServices(services); services.AddSingleton <ISet <ListenerRegistration>, HashSet <ListenerRegistration> >(_ => new[] { parserRego }.ToHashSet()); // act using var l = new DotNetRuntimeStatsCollector(services.BuildServiceProvider(), new CollectorRegistry(), new DotNetRuntimeStatsCollector.Options() { RecycleListenersEvery = TimeSpan.FromSeconds(3) }); Assert.That(() => eventAssertion.Fired, Is.True.After(2000, 10)); await Task.Delay(TimeSpan.FromSeconds(10)); // Why do we expected this value of events? Although we are waiting for 10 seconds for events, recycles may cause a counter period // to not fire. As counter events fire each second, as long as this value is greater than the recycle period this test can veryify // recycling is working correctly. const int expectedCounterEvents = 6; Assert.That(eventAssertion.History.Count, Is.GreaterThanOrEqualTo(expectedCounterEvents)); Assert.That(l.EventListenerRecycles.Value, Is.InRange(3, 5)); }
/// <summary> /// Finishes configuration and starts collecting .NET runtime metrics. Returns a <see cref="IDisposable"/> that /// can be disposed of to stop metric collection. /// </summary> /// <returns></returns> public IDisposable StartCollecting() { if (DotNetRuntimeStatsCollector.Instance != null) { throw new InvalidOperationException(".NET runtime metrics are already being collected. Dispose() of your previous collector before calling this method again."); } var runtimeStatsCollector = new DotNetRuntimeStatsCollector(StatsCollectors.ToImmutableHashSet(), _errorHandler); runtimeStatsCollector.RegisterMetrics(Telemetry); return(runtimeStatsCollector); }
public DotNetMetricsService(IMetrics metrics, ILogger <DotNetMetricsService> logger) { _logger = logger; _dotNetRuntimeStatsCollector = DotNetRuntimeStatsBuilder.Default(metrics).StartCollecting(); }