opentelemetry-java-instrume.../dd-java-agent/instrumentation/dropwizard/src/test/groovy/DropwizardTest.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 {}
}