【问题标题】:Metrics like response time of an API in spring cloud gatewaySpring Cloud Gateway 中 API 的响应时间等指标
【发布时间】:2020-02-29 07:12:58
【问题描述】:

我正在使用 Spring Cloud Gateway,并且希望捕获所有 API 命中的指标。指标包括响应时间、错误代码等。我使用的是 Spring Cloud 的 Hoxton.RELEASE 版本。 我尝试按照他们的文档中的建议使用 /actuator/metrics/gateway.requests 但它没有用。此外,如果这些指标可以通过 jmx 指标获得会更好。我也尝试使用 jmx 并在 jconsole 上将其可视化,但它没有显示 API 的响应时间等。

有人可以建议怎么做吗?我们必须在生产中使用它,这对我们来说是一个重要因素。

【问题讨论】:

    标签: spring jmx spring-cloud-gateway


    【解决方案1】:

    我遇到了同样令人头疼的问题。端点不工作:

    /actuator/metrics/gateway.requests
    

    我终于发现,如果你没有数据(requests, responses),那个端点将无法工作,当你用浏览器检查它时,它会显示error(这真的不太可取,让每个人都感到困惑,就像你和我)

    我必须编写脚本来卷曲网关以生成请求,以便端点可以有数据工作

    也在应用程序中。您必须确保这些属性已配置

    management.endpoint.gateway.enabled=true # default value
    
    management.endpoints.web.exposure.include=gateway
    

    参考链接:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.0.RC1/reference/html/#actuator-api

    另一个有趣的事情是 Spring 支持 Grafana 的图形仪表板,你可以使用 Spring 中的这个 json 定义并将其导入你的 Grafana。

    https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/gateway-grafana-dashboard.json

    仪表板将如下所示:

    https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/images/gateway-grafana-dashboard.jpeg

    参考链接: https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#the-gateway-metrics-filter

    顺便说一句,上面的 GatewayFilter 也可以解决,但是这会为您的过滤器链添加另一层,并且可能会给您的网关带来很少的开销,如果您的负载很高,则需要考虑这一点,因为它可能会降级您的应用

    关于JMX,可以参考这里的Spring官方文档: https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints.exposing

    大部分端点都支持 JMX,包括 Spring Gateway

    【讨论】:

      【解决方案2】:

      检查“/actuator/metrics”后 它的指标现在是'/actuator/metrics/spring.cloud.gateway.requests' 在“spring-cloud-starter-gateway”上。

      【讨论】:

        【解决方案3】:

        您可以通过编写如下自定义过滤器工厂来捕获所有 API 命中到 Spring Cloud Gateway 的响应时间:

            ResponseFilterFactory extends AbstractGatewayFilterFactory<ResponseFilterFactory.Config> {
        
            public ResponseFilterFactory() {
                    super(Config.class);
                }
        
               @Override
        public GatewayFilter apply(Config config) {
        return new OrderedGatewayFilter((exchange, chain) -> {
        // Pre-processing
        startTime = System.currentTimeMillis();
        
            return chain.filter(exchange)
              .then(Mono.fromRunnable(() -> {
                  // Post-processing
                     String serviceResponseStatus= exchange.getResponse().getStatusCode().toString();
        
                        if(serviceResponseStatus.startsWith("2")){
                            serviceResponseStatus="Success";
                        }
                        else{
                            serviceResponseStatus="Failure";
                        }
                    long execTime = System.currentTimeMillis() - startTime;
                    LOGGER.info("caller={}, serviceName={}, serviceResponseStatus={}, serviceResponseTime(ms)={}", Objects.isNull(caller) ? "default" : caller,
                            serviceName, serviceResponseStatus, execTime);
        
              }));
        },1);
        }
        
        
                public static class Config {
                        private String headerName;
        
                        public String getHeaderName() {
            // add some thing to config if you want to log along with resp time, ex. headers etc
                               return null;
                        }
                }
        

        在此之后,您可以将其添加到您的路由配置文件中作为默认过滤器:

          cloud:
            gateway:
              default-filters:
              - name: ResponseFilterFactory
        

        【讨论】:

        • Spring Cloud Gateway 已经提供开箱即用的请求时间日志记录(如果配置正确),为什么还要自己编写?
        • 可能是他们现在添加的,我不记得或知道当时有一种开箱即用的方法,您能否分享一下如何实现它并在响应开始之前记录端到端响应时间回来了?
        • 是这个过滤器:github.com/spring-cloud/spring-cloud-gateway/blob/main/docs/src/… 虽然之前它的文档记录不正确,直到github.com/spring-cloud/spring-cloud-gateway/issues/2273 才修复
        • 这不会在日志文件/控制台中记录响应时间,但您需要调用执行器端点,这不是我们的实际要求
        • 确实,OP 要求 jmx。
        猜你喜欢
        • 2021-08-01
        • 2021-05-24
        • 1970-01-01
        • 1970-01-01
        • 2023-02-10
        • 2020-07-19
        • 1970-01-01
        • 1970-01-01
        • 2020-06-28
        相关资源
        最近更新 更多