Fix latestDepTests for Jetty

This commit is contained in:
Tyler Benson 2018-11-12 08:18:01 -08:00
parent 5e194ef06c
commit 51dfd2b184
3 changed files with 92 additions and 57 deletions

View File

@ -1,7 +1,6 @@
import datadog.trace.agent.test.AgentTestRunner import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes import datadog.trace.api.DDSpanTypes
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import org.eclipse.jetty.continuation.Continuation import org.eclipse.jetty.continuation.Continuation
@ -11,9 +10,11 @@ import org.eclipse.jetty.server.Request
import org.eclipse.jetty.server.Server import org.eclipse.jetty.server.Server
import org.eclipse.jetty.server.handler.AbstractHandler import org.eclipse.jetty.server.handler.AbstractHandler
import javax.servlet.DispatcherType
import javax.servlet.ServletException import javax.servlet.ServletException
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse import javax.servlet.http.HttpServletResponse
import java.util.concurrent.atomic.AtomicBoolean
class JettyHandlerTest extends AgentTestRunner { class JettyHandlerTest extends AgentTestRunner {
@ -55,29 +56,29 @@ class JettyHandlerTest extends AgentTestRunner {
expect: expect:
response.body().string().trim() == "Hello World" response.body().string().trim() == "Hello World"
TEST_WRITER.waitForTraces(1)
TEST_WRITER.size() == 1 assertTraces(1) {
def trace = TEST_WRITER.firstTrace() trace(0, 1) {
trace.size() == 1 span(0) {
def context = trace[0].context() serviceName "unnamed-java-app"
context.serviceName == "unnamed-java-app" operationName "jetty.request"
context.operationName == "jetty.request" resourceName "GET ${handler.class.name}"
context.resourceName == "GET ${handler.class.name}" spanType DDSpanTypes.HTTP_SERVER
context.spanType == DDSpanTypes.HTTP_SERVER errored false
!context.getErrorFlag() parent()
context.parentId == "0" tags {
def tags = context.tags "http.url" "http://localhost:$port/"
tags["http.url"] == "http://localhost:$port/" "http.method" "GET"
tags["http.method"] == "GET" "span.kind" "server"
tags["span.kind"] == "server" "component" "jetty-handler"
tags["span.type"] == DDSpanTypes.HTTP_SERVER "span.origin.type" handler.class.name
tags["component"] == "jetty-handler" "span.type" DDSpanTypes.HTTP_SERVER
tags["http.status_code"] == 200 "http.status_code" 200
tags["thread.name"] != null defaultTags()
tags["thread.id"] != null }
tags[Config.RUNTIME_ID_TAG] == Config.get().runtimeId }
tags["span.origin.type"] == handler.class.name }
tags.size() == 10 }
} }
def "handler instrumentation clears state after async request"() { def "handler instrumentation clears state after async request"() {
@ -127,12 +128,18 @@ class JettyHandlerTest extends AgentTestRunner {
def "call to jetty with error creates a trace"() { def "call to jetty with error creates a trace"() {
setup: setup:
def errorHandlerCalled = new AtomicBoolean(false)
Handler handler = new AbstractHandler() { Handler handler = new AbstractHandler() {
@Override @Override
void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
if (baseRequest.dispatcherType == DispatcherType.ERROR) {
errorHandlerCalled.set(true)
baseRequest.setHandled(true)
} else {
throw new RuntimeException() throw new RuntimeException()
} }
} }
}
server.setHandler(handler) server.setHandler(handler)
server.start() server.start()
def request = new okhttp3.Request.Builder() def request = new okhttp3.Request.Builder()
@ -143,31 +150,52 @@ class JettyHandlerTest extends AgentTestRunner {
expect: expect:
response.body().string().trim() == "" response.body().string().trim() == ""
TEST_WRITER.waitForTraces(1)
TEST_WRITER.size() == 1 assertTraces(errorHandlerCalled.get() ? 2 : 1) {
def trace = TEST_WRITER.firstTrace() trace(0, 1) {
trace.size() == 1 span(0) {
def context = trace[0].context() serviceName "unnamed-java-app"
context.serviceName == "unnamed-java-app" operationName "jetty.request"
context.operationName == "jetty.request" resourceName "GET ${handler.class.name}"
context.resourceName == "GET ${handler.class.name}" spanType DDSpanTypes.HTTP_SERVER
context.spanType == DDSpanTypes.HTTP_SERVER errored true
context.getErrorFlag() parent()
context.parentId == "0" tags {
def tags = context.tags "http.url" "http://localhost:$port/"
tags["http.url"] == "http://localhost:$port/" "http.method" "GET"
tags["http.method"] == "GET" "span.kind" "server"
tags["span.kind"] == "server" "component" "jetty-handler"
tags["span.type"] == DDSpanTypes.HTTP_SERVER "span.origin.type" handler.class.name
tags["component"] == "jetty-handler" "span.type" DDSpanTypes.HTTP_SERVER
tags["http.status_code"] == 500 "http.status_code" 500
tags["thread.name"] != null errorTags RuntimeException
tags["thread.id"] != null defaultTags()
tags[Config.RUNTIME_ID_TAG] == Config.get().runtimeId }
tags["span.origin.type"] == handler.class.name }
tags["error"] == true }
tags["error.type"] == RuntimeException.name if (errorHandlerCalled.get()) {
tags["error.stack"] != null trace(1, 1) {
tags.size() == 13 span(0) {
serviceName "unnamed-java-app"
operationName "jetty.request"
resourceName "GET ${handler.class.name}"
spanType DDSpanTypes.HTTP_SERVER
errored true
parent()
tags {
"http.url" "http://localhost:$port/"
"http.method" "GET"
"span.kind" "server"
"component" "jetty-handler"
"span.origin.type" handler.class.name
"span.type" DDSpanTypes.HTTP_SERVER
"http.status_code" 500
"error" true
defaultTags()
}
}
}
}
}
} }
} }

View File

@ -7,7 +7,6 @@ import okhttp3.Interceptor
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.eclipse.jetty.http.HttpHeaders
import org.eclipse.jetty.security.ConstraintMapping import org.eclipse.jetty.security.ConstraintMapping
import org.eclipse.jetty.security.ConstraintSecurityHandler import org.eclipse.jetty.security.ConstraintSecurityHandler
import org.eclipse.jetty.security.HashLoginService import org.eclipse.jetty.security.HashLoginService
@ -16,6 +15,7 @@ import org.eclipse.jetty.security.authentication.BasicAuthenticator
import org.eclipse.jetty.server.Server import org.eclipse.jetty.server.Server
import org.eclipse.jetty.servlet.ServletContextHandler import org.eclipse.jetty.servlet.ServletContextHandler
import org.eclipse.jetty.util.security.Constraint import org.eclipse.jetty.util.security.Constraint
import spock.lang.Shared
class JettyServlet3Test extends AgentTestRunner { class JettyServlet3Test extends AgentTestRunner {
@ -29,11 +29,14 @@ class JettyServlet3Test extends AgentTestRunner {
}) })
.build() .build()
@Shared
int port int port
@Shared
private Server jettyServer private Server jettyServer
@Shared
private ServletContextHandler servletContext private ServletContextHandler servletContext
def setup() { def setupSpec() {
port = TestUtils.randomOpenPort() port = TestUtils.randomOpenPort()
jettyServer = new Server(port) jettyServer = new Server(port)
servletContext = new ServletContextHandler() servletContext = new ServletContextHandler()
@ -53,7 +56,7 @@ class JettyServlet3Test extends AgentTestRunner {
"Jetty server: http://localhost:" + port + "/") "Jetty server: http://localhost:" + port + "/")
} }
def cleanup() { def cleanupSpec() {
jettyServer.stop() jettyServer.stop()
jettyServer.destroy() jettyServer.destroy()
} }
@ -68,7 +71,7 @@ class JettyServlet3Test extends AgentTestRunner {
requestBuilder.header("x-datadog-parent-id", "456") requestBuilder.header("x-datadog-parent-id", "456")
} }
if (auth) { if (auth) {
requestBuilder.header(HttpHeaders.AUTHORIZATION, Credentials.basic("user", "password")) requestBuilder.header("Authorization", Credentials.basic("user", "password"))
} }
def response = client.newCall(requestBuilder.build()).execute() def response = client.newCall(requestBuilder.build()).execute()

View File

@ -10,16 +10,20 @@ import org.apache.catalina.core.ApplicationFilterChain
import org.apache.catalina.startup.Tomcat import org.apache.catalina.startup.Tomcat
import org.apache.tomcat.JarScanFilter import org.apache.tomcat.JarScanFilter
import org.apache.tomcat.JarScanType import org.apache.tomcat.JarScanType
import spock.lang.Shared
class TomcatServlet3Test extends AgentTestRunner { class TomcatServlet3Test extends AgentTestRunner {
OkHttpClient client = OkHttpUtils.client() OkHttpClient client = OkHttpUtils.client()
@Shared
int port int port
@Shared
Tomcat tomcatServer Tomcat tomcatServer
@Shared
Context appContext Context appContext
def setup() { def setupSpec() {
port = TestUtils.randomOpenPort() port = TestUtils.randomOpenPort()
tomcatServer = new Tomcat() tomcatServer = new Tomcat()
tomcatServer.setPort(port) tomcatServer.setPort(port)
@ -52,7 +56,7 @@ class TomcatServlet3Test extends AgentTestRunner {
"Tomcat server: http://" + tomcatServer.getHost().getName() + ":" + port + "/") "Tomcat server: http://" + tomcatServer.getHost().getName() + ":" + port + "/")
} }
def cleanup() { def cleanupSpec() {
tomcatServer.stop() tomcatServer.stop()
tomcatServer.destroy() tomcatServer.destroy()
} }