package com.github.kristofa.brave.jersey; import com.github.kristofa.brave.Brave; import com.github.kristofa.brave.LocalTracer; import com.github.kristofa.brave.http.ITServletContainer; import com.github.kristofa.brave.http.SpanNameProvider; import com.github.kristofa.brave.servlet.BraveServletFilter; import com.sun.jersey.api.core.DefaultResourceConfig; import com.sun.jersey.spi.container.servlet.ServletContainer; import java.io.IOException; import java.util.EnumSet; import javax.servlet.DispatcherType; import javax.servlet.ServletContext; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; public class ITJerseyServletTraceFilter extends ITServletContainer { /** Jersey 1.x pins to JAX-RS 1.1, which doesn't support AsyncResponse */ @Path("") public static class TestResource { final LocalTracer localTracer; public TestResource(@Context ServletContext context) { this.localTracer = ((Brave) context.getAttribute("brave")).localTracer(); } @GET @Path("foo") public Response get() { return Response.status(200).build(); } @GET @Path("child") public Response child() { localTracer.startNewSpan("child", "child"); localTracer.finishSpan(); return Response.status(200).build(); } @GET @Path("disconnect") public Response disconnect() throws IOException { throw new IOException(); } } @Override public void init(ServletContextHandler handler, Brave brave, SpanNameProvider spanNameProvider) { // add a servlet for the test resource handler.setAttribute("brave", brave); // TestResource needs a Brave DefaultResourceConfig config = new DefaultResourceConfig(TestResource.class); handler.addServlet(new ServletHolder(new ServletContainer(config)), "/*"); // add the trace filter BraveServletFilter filter = ServletTraceFilter.builder(brave) .spanNameProvider(spanNameProvider) .build(); handler.addFilter(new FilterHolder(filter), "/*", EnumSet.of(DispatcherType.REQUEST)); } }