Move trace response headers up to start of filter
They seem to only get set once (by the proxy, which is most likely to be correct) even if Zuul is proxying a service that itself is a Sleuth application. Fixes gh-199
This commit is contained in:
@@ -158,8 +158,7 @@ public class TraceFilter extends OncePerRequestFilter
|
||||
}
|
||||
else {
|
||||
if (skip) {
|
||||
spanFromRequest = this.tracer.createSpan(name,
|
||||
NeverSampler.INSTANCE);
|
||||
spanFromRequest = this.tracer.createSpan(name, NeverSampler.INSTANCE);
|
||||
}
|
||||
else {
|
||||
spanFromRequest = this.tracer.createSpan(name);
|
||||
@@ -172,6 +171,9 @@ public class TraceFilter extends OncePerRequestFilter
|
||||
try {
|
||||
|
||||
addRequestTags(request);
|
||||
// Add headers before filter chain in case one of the filters flushes the
|
||||
// response...
|
||||
addResponseHeaders(response, spanFromRequest);
|
||||
filterChain.doFilter(request, response);
|
||||
|
||||
}
|
||||
@@ -190,7 +192,6 @@ public class TraceFilter extends OncePerRequestFilter
|
||||
}
|
||||
if (spanFromRequest != null) {
|
||||
addResponseTags(response, exception);
|
||||
addResponseHeaders(response, spanFromRequest);
|
||||
if (spanFromRequest.hasSavedSpan()) {
|
||||
publish(new ServerSentEvent(this, spanFromRequest.getSavedSpan(),
|
||||
spanFromRequest));
|
||||
@@ -203,8 +204,10 @@ public class TraceFilter extends OncePerRequestFilter
|
||||
|
||||
private void addResponseHeaders(HttpServletResponse response, Span span) {
|
||||
if (span != null) {
|
||||
response.addHeader(Span.SPAN_ID_NAME, Span.idToHex(span.getSpanId()));
|
||||
response.addHeader(Span.TRACE_ID_NAME, Span.idToHex(span.getTraceId()));
|
||||
if (!response.containsHeader(Span.SPAN_ID_NAME)) {
|
||||
response.addHeader(Span.SPAN_ID_NAME, Span.idToHex(span.getSpanId()));
|
||||
response.addHeader(Span.TRACE_ID_NAME, Span.idToHex(span.getTraceId()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -62,23 +62,21 @@ public class TracePreZuulFilter extends ZuulFilter
|
||||
@Override
|
||||
public Object run() {
|
||||
RequestContext ctx = RequestContext.getCurrentContext();
|
||||
Map<String, String> response = ctx.getZuulRequestHeaders();
|
||||
// N.B. this will only work with the simple host filter (not ribbon) unless you
|
||||
// set hystrix.execution.isolation.strategy=SEMAPHORE
|
||||
Map<String, String> requestHeaders = ctx.getZuulRequestHeaders();
|
||||
Span span = getCurrentSpan();
|
||||
if (span == null) {
|
||||
setHeader(response, Span.NOT_SAMPLED_NAME, "true");
|
||||
setHeader(requestHeaders, Span.NOT_SAMPLED_NAME, "true");
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
setHeader(response, Span.SPAN_ID_NAME, span.getSpanId());
|
||||
setHeader(response, Span.TRACE_ID_NAME, span.getTraceId());
|
||||
setHeader(response, Span.SPAN_NAME_NAME, span.getName());
|
||||
setHeader(requestHeaders, Span.SPAN_ID_NAME, span.getSpanId());
|
||||
setHeader(requestHeaders, Span.TRACE_ID_NAME, span.getTraceId());
|
||||
setHeader(requestHeaders, Span.SPAN_NAME_NAME, span.getName());
|
||||
if (!span.isExportable()) {
|
||||
setHeader(response, Span.NOT_SAMPLED_NAME, "true");
|
||||
setHeader(requestHeaders, Span.NOT_SAMPLED_NAME, "true");
|
||||
}
|
||||
setHeader(response, Span.PARENT_ID_NAME, getParentId(span));
|
||||
setHeader(response, Span.PROCESS_ID_NAME, span.getProcessId());
|
||||
setHeader(requestHeaders, Span.PARENT_ID_NAME, getParentId(span));
|
||||
setHeader(requestHeaders, Span.PROCESS_ID_NAME, span.getProcessId());
|
||||
// TODO: the client sent event should come from the client not the filter!
|
||||
publish(new ClientSentEvent(this, span));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user