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:
Dave Syer
2016-03-04 14:41:05 +00:00
parent 6aba876804
commit cedede7fd4
2 changed files with 16 additions and 15 deletions

View File

@@ -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()));
}
}
}

View File

@@ -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));
}