如何在回應式 WebFlux 背景關系的回應標頭中添加 Trace Id?我已嘗試使用以下代碼,但跨度始終為空。Sleuth 依賴版本是 3.0.3,Spring Boot 版本是 2.5.4
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.server.reactive.ServerHttpResponse;
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 GatewaySleuthFilter implements WebFilter {
@Autowired
Tracer tracer;
@Override
public Mono<Void> filter(ServerWebExchange exchange,
WebFilterChain chain) {
ServerHttpResponse response = exchange.getResponse();
response.beforeCommit(() -> {
Span span = tracer.currentSpan();
if (span != null) {
exchange.getResponse().getHeaders().add("trace-id", span.context().traceId());
exchange.getResponse().getHeaders().add("span-id", span.context().spanId());
}
return Mono.empty();
});
return chain.filter(exchange);
}
}
uj5u.com熱心網友回復:
使用 aWebFilter將是執行此操作的正確方法,檔案建議類似.
我不確定為什么你會得到這種行為(我想beforeCommit可能不在背景關系中),這就是檔案的建議,我會先嘗試這個:
@Bean
WebFilter traceIdInResponseFilter(Tracer tracer) {
return (exchange, chain) -> {
Span span = tracer.currentSpan();
if (span != null) {
exchange.getResponse().getHeaders().add("trace-id", span.context().traceId());
exchange.getResponse().getHeaders().add("span-id", span.context().spanId());
}
return chain.filter(exchange);
};
}
以下是用于故障排除的其他一些提示:
- 請檢查您的跨度是否被采樣
- 請檢查是否創建了 Span 并且您在它的背景關系中
- 您能否檢查一下是否有任何其他儀器樣式有效(我推薦
DECORATE_QUEUES)?
uj5u.com熱心網友回復:
當前跨度是null因為網關中的默認檢測選項是手動的。所以你負責檢索跨度。所以你有兩個選擇。
選項 1 用于WebFluxSleuthOperators從ServerWebExchange( https://github.com/spring-cloud/spring-cloud-sleuth/blob/v3.0.4/spring-cloud-sleuth-instrumentation/src/main /java/org/springframework/cloud/sleuth/instrument/web/WebFluxSleuthOperators.java)如下:
@Bean
WebFilter traceIdInResponseFilter() {
return (exchange, chain) -> {
Span span =
WebFluxSleuthOperators.currentTraceContext(exchange);
if (span != null) {
exchange.getResponse().getHeaders().add("trace-id", span.context().traceId());
exchange.getResponse().getHeaders().add("span-id", span.context().spanId());
}
return chain.filter(exchange);
};
}
或選項 2 與 Jontan 提到的不同 Sleuth Reactor 集成一起使用https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/htmlsingle/#sleuth-reactor-integration如下:
spring:
sleuth:
reactor:
# try decorate_queues and if that fails decorate_on_each
# decorate_on_each can lead to dramatic performance degradation
instrumentation-type: decorate_queues
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/345744.html
標籤:弹簧靴 弹簧-webflux 春云侦探
