如何在 WebFluxTagsProvider

问题描述

我试图从我的正文中获取一个元素作为 http.requests 指标的标签。 我尝试使用 WebFluxTagProvider 但当信息来自 ServerWebExchange 请求正文时它需要 Iterable<Tag>,它是 Flux<DataBuffer>

这是我试过的代码


import example.companyname.dto.Log;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.micrometer.core.instrument.Tag;
import org.springframework.boot.actuate.metrics.web.reactive.server.DefaultWebFluxTagsProvider;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

@Component
public class ApplicationIdTagProvider extends DefaultWebFluxTagsProvider {

  private final Jackson2JsonDecoder jsonDecoder;

  public ApplicationIdTagProvider(final ObjectMapper objectMapper) {
    this.jsonDecoder = new Jackson2JsonDecoder(objectMapper);
  }

  @Override
  public Iterable<Tag> httpRequestTags(ServerWebExchange exchange,Throwable ex) {
    var tag = exchange.getRequest()
        .getBody()
        .map(dataBuffer ->
          (Log) jsonDecoder.decode(dataBuffer,forClass(Log.class),null,null)
        )
        .log()
        .map(log -> Tag.of("applicationId",log.getApplicationId()))
        .collectList()
        .share()
        .block();

    return tag;
  }
}

这段代码在编译和运行时“有效”,但调试器传递的 List 为空(结果也是如此)。

这引出了我的两个问题:

  • 这是解决问题的正确方法吗?
  • 我怎样才能做到这一点?
    • Iterable<Tag> 让我相信我被迫通过阻塞代码,而我似乎无法做到Flux<DataBuffer>

2021 年 4 月 8 日更新:

  • 我一直在研究它,我很确定它不可能使用非阻塞代码。我不确定是否有可能做我们想做的事。关于此功能的文档非常少。

2021 年 4 月 20 日更新:

  • 我没有找到令人满意的解决方案,我们也不是很喜欢解析身体两次,因此我们放弃了这样做。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)