Extract HttpServerTest INDEXED_CHILD span attribute collection logic (#3095)

* Extrawct HttpServerTest INDEXED_CHILD span attribute collection logic

* Adjust whitespace

* Fix context issue with JAX-RS

* Rerun tests
This commit is contained in:
Ago Allikmaa 2021-05-27 11:18:11 +03:00 committed by GitHub
parent acedbff78d
commit df078f95a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 50 additions and 47 deletions

View File

@ -14,7 +14,6 @@ import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEn
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS
import static java.util.concurrent.TimeUnit.SECONDS
import io.opentelemetry.api.trace.Span
import io.opentelemetry.instrumentation.test.base.HttpServerTest
import java.util.concurrent.CompletableFuture
import java.util.concurrent.CompletionStage
@ -88,10 +87,12 @@ class JaxRsTestResource {
@Path("/child")
@GET
void indexed_child(@Suspended AsyncResponse response, @QueryParam("id") long id) {
void indexed_child(@Context UriInfo uriInfo, @Suspended AsyncResponse response) {
def parameters = uriInfo.queryParameters
CompletableFuture.runAsync({
HttpServerTest.controller(INDEXED_CHILD) {
Span.current().setAttribute("test.request.id", id)
INDEXED_CHILD.collectSpanAttributes { parameters.getFirst(it) }
response.resume("")
}
})

View File

@ -16,7 +16,6 @@ import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.LOCATION
import static org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1
import io.opentelemetry.api.trace.Span
import io.opentelemetry.instrumentation.test.AgentTestTrait
import io.opentelemetry.instrumentation.test.base.HttpServerTest
import org.jboss.netty.bootstrap.ServerBootstrap
@ -75,8 +74,7 @@ class Netty38ServerTest extends HttpServerTest<ServerBootstrap> implements Agent
response.setContent(responseContent)
break
case INDEXED_CHILD:
QueryStringDecoder queryStringDecoder = new QueryStringDecoder(uri)
Span.current().setAttribute("test.request.id", queryStringDecoder.getParameters().get("id").find() as long)
endpoint.collectSpanAttributes { new QueryStringDecoder(uri).getParameters().get(it).find() }
response = new DefaultHttpResponse(HTTP_1_1, HttpResponseStatus.valueOf(endpoint.status))
break
case QUERY_PARAM:

View File

@ -36,7 +36,6 @@ import io.netty.handler.codec.http.QueryStringDecoder
import io.netty.handler.logging.LogLevel
import io.netty.handler.logging.LoggingHandler
import io.netty.util.CharsetUtil
import io.opentelemetry.api.trace.Span
import io.opentelemetry.instrumentation.test.AgentTestTrait
import io.opentelemetry.instrumentation.test.base.HttpServerTest
@ -73,8 +72,7 @@ class Netty40ServerTest extends HttpServerTest<EventLoopGroup> implements AgentT
response = new DefaultFullHttpResponse(HTTP_1_1, HttpResponseStatus.valueOf(endpoint.status), content)
break
case INDEXED_CHILD:
QueryStringDecoder queryStringDecoder = new QueryStringDecoder(uri)
Span.current().setAttribute("test.request.id", queryStringDecoder.parameters().get("id").find() as long)
endpoint.collectSpanAttributes { new QueryStringDecoder(uri).parameters().get(it).find() }
response = new DefaultFullHttpResponse(HTTP_1_1, HttpResponseStatus.valueOf(endpoint.status))
break
case QUERY_PARAM:

View File

@ -35,7 +35,6 @@ import io.netty.handler.codec.http.QueryStringDecoder
import io.netty.handler.logging.LogLevel
import io.netty.handler.logging.LoggingHandler
import io.netty.util.CharsetUtil
import io.opentelemetry.api.trace.Span
import io.opentelemetry.instrumentation.test.AgentTestTrait
import io.opentelemetry.instrumentation.test.base.HttpServerTest
@ -72,8 +71,7 @@ class Netty41ServerTest extends HttpServerTest<EventLoopGroup> implements AgentT
response = new DefaultFullHttpResponse(HTTP_1_1, HttpResponseStatus.valueOf(endpoint.status), content)
break
case INDEXED_CHILD:
QueryStringDecoder queryStringDecoder = new QueryStringDecoder(uri)
Span.current().setAttribute("test.request.id", queryStringDecoder.parameters().get("id").find() as long)
endpoint.collectSpanAttributes { new QueryStringDecoder(uri).parameters().get(it).find() }
response = new DefaultFullHttpResponse(HTTP_1_1, HttpResponseStatus.valueOf(endpoint.status))
break
case QUERY_PARAM:

View File

@ -13,7 +13,6 @@ import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEn
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS
import static play.mvc.Http.Context.Implicit.request
import io.opentelemetry.api.trace.Span
import java.util.concurrent.CompletableFuture
import java.util.function.Supplier
import play.libs.concurrent.HttpExecution
@ -36,7 +35,7 @@ class PlayAsyncServerTest extends PlayServerTest {
.GET(INDEXED_CHILD.getPath()).routeTo({
CompletableFuture.supplyAsync({
controller(INDEXED_CHILD) {
Span.current().setAttribute("test.request.id", request().getQueryString("id") as long)
INDEXED_CHILD.collectSpanAttributes { request().getQueryString(it) }
Results.status(INDEXED_CHILD.getStatus())
}
}, HttpExecution.defaultContext())

View File

@ -14,7 +14,6 @@ import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEn
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS
import static play.mvc.Http.Context.Implicit.request
import io.opentelemetry.api.trace.Span
import io.opentelemetry.api.trace.StatusCode
import io.opentelemetry.instrumentation.test.AgentTestTrait
import io.opentelemetry.instrumentation.test.asserts.TraceAssert
@ -37,7 +36,7 @@ class PlayServerTest extends HttpServerTest<Server> implements AgentTestTrait {
} as Supplier)
.GET(INDEXED_CHILD.getPath()).routeTo({
controller(INDEXED_CHILD) {
Span.current().setAttribute("test.request.id", request().getQueryString("id") as long)
INDEXED_CHILD.collectSpanAttributes { request().getQueryString(it) }
Results.status(INDEXED_CHILD.getStatus())
}
} as Supplier)

View File

@ -13,7 +13,6 @@ import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEn
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.REDIRECT
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS
import io.opentelemetry.api.trace.Span
import ratpack.exec.Promise
import ratpack.groovy.test.embed.GroovyEmbeddedApp
import ratpack.test.embed.EmbeddedApp
@ -48,7 +47,7 @@ class RatpackAsyncHttpServerTest extends RatpackHttpServerTest {
INDEXED_CHILD
} then {
controller(INDEXED_CHILD) {
Span.current().setAttribute("test.request.id", request.queryParams.get("id") as long)
INDEXED_CHILD.collectSpanAttributes { request.queryParams.get(it) }
context.response.status(INDEXED_CHILD.status).send()
}
}

View File

@ -13,7 +13,6 @@ import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEn
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.REDIRECT
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS
import io.opentelemetry.api.trace.Span
import ratpack.exec.Promise
import ratpack.groovy.test.embed.GroovyEmbeddedApp
import ratpack.test.embed.EmbeddedApp
@ -48,7 +47,7 @@ class RatpackForkedHttpServerTest extends RatpackHttpServerTest {
INDEXED_CHILD
}.fork().then {
controller(INDEXED_CHILD) {
Span.current().setAttribute("test.request.id", request.queryParams.get("id") as long)
INDEXED_CHILD.collectSpanAttributes { request.queryParams.get(it) }
context.response.status(INDEXED_CHILD.status).send()
}
}

View File

@ -14,7 +14,6 @@ import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEn
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.REDIRECT
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS
import io.opentelemetry.api.trace.Span
import io.opentelemetry.api.trace.StatusCode
import io.opentelemetry.instrumentation.test.AgentTestTrait
import io.opentelemetry.instrumentation.test.asserts.TraceAssert
@ -48,7 +47,7 @@ class RatpackHttpServerTest extends HttpServerTest<EmbeddedApp> implements Agent
prefix(INDEXED_CHILD.rawPath()) {
all {
controller(INDEXED_CHILD) {
Span.current().setAttribute("test.request.id", request.queryParams.get("id") as long)
INDEXED_CHILD.collectSpanAttributes { request.queryParams.get(it) }
context.response.status(INDEXED_CHILD.status).send()
}
}

View File

@ -11,7 +11,6 @@ import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEn
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS
import groovy.servlet.AbstractHttpServlet
import io.opentelemetry.api.trace.Span
import io.opentelemetry.instrumentation.test.base.HttpServerTest
import java.util.concurrent.Phaser
import javax.servlet.RequestDispatcher
@ -40,7 +39,7 @@ class TestServlet3 {
break
case INDEXED_CHILD:
resp.status = endpoint.status
Span.current().setAttribute("test.request.id", req.getParameter("id") as long)
endpoint.collectSpanAttributes { req.getParameter(it) }
break
case QUERY_PARAM:
resp.status = endpoint.status
@ -78,7 +77,7 @@ class TestServlet3 {
context.complete()
break
case INDEXED_CHILD:
Span.current().setAttribute("test.request.id", req.getParameter("id") as long)
endpoint.collectSpanAttributes { req.getParameter(it) }
resp.status = endpoint.status
context.complete()
break
@ -128,7 +127,7 @@ class TestServlet3 {
resp.writer.print(endpoint.body)
break
case INDEXED_CHILD:
Span.current().setAttribute("test.request.id", req.getParameter("id") as long)
endpoint.collectSpanAttributes { req.getParameter(it) }
resp.status = endpoint.status
break
case QUERY_PARAM:

View File

@ -10,7 +10,6 @@ import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEn
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.REDIRECT
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS
import io.opentelemetry.api.trace.Span
import io.opentelemetry.instrumentation.test.base.HttpServerTest
import jakarta.servlet.RequestDispatcher
import jakarta.servlet.ServletException
@ -40,7 +39,7 @@ class TestServlet5 {
break
case INDEXED_CHILD:
resp.status = endpoint.status
Span.current().setAttribute("test.request.id", req.getParameter("id") as long)
endpoint.collectSpanAttributes { req.getParameter(it) }
break
case QUERY_PARAM:
resp.status = endpoint.status
@ -78,7 +77,7 @@ class TestServlet5 {
context.complete()
break
case INDEXED_CHILD:
Span.current().setAttribute("test.request.id", req.getParameter("id") as long)
endpoint.collectSpanAttributes { req.getParameter(it) }
resp.status = endpoint.status
context.complete()
break
@ -128,7 +127,7 @@ class TestServlet5 {
resp.writer.print(endpoint.body)
break
case INDEXED_CHILD:
Span.current().setAttribute("test.request.id", req.getParameter("id") as long)
endpoint.collectSpanAttributes { req.getParameter(it) }
resp.status = endpoint.status
break
case QUERY_PARAM:

View File

@ -5,7 +5,6 @@
package server.base;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint;
import java.net.URI;
import java.util.concurrent.Callable;
@ -96,9 +95,7 @@ public abstract class ServerTestController {
return wrapControllerMethod(
endpoint,
() -> {
Span.current()
.setAttribute(
"test.request.id", Long.parseLong(request.getQueryParams().getFirst("id")));
endpoint.collectSpanAttributes(it -> request.getQueryParams().getFirst(it));
setStatus(response, endpoint);
return "";
});

View File

@ -13,7 +13,6 @@ import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEn
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.REDIRECT
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS
import io.opentelemetry.api.trace.Span
import io.opentelemetry.instrumentation.test.base.HttpServerTest
import io.vertx.circuitbreaker.CircuitBreakerOptions
import io.vertx.core.Future
@ -64,7 +63,7 @@ class VertxRxCircuitBreakerHttpServerTest extends VertxRxHttpServerTest {
}
HttpServerTest.ServerEndpoint endpoint = it.result()
controller(endpoint) {
Span.current().setAttribute("test.request.id", ctx.request().params().get("id") as long)
endpoint.collectSpanAttributes { ctx.request().params().get(it) }
ctx.response().setStatusCode(endpoint.status).end()
}
})

View File

@ -14,7 +14,6 @@ import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEn
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.REDIRECT
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS
import io.opentelemetry.api.trace.Span
import io.opentelemetry.instrumentation.test.AgentTestTrait
import io.opentelemetry.instrumentation.test.base.HttpServerTest
import io.vertx.core.DeploymentOptions
@ -95,8 +94,8 @@ class VertxRxHttpServerTest extends HttpServerTest<Vertx> implements AgentTestTr
}
}
router.route(INDEXED_CHILD.path).handler { ctx ->
controller(QUERY_PARAM) {
Span.current().setAttribute("test.request.id", ctx.request().params().get("id") as long)
controller(INDEXED_CHILD) {
INDEXED_CHILD.collectSpanAttributes { ctx.request().params().get(it) }
ctx.response().setStatusCode(INDEXED_CHILD.status).end()
}
}

View File

@ -13,7 +13,6 @@ import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEn
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.REDIRECT;
import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.instrumentation.test.base.HttpServerTest;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
@ -53,9 +52,7 @@ public class VertxWebServer extends AbstractVerticle {
HttpServerTest.controller(
INDEXED_CHILD,
() -> {
Span.current()
.setAttribute(
"test.request.id", Long.parseLong(ctx.request().getParam("id")));
INDEXED_CHILD.collectSpanAttributes(it -> ctx.request().getParam(it));
ctx.response().setStatusCode(INDEXED_CHILD.getStatus()).end();
return null;
}));

View File

@ -138,6 +138,9 @@ abstract class HttpServerTest<SERVER> extends InstrumentationSpecification imple
AUTH_ERROR("basicsecured/endpoint", 401, null),
INDEXED_CHILD("child", 200, null),
public static final String ID_ATTRIBUTE_NAME = "test.request.id"
public static final String ID_PARAMETER_NAME = "id"
private final URI uriObj
private final String path
final String query
@ -177,11 +180,31 @@ abstract class HttpServerTest<SERVER> extends InstrumentationSpecification imple
return new URI(uri.scheme, null, uri.host, uri.port, uri.path, uri.query, null)
}
/**
* Populates custom test attributes for the {@link HttpServerTest#controller} span (which must
* be the current span when this is called) based on URL parameters. Required for
* {@link #INDEXED_CHILD}.
*/
void collectSpanAttributes(UrlParameterProvider parameterProvider) {
if (this == INDEXED_CHILD) {
String value = parameterProvider.getParameter(ID_PARAMETER_NAME)
if (value != null) {
Span.current().setAttribute(ID_ATTRIBUTE_NAME, value as long)
}
}
}
private static final Map<String, ServerEndpoint> PATH_MAP = values().collectEntries { [it.path, it] }
static ServerEndpoint forPath(String path) {
return PATH_MAP.get(path)
}
// Static keyword required for Scala interop
static interface UrlParameterProvider {
String getParameter(String name)
}
}
Request.Builder request(ServerEndpoint uri, String method, RequestBody body) {
@ -416,11 +439,11 @@ abstract class HttpServerTest<SERVER> extends InstrumentationSpecification imple
def job = {
latch.await()
def url = HttpUrl.get(endpoint.resolvePath(address)).newBuilder()
.query("id=$index")
.query("${ServerEndpoint.ID_PARAMETER_NAME}=$index")
.build()
Request.Builder builder = request(url, "GET", null)
runUnderTrace("client " + index) {
Span.current().setAttribute("test.request.id", index)
Span.current().setAttribute(ServerEndpoint.ID_ATTRIBUTE_NAME, index)
propagator.inject(Context.current(), builder, setter)
client.newCall(builder.build()).execute()
}
@ -439,7 +462,7 @@ abstract class HttpServerTest<SERVER> extends InstrumentationSpecification imple
def requestId = Integer.parseInt(rootSpan.name.substring("client ".length()))
basicSpan(it, 0, "client " + requestId, null, null) {
it."test.request.id" requestId
"${ServerEndpoint.ID_ATTRIBUTE_NAME}" requestId
}
indexedServerSpan(it, span(0), requestId)
@ -648,7 +671,7 @@ abstract class HttpServerTest<SERVER> extends InstrumentationSpecification imple
name "controller"
childOf((SpanData) parent)
attributes {
it."test.request.id" requestId
"${ServerEndpoint.ID_ATTRIBUTE_NAME}" requestId
}
}
}