203 lines
5.6 KiB
Groovy
203 lines
5.6 KiB
Groovy
import datadog.opentracing.DDSpan
|
|
import datadog.trace.agent.test.asserts.TraceAssert
|
|
import datadog.trace.agent.test.base.HttpServerTest
|
|
import datadog.trace.api.DDSpanTypes
|
|
import datadog.trace.api.DDTags
|
|
import datadog.trace.bootstrap.instrumentation.api.Tags
|
|
import datadog.trace.instrumentation.jaxrs2.JaxRsAnnotationsDecorator
|
|
import datadog.trace.instrumentation.servlet3.Servlet3Decorator
|
|
import io.dropwizard.Application
|
|
import io.dropwizard.Configuration
|
|
import io.dropwizard.setup.Bootstrap
|
|
import io.dropwizard.setup.Environment
|
|
import io.dropwizard.testing.ConfigOverride
|
|
import io.dropwizard.testing.DropwizardTestSupport
|
|
import javax.ws.rs.GET
|
|
import javax.ws.rs.Path
|
|
import javax.ws.rs.QueryParam
|
|
import javax.ws.rs.core.Response
|
|
import org.eclipse.jetty.servlet.ServletHandler
|
|
|
|
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.ERROR
|
|
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.EXCEPTION
|
|
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_PARAM
|
|
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.REDIRECT
|
|
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS
|
|
|
|
class DropwizardTest extends HttpServerTest<DropwizardTestSupport, Servlet3Decorator> {
|
|
|
|
@Override
|
|
DropwizardTestSupport startServer(int port) {
|
|
def testSupport = new DropwizardTestSupport(testApp(),
|
|
null,
|
|
ConfigOverride.config("server.applicationConnectors[0].port", "$port"))
|
|
testSupport.before()
|
|
return testSupport
|
|
}
|
|
|
|
Class testApp() {
|
|
TestApp
|
|
}
|
|
|
|
Class testResource() {
|
|
ServiceResource
|
|
}
|
|
|
|
@Override
|
|
void stopServer(DropwizardTestSupport testSupport) {
|
|
testSupport.after()
|
|
}
|
|
|
|
@Override
|
|
Servlet3Decorator decorator() {
|
|
return new Servlet3Decorator() {
|
|
@Override
|
|
protected String component() {
|
|
return "jax-rs"
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
String expectedOperationName() {
|
|
return "servlet.request"
|
|
}
|
|
|
|
@Override
|
|
boolean hasHandlerSpan() {
|
|
true
|
|
}
|
|
|
|
@Override
|
|
boolean testNotFound() {
|
|
false
|
|
}
|
|
|
|
boolean testExceptionBody() {
|
|
false
|
|
}
|
|
|
|
@Override
|
|
void handlerSpan(TraceAssert trace, int index, Object parent, ServerEndpoint endpoint = SUCCESS) {
|
|
trace.span(index) {
|
|
serviceName expectedServiceName()
|
|
operationName "jax-rs.request"
|
|
resourceName "${testResource().simpleName}.${endpoint.name().toLowerCase()}"
|
|
spanType DDSpanTypes.HTTP_SERVER
|
|
errored endpoint == EXCEPTION
|
|
childOf(parent as DDSpan)
|
|
tags {
|
|
"$Tags.COMPONENT" JaxRsAnnotationsDecorator.DECORATE.component()
|
|
if (endpoint == EXCEPTION) {
|
|
errorTags(Exception, EXCEPTION.body)
|
|
}
|
|
defaultTags()
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
void serverSpan(TraceAssert trace, int index, BigInteger traceID = null, BigInteger parentID = null, String method = "GET", ServerEndpoint endpoint = SUCCESS) {
|
|
trace.span(index) {
|
|
serviceName expectedServiceName()
|
|
operationName expectedOperationName()
|
|
resourceName endpoint.status == 404 ? "404" : "$method ${endpoint.resolve(address).path}"
|
|
spanType DDSpanTypes.HTTP_SERVER
|
|
errored endpoint.errored
|
|
if (parentID != null) {
|
|
traceId traceID
|
|
parentId parentID
|
|
} else {
|
|
parent()
|
|
}
|
|
tags {
|
|
"$Tags.COMPONENT" serverDecorator.component()
|
|
"$Tags.SPAN_KIND" Tags.SPAN_KIND_SERVER
|
|
"$Tags.PEER_HOSTNAME" { it == "localhost" || it == "127.0.0.1" }
|
|
"$Tags.PEER_HOST_IPV4" { it == null || it == "127.0.0.1" } // Optional
|
|
"$Tags.PEER_PORT" Integer
|
|
"$Tags.HTTP_URL" "${endpoint.resolve(address)}"
|
|
"$Tags.HTTP_METHOD" method
|
|
"$Tags.HTTP_STATUS" endpoint.status
|
|
"span.origin.type" ServletHandler.CachedChain.name
|
|
if (endpoint.errored) {
|
|
"$Tags.ERROR" endpoint.errored
|
|
"error.msg" { it == null || it == EXCEPTION.body }
|
|
"error.type" { it == null || it == Exception.name }
|
|
"error.stack" { it == null || it instanceof String }
|
|
}
|
|
if (endpoint.query) {
|
|
"$DDTags.HTTP_QUERY" endpoint.query
|
|
}
|
|
defaultTags(true)
|
|
}
|
|
}
|
|
}
|
|
|
|
static class TestApp extends Application<Configuration> {
|
|
@Override
|
|
void initialize(Bootstrap<Configuration> bootstrap) {
|
|
}
|
|
|
|
@Override
|
|
void run(Configuration configuration, Environment environment) {
|
|
environment.jersey().register(ServiceResource)
|
|
}
|
|
}
|
|
|
|
@Path("/ignored1")
|
|
static interface TestInterface {}
|
|
|
|
@Path("/ignored2")
|
|
static abstract class AbstractClass implements TestInterface {
|
|
|
|
@GET
|
|
@Path("success")
|
|
Response success() {
|
|
controller(SUCCESS) {
|
|
Response.status(SUCCESS.status).entity(SUCCESS.body).build()
|
|
}
|
|
}
|
|
|
|
@GET
|
|
@Path("query")
|
|
Response query_param(@QueryParam("some") String param) {
|
|
controller(QUERY_PARAM) {
|
|
Response.status(QUERY_PARAM.status).entity("some=$param".toString()).build()
|
|
}
|
|
}
|
|
|
|
@GET
|
|
@Path("redirect")
|
|
Response redirect() {
|
|
controller(REDIRECT) {
|
|
Response.status(REDIRECT.status).location(new URI(REDIRECT.body)).build()
|
|
}
|
|
}
|
|
}
|
|
|
|
@Path("/ignored3")
|
|
static class ParentClass extends AbstractClass {
|
|
|
|
@GET
|
|
@Path("error-status")
|
|
Response error() {
|
|
controller(ERROR) {
|
|
Response.status(ERROR.status).entity(ERROR.body).build()
|
|
}
|
|
}
|
|
|
|
@GET
|
|
@Path("exception")
|
|
Response exception() {
|
|
controller(EXCEPTION) {
|
|
throw new Exception(EXCEPTION.body)
|
|
}
|
|
return null
|
|
}
|
|
}
|
|
|
|
@Path("/")
|
|
static class ServiceResource extends ParentClass {}
|
|
}
|