public async void HandleMetricsRequestAsync_GetSpecificExistingMetric_ReturnsExpected() { var opts = new MetricsEndpointOptions(); var mopts = TestHelpers.GetManagementOptions(opts); var stats = new OpenCensusStats(); var tagsComponent = new TagsComponent(); var tagger = tagsComponent.Tagger; var ep = new MetricsEndpoint(opts, stats); SetupTestView(stats); var middle = new MetricsEndpointMiddleware(null, ep, mopts); var context = CreateRequest("GET", "/cloudfoundryapplication/metrics/test.test", "?tag=a:v1"); await middle.HandleMetricsRequestAsync(context); Assert.Equal(200, context.Response.StatusCode); context.Response.Body.Seek(0, SeekOrigin.Begin); StreamReader rdr = new StreamReader(context.Response.Body); string json = await rdr.ReadToEndAsync(); Assert.Equal("{\"name\":\"test.test\",\"measurements\":[{\"statistic\":\"TOTAL\",\"value\":45.0}],\"availableTags\":[{\"tag\":\"a\",\"values\":[\"v1\"]},{\"tag\":\"b\",\"values\":[\"v1\"]},{\"tag\":\"c\",\"values\":[\"v1\"]}]}", json); }
public void HandleStopEvent_RecordsStats() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new AspNetCoreHostingObserver(options, stats, tags, null); var context = GetHttpRequestMessage(); var exceptionHandlerFeature = new ExceptionHandlerFeature() { Error = new ArgumentNullException() }; context.Features.Set <IExceptionHandlerFeature>(exceptionHandlerFeature); context.Response.StatusCode = 500; Activity act = new Activity("Test"); act.Start(); Thread.Sleep(1000); act.SetEndTime(DateTime.UtcNow); observer.HandleStopEvent(act, context); observer.HandleStopEvent(act, context); var reqData = stats.ViewManager.GetView(ViewName.Create("http.server.request.time")); var aggData1 = reqData.SumWithTags() as IDistributionData; Assert.Equal(2, aggData1.Count); Assert.True(aggData1.Mean > 1000.00); Assert.True(aggData1.Max > 1000.00); act.Stop(); }
public void Invoke_WithNullMetricsRequest_ReturnsExpected() { var opts = new MetricsEndpointOptions(); SetupStats(out var exporter); var ep = new MetricsEndpoint(opts, exporter); var result = ep.Invoke(null); Assert.NotNull(result); Assert.IsType <MetricsListNamesResponse>(result); var resp = result as MetricsListNamesResponse; Assert.NotEmpty(resp.Names); Assert.Contains("http.server.requests", resp.Names); Assert.Contains("jvm.memory.used", resp.Names); Assert.Equal(2, resp.Names.Count); opts = new MetricsEndpointOptions(); exporter = new SteeltoeExporter(); ep = new MetricsEndpoint(opts, exporter); result = ep.Invoke(null); Assert.NotNull(result); Assert.IsType <MetricsListNamesResponse>(result); resp = result as MetricsListNamesResponse; Assert.Empty(resp.Names); }
public void EventCounterListenerGetsMetricsTest() { var options = new MetricsEndpointOptions(); var stats = new TestOpenTelemetryMetrics(); var factory = stats.Factory; var processor = stats.Processor; using var listener = new EventCounterListener(stats, new MetricsObserverOptions()); Task.Delay(2000).Wait(); factory.CollectAllMetrics(); foreach (var metric in _longMetrics) { var summary = processor.GetMetricByName <long>(metric); Assert.NotNull(summary); Assert.True(summary.Count > 0); } foreach (var metric in _doubleMetrics) { var summary = processor.GetMetricByName <double>(metric); Assert.NotNull(summary); Assert.True(summary.Count > 0); } }
public void ParseTags_ReturnsExpected() { var opts = new MetricsEndpointOptions(); var mopts = TestHelper.GetManagementOptions(opts); var ep = new MetricsEndpoint(opts, new SteeltoeExporter()); var middle = new MetricsEndpointMiddleware(null, ep, mopts); var context1 = CreateRequest("GET", "/cloudfoundryapplication/metrics/Foo.Bar.Class", "?foo=key:value"); var result = middle.ParseTags(context1.Request.Query); Assert.NotNull(result); Assert.Empty(result); var context2 = CreateRequest("GET", "/cloudfoundryapplication/metrics/Foo.Bar.Class", "?tag=key:value"); result = middle.ParseTags(context2.Request.Query); Assert.NotNull(result); Assert.Contains(new KeyValuePair <string, string>("key", "value"), result); var context3 = CreateRequest("GET", "/cloudfoundryapplication/metrics/Foo.Bar.Class", "?tag=key:value&foo=key:value&tag=key1:value1"); result = middle.ParseTags(context3.Request.Query); Assert.NotNull(result); Assert.Contains(new KeyValuePair <string, string>("key", "value"), result); Assert.Contains(new KeyValuePair <string, string>("key1", "value1"), result); Assert.Equal(2, result.Count); var context4 = CreateRequest("GET", "/cloudfoundryapplication/metrics/Foo.Bar.Class", "?tag=key:value&foo=key:value&tag=key:value"); result = middle.ParseTags(context4.Request.Query); Assert.NotNull(result); Assert.Contains(new KeyValuePair <string, string>("key", "value"), result); Assert.Single(result); }
public async Task HandleMetricsRequestAsync_GetSpecificExistingMetric_ReturnsExpected() { var opts = new MetricsEndpointOptions(); var mopts = new CloudFoundryManagementOptions(); mopts.EndpointOptions.Add(opts); var stats = new TestOpenTelemetryMetrics(); var exporter = stats.Exporter; SetupTestView(stats); var ep = new MetricsEndpoint(opts, exporter); var middle = new MetricsEndpointMiddleware(null, ep, mopts); var context = CreateRequest("GET", "/cloudfoundryapplication/metrics/test", "?tag=a:v1"); await middle.HandleMetricsRequestAsync(context); Assert.Equal(200, context.Response.StatusCode); context.Response.Body.Seek(0, SeekOrigin.Begin); var rdr = new StreamReader(context.Response.Body); var json = await rdr.ReadToEndAsync(); Assert.Equal("{\"name\":\"test\",\"measurements\":[{\"statistic\":\"VALUE\",\"value\":4.5},{\"statistic\":\"TOTAL\",\"value\":45}],\"availableTags\":[{\"tag\":\"a\",\"values\":[\"v1\"]},{\"tag\":\"b\",\"values\":[\"v1\"]},{\"tag\":\"c\",\"values\":[\"v1\"]}]}", json); }
public void HandleStopEvent_RecordsStats() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new HttpClientDesktopObserver(options, stats, tags, null); 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); var reqData = stats.ViewManager.GetView(ViewName.Create("http.desktop.client.request.time")); var aggData1 = MetricsHelpers.SumWithTags(reqData) as IDistributionData; Assert.InRange(aggData1.Mean, 990.0, 1025.0); Assert.InRange(aggData1.Max, 990.0, 1025.0); reqData = stats.ViewManager.GetView(ViewName.Create("http.desktop.client.request.count")); var aggData2 = MetricsHelpers.SumWithTags(reqData) as ISumDataLong; Assert.Equal(2, aggData2.Sum); act.Stop(); }
public void Constructor_InitializesWithDefaults() { var opts = new MetricsEndpointOptions(); Assert.Null(opts.Enabled); Assert.Equal("metrics", opts.Id); }
/// <summary> /// Register the Metrics endpoint, OWIN middleware and options /// </summary> /// <param name="container">Autofac DI <see cref="ContainerBuilder"/></param> /// <param name="config">Your application's <see cref="IConfiguration"/></param> public static void RegisterMetricsActuator(this ContainerBuilder container, IConfiguration config) { if (container == null) { throw new ArgumentNullException(nameof(container)); } if (config == null) { throw new ArgumentNullException(nameof(config)); } container.RegisterType <DiagnosticsManager>().As <IDiagnosticsManager>().IfNotRegistered(typeof(IDiagnosticsManager)).SingleInstance(); container.RegisterType <CLRRuntimeSource>().As <IPolledDiagnosticSource>().SingleInstance(); container.Register(c => { var options = new MetricsEndpointOptions(config); var mgmtOptions = c.Resolve <IEnumerable <IManagementOptions> >(); foreach (var mgmt in mgmtOptions) { mgmt.EndpointOptions.Add(options); } return(options); }).As <IMetricsOptions>().IfNotRegistered(typeof(IMetricsOptions)).SingleInstance(); container.RegisterType <OwinHostingObserver>().As <IDiagnosticObserver>().SingleInstance(); container.RegisterType <CLRRuntimeObserver>().As <IDiagnosticObserver>().SingleInstance(); container.RegisterType <OpenCensusStats>().As <IStats>().IfNotRegistered(typeof(IStats)).SingleInstance(); container.RegisterType <OpenCensusTags>().As <ITags>().IfNotRegistered(typeof(ITags)).SingleInstance(); container.RegisterType <MetricsEndpoint>().SingleInstance(); container.RegisterType <MetricsEndpointOwinMiddleware>().SingleInstance(); }
public void HandleStopEvent_RecordsStats() { var options = new MetricsEndpointOptions(); 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 Poll_GeneratesExpectedEvents() { var source = new CLRRuntimeSource(); var listener = source.Source as DiagnosticListener; var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new TestObserver(options, stats, tags, 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 RoutesByPathAndVerb() { var options = new MetricsEndpointOptions(); Assert.False(options.ExactMatch); Assert.Equal("/actuator/metrics/{**_}", options.GetContextPath(new ActuatorManagementOptions())); Assert.Equal("/cloudfoundryapplication/metrics/{**_}", options.GetContextPath(new CloudFoundryManagementOptions())); Assert.Null(options.AllowedVerbs); }
public void HandleThreadsEvent_RecordsValues() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new CLRRuntimeObserver(options, stats, tags, null); CLRRuntimeSource.ThreadMetrics metrics = new CLRRuntimeSource.ThreadMetrics(100, 100, 200, 200); observer.HandleThreadsEvent(metrics); var live = stats.ViewManager.GetView(ViewName.Create("clr.threadpool.active")); var aggData = MetricsHelpers.SumWithTags(live) as IMeanData; Assert.Equal(100, aggData.Mean); Assert.Equal(100, aggData.Min); Assert.Equal(100, aggData.Max); aggData = MetricsHelpers.SumWithTags(live, new List <ITagValue>() { TagValue.Create("worker") }) as IMeanData; Assert.Equal(100, aggData.Mean); Assert.Equal(100, aggData.Min); Assert.Equal(100, aggData.Max); aggData = MetricsHelpers.SumWithTags(live, new List <ITagValue>() { TagValue.Create("completionPort") }) as IMeanData; Assert.Equal(100, aggData.Mean); Assert.Equal(100, aggData.Min); Assert.Equal(100, aggData.Max); var avail = stats.ViewManager.GetView(ViewName.Create("clr.threadpool.avail")); aggData = MetricsHelpers.SumWithTags(avail) as IMeanData; Assert.Equal(100, aggData.Mean); Assert.Equal(100, aggData.Min); Assert.Equal(100, aggData.Max); aggData = MetricsHelpers.SumWithTags(avail, new List <ITagValue>() { TagValue.Create("worker") }) as IMeanData; Assert.Equal(100, aggData.Mean); Assert.Equal(100, aggData.Min); Assert.Equal(100, aggData.Max); aggData = MetricsHelpers.SumWithTags(avail, new List <ITagValue>() { TagValue.Create("completionPort") }) as IMeanData; Assert.Equal(100, aggData.Mean); Assert.Equal(100, aggData.Min); Assert.Equal(100, aggData.Max); }
public void Constructor_RegistersExpectedViews() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new AspNetCoreHostingObserver(options, stats, tags, null); Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("http.server.request.time"))); Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("http.server.request.count"))); }
public void ProcessEvent_IgnoresNulls() { var options = new MetricsEndpointOptions(); 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 Invoke_WithMetricsRequest_ReturnsExpected() { var opts = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tagsComponent = new TagsComponent(); var tagger = tagsComponent.Tagger; var ep = new MetricsEndpoint(opts, stats); var testMeasure = MeasureDouble.Create("test.total", "test", MeasureUnit.Bytes); SetupTestView(stats, Sum.Create(), testMeasure, "test.test1"); var context1 = tagger .EmptyBuilder .Put(TagKey.Create("a"), TagValue.Create("v1")) .Put(TagKey.Create("b"), TagValue.Create("v1")) .Put(TagKey.Create("c"), TagValue.Create("v1")) .Build(); long allKeyssum = 0; for (var i = 0; i < 10; i++) { allKeyssum += i; stats.StatsRecorder.NewMeasureMap().Put(testMeasure, i).Record(context1); } var alltags = new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>("a", "v1"), new KeyValuePair <string, string>("b", "v1"), new KeyValuePair <string, string>("c", "v1") }; var req = new MetricsRequest("test.test1", alltags); var resp = ep.Invoke(req) as MetricsResponse; Assert.NotNull(resp); Assert.Equal("test.test1", resp.Name); Assert.NotNull(resp.Measurements); Assert.Single(resp.Measurements); var sample = resp.Measurements[0]; Assert.Equal(MetricStatistic.TOTAL, sample.Statistic); Assert.Equal(allKeyssum, sample.Value); Assert.NotNull(resp.AvailableTags); Assert.Equal(3, resp.AvailableTags.Count); req = new MetricsRequest("foo.bar", alltags); resp = ep.Invoke(req) as MetricsResponse; Assert.Null(resp); }
public void ProcessEvent_IgnoresNulls() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new CLRRuntimeObserver(options, stats, tags, null); observer.ProcessEvent("foobar", null); observer.ProcessEvent(CLRRuntimeObserver.HEAP_EVENT, null); observer.ProcessEvent(CLRRuntimeObserver.THREADS_EVENT, null); }
public void ShouldIgnore_ReturnsExpected() { var options = new MetricsEndpointOptions(); 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_RegistersExpectedViews() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new CLRRuntimeObserver(options, stats, tags, null); Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("clr.memory.used"))); Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("clr.gc.collections"))); Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("clr.threadpool.active"))); Assert.NotNull(stats.ViewManager.GetView(ViewName.Create("clr.threadpool.avail"))); }
public void EventCounterListenerGetsMetricsTest() { var options = new MetricsEndpointOptions(); var stats = new TestOpenTelemetryMetrics(); var factory = stats.Factory; var processor = stats.Processor; using var listener = new EventCounterListener(stats); Task.Delay(2000).Wait(); factory.CollectAllMetrics(); var longMetrics = new string[] { "System.Runtime.alloc-rate", "System.Runtime.gen-2-gc-count", "System.Runtime.threadpool-completed-items-count", "System.Runtime.monitor-lock-contention-count", "System.Runtime.gen-1-gc-count", "System.Runtime.gen-0-gc-count", "System.Runtime.exception-count" }; var doubleMetrics = new string[] { "System.Runtime.time-in-gc", "System.Runtime.threadpool-thread-count", "System.Runtime.gen-1-size", "System.Runtime.threadpool-queue-length", "System.Runtime.gen-2-size", "System.Runtime.gc-heap-size", "System.Runtime.assembly-count", "System.Runtime.gen-0-size", "System.Runtime.cpu-usage", "System.Runtime.active-timer-count", "System.Runtime.loh-size", "System.Runtime.working-set" }; foreach (var metric in longMetrics) { var summary = processor.GetMetricByName <long>(metric); Assert.NotNull(summary); Assert.True(summary.Count > 0); } foreach (var metric in doubleMetrics) { var summary = processor.GetMetricByName <double>(metric); Assert.NotNull(summary); Assert.True(summary.Count > 0); } }
public void GetTagValuesInColumnOrder_ReturnsExpected() { var tags = new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>("foo", "bar"), new KeyValuePair <string, string>("aaa", "bbb") }; var columns = new List <ITagKey>() { TagKey.Create("foo"), TagKey.Create("aaa") }; var opts = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var ep = new MetricsEndpoint(opts, stats); var result = ep.GetTagValuesInColumnOrder(columns, tags); Assert.NotNull(result); Assert.Equal(2, result.Count); Assert.Equal(TagValue.Create("bar"), result[0]); Assert.Equal(TagValue.Create("bbb"), result[1]); // Invalid tagkey provided columns = new List <ITagKey>() { TagKey.Create("bar"), TagKey.Create("aaa") }; result = ep.GetTagValuesInColumnOrder(columns, tags); Assert.Null(result); // aaa column not provided columns = new List <ITagKey>() { TagKey.Create("foo"), TagKey.Create("aaa"), TagKey.Create("bbb"), }; tags = new List <KeyValuePair <string, string> >() { new KeyValuePair <string, string>("foo", "bar"), new KeyValuePair <string, string>("bbb", "bbb") }; result = ep.GetTagValuesInColumnOrder(columns, tags); Assert.Equal(3, result.Count); Assert.Equal(TagValue.Create("bar"), result[0]); Assert.Null(result[1]); Assert.Equal(TagValue.Create("bbb"), result[2]); }
public void ParseTag_ReturnsExpected() { var opts = new MetricsEndpointOptions(); var mopts = TestHelper.GetManagementOptions(opts); var ep = new MetricsEndpoint(opts, new SteeltoeExporter()); var middle = new MetricsEndpointMiddleware(null, ep, mopts); Assert.Null(middle.ParseTag("foobar")); Assert.Equal(new KeyValuePair <string, string>("foo", "bar"), middle.ParseTag("foo:bar")); Assert.Equal(new KeyValuePair <string, string>("foo", "bar:bar"), middle.ParseTag("foo:bar:bar")); Assert.Null(middle.ParseTag("foo,bar")); }
public void ShouldIgnore_ReturnsExpected() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var obs = new HttpClientCoreObserver(options, stats, tags, null); Assert.True(obs.ShouldIgnoreRequest("/api/v2/spans")); Assert.True(obs.ShouldIgnoreRequest("/v2/apps/foobar/permissions")); Assert.True(obs.ShouldIgnoreRequest("/v2/apps/barfoo/permissions")); Assert.False(obs.ShouldIgnoreRequest("/api/test")); Assert.False(obs.ShouldIgnoreRequest("/v2/apps")); }
public void GetTagContext_ReturnsExpected() { var options = new MetricsEndpointOptions(); 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 async void HandleMetricsRequestAsync_GetSpecificNonExistingMetric_ReturnsExpected() { var opts = new MetricsEndpointOptions(); var mopts = TestHelper.GetManagementOptions(opts); var ep = new MetricsEndpoint(opts, new SteeltoeExporter()); var middle = new MetricsEndpointMiddleware(null, ep, mopts); var context = CreateRequest("GET", "/cloudfoundryapplication/metrics/foo.bar"); await middle.HandleMetricsRequestAsync(context); Assert.Equal(404, context.Response.StatusCode); }
public async Task MultipleExportersTestAsync() { var opts = new PrometheusEndpointOptions(); var mopts = new ActuatorManagementOptions(); mopts.EndpointOptions.Add(opts); var exporter1 = new PrometheusExporter(); var exporter2 = new SteeltoeExporter(); var multiExporter = new MultiExporter(new MetricExporter[] { exporter1, exporter2 }.ToList()); var processor = new SteeltoeProcessor(multiExporter); var factory = AutoCollectingMeterFactory.Create(processor); var meter = factory.GetMeter("Test"); SetupTestView(meter); factory.CollectAllMetrics(); processor.ExportMetrics(); Task.Delay(1000).Wait(); var ep = new PrometheusScraperEndpoint(opts, exporter1); var middle = new PrometheusScraperEndpointMiddleware(null, ep, mopts); var context = CreateRequest("GET", "/actuator/prometheus"); await middle.HandleMetricsRequestAsync(context); context.Response.Body.Seek(0, SeekOrigin.Begin); var rdr = new StreamReader(context.Response.Body); var text = await rdr.ReadToEndAsync(); Assert.Equal("# HELP test Testtest\n# TYPE test counter\ntest{a=\"v1\",b=\"v1\",c=\"v1\"} 45\n", text); var meopts = new MetricsEndpointOptions(); var ep2 = new MetricsEndpoint(meopts, exporter2); var middle2 = new MetricsEndpointMiddleware(null, ep2, mopts); var context2 = CreateRequest("GET", "/actuator/metrics/test", "?tag=a:v1"); await middle2.HandleMetricsRequestAsync(context2); Assert.Equal(200, context.Response.StatusCode); context2.Response.Body.Seek(0, SeekOrigin.Begin); StreamReader rdr2 = new StreamReader(context2.Response.Body); string json = await rdr2.ReadToEndAsync(); Assert.Equal("{\"name\":\"test\",\"measurements\":[{\"statistic\":\"COUNT\",\"value\":45}],\"availableTags\":[{\"tag\":\"a\",\"values\":[\"v1\"]},{\"tag\":\"b\",\"values\":[\"v1\"]},{\"tag\":\"c\",\"values\":[\"v1\"]}]}", json); }
public void ProcessEvent_IgnoresNulls() { var options = new MetricsEndpointOptions(); var stats = new TestOpenTelemetryMetrics(); var observer = new AspNetCoreHostingObserver(options, stats, null); observer.ProcessEvent("foobar", null); observer.ProcessEvent(AspNetCoreHostingObserver.STOP_EVENT, null); Activity act = new Activity("Test"); act.Start(); observer.ProcessEvent(AspNetCoreHostingObserver.STOP_EVENT, null); act.Stop(); }
public void ProcessEvent_IgnoresNulls() { var options = new MetricsEndpointOptions(); var stats = new TestOpenTelemetryMetrics(); var observer = new HttpClientCoreObserver(options, stats, null); observer.ProcessEvent("foobar", null); observer.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, null); var act = new Activity("Test"); act.Start(); observer.ProcessEvent(HttpClientCoreObserver.STOP_EVENT, null); observer.ProcessEvent(HttpClientCoreObserver.EXCEPTION_EVENT, null); act.Stop(); }
public void MetricsEndpointMiddleware_PathAndVerbMatching_ReturnsExpected() { var opts = new MetricsEndpointOptions(); var mopts = TestHelper.GetManagementOptions(opts); var ep = new MetricsEndpoint(opts, new SteeltoeExporter()); var middle = new MetricsEndpointMiddleware(null, ep, mopts); Assert.True(middle.RequestVerbAndPathMatch("GET", "/cloudfoundryapplication/metrics")); Assert.False(middle.RequestVerbAndPathMatch("PUT", "/cloudfoundryapplication/metrics")); Assert.False(middle.RequestVerbAndPathMatch("GET", "/cloudfoundryapplication/badpath")); Assert.False(middle.RequestVerbAndPathMatch("POST", "/cloudfoundryapplication/metrics")); Assert.False(middle.RequestVerbAndPathMatch("DELETE", "/cloudfoundryapplication/metrics")); Assert.True(middle.RequestVerbAndPathMatch("GET", "/cloudfoundryapplication/metrics/Foo.Bar.Class")); Assert.True(middle.RequestVerbAndPathMatch("GET", "/cloudfoundryapplication/metrics/Foo.Bar.Class?tag=key:value&tag=key1:value1")); Assert.True(middle.RequestVerbAndPathMatch("GET", "/cloudfoundryapplication/metrics?tag=key:value&tag=key1:value1")); }
public void GetTagContext_ReturnsExpected() { var options = new MetricsEndpointOptions(); var stats = new OpenCensusStats(); var tags = new OpenCensusTags(); var observer = new HttpClientDesktopObserver(options, stats, tags, null); var req = GetHttpRequestMessage(); var tagContext = observer.GetTagContext(req, HttpStatusCode.InternalServerError); var tagValues = tagContext.ToList(); tagValues.Contains(Tag.Create(TagKey.Create("clientName"), TagValue.Create("localhost:5555"))); tagValues.Contains(Tag.Create(TagKey.Create("uri"), TagValue.Create("/foo/bar"))); tagValues.Contains(Tag.Create(TagKey.Create("status"), TagValue.Create("500"))); tagValues.Contains(Tag.Create(TagKey.Create("method"), TagValue.Create("GET"))); }