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);
        }
Example #2
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 void ParseTags_ReturnsExpected()
        {
            var opts  = new MetricsOptions();
            var stats = new OpenCensusStats();

            var ep     = new MetricsEndpoint(opts, stats);
            var middle = new MetricsEndpointOwinMiddleware(null, ep);

            var context1 = CreateRequest("GET", "/metrics/Foo.Bar.Class", "foo=key:value");
            var result   = middle.ParseTags(context1.Request.Query);

            Assert.NotNull(result);
            Assert.Empty(result);

            var context2 = CreateRequest("GET", "/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", "/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", "/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);
        }
Example #4
0
        /// <summary>
        /// Register a report at the specified endpoint.
        /// </summary>
        /// <param name="endpoint">Endpoint where the report will be accessible. E.g. "/text" </param>
        /// <param name="responseFactory">Produces the response. Will be called each time the endpoint is accessed.</param>
        /// <returns>Chain-able configuration object.</returns>
        public MetricsEndpointReports WithEndpointReport(string endpoint, Func <MetricsData, Func <HealthStatus>, MetricsEndpointRequest, MetricsEndpointResponse> responseFactory)
        {
            var metricsEndpoint = new MetricsEndpoint(endpoint, r => responseFactory(this.metricsDataProvider.CurrentMetricsData, this.healthStatus, r));

            this.endpoints[metricsEndpoint.Endpoint] = metricsEndpoint;
            return(this);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        public void MetricsEndpointHandler_CannotProcessMissingEndpoint()
        {
            var endpoint = new MetricsEndpoint("test", c => new MetricsEndpointResponse("text", "text/plain"));
            var handler  = new MetricsEndpointHandler(new[] { endpoint });

            var response = handler.Process("other", null);

            response.Should().BeNull();
        }
Example #8
0
        public void MetricsEndpoint_MatchesCorrectly()
        {
            var endpoint = new MetricsEndpoint("test", c => new MetricsEndpointResponse("test", "text/plain"));

            endpoint.IsMatch("test").Should().BeTrue();
            endpoint.IsMatch("/test").Should().BeTrue();
            endpoint.IsMatch("TEST").Should().BeTrue();
            endpoint.IsMatch("/TEST").Should().BeTrue();
            endpoint.IsMatch("text").Should().BeFalse();
        }
Example #9
0
        public void MetricsEndpoint_CanNormalizePath()
        {
            var endpoint1 = new MetricsEndpoint("test", c => new MetricsEndpointResponse("test", "text/plain"));

            endpoint1.Endpoint.Should().Be("test");

            var endpoint2 = new MetricsEndpoint("/test", c => new MetricsEndpointResponse("test", "text/plain"));

            endpoint1.Endpoint.Should().Be("test");
        }
Example #10
0
        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);
        }
Example #11
0
        public void MetricsEndpointHandler_CanProcessEndpoint()
        {
            var endpoint = new MetricsEndpoint("test", c => new MetricsEndpointResponse("text", "text/plain"));
            var handler  = new TestMetricsEndpointHandler(new[] { endpoint });

            var response = handler.Process("test", null);

            response.Should().NotBeNull();
            response.Content.Should().Be("text");
            response.ContentType.Should().Be("text/plain");
        }
Example #12
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 MetricsOptions();
            var stats = new OpenCensusStats();

            var ep     = new MetricsEndpoint(opts, stats);
            var middle = new MetricsEndpointOwinMiddleware(null, ep);

            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"));
        }
Example #14
0
        public void MetricsEndpoint_CanProduceResponse()
        {
            Func <MetricsEndpointRequest, MetricsEndpointResponse> factory = r => new MetricsEndpointResponse("custom content", "application/custom", Encoding.ASCII, 202, "Accepted");
            var endpoint = new MetricsEndpoint("test", factory);

            var response = endpoint.ProduceResponse(null);

            response.Content.Should().Be("custom content");
            response.ContentType.Should().Be("application/custom");
            response.Encoding.Should().Be(Encoding.ASCII);
            response.StatusCode.Should().Be(202);
            response.StatusCodeDescription.Should().Be("Accepted");
        }
Example #15
0
        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 async void HandleMetricsRequestAsync_GetSpecificNonExistingMetric_ReturnsExpected()
        {
            var opts  = new MetricsOptions();
            var stats = new OpenCensusStats();

            var ep     = new MetricsEndpoint(opts, stats);
            var middle = new MetricsEndpointOwinMiddleware(null, ep);

            var context = CreateRequest("GET", "/metrics/foo.bar");

            await middle.HandleMetricsRequestAsync(context);

            Assert.Equal(404, context.Response.StatusCode);
        }
Example #17
0
        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);
        }
Example #18
0
        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);
        }
Example #19
0
        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 MetricsEndpointMiddleware_PathAndVerbMatching_ReturnsExpected()
        {
            var opts   = new MetricsOptions();
            var stats  = new OpenCensusStats();
            var ep     = new MetricsEndpoint(opts, stats);
            var middle = new MetricsEndpointOwinMiddleware(null, ep);

            Assert.True(middle.RequestVerbAndPathMatch("GET", "/metrics"));
            Assert.False(middle.RequestVerbAndPathMatch("PUT", "/metrics"));
            Assert.False(middle.RequestVerbAndPathMatch("GET", "/badpath"));
            Assert.False(middle.RequestVerbAndPathMatch("POST", "/metrics"));
            Assert.False(middle.RequestVerbAndPathMatch("DELETE", "/metrics"));
            Assert.True(middle.RequestVerbAndPathMatch("GET", "/metrics/Foo.Bar.Class"));
            Assert.True(middle.RequestVerbAndPathMatch("GET", "/metrics/Foo.Bar.Class?tag=key:value&tag=key1:value1"));
            Assert.True(middle.RequestVerbAndPathMatch("GET", "/metrics?tag=key:value&tag=key1:value1"));
        }
Example #21
0
        /// <summary>
        /// Add Metrics actuator endpoint to OWIN Pipeline
        /// </summary>
        /// <param name="builder">OWIN <see cref="IAppBuilder" /></param>
        /// <param name="config"><see cref="IConfiguration"/> of application for configuring metrics endpoint</param>
        /// <param name="stats">Class for recording statistics - See also: <seealso cref="OpenCensusStats"/></param>
        /// <param name="tags">Class using for recording statistics</param>
        /// <param name="loggerFactory">For logging within the middleware</param>
        /// <returns>OWIN <see cref="IAppBuilder" /> with Metrics Endpoint added</returns>
        public static IAppBuilder UseMetricsActuator(this IAppBuilder builder, IConfiguration config, IStats stats, ITags tags, ILoggerFactory loggerFactory = null)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            if (config == null)
            {
                throw new ArgumentNullException(nameof(config));
            }

            if (stats == null)
            {
                throw new ArgumentNullException(nameof(stats));
            }

            if (tags == null)
            {
                throw new ArgumentNullException(nameof(tags));
            }

            IMetricsOptions options     = new MetricsEndpointOptions(config);
            var             mgmtOptions = ManagementOptions.Get(config);

            foreach (var mgmt in mgmtOptions)
            {
                mgmt.EndpointOptions.Add(options);
            }

            var hostObserver = new OwinHostingObserver(options, stats, tags, loggerFactory?.CreateLogger <OwinHostingObserver>());
            var clrObserver  = new CLRRuntimeObserver(options, stats, tags, loggerFactory?.CreateLogger <CLRRuntimeObserver>());

            DiagnosticsManager.Instance.Observers.Add(hostObserver);
            DiagnosticsManager.Instance.Observers.Add(clrObserver);

            var clrSource = new CLRRuntimeSource();

            DiagnosticsManager.Instance.Sources.Add(clrSource);

            var endpoint = new MetricsEndpoint(options, stats, loggerFactory?.CreateLogger <MetricsEndpoint>());
            var logger   = loggerFactory?.CreateLogger <MetricsEndpointOwinMiddleware>();

            return(builder.Use <MetricsEndpointOwinMiddleware>(endpoint, mgmtOptions, logger));
        }
Example #22
0
        public static void UseMetricsActuator(IConfiguration configuration, ILoggerFactory loggerFactory)
        {
            var options = new MetricsOptions(configuration);

            var hostObserver = new AspNetHostingObserver(options, OpenCensusStats.Instance, OpenCensusTags.Instance, CreateLogger <AspNetHostingObserver>(loggerFactory));
            var clrObserver  = new CLRRuntimeObserver(options, OpenCensusStats.Instance, OpenCensusTags.Instance, CreateLogger <CLRRuntimeObserver>(loggerFactory));

            DiagnosticsManager.Instance.Observers.Add((IDiagnosticObserver)hostObserver);
            DiagnosticsManager.Instance.Observers.Add((IDiagnosticObserver)clrObserver);

            var clrSource = new CLRRuntimeSource();

            DiagnosticsManager.Instance.Sources.Add(clrSource);
            var ep      = new MetricsEndpoint(options, OpenCensusStats.Instance, CreateLogger <MetricsEndpoint>(loggerFactory));
            var handler = new MetricsHandler(ep, SecurityService, CreateLogger <MetricsHandler>(loggerFactory));

            ConfiguredHandlers.Add(handler);
        }
Example #23
0
        public async void HandleMetricsRequestAsync_GetMetricsNames_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");

            await middle.HandleMetricsRequestAsync(context);

            context.Response.Body.Seek(0, SeekOrigin.Begin);
            StreamReader rdr  = new StreamReader(context.Response.Body);
            string       json = await rdr.ReadToEndAsync();

            Assert.Equal("{\"names\":[]}", json);
        }
        public async void HandleMetricsRequestAsync_GetMetricsNames_ReturnsExpected()
        {
            var opts  = new MetricsOptions();
            var stats = new OpenCensusStats();

            var ep     = new MetricsEndpoint(opts, stats);
            var middle = new MetricsEndpointOwinMiddleware(null, ep);

            var context = CreateRequest("GET", "/metrics");

            await middle.HandleMetricsRequestAsync(context);

            context.Response.Body.Seek(0, SeekOrigin.Begin);
            StreamReader rdr  = new StreamReader(context.Response.Body);
            string       json = await rdr.ReadToEndAsync();

            Assert.Equal("{\"names\":[]}", json);
        }
Example #25
0
        public void Invoke_WithMetricsRequest_ReturnsExpected()
        {
            var  opts        = new MetricsEndpointOptions();
            var  stats       = new TestOpenTelemetryMetrics();
            var  ep          = new MetricsEndpoint(opts, stats.Exporter);
            var  testMeasure = stats.Meter.CreateDoubleMeasure("test.test1");
            long allKeyssum  = 0;
            var  labels      = new Dictionary <string, string>()
            {
                { "a", "v1" }, { "b", "v1" }, { "c", "v1" }
            }.ToList();

            for (var i = 0; i < 10; i++)
            {
                allKeyssum += i;
                testMeasure.Record(default(SpanContext), i, labels);
            }

            stats.Factory.CollectAllMetrics();
            stats.Processor.ExportMetrics();

            var req  = new MetricsRequest("test.test1", labels);
            var resp = ep.Invoke(req) as MetricsResponse;

            Assert.NotNull(resp);

            Assert.Equal("test.test1", resp.Name);

            Assert.NotNull(resp.Measurements);
            Assert.Equal(2, resp.Measurements.Count);

            var sample = resp.Measurements.SingleOrDefault(x => x.Statistic == MetricStatistic.VALUE);

            Assert.NotNull(sample);
            Assert.Equal((double)allKeyssum / 10, sample.Value);

            Assert.NotNull(resp.AvailableTags);
            Assert.Equal(3, resp.AvailableTags.Count);

            req  = new MetricsRequest("foo.bar", labels);
            resp = ep.Invoke(req) as MetricsResponse;
            Assert.Null(resp);
        }
Example #26
0
        public void GetStatistic_ReturnsExpected()
        {
            var opts  = new MetricsEndpointOptions();
            var stats = new OpenCensusStats();
            var ep    = new MetricsEndpoint(opts, stats);

            var m1     = MeasureDouble.Create("test.totalTime", "test", MeasureUnit.Seconds);
            var result = ep.GetStatistic(Sum.Create(), m1);

            Assert.Equal(MetricStatistic.TOTALTIME, result);

            var m2 = MeasureDouble.Create("test.value", "test", MeasureUnit.Seconds);

            result = ep.GetStatistic(LastValue.Create(), m2);
            Assert.Equal(MetricStatistic.VALUE, result);

            var m3 = MeasureDouble.Create("test.count", "test", MeasureUnit.Seconds);

            result = ep.GetStatistic(Count.Create(), m3);
            Assert.Equal(MetricStatistic.COUNT, result);

            var m4 = MeasureDouble.Create("test.sum", "test", MeasureUnit.Bytes);

            result = ep.GetStatistic(Sum.Create(), m4);
            Assert.Equal(MetricStatistic.TOTAL, result);

            var m5 = MeasureDouble.Create("foobar", "test", MeasureUnit.Seconds);

            result = ep.GetStatistic(Distribution.Create(BucketBoundaries.Create(new List <double>()
            {
                0.0, 1.0, 5.0, 10.0, 100.0
            })), m5);
            Assert.Equal(MetricStatistic.TOTALTIME, result);

            var m6 = MeasureDouble.Create("foobar", "test", MeasureUnit.Bytes);

            result = ep.GetStatistic(Distribution.Create(BucketBoundaries.Create(new List <double>()
            {
                0.0, 1.0, 5.0, 10.0, 100.0
            })), m6);
            Assert.Equal(MetricStatistic.TOTAL, result);
        }
Example #27
0
        public void GetMetricName_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");

            Assert.Null(middle.GetMetricName(context1.Request));

            var context2 = CreateRequest("GET", "/cloudfoundryapplication/metrics/Foo.Bar.Class");

            Assert.Equal("Foo.Bar.Class", middle.GetMetricName(context2.Request));

            var context3 = CreateRequest("GET", "/cloudfoundryapplication/metrics", "?tag=key:value&tag=key1:value1");

            Assert.Null(middle.GetMetricName(context3.Request));
        }
Example #28
0
        public void GetMetricSamples_ReturnsExpectedMeasure()
        {
            var opts  = new MetricsEndpointOptions();
            var stats = new TestOpenTelemetryMetrics();
            var ep    = new MetricsEndpoint(opts, stats.Exporter);

            var measure = stats.Meter.CreateDoubleMeasure("test.test3");

            measure.Record(default(SpanContext), 100, LabelSet.BlankLabelSet);

            stats.Factory.CollectAllMetrics();
            stats.Processor.ExportMetrics();

            ep.GetMetricsCollection(out var measurements, out _);
            Assert.Single(measurements.Values);
            var sample = measurements.Values.FirstOrDefault()[0];

            Assert.Equal(100, sample.Value);
            Assert.Equal(MetricStatistic.VALUE, sample.Statistic);
        }
        public void GetMetricName_ReturnsExpected()
        {
            var opts  = new MetricsOptions();
            var stats = new OpenCensusStats();

            var ep     = new MetricsEndpoint(opts, stats);
            var middle = new MetricsEndpointOwinMiddleware(null, ep);

            var context1 = CreateRequest("GET", "/metrics");

            Assert.Null(middle.GetMetricName(context1.Request));

            var context2 = CreateRequest("GET", "/metrics/Foo.Bar.Class");

            Assert.Equal("Foo.Bar.Class", middle.GetMetricName(context2.Request));

            var context3 = CreateRequest("GET", "/metrics", "tag=key:value&tag=key1:value1");

            Assert.Null(middle.GetMetricName(context3.Request));
        }
        public void GetMetricName_ReturnsExpected_When_ManagementPath_Is_Slash()
        {
            var opts  = new MetricsEndpointOptions();
            var mopts = new ActuatorManagementOptions();

            mopts.Path = "/";

            mopts.EndpointOptions.Add(opts);

            var ep     = new MetricsEndpoint(opts, new SteeltoeExporter());
            var middle = new MetricsEndpointMiddleware(null, ep, mopts);

            var context1 = CreateRequest("GET", "/metrics");

            Assert.Null(middle.GetMetricName(context1.Request));

            var context2 = CreateRequest("GET", "/metrics/Foo.Bar.Class");

            Assert.Equal("Foo.Bar.Class", middle.GetMetricName(context2.Request));

            var context3 = CreateRequest("GET", "/metrics", "?tag=key:value&tag=key1:value1");

            Assert.Null(middle.GetMetricName(context3.Request));
        }