如何衡量 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;
        };
    }

我需要衡量

的表现
  1. 整体处理程序执行时间
  2. 数据库查找执行时间
  3. 数据丰富执行时间

由于 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()