package brave.http; import io.undertow.Undertow; import io.undertow.servlet.Servlets; import io.undertow.servlet.api.DeploymentInfo; import io.undertow.servlet.api.DeploymentManager; import java.io.IOException; import java.net.InetSocketAddress; import java.util.concurrent.TimeUnit; import javax.servlet.ServletException; import okhttp3.OkHttpClient; import okhttp3.Request; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.TearDown; import org.openjdk.jmh.annotations.Threads; import org.openjdk.jmh.annotations.Warmup; @Measurement(iterations = 5, time = 1) @Warmup(iterations = 10, time = 1) @Fork(3) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) @Threads(2) @State(Scope.Benchmark) public abstract class HttpServerBenchmarks { Undertow server; OkHttpClient client; String baseUrl; protected String baseUrl() { return baseUrl; } @Setup(Level.Trial) public void init() throws Exception { baseUrl = "http://127.0.0.1:" + initServer(); client = new OkHttpClient(); } @TearDown(Level.Trial) public void close() throws Exception { if (server != null) server.stop(); client.dispatcher().executorService().shutdown(); } protected int initServer() throws ServletException { DeploymentInfo servletBuilder = Servlets.deployment() .setClassLoader(getClass().getClassLoader()) .setContextPath("/") .setDeploymentName("test.war"); init(servletBuilder); DeploymentManager manager = Servlets.defaultContainer().addDeployment(servletBuilder); manager.deploy(); server = Undertow.builder() .addHttpListener(0, "127.0.0.1") .setHandler(manager.start()).build(); server.start(); return ((InetSocketAddress) server.getListenerInfo().get(0).getAddress()).getPort(); } protected abstract void init(DeploymentInfo servletBuilder); @Benchmark public void server_get() throws Exception { get("/nottraced"); } @Benchmark public void unsampledServer_get() throws Exception { get("/unsampled"); } @Benchmark public void tracedServer_get() throws Exception { get("/traced"); } void get(String path) throws IOException { client.newCall(new Request.Builder().url(baseUrl() + path).build()) .execute() .body().close(); } }