Repository: cxf Updated Branches: refs/heads/master 698227f4a -> b0097f196
CXF-6360: Integration with Apache HTrace. Fixed asynchronous invocation flow on client-side Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/b0097f19 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/b0097f19 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/b0097f19 Branch: refs/heads/master Commit: b0097f19641e9c42837e87e98d37415026087640 Parents: 698227f Author: reta <[email protected]> Authored: Wed Sep 16 21:37:24 2015 -0400 Committer: reta <[email protected]> Committed: Wed Sep 16 21:37:24 2015 -0400 ---------------------------------------------------------------------- .../htrace/jaxrs/HTraceClientProvider.java | 23 ++++++++++++++++++-- .../jaxrs/tracing/htrace/HTraceTracingTest.java | 20 +++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/b0097f19/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/jaxrs/HTraceClientProvider.java ---------------------------------------------------------------------- diff --git a/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/jaxrs/HTraceClientProvider.java b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/jaxrs/HTraceClientProvider.java index fc88ec8..cfd5ca7 100644 --- a/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/jaxrs/HTraceClientProvider.java +++ b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/jaxrs/HTraceClientProvider.java @@ -27,6 +27,7 @@ import javax.ws.rs.client.ClientResponseFilter; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.Provider; +import org.apache.cxf.jaxrs.utils.JAXRSUtils; import org.apache.cxf.tracing.AbstractTracingProvider; import org.apache.htrace.Sampler; import org.apache.htrace.Span; @@ -52,9 +53,10 @@ public class HTraceClientProvider extends AbstractTracingProvider @Override public void filter(final ClientRequestContext requestContext) throws IOException { Span span = Trace.currentSpan(); + TraceScope scope = null; if (span == null) { - final TraceScope scope = Trace.startSpan(buildSpanDescription(requestContext.getUri().toString(), + scope = Trace.startSpan(buildSpanDescription(requestContext.getUri().toString(), requestContext.getMethod()), sampler); span = scope.getSpan(); @@ -73,6 +75,12 @@ public class HTraceClientProvider extends AbstractTracingProvider requestHeaders.putSingle(traceIdHeader, Long.toString(span.getTraceId())); requestHeaders.putSingle(spanIdHeader, Long.toString(span.getSpanId())); } + + // In case of asynchronous client invocation, the span should be detached as JAX-RS + // client request / response filters are going to be executed in different threads. + if (isAsyncInvocation() && scope != null) { + scope.detach(); + } } @Override @@ -81,7 +89,18 @@ public class HTraceClientProvider extends AbstractTracingProvider final TraceScope scope = (TraceScope)requestContext.getProperty(TRACE_SPAN); if (scope != null) { - scope.close(); + // If the client invocation was asynchronous , the trace scope has been created + // in another thread and should be re-attached to the current one. + if (scope.isDetached()) { + final TraceScope continueSpan = Trace.continueSpan(scope.getSpan()); + continueSpan.close(); + } else { + scope.close(); + } } } + + private boolean isAsyncInvocation() { + return !JAXRSUtils.getCurrentMessage().getExchange().isSynchronous(); + } } http://git-wip-us.apache.org/repos/asf/cxf/blob/b0097f19/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/HTraceTracingTest.java ---------------------------------------------------------------------- diff --git a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/HTraceTracingTest.java b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/HTraceTracingTest.java index 48bd0cc..11b7442 100644 --- a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/HTraceTracingTest.java +++ b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/HTraceTracingTest.java @@ -21,6 +21,8 @@ package org.apache.cxf.systest.jaxrs.tracing.htrace; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -92,6 +94,7 @@ public class HTraceTracingTest extends AbstractBusClientServerTestBase { assertThat(TestSpanReceiver.getAllSpans().size(), equalTo(2)); assertThat(TestSpanReceiver.getAllSpans().get(0).getDescription(), equalTo("Get Books")); + assertThat(TestSpanReceiver.getAllSpans().get(1).getDescription(), equalTo("GET bookstore/books")); assertFalse(r.getHeaders().containsKey(TracerHeaders.DEFAULT_HEADER_TRACE_ID)); assertFalse(r.getHeaders().containsKey(TracerHeaders.DEFAULT_HEADER_SPAN_ID)); @@ -202,6 +205,23 @@ public class HTraceTracingTest extends AbstractBusClientServerTestBase { assertThat(TestSpanReceiver.getAllSpans().get(1).getDescription(), equalTo("Processing books")); } + @Test + public void testThatNewSpanIsCreatedWhenNotProvidedUsingAsyncClient() throws Exception { + final WebClient client = createWebClient("/bookstore/books", htraceClientProvider); + final Future<Response> f = client.async().get(); + + final Response r = f.get(1, TimeUnit.SECONDS); + assertEquals(Status.OK.getStatusCode(), r.getStatus()); + + assertThat(TestSpanReceiver.getAllSpans().size(), equalTo(3)); + assertThat(TestSpanReceiver.getAllSpans().get(0).getDescription(), equalTo("Get Books")); + assertThat(TestSpanReceiver.getAllSpans().get(1).getDescription(), equalTo("GET bookstore/books")); + assertThat(TestSpanReceiver.getAllSpans().get(2).getDescription(), equalTo("GET " + client.getCurrentURI())); + + assertTrue(r.getHeaders().containsKey(TracerHeaders.DEFAULT_HEADER_TRACE_ID)); + assertTrue(r.getHeaders().containsKey(TracerHeaders.DEFAULT_HEADER_SPAN_ID)); + } + protected WebClient createWebClient(final String url, final Object ... providers) { return WebClient .create("http://localhost:" + PORT + url, Arrays.asList(providers))
