问题描述
我试图从我的正文中获取一个元素作为 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 (将#修改为@)