Spring cloud Spring Sleuth升级并添加自定义跟踪ID
我一直在尝试将我的SpringCloudSleuth从1.3.3版升级到2.2.0版。我们使用的是HTTPSpanInjector和HTTPSpanExtractor,它们后来被弃用。我已经粘贴了需要升级的当前代码 我有一个叫做跟踪处理程序的类Spring cloud Spring Sleuth升级并添加自定义跟踪ID,spring-cloud,spring-cloud-sleuth,zipkin,Spring Cloud,Spring Cloud Sleuth,Zipkin,我一直在尝试将我的SpringCloudSleuth从1.3.3版升级到2.2.0版。我们使用的是HTTPSpanInjector和HTTPSpanExtractor,它们后来被弃用。我已经粘贴了需要升级的当前代码 我有一个叫做跟踪处理程序的类 /** * */ import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import jav
/**
*
*/
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.SpanTextMap;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.instrument.web.HttpSpanExtractor;
import org.springframework.cloud.sleuth.instrument.web.HttpSpanInjector;
import org.springframework.cloud.sleuth.instrument.web.ZipkinHttpSpanInjector;
import org.springframework.cloud.sleuth.util.TextMapUtil;
import org.springframework.web.filter.GenericFilterBean;
/**
*
*
*/
public final class TracingHandler {
public static final String TRACE_HEADER_NAME = "X-Pep-TraceId";
public static final String SPAN_HEADER_NAME = "X-Pep-SpanId";
public static class CustomHttpSpanExtractor implements HttpSpanExtractor {
@Override
public Span joinTrace(SpanTextMap carrier) {
Map<String, String> map = TextMapUtil.asMap(carrier);
String traceIdStr = map.get(TRACE_HEADER_NAME);
String spanIdStr = map.get(SPAN_HEADER_NAME);
Long traceId = null;
Long spanId = null;
if (!StringUtils.isBlank(traceIdStr)) {
traceId = Span.hexToId(traceIdStr);
}
if (!StringUtils.isBlank(spanIdStr)) {
spanId = Span.hexToId(spanIdStr);
}
Span.SpanBuilder builder = Span.builder();
if (traceId != null) {
builder.traceId(traceId);
}
if (spanId != null) {
builder.spanId(spanId);
}
return builder.build();
}
}
public static class CustomHttpSpanInjector implements HttpSpanInjector {
@Override
public void inject(Span span, SpanTextMap carrier) {
carrier.put(TRACE_HEADER_NAME, span.traceIdString());
carrier.put(SPAN_HEADER_NAME, Span.idToHex(span.getSpanId()));
}
}
static class CustomHttpServletResponseSpanInjector extends ZipkinHttpSpanInjector {
@Override
public void inject(Span span, SpanTextMap carrier) {
super.inject(span, carrier);
carrier.put(Span.TRACE_ID_NAME, span.traceIdString());
carrier.put(Span.SPAN_ID_NAME, Span.idToHex(span.getSpanId()));
}
}
public static class HttpResponseInjectingTraceFilter extends GenericFilterBean {
private final Tracer tracer;
private final HttpSpanInjector spanInjector;
public HttpResponseInjectingTraceFilter(Tracer tracer, HttpSpanInjector spanInjector) {
this.tracer = tracer;
this.spanInjector = spanInjector;
}
@Override
public void doFilter(ServletRequest request, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
Span currentSpan = this.tracer.getCurrentSpan();
this.spanInjector.inject(currentSpan, new HttpServletResponseTextMap(response));
filterChain.doFilter(request, response);
}
class HttpServletResponseTextMap implements SpanTextMap {
private final HttpServletResponse delegate;
HttpServletResponseTextMap(HttpServletResponse delegate) {
this.delegate = delegate;
}
@Override
public Iterator<Map.Entry<String, String>> iterator() {
Map<String, String> map = new HashMap<>();
for (String header : this.delegate.getHeaderNames()) {
map.put(header, this.delegate.getHeader(header));
}
return map.entrySet().iterator();
}
@Override
public void put(String key, String value) {
this.delegate.addHeader(key, value);
}
}
}
/* As this class is supposed to be a config. class, there's no need to allow consumers to create an object for this class */
private TracingHandler() {}
}
如何升级到SpringCloudSleuth 2.2-Release并实现相同的功能
@Bean
public HttpSpanInjector customHttpSpanInjector() {
return new TracingHandler.CustomHttpSpanInjector();
}
@Bean
public HttpSpanExtractor customHttpSpanExtractor() {
return new TracingHandler.CustomHttpSpanExtractor();
}
@Bean
public HttpResponseInjectingTraceFilter responseInjectingTraceFilter(Tracer tracer) {
return new HttpResponseInjectingTraceFilter(tracer, customHttpSpanInjector());
}