From ffaf242777a6e5b8e77fc2b0aedb2181b5977071 Mon Sep 17 00:00:00 2001 From: Tony Clarke Date: Tue, 17 Jul 2018 13:07:42 -0400 Subject: [PATCH 1/6] Add support for api gateway metrics --- .../config/GatewayAutoConfiguration.java | 9 +++ .../gateway/filter/GatewayMetricsFilter.java | 47 ++++++++++++ .../config/GatewayAutoConfigurationTests.java | 6 ++ .../filter/GatewayMetricFilterTests.java | 74 +++++++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java create mode 100644 spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java index 1317550a..0f3d9b8b 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java @@ -21,6 +21,8 @@ import java.util.List; import java.util.function.Consumer; import com.netflix.hystrix.HystrixObservableCommand; + +import io.micrometer.core.instrument.MeterRegistry; import io.netty.channel.ChannelOption; import io.netty.handler.ssl.util.InsecureTrustManagerFactory; import reactor.core.publisher.Flux; @@ -48,6 +50,7 @@ import org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter; import org.springframework.cloud.gateway.filter.ForwardPathFilter; import org.springframework.cloud.gateway.filter.ForwardRoutingFilter; import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.cloud.gateway.filter.GatewayMetricsFilter; import org.springframework.cloud.gateway.filter.NettyRoutingFilter; import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter; import org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter; @@ -320,6 +323,12 @@ public class GatewayAutoConfiguration { // GlobalFilter beans + + @Bean + @ConditionalOnProperty(name = "spring.cloud.gateway.metrics.enabled", matchIfMissing = true) + public GatewayMetricsFilter gatewayMetricFilter(MeterRegistry meterRegistry) { + return new GatewayMetricsFilter(meterRegistry); + } @Bean public AdaptCachedBodyGlobalFilter adaptCachedBodyGlobalFilter() { diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java new file mode 100644 index 00000000..a06c4d9d --- /dev/null +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java @@ -0,0 +1,47 @@ +package org.springframework.cloud.gateway.filter; + +import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR; + +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import org.springframework.cloud.gateway.route.Route; +import org.springframework.core.Ordered; +import org.springframework.http.HttpStatus; +import org.springframework.web.server.ServerWebExchange; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Tag; +import reactor.core.publisher.Mono; + +public class GatewayMetricsFilter implements GlobalFilter, Ordered { + + private MeterRegistry meterRegistry; + + public GatewayMetricsFilter(MeterRegistry meterRegistry) { + this.meterRegistry = meterRegistry; + } + + @Override + public int getOrder() { + return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER - 1; + } + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + long start = System.nanoTime(); + return chain.filter(exchange).then(Mono.defer(() -> { + HttpStatus statusCode = exchange.getResponse().getStatusCode(); + boolean success = statusCode.is2xxSuccessful(); + Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR); + Iterable iterableTags = Arrays.asList( + Tag.of("success", Boolean.toString(success)), + Tag.of("httpStatus", statusCode.name()), + Tag.of("routeId", route.getId()), + Tag.of("routeUri", route.getUri().toString())); + meterRegistry.timer("gateway.requests", iterableTags) + .record(System.nanoTime() - start, TimeUnit.NANOSECONDS); + return Mono.empty(); + })); + } +} diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java index 94a1b429..af17a135 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java @@ -24,6 +24,8 @@ import reactor.ipc.netty.http.client.HttpClientOptions; import reactor.ipc.netty.options.ClientProxyOptions; import reactor.ipc.netty.resources.PoolResources; +import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; @@ -36,6 +38,8 @@ public class GatewayAutoConfigurationTests { public void nettyHttpClientDefaults() { new ReactiveWebApplicationContextRunner() .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, + MetricsAutoConfiguration.class, + SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class)) .withPropertyValues("debug=true") .run(context -> { @@ -59,6 +63,8 @@ public class GatewayAutoConfigurationTests { public void nettyHttpClientConfigured() { new ReactiveWebApplicationContextRunner() .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, + MetricsAutoConfiguration.class, + SimpleMetricsExportAutoConfiguration.class, GatewayAutoConfiguration.class)) .withPropertyValues("spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager=true", "spring.cloud.gateway.httpclient.connect-timeout=10", diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java new file mode 100644 index 00000000..6952e04e --- /dev/null +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java @@ -0,0 +1,74 @@ +/* + * Copyright 2013-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.springframework.cloud.gateway.filter; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.gateway.config.GatewayProperties; +import org.springframework.cloud.gateway.test.BaseWebClientTests; +import org.springframework.context.annotation.Import; +import org.springframework.http.HttpStatus; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import io.micrometer.core.instrument.MeterRegistry; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = RANDOM_PORT) +@DirtiesContext +public class GatewayMetricFilterTests extends BaseWebClientTests { + + private static final String REQUEST_METRICS_NAME = "gateway.requests"; + + @Autowired + private GatewayProperties properties; + + @Autowired + private MeterRegistry meterRegistry; + + @Test + public void gatewayRequestsMeterFilterHasTags() { + assertThat(this.properties.getDefaultFilters()).isNotEmpty(); + + testClient.get().uri("/headers").exchange().expectStatus().isOk(); + assertMetricsContainsTag("success", Boolean.TRUE.toString()); + assertMetricsContainsTag("httpStatus", HttpStatus.OK.name()); + assertMetricsContainsTag("routeId", "default_path_to_httpbin"); + assertMetricsContainsTag("routeUri", "lb://testservice"); + } + + private void assertMetricsContainsTag(String tagKey, String tagValue) { + assertThat(this.meterRegistry.get(REQUEST_METRICS_NAME).tag(tagKey, tagValue).timer() + .count()).isEqualTo(1); + } + + @EnableAutoConfiguration + @SpringBootConfiguration + @Import(DefaultTestConfig.class) + public static class TestConfig { + + } + +} From 26715114ecb87378237cae7d9bb8afc7e304cab0 Mon Sep 17 00:00:00 2001 From: Tony Clarke Date: Tue, 17 Jul 2018 15:55:50 -0400 Subject: [PATCH 2/6] Simulate scrape interval --- .../cloud/gateway/filter/GatewayMetricFilterTests.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java index 6952e04e..737eb6c9 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java @@ -18,6 +18,7 @@ package org.springframework.cloud.gateway.filter; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; import org.junit.Test; @@ -32,6 +33,7 @@ import org.springframework.context.annotation.Import; import org.springframework.http.HttpStatus; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.reactive.function.client.ClientResponse; import io.micrometer.core.instrument.MeterRegistry; @@ -49,10 +51,12 @@ public class GatewayMetricFilterTests extends BaseWebClientTests { private MeterRegistry meterRegistry; @Test - public void gatewayRequestsMeterFilterHasTags() { + public void gatewayRequestsMeterFilterHasTags() throws InterruptedException { assertThat(this.properties.getDefaultFilters()).isNotEmpty(); - testClient.get().uri("/headers").exchange().expectStatus().isOk(); + ClientResponse clientResponse = webClient.get().uri("/headers").exchange().block(); + assertEquals(clientResponse.statusCode(), HttpStatus.OK); + Thread.sleep(2000); // simulate scrape interval assertMetricsContainsTag("success", Boolean.TRUE.toString()); assertMetricsContainsTag("httpStatus", HttpStatus.OK.name()); assertMetricsContainsTag("routeId", "default_path_to_httpbin"); From 153613269d3f4ec9e027da2cb1e1e2670e614ad7 Mon Sep 17 00:00:00 2001 From: Tony Clarke Date: Tue, 17 Jul 2018 18:48:38 -0400 Subject: [PATCH 3/6] Add documenation to describe gateway metrics plus a sample grafana dashboard --- .../asciidoc/gateway-grafana-dashboard.json | 760 ++++++++++++++++++ .../images/gateway-grafana-dashboard.jpeg | Bin 0 -> 247058 bytes .../main/asciidoc/spring-cloud-gateway.adoc | 11 + 3 files changed, 771 insertions(+) create mode 100644 docs/src/main/asciidoc/gateway-grafana-dashboard.json create mode 100644 docs/src/main/asciidoc/images/gateway-grafana-dashboard.jpeg diff --git a/docs/src/main/asciidoc/gateway-grafana-dashboard.json b/docs/src/main/asciidoc/gateway-grafana-dashboard.json new file mode 100644 index 00000000..d64c35e5 --- /dev/null +++ b/docs/src/main/asciidoc/gateway-grafana-dashboard.json @@ -0,0 +1,760 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "4.4.1" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "singlestat", + "name": "Singlestat", + "version": "" + } + ], + "annotations": { + "list": [] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "hideControls": false, + "id": null, + "links": [], + "refresh": "1m", + "rows": [ + { + "collapse": false, + "height": 38, + "panels": [ + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(191, 148, 112, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${DS_PROMETHEUS}", + "description": "", + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "hideTimeOverride": false, + "id": 28, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "span": 4, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "Value", + "targets": [ + { + "expr": "sum(gateway_requests_seconds_count{job=~\"$gatewayService\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "metric": "gateway_requests_seconds_count", + "refId": "A", + "step": 1200 + } + ], + "thresholds": "", + "timeFrom": null, + "timeShift": null, + "title": "Total Requests Served", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(191, 148, 112, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${DS_PROMETHEUS}", + "description": "", + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "hideTimeOverride": false, + "id": 29, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "span": 4, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "Value", + "targets": [ + { + "expr": "sum(gateway_requests_seconds_count{success=\"true\", job=~\"$gatewayService\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "metric": "gateway_requests_seconds_count", + "refId": "A", + "step": 1200 + } + ], + "thresholds": "", + "timeFrom": null, + "timeShift": null, + "title": "Total Successful Requests Served", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(191, 148, 112, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${DS_PROMETHEUS}", + "description": "", + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "hideTimeOverride": false, + "id": 30, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "span": 4, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "Value", + "targets": [ + { + "expr": "sum(gateway_requests_seconds_count{success=\"false\", job=~\"$gatewayService\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "metric": "gateway_requests_seconds_count", + "refId": "A", + "step": 1200 + } + ], + "thresholds": "", + "timeFrom": null, + "timeShift": null, + "title": "Total Unsuccessful Requests Served", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Total Throughput", + "titleSize": "h2" + }, + { + "collapse": false, + "height": 250, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fill": 1, + "id": 49, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "routeId", + "seriesOverrides": [], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "gateway_requests_seconds_sum{routeId=~\"$routeId\", job=~\"$gatewayService\"}/gateway_requests_seconds_count{routeId=~\"$routeId\", job=~\"$gatewayService\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ httpStatus }}", + "metric": "gateway_api_time_seconds_sum", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "$routeId", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Request Processing Time", + "titleSize": "h2" + }, + { + "collapse": true, + "height": 250, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fill": 1, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": null, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "routeId", + "seriesOverrides": [], + "spaceLength": 10, + "span": 4, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "gateway_requests_seconds_count{success=\"true\", routeId=~\"$routeId\", job=~\"$gatewayService\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ job }} / {{ routeUri }}", + "metric": "gateway_requests_seconds_count", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "$routeId Success API Gateway Calls", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Successful API Calls", + "titleSize": "h2" + }, + { + "collapse": true, + "height": 250, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fill": 1, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "routeId", + "seriesOverrides": [], + "spaceLength": 10, + "span": 4, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "gateway_requests_seconds_count{success=\"false\", routeId=~\"$routeId\", job=~\"$gatewayService\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ job }} / {{ routeUri }}", + "metric": "gateway_requests_seconds_count", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "$routeId Unsuccessful GW Calls", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "Unsuccessful API Calls", + "titleSize": "h2" + }, + { + "collapse": false, + "height": 250, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fill": 1, + "id": 35, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "routeId", + "seriesOverrides": [], + "spaceLength": 10, + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(gateway_requests_seconds_count{routeId=~\"$routeId\", job=~\"$gatewayService\"}) by (job, httpStatus)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ job }} / {{ httpStatus }}", + "metric": "gateway_requests_seconds_count", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "$routeId", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "API / HTTP Status", + "titleSize": "h2" + } + ], + "schemaVersion": 14, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "hide": 0, + "includeAll": true, + "label": "Gateway Service", + "multi": true, + "name": "gatewayService", + "options": [], + "query": "label_values(gateway_requests_seconds_count,job)", + "refresh": 1, + "regex": "", + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "hide": 0, + "includeAll": true, + "label": "Route Id", + "multi": true, + "name": "routeId", + "options": [], + "query": "label_values(gateway_requests_seconds_count,routeId)", + "refresh": 1, + "regex": "", + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now/d", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "APIGW", + "version": 29 +} \ No newline at end of file diff --git a/docs/src/main/asciidoc/images/gateway-grafana-dashboard.jpeg b/docs/src/main/asciidoc/images/gateway-grafana-dashboard.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7ba7f88ba12dc53750d855879b674df939cf2f17 GIT binary patch literal 247058 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 Rh0&<5gx$5f!1>qQ{{pgZ5mW#G literal 0 HcmV?d00001 diff --git a/docs/src/main/asciidoc/spring-cloud-gateway.adoc b/docs/src/main/asciidoc/spring-cloud-gateway.adoc index 2d02210b..48505644 100644 --- a/docs/src/main/asciidoc/spring-cloud-gateway.adoc +++ b/docs/src/main/asciidoc/spring-cloud-gateway.adoc @@ -884,6 +884,17 @@ spring: - Path=/websocket/** ---- +=== Gateway Metrics Filter + +The Gateway Metrics Filter runs as long as the property spring.cloud.gateway.metrics.enabled is not set to false. This filter adds a timer metric named "gateway.requests" with the following tags: + +* `routeId`: The route id +* `routeUri`: The URI that the API will be routed to +* `success`: A boolean indicating if the API was succesfully routed and returned to the client +* `httpStatus`: Http Status of the request returned to the client + +These metrics are then available to be scraped from ``/actuator/metrics/gateway.requests`` and can be easily integated with Prometheus to create a link:images/gateway-grafana-dashboard.jpeg[Grafana] link:gateway-grafana-dashboard.json[dashboard]. + === Making An Exchange As Routed After the Gateway has routed a `ServerWebExchange` it will mark that exchange as "routed" by adding `gatewayAlreadyRouted` From 5f98cad3017bde4951ada2f9f0f84d7f414e93ab Mon Sep 17 00:00:00 2001 From: Tony Clarke Date: Sun, 22 Jul 2018 22:22:59 -0400 Subject: [PATCH 4/6] Update metrics filter with feedback from ryanjbaxter and jkschneider --- .../asciidoc/gateway-grafana-dashboard.json | 20 ++--- .../main/asciidoc/spring-cloud-gateway.adoc | 6 +- .../gateway/filter/GatewayMetricsFilter.java | 67 +++++++++++---- .../filter/GatewayMetricFilterTests.java | 86 ++++++++++++++++--- .../gateway/test/BaseWebClientTests.java | 9 +- 5 files changed, 146 insertions(+), 42 deletions(-) diff --git a/docs/src/main/asciidoc/gateway-grafana-dashboard.json b/docs/src/main/asciidoc/gateway-grafana-dashboard.json index d64c35e5..95defd61 100644 --- a/docs/src/main/asciidoc/gateway-grafana-dashboard.json +++ b/docs/src/main/asciidoc/gateway-grafana-dashboard.json @@ -191,7 +191,7 @@ "tableColumn": "Value", "targets": [ { - "expr": "sum(gateway_requests_seconds_count{success=\"true\", job=~\"$gatewayService\"})", + "expr": "sum(gateway_requests_seconds_count{outcome=\"SUCCESSFUL\", job=~\"$gatewayService\"})", "format": "time_series", "interval": "", "intervalFactor": 2, @@ -274,7 +274,7 @@ "tableColumn": "Value", "targets": [ { - "expr": "sum(gateway_requests_seconds_count{success=\"false\", job=~\"$gatewayService\"})", + "expr": "sum(gateway_requests_seconds_count{outcome!=\"SUCCESSFUL\", job=~\"$gatewayService\"})", "format": "time_series", "interval": "", "intervalFactor": 2, @@ -348,7 +348,7 @@ "format": "time_series", "interval": "", "intervalFactor": 2, - "legendFormat": "{{ httpStatus }}", + "legendFormat": "{{ status }}", "metric": "gateway_api_time_seconds_sum", "refId": "A", "step": 240 @@ -437,7 +437,7 @@ "steppedLine": false, "targets": [ { - "expr": "gateway_requests_seconds_count{success=\"true\", routeId=~\"$routeId\", job=~\"$gatewayService\"}", + "expr": "gateway_requests_seconds_count{outcome=\"SUCCESSFUL\", routeId=~\"$routeId\", job=~\"$gatewayService\"}", "format": "time_series", "hide": false, "interval": "", @@ -531,7 +531,7 @@ "steppedLine": false, "targets": [ { - "expr": "gateway_requests_seconds_count{success=\"false\", routeId=~\"$routeId\", job=~\"$gatewayService\"}", + "expr": "gateway_requests_seconds_count{outcome!=\"SUCCESSFUL\", routeId=~\"$routeId\", job=~\"$gatewayService\"}", "format": "time_series", "interval": "", "intervalFactor": 2, @@ -623,11 +623,11 @@ "steppedLine": false, "targets": [ { - "expr": "sum(gateway_requests_seconds_count{routeId=~\"$routeId\", job=~\"$gatewayService\"}) by (job, httpStatus)", + "expr": "sum(gateway_requests_seconds_count{routeId=~\"$routeId\", job=~\"$gatewayService\"}) by (job, status)", "format": "time_series", "interval": "", "intervalFactor": 2, - "legendFormat": "{{ job }} / {{ httpStatus }}", + "legendFormat": "{{ job }} / {{ status }}", "metric": "gateway_requests_seconds_count", "refId": "A", "step": 240 @@ -755,6 +755,6 @@ ] }, "timezone": "", - "title": "APIGW", - "version": 29 -} \ No newline at end of file + "title": "Spring Cloud Gateway", + "version": 1 +} diff --git a/docs/src/main/asciidoc/spring-cloud-gateway.adoc b/docs/src/main/asciidoc/spring-cloud-gateway.adoc index cd2895fb..2ab6834a 100644 --- a/docs/src/main/asciidoc/spring-cloud-gateway.adoc +++ b/docs/src/main/asciidoc/spring-cloud-gateway.adoc @@ -886,12 +886,12 @@ spring: === Gateway Metrics Filter -The Gateway Metrics Filter runs as long as the property spring.cloud.gateway.metrics.enabled is not set to false. This filter adds a timer metric named "gateway.requests" with the following tags: +The Gateway Metrics Filter runs as long as the property `spring.cloud.gateway.metrics.enabled` is not set to `false`. This filter adds a timer metric named "gateway.requests" with the following tags: * `routeId`: The route id * `routeUri`: The URI that the API will be routed to -* `success`: A boolean indicating if the API was succesfully routed and returned to the client -* `httpStatus`: Http Status of the request returned to the client +* `outcome` |Outcome as classified by link:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpStatus.Series.html[HttpStatus.Series] +* `status`: Http Status of the request returned to the client These metrics are then available to be scraped from ``/actuator/metrics/gateway.requests`` and can be easily integated with Prometheus to create a link:images/gateway-grafana-dashboard.jpeg[Grafana] link:gateway-grafana-dashboard.json[dashboard]. diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java index a06c4d9d..f690f3ea 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java @@ -3,15 +3,18 @@ package org.springframework.cloud.gateway.filter; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR; import java.util.Arrays; -import java.util.concurrent.TimeUnit; import org.springframework.cloud.gateway.route.Route; import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.AbstractServerHttpResponse; +import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.web.server.ServerWebExchange; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Tag; +import io.micrometer.core.instrument.Timer; +import io.micrometer.core.instrument.Timer.Sample; import reactor.core.publisher.Mono; public class GatewayMetricsFilter implements GlobalFilter, Ordered { @@ -29,19 +32,53 @@ public class GatewayMetricsFilter implements GlobalFilter, Ordered { @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - long start = System.nanoTime(); - return chain.filter(exchange).then(Mono.defer(() -> { - HttpStatus statusCode = exchange.getResponse().getStatusCode(); - boolean success = statusCode.is2xxSuccessful(); - Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR); - Iterable iterableTags = Arrays.asList( - Tag.of("success", Boolean.toString(success)), - Tag.of("httpStatus", statusCode.name()), - Tag.of("routeId", route.getId()), - Tag.of("routeUri", route.getUri().toString())); - meterRegistry.timer("gateway.requests", iterableTags) - .record(System.nanoTime() - start, TimeUnit.NANOSECONDS); - return Mono.empty(); - })); + Sample sample = Timer.start(meterRegistry); + return chain.filter(exchange).then(Mono.fromRunnable(() -> { + endTimerRespectingCommit(exchange, sample); + })).doOnError(t -> { // needed for example when netty routing filter times out + endTimerRespectingCommit(exchange, sample); + }).then(); + } + + private void endTimerRespectingCommit(ServerWebExchange exchange, Sample sample) { + + ServerHttpResponse response = exchange.getResponse(); + if (response.isCommitted()) { + endTimerInner(exchange, sample); + } + else { + response.beforeCommit(() -> { + endTimerInner(exchange, sample); + return Mono.empty(); + }); + } + + } + + private void endTimerInner(ServerWebExchange exchange, Sample sample) { + String outcome = "CUSTOM"; + String status = "CUSTOM"; + HttpStatus statusCode = exchange.getResponse().getStatusCode(); + if (statusCode != null) { + outcome = statusCode.series().name(); + status = statusCode.name(); + } + else { // a non standard HTTPS status could be used. Let's be defensive here + if (exchange.getResponse() instanceof AbstractServerHttpResponse) { + Integer statusInt = ((AbstractServerHttpResponse) exchange.getResponse()) + .getStatusCodeValue(); + if (statusInt != null) { + status = String.valueOf(statusInt); + } + else { + status = "NA"; + } + } + } + Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR); + Iterable iterableTags = Arrays.asList(Tag.of("outcome", outcome), + Tag.of("status", status), Tag.of("routeId", route.getId()), + Tag.of("routeUri", route.getUri().toString())); + sample.stop(meterRegistry.timer("gateway.requests", iterableTags)); } } diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java index 737eb6c9..9c819f9f 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java @@ -24,15 +24,26 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.gateway.config.GatewayProperties; +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.cloud.gateway.test.BaseWebClientTests; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.reactive.function.client.ClientResponse; import io.micrometer.core.instrument.MeterRegistry; @@ -43,36 +54,89 @@ import io.micrometer.core.instrument.MeterRegistry; public class GatewayMetricFilterTests extends BaseWebClientTests { private static final String REQUEST_METRICS_NAME = "gateway.requests"; - + @Autowired private GatewayProperties properties; @Autowired private MeterRegistry meterRegistry; + @Value("${test.uri}") + private String testUri; + @Test public void gatewayRequestsMeterFilterHasTags() throws InterruptedException { assertThat(this.properties.getDefaultFilters()).isNotEmpty(); - - ClientResponse clientResponse = webClient.get().uri("/headers").exchange().block(); - assertEquals(clientResponse.statusCode(), HttpStatus.OK); - Thread.sleep(2000); // simulate scrape interval - assertMetricsContainsTag("success", Boolean.TRUE.toString()); - assertMetricsContainsTag("httpStatus", HttpStatus.OK.name()); + ClientResponse clientResponse = webClient.get().uri("/headers").exchange() + .block(); + assertEquals(HttpStatus.OK, clientResponse.statusCode()); + Thread.sleep(1000); // allow metrics to complete in the mono following the then + assertMetricsContainsTag("outcome", HttpStatus.Series.SUCCESSFUL.name()); + assertMetricsContainsTag("status", HttpStatus.OK.name()); assertMetricsContainsTag("routeId", "default_path_to_httpbin"); assertMetricsContainsTag("routeUri", "lb://testservice"); } + @Test + public void gatewayRequestsMeterFilterHasTagsForBadTargetUri() + throws InterruptedException { + assertThat(this.properties.getDefaultFilters()).isNotEmpty(); + ClientResponse clientResponse = webClient.get().uri("/badtargeturi").exchange() + .block(); + assertEquals("Expecting request to fail with http status internal server error", + HttpStatus.INTERNAL_SERVER_ERROR, clientResponse.statusCode()); + Thread.sleep(1000); // allow metrics to complete in the mono following the then + assertMetricsContainsTag("outcome", HttpStatus.Series.SERVER_ERROR.name()); + assertMetricsContainsTag("status", HttpStatus.INTERNAL_SERVER_ERROR.name()); + assertMetricsContainsTag("routeId", "default_path_to_httpbin"); + assertMetricsContainsTag("routeUri", testUri); + } + + @Test + public void hasMetricsForSetStatusFilter() throws InterruptedException { + HttpHeaders headers = new HttpHeaders(); + headers.set(HttpHeaders.HOST, "www.setcustomstatus.org"); + ResponseEntity response = new TestRestTemplate().exchange( + baseUri + "/headers", HttpMethod.GET, new HttpEntity<>(headers), + String.class); + assertThat(response.getStatusCodeValue()).isEqualTo(432); + Thread.sleep(1000); // allow metrics to complete in the mono following the then + assertMetricsContainsTag("outcome", "CUSTOM"); + assertMetricsContainsTag("status", "432"); + assertMetricsContainsTag("routeId", "test_custom_http_status"); + assertMetricsContainsTag("routeUri", testUri); + } + private void assertMetricsContainsTag(String tagKey, String tagValue) { - assertThat(this.meterRegistry.get(REQUEST_METRICS_NAME).tag(tagKey, tagValue).timer() - .count()).isEqualTo(1); + assertThat(this.meterRegistry.get(REQUEST_METRICS_NAME).tag(tagKey, tagValue) + .timer().count()).isEqualTo(1); } @EnableAutoConfiguration @SpringBootConfiguration + @RestController @Import(DefaultTestConfig.class) - public static class TestConfig { + public static class CustomConfig { + @Value("${test.uri}") + protected String testUri; + @Bean + public RouteLocator myRouteLocator(RouteLocatorBuilder builder) { + // return builder.routes().route("test_bad_target_uri", r -> + // r.host("*.badtarget.org").uri(testUri)) + // .route("test_custom_http_status", + // r -> r.host("*.setcustomstatus.org").filters(f -> + // f.setStatus(432)).uri(testUri)) + // .build(); + return builder.routes() + .route("test_custom_http_status", r -> r.host("*.setcustomstatus.org") + .filters(f -> f.setStatus(432)).uri(testUri)) + .build(); + } + + @RequestMapping("/httpbin/badtargeturi") + public String exception() { + throw new RuntimeException("an error"); + } } - } diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/BaseWebClientTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/BaseWebClientTests.java index 1473f00c..603e8bea 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/BaseWebClientTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/BaseWebClientTests.java @@ -22,7 +22,6 @@ import java.time.Duration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Before; -import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.web.server.LocalServerPort; @@ -35,6 +34,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.core.annotation.Order; +import org.springframework.http.client.reactive.ClientHttpConnector; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.web.reactive.function.client.WebClient; @@ -63,9 +64,11 @@ public class BaseWebClientTests { @Before public void setup() { - //TODO: how to set new ReactorClientHttpConnector() + ClientHttpConnector httpConnector = new ReactorClientHttpConnector(); + baseUri = "http://localhost:" + port; - this.webClient = WebClient.create(baseUri); + this.webClient = WebClient.builder().clientConnector(httpConnector) + .baseUrl(baseUri).build(); this.testClient = WebTestClient.bindToServer().baseUrl(baseUri).build(); } From 22312fb2c10158b022707335259ebe529df5ee36 Mon Sep 17 00:00:00 2001 From: Tony Clarke Date: Mon, 23 Jul 2018 16:15:34 -0400 Subject: [PATCH 5/6] Add license text and remove commented out test code --- .../gateway/filter/GatewayMetricsFilter.java | 17 +++++++++++++++++ .../filter/GatewayMetricFilterTests.java | 6 ------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java index f690f3ea..3788b32d 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java @@ -1,3 +1,20 @@ +/* + * Copyright 2013-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.springframework.cloud.gateway.filter; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR; diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java index 9c819f9f..7c77ba64 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java @@ -122,12 +122,6 @@ public class GatewayMetricFilterTests extends BaseWebClientTests { @Bean public RouteLocator myRouteLocator(RouteLocatorBuilder builder) { - // return builder.routes().route("test_bad_target_uri", r -> - // r.host("*.badtarget.org").uri(testUri)) - // .route("test_custom_http_status", - // r -> r.host("*.setcustomstatus.org").filters(f -> - // f.setStatus(432)).uri(testUri)) - // .build(); return builder.routes() .route("test_custom_http_status", r -> r.host("*.setcustomstatus.org") .filters(f -> f.setStatus(432)).uri(testUri)) From ca915c9b5aac992b3c324b74c4dbcf26f0537e58 Mon Sep 17 00:00:00 2001 From: Tony Clarke Date: Wed, 25 Jul 2018 15:57:38 -0400 Subject: [PATCH 6/6] Update metrics with feedback from Ryan and Jon. Metrics are now reported before we send the response back to the client. Hence no need for sleeps in the client side test. --- .../gateway/filter/GatewayMetricsFilter.java | 23 ++++++++----------- .../filter/GatewayMetricFilterTests.java | 22 ++++-------------- 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java index 3788b32d..11ac4981 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/GatewayMetricsFilter.java @@ -19,8 +19,6 @@ package org.springframework.cloud.gateway.filter; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR; -import java.util.Arrays; - import org.springframework.cloud.gateway.route.Route; import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; @@ -29,7 +27,7 @@ import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.web.server.ServerWebExchange; import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.core.instrument.Tag; +import io.micrometer.core.instrument.Tags; import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.Timer.Sample; import reactor.core.publisher.Mono; @@ -44,17 +42,18 @@ public class GatewayMetricsFilter implements GlobalFilter, Ordered { @Override public int getOrder() { - return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER - 1; + // start the timer as soon as possible and report the metric event before we write + // response to client + return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1; } @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { Sample sample = Timer.start(meterRegistry); - return chain.filter(exchange).then(Mono.fromRunnable(() -> { + + return chain.filter(exchange).doOnSuccessOrError((aVoid, ex) -> { endTimerRespectingCommit(exchange, sample); - })).doOnError(t -> { // needed for example when netty routing filter times out - endTimerRespectingCommit(exchange, sample); - }).then(); + }); } private void endTimerRespectingCommit(ServerWebExchange exchange, Sample sample) { @@ -69,7 +68,6 @@ public class GatewayMetricsFilter implements GlobalFilter, Ordered { return Mono.empty(); }); } - } private void endTimerInner(ServerWebExchange exchange, Sample sample) { @@ -93,9 +91,8 @@ public class GatewayMetricsFilter implements GlobalFilter, Ordered { } } Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR); - Iterable iterableTags = Arrays.asList(Tag.of("outcome", outcome), - Tag.of("status", status), Tag.of("routeId", route.getId()), - Tag.of("routeUri", route.getUri().toString())); - sample.stop(meterRegistry.timer("gateway.requests", iterableTags)); + Tags tags = Tags.of("outcome", outcome, "status", status, "routeId", + route.getId(), "routeUri", route.getUri().toString()); + sample.stop(meterRegistry.timer("gateway.requests", tags)); } } diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java index 7c77ba64..46a957c9 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/GatewayMetricFilterTests.java @@ -18,7 +18,6 @@ package org.springframework.cloud.gateway.filter; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; import org.junit.Test; @@ -29,7 +28,6 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.cloud.gateway.config.GatewayProperties; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.cloud.gateway.test.BaseWebClientTests; @@ -44,7 +42,6 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.reactive.function.client.ClientResponse; import io.micrometer.core.instrument.MeterRegistry; @@ -55,9 +52,6 @@ public class GatewayMetricFilterTests extends BaseWebClientTests { private static final String REQUEST_METRICS_NAME = "gateway.requests"; - @Autowired - private GatewayProperties properties; - @Autowired private MeterRegistry meterRegistry; @@ -66,11 +60,7 @@ public class GatewayMetricFilterTests extends BaseWebClientTests { @Test public void gatewayRequestsMeterFilterHasTags() throws InterruptedException { - assertThat(this.properties.getDefaultFilters()).isNotEmpty(); - ClientResponse clientResponse = webClient.get().uri("/headers").exchange() - .block(); - assertEquals(HttpStatus.OK, clientResponse.statusCode()); - Thread.sleep(1000); // allow metrics to complete in the mono following the then + testClient.get().uri("/headers").exchange().expectStatus().isOk(); assertMetricsContainsTag("outcome", HttpStatus.Series.SUCCESSFUL.name()); assertMetricsContainsTag("status", HttpStatus.OK.name()); assertMetricsContainsTag("routeId", "default_path_to_httpbin"); @@ -80,12 +70,8 @@ public class GatewayMetricFilterTests extends BaseWebClientTests { @Test public void gatewayRequestsMeterFilterHasTagsForBadTargetUri() throws InterruptedException { - assertThat(this.properties.getDefaultFilters()).isNotEmpty(); - ClientResponse clientResponse = webClient.get().uri("/badtargeturi").exchange() - .block(); - assertEquals("Expecting request to fail with http status internal server error", - HttpStatus.INTERNAL_SERVER_ERROR, clientResponse.statusCode()); - Thread.sleep(1000); // allow metrics to complete in the mono following the then + testClient.get().uri("/badtargeturi").exchange().expectStatus() + .is5xxServerError(); assertMetricsContainsTag("outcome", HttpStatus.Series.SERVER_ERROR.name()); assertMetricsContainsTag("status", HttpStatus.INTERNAL_SERVER_ERROR.name()); assertMetricsContainsTag("routeId", "default_path_to_httpbin"); @@ -96,11 +82,11 @@ public class GatewayMetricFilterTests extends BaseWebClientTests { public void hasMetricsForSetStatusFilter() throws InterruptedException { HttpHeaders headers = new HttpHeaders(); headers.set(HttpHeaders.HOST, "www.setcustomstatus.org"); + // cannot use netty client since we cannot read custom http status ResponseEntity response = new TestRestTemplate().exchange( baseUri + "/headers", HttpMethod.GET, new HttpEntity<>(headers), String.class); assertThat(response.getStatusCodeValue()).isEqualTo(432); - Thread.sleep(1000); // allow metrics to complete in the mono following the then assertMetricsContainsTag("outcome", "CUSTOM"); assertMetricsContainsTag("status", "432"); assertMetricsContainsTag("routeId", "test_custom_http_status");