Example #1
0
        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));
        }
Example #3
0
            /// <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();
 }