package brave.servlet;
import brave.Tracing;
import brave.http.HttpServerBenchmarks;
import brave.sampler.Sampler;
import io.undertow.servlet.Servlets;
import io.undertow.servlet.api.DeploymentInfo;
import io.undertow.servlet.api.FilterInfo;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import zipkin.reporter.Reporter;
import static javax.servlet.DispatcherType.REQUEST;
public class ServletBenchmarks extends HttpServerBenchmarks {
static class HelloServlet extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.addHeader("Content-Type", "text/plain; charset=UTF-8");
resp.getWriter().println("hello world");
}
}
public static class Unsampled extends ForwardingTracingFilter {
public Unsampled() {
super(TracingFilter.create(
Tracing.newBuilder().sampler(Sampler.NEVER_SAMPLE).reporter(Reporter.NOOP).build()
));
}
}
public static class Traced extends ForwardingTracingFilter {
public Traced() {
super(TracingFilter.create(Tracing.newBuilder().reporter(Reporter.NOOP).build()));
}
}
@Override protected void init(DeploymentInfo servletBuilder) {
servletBuilder.addFilter(new FilterInfo("Unsampled", Unsampled.class))
.addFilterUrlMapping("Unsampled", "/unsampled", REQUEST)
.addFilter(new FilterInfo("Traced", Traced.class))
.addFilterUrlMapping("Traced", "/traced", REQUEST)
.addServlets(Servlets.servlet("HelloServlet", HelloServlet.class).addMapping("/*"));
}
// Convenience main entry-point
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(".*" + ServletBenchmarks.class.getSimpleName() + ".*")
.build();
new Runner(opt).run();
}
static class ForwardingTracingFilter implements Filter {
final Filter delegate;
public ForwardingTracingFilter(Filter delegate) {
this.delegate = delegate;
}
@Override public void init(FilterConfig filterConfig) throws ServletException {
}
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
delegate.doFilter(servletRequest, servletResponse, filterChain);
}
@Override public void destroy() {
}
}
}