public void Constructor_BindsConfigurationCorrectly()
        {
            var appsettings = new Dictionary <string, string>()
            {
                ["management:metrics:observer:ingressIgnorePattern"] = "pattern",
                ["management:metrics:observer:egressIgnorePattern"]  = "pattern",
                ["management:metrics:observer:aspnetcoreHosting"]    = "false",
                ["management:metrics:observer:gcEvents"]             = "false",
                ["management:metrics:observer:eventCounterEvents"]   = "true",
                ["management:metrics:observer:threadPoolEvents"]     = "false",
                ["management:metrics:observer:httpClientCore"]       = "true",
                ["management:metrics:observer:httpClientDesktop"]    = "true",
                ["management:metrics:observer:hystrixEvents"]        = "true",
            };
            var configurationBuilder = new ConfigurationBuilder();

            configurationBuilder.AddInMemoryCollection(appsettings);
            var config = configurationBuilder.Build();

            var opts = new MetricsObserverOptions(config);

            Assert.Equal("pattern", opts.IngressIgnorePattern);
            Assert.Equal("pattern", opts.EgressIgnorePattern);
            Assert.False(opts.AspNetCoreHosting);
            Assert.False(opts.GCEvents);
            Assert.True(opts.EventCounterEvents);
            Assert.False(opts.ThreadPoolEvents);
            Assert.True(opts.HttpClientCore);
            Assert.True(opts.HttpClientDesktop);
            Assert.True(opts.HystrixEvents);
        }
        public void Poll_GeneratesExpectedEvents()
        {
            var source   = new CLRRuntimeSource();
            var listener = source.Source as DiagnosticListener;

            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new TestObserver(options, stats, null);

            listener.Subscribe(observer);

            source.Poll();

            Assert.Equal(2, observer.Events.Count);
            Assert.Equal(2, observer.Args.Count);

            Assert.Equal(CLRRuntimeSource.HEAP_EVENT, observer.Events[0]);
            Assert.Equal(CLRRuntimeSource.THREADS_EVENT, observer.Events[1]);

            var heapMetrics = (CLRRuntimeSource.HeapMetrics)observer.Args[0];

            Assert.NotEqual(0, heapMetrics.TotalMemory);
            Assert.NotNull(heapMetrics.CollectionCounts);
            Assert.NotEqual(0, heapMetrics.CollectionCounts.Count);

            var threadMetrics = (CLRRuntimeSource.ThreadMetrics)observer.Args[1];

            Assert.NotEqual(0, threadMetrics.AvailableThreadCompletionPort);
            Assert.NotEqual(0, threadMetrics.AvailableThreadPoolWorkers);
            Assert.NotEqual(0, threadMetrics.MaxThreadCompletionPort);
            Assert.NotEqual(0, threadMetrics.MaxThreadPoolWorkers);
        }
        public void HandleStopEvent_RecordsStats()
        {
            var options   = new MetricsObserverOptions();
            var stats     = new TestOpenTelemetryMetrics();
            var observer  = new HttpClientDesktopObserver(options, stats, null);
            var factory   = stats.Factory;
            var processor = stats.Processor;

            var req = GetHttpRequestMessage();

            Activity act = new Activity("Test");

            act.Start();
            Thread.Sleep(1000);
            act.SetEndTime(DateTime.UtcNow);

            observer.HandleStopEvent(act, req, HttpStatusCode.InternalServerError);
            observer.HandleStopEvent(act, req, HttpStatusCode.OK);

            factory.CollectAllMetrics();

            var requestTime = processor.GetMetricByName <double>("http.desktop.client.request.time");

            Assert.NotNull(requestTime);
            Assert.InRange(requestTime.Min, 950.0, 1500.0);
            Assert.InRange(requestTime.Max, 950.0, 1500.0);

            var requestCount = processor.GetMetricByName <long>("http.desktop.client.request.count");

            Assert.NotNull(requestCount);
            Assert.Equal(2, requestCount.Sum);

            act.Stop();
        }
        public void ProcessEvent_IgnoresNulls()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new CLRRuntimeObserver(options, stats, null);

            observer.ProcessEvent("foobar", null);
            observer.ProcessEvent(CLRRuntimeObserver.HEAP_EVENT, null);
            observer.ProcessEvent(CLRRuntimeObserver.THREADS_EVENT, null);
        }
        public void ShouldIgnore_ReturnsExpected()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new HttpClientDesktopObserver(options, stats, null);

            Assert.True(observer.ShouldIgnoreRequest("/api/v2/spans"));
            Assert.True(observer.ShouldIgnoreRequest("/v2/apps/foobar/permissions"));
            Assert.True(observer.ShouldIgnoreRequest("/v2/apps/barfoo/permissions"));
            Assert.False(observer.ShouldIgnoreRequest("/api/test"));
            Assert.False(observer.ShouldIgnoreRequest("/v2/apps"));
        }
        public void Constructor_InitializesWithDefaults()
        {
            var opts = new MetricsObserverOptions();

            Assert.Equal(opts.IngressIgnorePattern, MetricsObserverOptions.DEFAULT_INGRESS_IGNORE_PATTERN);
            Assert.Equal(opts.EgressIgnorePattern, MetricsObserverOptions.DEFAULT_EGRESS_IGNORE_PATTERN);
            Assert.True(opts.AspNetCoreHosting);
            Assert.True(opts.GCEvents);
            Assert.False(opts.EventCounterEvents);
            Assert.True(opts.ThreadPoolEvents);
            Assert.False(opts.HttpClientCore);
            Assert.False(opts.HttpClientDesktop);
            Assert.False(opts.HystrixEvents);
        }
        public void GetTagContext_ReturnsExpected()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new HttpClientDesktopObserver(options, stats, null);

            var req    = GetHttpRequestMessage();
            var labels = observer.GetLabels(req, HttpStatusCode.InternalServerError);

            labels.Contains(KeyValuePair.Create("clientName", "localhost:5555"));
            labels.Contains(KeyValuePair.Create("uri", "/foo/bar"));
            labels.Contains(KeyValuePair.Create("status", "500"));
            labels.Contains(KeyValuePair.Create("method", "GET"));
        }
Example #8
0
        public void ProcessEvent_IgnoresNulls()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new AspNetCoreHostingObserver(options, stats, null);

            observer.ProcessEvent("foobar", null);
            observer.ProcessEvent(AspNetCoreHostingObserver.STOP_EVENT, null);

            var act = new Activity("Test");

            act.Start();
            observer.ProcessEvent(AspNetCoreHostingObserver.STOP_EVENT, null);
            act.Stop();
        }
        public void ProcessEvent_IgnoresNulls()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new HttpClientDesktopObserver(options, stats, null);

            observer.ProcessEvent("foobar", null);
            observer.ProcessEvent(HttpClientDesktopObserver.STOP_EVENT, null);

            Activity act = new Activity("Test");

            act.Start();
            observer.ProcessEvent(HttpClientDesktopObserver.STOP_EVENT, null);
            observer.ProcessEvent(HttpClientDesktopObserver.STOPEX_EVENT, null);
            act.Stop();
        }
        public void GetTagContext_ReturnsExpected()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new HttpClientCoreObserver(options, stats, null);

            var req        = GetHttpRequestMessage();
            var resp       = GetHttpResponseMessage(HttpStatusCode.InternalServerError);
            var tagContext = observer.GetLabels(req, resp, TaskStatus.RanToCompletion);
            var tagValues  = tagContext.ToList();

            tagValues.Contains(KeyValuePair.Create("clientName", "localhost:5555"));
            tagValues.Contains(KeyValuePair.Create("uri", "/foo/bar"));
            tagValues.Contains(KeyValuePair.Create("status", "500"));
            tagValues.Contains(KeyValuePair.Create("method", "GET"));
        }
        public void GetStatusCode_ReturnsExpected()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new HttpClientCoreObserver(options, stats, null);

            var message = GetHttpResponseMessage(HttpStatusCode.OK);
            var status  = observer.GetStatusCode(message, default);

            Assert.Equal("200", status);

            status = observer.GetStatusCode(null, TaskStatus.Canceled);
            Assert.Equal("CLIENT_CANCELED", status);

            status = observer.GetStatusCode(null, TaskStatus.Faulted);
            Assert.Equal("CLIENT_FAULT", status);

            status = observer.GetStatusCode(null, TaskStatus.RanToCompletion);
            Assert.Equal("CLIENT_ERROR", status);
        }
Example #12
0
        public void ShouldIgnore_ReturnsExpected()
        {
            var options = new MetricsObserverOptions();
            var stats   = new TestOpenTelemetryMetrics();
            var obs     = new AspNetCoreHostingObserver(options, stats, null);

            Assert.True(obs.ShouldIgnoreRequest("/cloudfoundryapplication/info"));
            Assert.True(obs.ShouldIgnoreRequest("/cloudfoundryapplication/health"));
            Assert.True(obs.ShouldIgnoreRequest("/foo/bar/image.png"));
            Assert.True(obs.ShouldIgnoreRequest("/foo/bar/image.gif"));
            Assert.True(obs.ShouldIgnoreRequest("/favicon.ico"));
            Assert.True(obs.ShouldIgnoreRequest("/foo.js"));
            Assert.True(obs.ShouldIgnoreRequest("/foo.css"));
            Assert.True(obs.ShouldIgnoreRequest("/javascript/foo.js"));
            Assert.True(obs.ShouldIgnoreRequest("/css/foo.css"));
            Assert.True(obs.ShouldIgnoreRequest("/foo.html"));
            Assert.True(obs.ShouldIgnoreRequest("/html/foo.html"));
            Assert.False(obs.ShouldIgnoreRequest("/api/test"));
            Assert.False(obs.ShouldIgnoreRequest("/v2/apps"));
        }
Example #13
0
        public void GetException_ReturnsExpected()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new AspNetCoreHostingObserver(options, stats, null);

            var context   = GetHttpRequestMessage();
            var exception = observer.GetException(context);

            Assert.Equal("None", exception);

            context = GetHttpRequestMessage();
            var exceptionHandlerFeature = new ExceptionHandlerFeature()
            {
                Error = new ArgumentNullException()
            };

            context.Features.Set <IExceptionHandlerFeature>(exceptionHandlerFeature);
            exception = observer.GetException(context);
            Assert.Equal("ArgumentNullException", exception);
        }
Example #14
0
        public void GetLabelSets_ReturnsExpected()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new AspNetCoreHostingObserver(options, stats, null);

            var context = GetHttpRequestMessage();
            var exceptionHandlerFeature = new ExceptionHandlerFeature()
            {
                Error = new ArgumentNullException()
            };

            context.Features.Set <IExceptionHandlerFeature>(exceptionHandlerFeature);
            context.Response.StatusCode = 404;

            var tagContext = observer.GetLabelSets(context);
            var tagValues  = tagContext.ToList();

            tagValues.Contains(KeyValuePair.Create("exception", "ArgumentNullException"));
            tagValues.Contains(KeyValuePair.Create("uri", "/foobar"));
            tagValues.Contains(KeyValuePair.Create("status", "404"));
            tagValues.Contains(KeyValuePair.Create("method", "GET"));
        }
        public void HandleStopEvent_RecordsStats()
        {
            var options   = new MetricsObserverOptions();
            var stats     = new TestOpenTelemetryMetrics();
            var observer  = new HttpClientCoreObserver(options, stats, null);
            var factory   = stats.Factory;
            var processor = stats.Processor;

            var req  = GetHttpRequestMessage();
            var resp = GetHttpResponseMessage(HttpStatusCode.InternalServerError);

            var act = new Activity("Test");

            act.Start();

            Task.Delay(1000).Wait();
            act.SetEndTime(DateTime.UtcNow);

            observer.HandleStopEvent(act, req, resp, TaskStatus.RanToCompletion);
            observer.HandleStopEvent(act, req, resp, TaskStatus.RanToCompletion);

            factory.CollectAllMetrics();

            var timeSummary = processor.GetMetricByName <double>("http.client.request.time");

            Assert.NotNull(timeSummary);
            var average = timeSummary.Sum / timeSummary.Count;

            Assert.InRange(average, 975.0, 1200.0);
            Assert.InRange(timeSummary.Max, 975.0, 1200.0);

            var countSummary = processor.GetMetricByName <long>("http.client.request.count");

            Assert.Equal(2, countSummary.Count);

            act.Stop();
        }
Example #16
0
        public void HandleStopEvent_RecordsStats()
        {
            var options   = new MetricsObserverOptions();
            var stats     = new TestOpenTelemetryMetrics();
            var observer  = new AspNetCoreHostingObserver(options, stats, null);
            var factory   = stats.Factory;
            var processor = stats.Processor;

            var context = GetHttpRequestMessage();
            var exceptionHandlerFeature = new ExceptionHandlerFeature()
            {
                Error = new ArgumentNullException()
            };

            context.Features.Set <IExceptionHandlerFeature>(exceptionHandlerFeature);
            context.Response.StatusCode = 500;

            var act = new Activity("Test");

            act.Start();
            Thread.Sleep(1000);
            act.SetEndTime(DateTime.UtcNow);

            observer.HandleStopEvent(act, context);
            observer.HandleStopEvent(act, context);

            factory.CollectAllMetrics();
            var requestTime = processor.GetMetricByName <double>("http.server.requests.seconds");

            Assert.NotNull(requestTime);
            Assert.Equal(2, requestTime.Count);
            Assert.True(requestTime.Sum / 2 > 1);
            Assert.True(requestTime.Max > 1);

            act.Stop();
        }
        public void HandleHeapEvent_RecordsValues()
        {
            var options  = new MetricsObserverOptions();
            var stats    = new TestOpenTelemetryMetrics();
            var observer = new CLRRuntimeObserver(options, stats, null);
            var factory  = stats.Factory;

            var metrics = new CLRRuntimeSource.HeapMetrics(1000, new List <long>()
            {
                10, 20, 30
            });

            observer.HandleHeapEvent(metrics);
            factory.CollectAllMetrics();

            var processor = stats.Processor;

            var metricName = "clr.memory.used";
            var summary    = processor.GetMetricByName <long>(metricName);

            Assert.NotNull(summary);
            var mean = summary.Sum / summary.Count;

            Assert.Equal(1000, mean);
            Assert.Equal(1000, summary.Min);
            Assert.Equal(1000, summary.Max);

            metricName = "clr.gc.collections";
            var gen0Label = new Dictionary <string, string>()
            {
                { "generation", "gen0" }
            }.ToList();

            summary = processor.GetMetricByName <long>(metricName, gen0Label);
            Assert.NotNull(summary);
            Assert.Equal(10, summary.Sum);

            var gen1Label = new Dictionary <string, string>()
            {
                { "generation", "gen1" }
            }.ToList();

            summary = processor.GetMetricByName <long>(metricName, gen1Label);
            Assert.NotNull(summary);
            Assert.Equal(20, summary.Sum);

            var gen2Label = new Dictionary <string, string>()
            {
                { "generation", "gen2" }
            }.ToList();

            summary = processor.GetMetricByName <long>(metricName, gen2Label);
            Assert.NotNull(summary);
            Assert.Equal(30, summary.Sum);

            processor.Clear();
            observer = new CLRRuntimeObserver(options, stats, null);

            metrics = new CLRRuntimeSource.HeapMetrics(1000, new List <long>()
            {
                10, 20, 30
            });
            observer.HandleHeapEvent(metrics);
            metrics = new CLRRuntimeSource.HeapMetrics(5000, new List <long>()
            {
                15, 25, 30
            });
            observer.HandleHeapEvent(metrics);
            factory.CollectAllMetrics();

            metricName = "clr.memory.used";
            summary    = processor.GetMetricByName <long>(metricName);
            Assert.Equal(5000 + 1000, summary.Sum);
            Assert.Equal(5000, summary.Max);
            Assert.Equal(1000, summary.Min);

            metricName = "clr.gc.collections";
            summary    = processor.GetMetricByName <long>(metricName, gen0Label);
            Assert.Equal(15, summary.Sum);

            summary = processor.GetMetricByName <long>(metricName, gen1Label);
            Assert.NotNull(summary);
            Assert.Equal(25, summary.Sum);

            summary = processor.GetMetricByName <long>(metricName, gen2Label);
            Assert.NotNull(summary);
            Assert.Equal(30, summary.Sum);
        }
        public void HandleThreadsEvent_RecordsValues()
        {
            var options   = new MetricsObserverOptions();
            var stats     = new TestOpenTelemetryMetrics();
            var factory   = stats.Factory;
            var processor = stats.Processor;
            var observer  = new CLRRuntimeObserver(options, stats, null);

            var metrics = new CLRRuntimeSource.ThreadMetrics(100, 100, 200, 200);

            observer.HandleThreadsEvent(metrics);

            factory.CollectAllMetrics();

            var metricName = "clr.threadpool.active";
            var summary    = processor.GetMetricByName <long>(metricName);

            Assert.NotNull(summary);
            var mean = summary.Sum / summary.Count;

            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);

            var workerLabel = new Dictionary <string, string>()
            {
                { "kind", "worker" }
            }.ToList();

            summary = processor.GetMetricByName <long>(metricName, workerLabel);
            Assert.NotNull(summary);
            mean = summary.Sum / summary.Count;
            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);

            var comportLabel = new Dictionary <string, string>()
            {
                { "kind", "completionPort" }
            }.ToList();

            summary = processor.GetMetricByName <long>(metricName, comportLabel);
            Assert.NotNull(summary);
            mean = summary.Sum / summary.Count;
            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);

            metricName = "clr.threadpool.avail";
            summary    = processor.GetMetricByName <long>(metricName);
            Assert.NotNull(summary);
            mean = summary.Sum / summary.Count;
            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);

            summary = processor.GetMetricByName <long>(metricName, workerLabel);
            Assert.NotNull(summary);
            mean = summary.Sum / summary.Count;
            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);

            summary = processor.GetMetricByName <long>(metricName, comportLabel);
            Assert.NotNull(summary);
            mean = summary.Sum / summary.Count;
            Assert.Equal(100, mean);
            Assert.Equal(100, summary.Min);
            Assert.Equal(100, summary.Max);
        }