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")); }
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); }
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")); }
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); }
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(); }
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); }