package com.github.kristofa.brave.jersey; import com.github.kristofa.brave.internal.Util; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.servlet.GuiceFilter; import com.google.inject.servlet.GuiceServletContextListener; import com.google.inject.servlet.ServletModule; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.guice.spi.container.servlet.GuiceContainer; import com.sun.jersey.test.framework.JerseyTest; import com.sun.jersey.test.framework.WebAppDescriptor; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Response; import org.junit.Test; import zipkin.TraceKeys; import zipkin.storage.QueryRequest; import static org.assertj.core.api.Assertions.assertThat; /** * This tests injected {@link ServletTraceFilter} and {@link JerseyClientTraceFilter}. * * <p>This uses Guice as Jersey 1.x doesn't really have an injection system. */ public class ITBraveJersey extends JerseyTest { public static class GuiceServletConfig extends GuiceServletContextListener { @Override protected Injector getInjector() { return Guice.createInjector(new ServletModule() { @Override protected void configureServlets() { bind(TestResource.class); serve("/*").with(GuiceContainer.class); filter("/*").through(TraceFilters.INSTANCE.server); } }); } } @Path("test") public static class TestResource { @GET public Response get() { return Response.status(200).build(); } } public ITBraveJersey() throws Exception { super(new WebAppDescriptor.Builder() .contextListenerClass(GuiceServletConfig.class) .filterClass(GuiceFilter.class) .build()); } @Test public void test() throws Exception { // install the trace filter WebResource webResource = resource(); webResource.addFilter(TraceFilters.INSTANCE.client); // hit the server webResource.path("test").get(String.class); List<List<zipkin.Span>> traces = TraceFilters.INSTANCE.storage.spanStore() .getTraces(QueryRequest.builder().build()); assertThat(traces).hasSize(1); assertThat(traces.get(0)) .withFailMessage("Expected client and server to share ids: " + traces.get(0)) .hasSize(1); zipkin.Span clientServerSpan = traces.get(0).get(0); assertThat(clientServerSpan.annotations).extracting(a -> a.value) .containsExactly("cs", "sr", "ss", "cr"); // Currently one side logs the full url where the other logs only the path assertThat(clientServerSpan.binaryAnnotations) .filteredOn(ba -> ba.key.equals(TraceKeys.HTTP_URL)) .extracting(ba -> new String(ba.value, Util.UTF_8)) .allSatisfy(url -> assertThat(url.endsWith("/test"))); } }