如何计算总执行时间并设置响应 header,即 Spring WebFlux 中每个请求的 x-runtime?
How to calculate total execution time and set in response header i.e. x-runtime for every request in Spring WebFlux?
不知道我的做法对不对?另外,请让我知道是否还有其他 work-around 可以实现此目的。
是否可以使用 WebFilter?
package request.middlewares;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
@Component
public class ResponseTimeCalculator implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
// is it possible here?
exchange.getResponse().getHeaders().add("X-Runtime", "10ms");
return chain.filter(exchange);
}
}
如果您正在使用 Spring 启动,您应该为此使用 spring-boot-starter-actuator
。
如果您没有使用 Spring Boot,您仍然应该看看 Micrometer,它使用 Spring WebFlux 来收集此类数据。
请注意,您的方法存在很多缺陷:
- 处理程序链可能 return 但实际响应 handling/writing 可能尚未完成
- 使用简单的计时器不会考虑 GC 暂停
- 查看测量样本并不重要,百分位数可以提供更多信息
无论如何,您可以查看 Spring Boot 的 MetricsWebFilter
(here) 以了解如何使用 Micrometer 实现这一点。
不知道我的做法对不对?另外,请让我知道是否还有其他 work-around 可以实现此目的。
是否可以使用 WebFilter?
package request.middlewares;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
@Component
public class ResponseTimeCalculator implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
// is it possible here?
exchange.getResponse().getHeaders().add("X-Runtime", "10ms");
return chain.filter(exchange);
}
}
如果您正在使用 Spring 启动,您应该为此使用 spring-boot-starter-actuator
。
如果您没有使用 Spring Boot,您仍然应该看看 Micrometer,它使用 Spring WebFlux 来收集此类数据。
请注意,您的方法存在很多缺陷:
- 处理程序链可能 return 但实际响应 handling/writing 可能尚未完成
- 使用简单的计时器不会考虑 GC 暂停
- 查看测量样本并不重要,百分位数可以提供更多信息
无论如何,您可以查看 Spring Boot 的 MetricsWebFilter
(here) 以了解如何使用 Micrometer 实现这一点。