CR fixes.

This commit is contained in:
Tyler Benson 2019-08-16 09:22:44 -07:00
parent 8c490a42a2
commit fc30b4c5bb
6 changed files with 36 additions and 81 deletions

View File

@ -1,6 +1,3 @@
import datadog.trace.agent.test.asserts.ListWriterAssert
import groovy.transform.stc.ClosureParams
import groovy.transform.stc.SimpleType
import javax.ws.rs.GET
import javax.ws.rs.Path
import javax.ws.rs.container.AsyncResponse
@ -28,6 +25,11 @@ class GrizzlyAsyncTest extends GrizzlyTest {
GrizzlyHttpServerFactory.createHttpServer(new URI("http://localhost:$port"), rc)
}
@Override
boolean reorderControllerSpan() {
true
}
@Path("/")
static class AsyncServiceResource {
private ExecutorService executor = Executors.newSingleThreadExecutor()
@ -76,25 +78,4 @@ class GrizzlyAsyncTest extends GrizzlyTest {
}
}
}
void cleanAndAssertTraces(
final int size,
@ClosureParams(value = SimpleType, options = "datadog.trace.agent.test.asserts.ListWriterAssert")
@DelegatesTo(value = ListWriterAssert, strategy = Closure.DELEGATE_FIRST)
final Closure spec) {
// If this is failing, make sure HttpServerTestAdvice is applied correctly.
TEST_WRITER.waitForTraces(size * 2)
// AsyncResponse.resume closes the handler span before the controller returns, so we need to manually reorder it.
TEST_WRITER.each {
def controllerSpan = it.find {
it.operationName == "controller"
}
if (controllerSpan) {
it.remove(controllerSpan)
it.add(controllerSpan)
}
}
super.cleanAndAssertTraces(size, spec)
}
}

View File

@ -62,34 +62,31 @@ public final class ContinuationInstrumentation extends Instrumenter.Default {
}
@Slf4j
public static class BlockWrapper<T> implements Block {
public static class BlockWrapper implements Block {
private final Block delegate;
private final Span span;
private BlockWrapper(final Block delegate, final Span span) {
assert span != null;
this.delegate = delegate;
this.span = span;
}
@Override
public void execute() throws Exception {
if (span != null) {
try (final Scope scope = GlobalTracer.get().scopeManager().activate(span, false)) {
if (scope instanceof TraceScope) {
((TraceScope) scope).setAsyncPropagation(true);
}
delegate.execute();
}
} else {
delegate.execute();
}
}
public static Block wrapIfNeeded(final Block delegate, final Span span) {
if (delegate instanceof BlockWrapper || span == null) {
if (delegate instanceof BlockWrapper) {
return delegate;
}
log.debug("Wrapping action task {}", delegate);
log.debug("Wrapping block {}", delegate);
return new BlockWrapper(delegate, span);
}
}

View File

@ -77,22 +77,19 @@ public final class DefaultExecutionInstrumentation extends Instrumenter.Default
private final Span span;
private ActionWrapper(final Action<T> delegate, final Span span) {
assert span != null;
this.delegate = delegate;
this.span = span;
}
@Override
public void execute(final T t) throws Exception {
if (span != null) {
try (final Scope scope = GlobalTracer.get().scopeManager().activate(span, false)) {
if (scope instanceof TraceScope) {
((TraceScope) scope).setAsyncPropagation(true);
}
delegate.execute(t);
}
} else {
delegate.execute(t);
}
}
public static <T> Action<T> wrapIfNeeded(final Action<T> delegate, final Span span) {

View File

@ -1,14 +1,11 @@
package server
import datadog.opentracing.DDSpan
import datadog.trace.agent.test.asserts.ListWriterAssert
import datadog.trace.agent.test.asserts.TraceAssert
import datadog.trace.agent.test.base.HttpServerTest
import datadog.trace.api.DDSpanTypes
import datadog.trace.instrumentation.netty41.server.NettyHttpServerDecorator
import datadog.trace.instrumentation.ratpack.RatpackServerDecorator
import groovy.transform.stc.ClosureParams
import groovy.transform.stc.SimpleType
import io.opentracing.tag.Tags
import ratpack.error.ServerErrorHandler
import ratpack.groovy.test.embed.GroovyEmbeddedApp
@ -95,25 +92,9 @@ class RatpackHttpServerTest extends HttpServerTest<EmbeddedApp, NettyHttpServerD
true
}
void cleanAndAssertTraces(
final int size,
@ClosureParams(value = SimpleType, options = "datadog.trace.agent.test.asserts.ListWriterAssert")
@DelegatesTo(value = ListWriterAssert, strategy = Closure.DELEGATE_FIRST)
final Closure spec) {
// If this is failing, make sure HttpServerTestAdvice is applied correctly.
TEST_WRITER.waitForTraces(size * 2)
// Ratpack closes the handler span before the controller returns, so we need to manually reorder it.
TEST_WRITER.each {
def controllerSpan = it.find {
it.operationName == "controller"
}
if (controllerSpan) {
it.remove(controllerSpan)
it.add(controllerSpan)
}
}
super.cleanAndAssertTraces(size, spec)
@Override
boolean reorderControllerSpan() {
true
}
@Override

View File

@ -1,10 +1,8 @@
package server
import datadog.trace.agent.test.asserts.ListWriterAssert
import datadog.trace.agent.test.base.HttpServerTest
import datadog.trace.instrumentation.netty41.server.NettyHttpServerDecorator
import groovy.transform.stc.ClosureParams
import groovy.transform.stc.SimpleType
import io.vertx.core.AbstractVerticle
import io.vertx.core.DeploymentOptions
import io.vertx.core.Future
@ -68,6 +66,11 @@ class VertxHttpServerTest extends HttpServerTest<Vertx, NettyHttpServerDecorator
false
}
@Override
boolean reorderControllerSpan() {
true
}
static class VertxWebTestServer extends AbstractVerticle {
@Override
@ -101,25 +104,4 @@ class VertxHttpServerTest extends HttpServerTest<Vertx, NettyHttpServerDecorator
.listen(port) { startFuture.complete() }
}
}
void cleanAndAssertTraces(
final int size,
@ClosureParams(value = SimpleType, options = "datadog.trace.agent.test.asserts.ListWriterAssert")
@DelegatesTo(value = ListWriterAssert, strategy = Closure.DELEGATE_FIRST)
final Closure spec) {
// If this is failing, make sure HttpServerTestAdvice is applied correctly.
TEST_WRITER.waitForTraces(size * 2)
// Netty closes the parent span before the controller returns, so we need to manually reorder it.
TEST_WRITER.each {
def controllerSpan = it.find {
it.operationName == "controller"
}
if (controllerSpan) {
it.remove(controllerSpan)
it.add(controllerSpan)
}
}
super.cleanAndAssertTraces(size, spec)
}
}

View File

@ -76,6 +76,10 @@ abstract class HttpServerTest<SERVER, DECORATOR extends HttpServerDecorator> ext
false
}
boolean reorderControllerSpan() {
true
}
boolean testNotFound() {
true
}
@ -352,6 +356,19 @@ abstract class HttpServerTest<SERVER, DECORATOR extends HttpServerDecorator> ext
assert toRemove.size() == size
TEST_WRITER.removeAll(toRemove)
if(reorderControllerSpan()) {
// Some frameworks close the handler span before the controller returns, so we need to manually reorder it.
TEST_WRITER.each {
def controllerSpan = it.find {
it.operationName == "controller"
}
if (controllerSpan) {
it.remove(controllerSpan)
it.add(controllerSpan)
}
}
}
assertTraces(size, spec)
}