如何衡量 web flux 中间操作的性能?
How to measure the performance of web flux intermediate operations?
我找不到更好的方法来衡量涉及 cache/db/service 查找的 Web 流量中间操作的性能?这是示例代码
@Bean
public RouterFunction<ServerResponse> registerEndpoints(){
return RouterFunctions.route(RequestPredicates.GET("/hello/{name}/address"), handleRoute());
}
private HandlerFunction<ServerResponse> handleRoute() {
return request -> {
log.info("handleRoute start");
Mono<ServerResponse> personInfo = Mono.just(request.pathVariable("name"))
.flatMap(this::handleDBLookup) //lookup person details from DB.
.map(this::enrichData) //in memory operations
.flatMap(data -> ServerResponse.ok().body(Mono.just(data), String.class));
log.info("handleRoute end");
return personInfo;
};
}
我需要衡量
的表现
- 整体处理程序执行时间
- 数据库查找执行时间
- 数据丰富执行时间
由于 flow.Please 的反应性质,在每个方法中添加开始和结束时间没有帮助。请提供任何建议。
您可以使用timed
运算符来测量电抗部分。例如测量数据库查找:
Mono.just(request.pathVariable("name")
.flatMap(s -> handleDBLookup()
.timed()
.doOnNext(timed -> System.out.println(timed.elapsed()))
.map(Timed::get)
)
这里的一个缺点是定时运算符仅在您有 onNext
事件时才有效。如果链有错误或完成为空,则不会执行。要解决这个问题,您可以使用 materialize
/dematerialize
,如下所示:
handleDBLookup()
.materialize()
.timed()
.doOnNext(timed -> System.out.println(timed.elapsed()))
.map(Timed::get)
.dematerialize()
我找不到更好的方法来衡量涉及 cache/db/service 查找的 Web 流量中间操作的性能?这是示例代码
@Bean
public RouterFunction<ServerResponse> registerEndpoints(){
return RouterFunctions.route(RequestPredicates.GET("/hello/{name}/address"), handleRoute());
}
private HandlerFunction<ServerResponse> handleRoute() {
return request -> {
log.info("handleRoute start");
Mono<ServerResponse> personInfo = Mono.just(request.pathVariable("name"))
.flatMap(this::handleDBLookup) //lookup person details from DB.
.map(this::enrichData) //in memory operations
.flatMap(data -> ServerResponse.ok().body(Mono.just(data), String.class));
log.info("handleRoute end");
return personInfo;
};
}
我需要衡量
的表现- 整体处理程序执行时间
- 数据库查找执行时间
- 数据丰富执行时间
由于 flow.Please 的反应性质,在每个方法中添加开始和结束时间没有帮助。请提供任何建议。
您可以使用timed
运算符来测量电抗部分。例如测量数据库查找:
Mono.just(request.pathVariable("name")
.flatMap(s -> handleDBLookup()
.timed()
.doOnNext(timed -> System.out.println(timed.elapsed()))
.map(Timed::get)
)
这里的一个缺点是定时运算符仅在您有 onNext
事件时才有效。如果链有错误或完成为空,则不会执行。要解决这个问题,您可以使用 materialize
/dematerialize
,如下所示:
handleDBLookup()
.materialize()
.timed()
.doOnNext(timed -> System.out.println(timed.elapsed()))
.map(Timed::get)
.dematerialize()