Apply formatter on java files.
This commit is contained in:
parent
bc3af56b08
commit
51919a77bb
|
@ -3,7 +3,11 @@ package datadog.trace.agent.tooling;
|
||||||
import datadog.trace.bootstrap.DatadogClassLoader;
|
import datadog.trace.bootstrap.DatadogClassLoader;
|
||||||
import datadog.trace.bootstrap.PatchLogger;
|
import datadog.trace.bootstrap.PatchLogger;
|
||||||
import io.opentracing.util.GlobalTracer;
|
import io.opentracing.util.GlobalTracer;
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.WeakHashMap;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
|
@ -44,7 +48,7 @@ public class ClassLoaderMatcher {
|
||||||
private static final Set<String> CLASSLOADER_CLASSES_TO_SKIP;
|
private static final Set<String> CLASSLOADER_CLASSES_TO_SKIP;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
final Set<String> classesToSkip = new HashSet<String>();
|
final Set<String> classesToSkip = new HashSet<>();
|
||||||
classesToSkip.add("org.codehaus.groovy.runtime.callsite.CallSiteClassLoader");
|
classesToSkip.add("org.codehaus.groovy.runtime.callsite.CallSiteClassLoader");
|
||||||
classesToSkip.add("sun.reflect.DelegatingClassLoader");
|
classesToSkip.add("sun.reflect.DelegatingClassLoader");
|
||||||
classesToSkip.add("jdk.internal.reflect.DelegatingClassLoader");
|
classesToSkip.add("jdk.internal.reflect.DelegatingClassLoader");
|
||||||
|
@ -55,7 +59,7 @@ public class ClassLoaderMatcher {
|
||||||
private SkipClassLoaderMatcher() {}
|
private SkipClassLoaderMatcher() {}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(ClassLoader target) {
|
public boolean matches(final ClassLoader target) {
|
||||||
if (target == BOOTSTRAP_CLASSLOADER) {
|
if (target == BOOTSTRAP_CLASSLOADER) {
|
||||||
// Don't skip bootstrap loader
|
// Don't skip bootstrap loader
|
||||||
return false;
|
return false;
|
||||||
|
@ -63,7 +67,7 @@ public class ClassLoaderMatcher {
|
||||||
return shouldSkipClass(target) || shouldSkipInstance(target);
|
return shouldSkipClass(target) || shouldSkipInstance(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean shouldSkipClass(ClassLoader loader) {
|
private boolean shouldSkipClass(final ClassLoader loader) {
|
||||||
return CLASSLOADER_CLASSES_TO_SKIP.contains(loader.getClass().getName());
|
return CLASSLOADER_CLASSES_TO_SKIP.contains(loader.getClass().getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +81,7 @@ public class ClassLoaderMatcher {
|
||||||
if (null != cached) {
|
if (null != cached) {
|
||||||
return cached.booleanValue();
|
return cached.booleanValue();
|
||||||
}
|
}
|
||||||
boolean skip = !delegatesToBootstrap(loader);
|
final boolean skip = !delegatesToBootstrap(loader);
|
||||||
if (skip) {
|
if (skip) {
|
||||||
log.debug(
|
log.debug(
|
||||||
"skipping classloader instance {} of type {}", loader, loader.getClass().getName());
|
"skipping classloader instance {} of type {}", loader, loader.getClass().getName());
|
||||||
|
@ -87,7 +91,7 @@ public class ClassLoaderMatcher {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean delegatesToBootstrap(ClassLoader loader) {
|
private boolean delegatesToBootstrap(final ClassLoader loader) {
|
||||||
boolean delegates = true;
|
boolean delegates = true;
|
||||||
if (!loadsExpectedClass(loader, GlobalTracer.class)) {
|
if (!loadsExpectedClass(loader, GlobalTracer.class)) {
|
||||||
log.debug("loader {} failed to delegate bootstrap opentracing class", loader);
|
log.debug("loader {} failed to delegate bootstrap opentracing class", loader);
|
||||||
|
@ -100,10 +104,10 @@ public class ClassLoaderMatcher {
|
||||||
return delegates;
|
return delegates;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean loadsExpectedClass(ClassLoader loader, Class<?> expectedClass) {
|
private boolean loadsExpectedClass(final ClassLoader loader, final Class<?> expectedClass) {
|
||||||
try {
|
try {
|
||||||
return loader.loadClass(expectedClass.getName()) == expectedClass;
|
return loader.loadClass(expectedClass.getName()) == expectedClass;
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (final ClassNotFoundException e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,12 @@ import net.bytebuddy.description.field.FieldList;
|
||||||
import net.bytebuddy.description.method.MethodList;
|
import net.bytebuddy.description.method.MethodList;
|
||||||
import net.bytebuddy.description.type.TypeDescription;
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
import net.bytebuddy.implementation.Implementation;
|
import net.bytebuddy.implementation.Implementation;
|
||||||
import net.bytebuddy.jar.asm.*;
|
import net.bytebuddy.jar.asm.ClassVisitor;
|
||||||
|
import net.bytebuddy.jar.asm.ClassWriter;
|
||||||
|
import net.bytebuddy.jar.asm.Label;
|
||||||
|
import net.bytebuddy.jar.asm.MethodVisitor;
|
||||||
|
import net.bytebuddy.jar.asm.Opcodes;
|
||||||
|
import net.bytebuddy.jar.asm.Type;
|
||||||
import net.bytebuddy.pool.TypePool;
|
import net.bytebuddy.pool.TypePool;
|
||||||
|
|
||||||
/** Visit a class and add: a private instrumenationMuzzle field and getter */
|
/** Visit a class and add: a private instrumenationMuzzle field and getter */
|
||||||
|
|
|
@ -3,7 +3,10 @@ package datadog.trace.agent.tooling.muzzle;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.BOOTSTRAP_CLASSLOADER;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.BOOTSTRAP_CLASSLOADER;
|
||||||
|
|
||||||
import datadog.trace.agent.tooling.Utils;
|
import datadog.trace.agent.tooling.Utils;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/** An immutable reference to a jvm class. */
|
/** An immutable reference to a jvm class. */
|
||||||
public class Reference {
|
public class Reference {
|
||||||
|
|
|
@ -3,8 +3,17 @@ package datadog.trace.agent.tooling.muzzle;
|
||||||
import datadog.trace.agent.tooling.Utils;
|
import datadog.trace.agent.tooling.Utils;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.*;
|
import java.util.ArrayDeque;
|
||||||
import net.bytebuddy.jar.asm.*;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Queue;
|
||||||
|
import java.util.Set;
|
||||||
|
import net.bytebuddy.jar.asm.ClassReader;
|
||||||
|
import net.bytebuddy.jar.asm.ClassVisitor;
|
||||||
|
import net.bytebuddy.jar.asm.Label;
|
||||||
|
import net.bytebuddy.jar.asm.MethodVisitor;
|
||||||
|
import net.bytebuddy.jar.asm.Opcodes;
|
||||||
|
|
||||||
/** Visit a class and collect all references made by the visited class. */
|
/** Visit a class and collect all references made by the visited class. */
|
||||||
public class ReferenceCreator extends ClassVisitor {
|
public class ReferenceCreator extends ClassVisitor {
|
||||||
|
|
|
@ -3,7 +3,14 @@ package datadog.trace.agent.tooling.muzzle;
|
||||||
import static net.bytebuddy.dynamic.loading.ClassLoadingStrategy.BOOTSTRAP_LOADER;
|
import static net.bytebuddy.dynamic.loading.ClassLoadingStrategy.BOOTSTRAP_LOADER;
|
||||||
|
|
||||||
import datadog.trace.agent.tooling.Utils;
|
import datadog.trace.agent.tooling.Utils;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.WeakHashMap;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
/** Matches a set of references against a classloader. */
|
/** Matches a set of references against a classloader. */
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
import static com.lightbend.lagom.javadsl.api.Service.*;
|
import static com.lightbend.lagom.javadsl.api.Service.named;
|
||||||
|
import static com.lightbend.lagom.javadsl.api.Service.namedCall;
|
||||||
|
|
||||||
import akka.NotUsed;
|
import akka.NotUsed;
|
||||||
import akka.stream.javadsl.Source;
|
import akka.stream.javadsl.Source;
|
||||||
import com.lightbend.lagom.javadsl.api.*;
|
import com.lightbend.lagom.javadsl.api.Descriptor;
|
||||||
|
import com.lightbend.lagom.javadsl.api.Service;
|
||||||
|
import com.lightbend.lagom.javadsl.api.ServiceCall;
|
||||||
|
|
||||||
public interface EchoService extends Service {
|
public interface EchoService extends Service {
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package datadog.trace.instrumentation.akkahttp;
|
package datadog.trace.instrumentation.akkahttp;
|
||||||
|
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.*;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import akka.NotUsed;
|
import akka.NotUsed;
|
||||||
import akka.http.javadsl.model.headers.RawHeader;
|
import akka.http.javadsl.model.headers.RawHeader;
|
||||||
|
@ -10,7 +12,7 @@ import akka.http.scaladsl.model.HttpRequest;
|
||||||
import akka.http.scaladsl.model.HttpResponse;
|
import akka.http.scaladsl.model.HttpResponse;
|
||||||
import akka.stream.scaladsl.Flow;
|
import akka.stream.scaladsl.Flow;
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.*;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
import datadog.trace.api.DDSpanTypes;
|
import datadog.trace.api.DDSpanTypes;
|
||||||
import datadog.trace.api.DDTags;
|
import datadog.trace.api.DDTags;
|
||||||
import io.opentracing.Scope;
|
import io.opentracing.Scope;
|
||||||
|
@ -92,10 +94,10 @@ public final class AkkaHttpClientInstrumentation extends Instrumenter.Default {
|
||||||
.withTag(Tags.HTTP_METHOD.getKey(), request.method().value())
|
.withTag(Tags.HTTP_METHOD.getKey(), request.method().value())
|
||||||
.withTag(Tags.HTTP_URL.getKey(), request.getUri().toString());
|
.withTag(Tags.HTTP_URL.getKey(), request.getUri().toString());
|
||||||
}
|
}
|
||||||
Scope scope = builder.startActive(false);
|
final Scope scope = builder.startActive(false);
|
||||||
|
|
||||||
if (request != null) {
|
if (request != null) {
|
||||||
AkkaHttpHeaders headers = new AkkaHttpHeaders(request);
|
final AkkaHttpHeaders headers = new AkkaHttpHeaders(request);
|
||||||
GlobalTracer.get().inject(scope.span().context(), Format.Builtin.HTTP_HEADERS, headers);
|
GlobalTracer.get().inject(scope.span().context(), Format.Builtin.HTTP_HEADERS, headers);
|
||||||
// Request is immutable, so we have to assign new value once we update headers
|
// Request is immutable, so we have to assign new value once we update headers
|
||||||
request = headers.getRequest();
|
request = headers.getRequest();
|
||||||
|
@ -111,7 +113,7 @@ public final class AkkaHttpClientInstrumentation extends Instrumenter.Default {
|
||||||
@Advice.Return final Future<HttpResponse> responseFuture,
|
@Advice.Return final Future<HttpResponse> responseFuture,
|
||||||
@Advice.Enter final Scope scope,
|
@Advice.Enter final Scope scope,
|
||||||
@Advice.Thrown final Throwable throwable) {
|
@Advice.Thrown final Throwable throwable) {
|
||||||
Span span = scope.span();
|
final Span span = scope.span();
|
||||||
if (throwable == null) {
|
if (throwable == null) {
|
||||||
responseFuture.onComplete(new OnCompleteHandler(span), thiz.system().dispatcher());
|
responseFuture.onComplete(new OnCompleteHandler(span), thiz.system().dispatcher());
|
||||||
} else {
|
} else {
|
||||||
|
@ -135,12 +137,12 @@ public final class AkkaHttpClientInstrumentation extends Instrumenter.Default {
|
||||||
public static class OnCompleteHandler extends AbstractFunction1<Try<HttpResponse>, Void> {
|
public static class OnCompleteHandler extends AbstractFunction1<Try<HttpResponse>, Void> {
|
||||||
private final Span span;
|
private final Span span;
|
||||||
|
|
||||||
public OnCompleteHandler(Span span) {
|
public OnCompleteHandler(final Span span) {
|
||||||
this.span = span;
|
this.span = span;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Void apply(Try<HttpResponse> result) {
|
public Void apply(final Try<HttpResponse> result) {
|
||||||
if (result.isSuccess()) {
|
if (result.isSuccess()) {
|
||||||
Tags.HTTP_STATUS.set(span, result.get().status().intValue());
|
Tags.HTTP_STATUS.set(span, result.get().status().intValue());
|
||||||
} else {
|
} else {
|
||||||
|
@ -155,7 +157,7 @@ public final class AkkaHttpClientInstrumentation extends Instrumenter.Default {
|
||||||
public static class AkkaHttpHeaders implements TextMap {
|
public static class AkkaHttpHeaders implements TextMap {
|
||||||
private HttpRequest request;
|
private HttpRequest request;
|
||||||
|
|
||||||
public AkkaHttpHeaders(HttpRequest request) {
|
public AkkaHttpHeaders(final HttpRequest request) {
|
||||||
this.request = request;
|
this.request = request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,15 @@
|
||||||
package datadog.trace.instrumentation.akkahttp;
|
package datadog.trace.instrumentation.akkahttp;
|
||||||
|
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.*;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import akka.http.javadsl.model.HttpHeader;
|
import akka.http.javadsl.model.HttpHeader;
|
||||||
import akka.http.scaladsl.model.HttpRequest;
|
import akka.http.scaladsl.model.HttpRequest;
|
||||||
import akka.http.scaladsl.model.HttpResponse;
|
import akka.http.scaladsl.model.HttpResponse;
|
||||||
import akka.stream.*;
|
import akka.stream.Materializer;
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.*;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
import datadog.trace.api.DDSpanTypes;
|
import datadog.trace.api.DDSpanTypes;
|
||||||
import datadog.trace.api.DDTags;
|
import datadog.trace.api.DDTags;
|
||||||
import datadog.trace.context.TraceScope;
|
import datadog.trace.context.TraceScope;
|
||||||
|
@ -19,7 +20,10 @@ import io.opentracing.propagation.Format;
|
||||||
import io.opentracing.propagation.TextMap;
|
import io.opentracing.propagation.TextMap;
|
||||||
import io.opentracing.tag.Tags;
|
import io.opentracing.tag.Tags;
|
||||||
import io.opentracing.util.GlobalTracer;
|
import io.opentracing.util.GlobalTracer;
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import net.bytebuddy.description.type.TypeDescription;
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
|
@ -90,13 +94,13 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
|
||||||
public static void wrapHandler(
|
public static void wrapHandler(
|
||||||
@Advice.Argument(value = 0, readOnly = false)
|
@Advice.Argument(value = 0, readOnly = false)
|
||||||
Function1<HttpRequest, scala.concurrent.Future<HttpResponse>> handler,
|
Function1<HttpRequest, scala.concurrent.Future<HttpResponse>> handler,
|
||||||
@Advice.Argument(value = 7) Materializer materializer) {
|
@Advice.Argument(value = 7) final Materializer materializer) {
|
||||||
handler = new DatadogAsyncWrapper(handler, materializer.executionContext());
|
handler = new DatadogAsyncWrapper(handler, materializer.executionContext());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class DatadogWrapperHelper {
|
public static class DatadogWrapperHelper {
|
||||||
public static Scope createSpan(HttpRequest request) {
|
public static Scope createSpan(final HttpRequest request) {
|
||||||
final SpanContext extractedContext =
|
final SpanContext extractedContext =
|
||||||
GlobalTracer.get()
|
GlobalTracer.get()
|
||||||
.extract(Format.Builtin.HTTP_HEADERS, new AkkaHttpServerHeaders(request));
|
.extract(Format.Builtin.HTTP_HEADERS, new AkkaHttpServerHeaders(request));
|
||||||
|
@ -117,7 +121,7 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
|
||||||
return scope;
|
return scope;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void finishSpan(Span span, HttpResponse response) {
|
public static void finishSpan(final Span span, final HttpResponse response) {
|
||||||
Tags.HTTP_STATUS.set(span, response.status().intValue());
|
Tags.HTTP_STATUS.set(span, response.status().intValue());
|
||||||
|
|
||||||
if (GlobalTracer.get().scopeManager().active() instanceof TraceScope) {
|
if (GlobalTracer.get().scopeManager().active() instanceof TraceScope) {
|
||||||
|
@ -126,7 +130,7 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
|
||||||
span.finish();
|
span.finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void finishSpan(Span span, Throwable t) {
|
public static void finishSpan(final Span span, final Throwable t) {
|
||||||
Tags.ERROR.set(span, true);
|
Tags.ERROR.set(span, true);
|
||||||
span.log(Collections.singletonMap(ERROR_OBJECT, t));
|
span.log(Collections.singletonMap(ERROR_OBJECT, t));
|
||||||
Tags.HTTP_STATUS.set(span, 500);
|
Tags.HTTP_STATUS.set(span, 500);
|
||||||
|
@ -141,19 +145,19 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
|
||||||
public static class DatadogSyncWrapper extends AbstractFunction1<HttpRequest, HttpResponse> {
|
public static class DatadogSyncWrapper extends AbstractFunction1<HttpRequest, HttpResponse> {
|
||||||
private final Function1<HttpRequest, HttpResponse> userHandler;
|
private final Function1<HttpRequest, HttpResponse> userHandler;
|
||||||
|
|
||||||
public DatadogSyncWrapper(Function1<HttpRequest, HttpResponse> userHandler) {
|
public DatadogSyncWrapper(final Function1<HttpRequest, HttpResponse> userHandler) {
|
||||||
this.userHandler = userHandler;
|
this.userHandler = userHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HttpResponse apply(HttpRequest request) {
|
public HttpResponse apply(final HttpRequest request) {
|
||||||
final Scope scope = DatadogWrapperHelper.createSpan(request);
|
final Scope scope = DatadogWrapperHelper.createSpan(request);
|
||||||
try {
|
try {
|
||||||
final HttpResponse response = userHandler.apply(request);
|
final HttpResponse response = userHandler.apply(request);
|
||||||
scope.close();
|
scope.close();
|
||||||
DatadogWrapperHelper.finishSpan(scope.span(), response);
|
DatadogWrapperHelper.finishSpan(scope.span(), response);
|
||||||
return response;
|
return response;
|
||||||
} catch (Throwable t) {
|
} catch (final Throwable t) {
|
||||||
scope.close();
|
scope.close();
|
||||||
DatadogWrapperHelper.finishSpan(scope.span(), t);
|
DatadogWrapperHelper.finishSpan(scope.span(), t);
|
||||||
throw t;
|
throw t;
|
||||||
|
@ -167,19 +171,19 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
|
||||||
private final ExecutionContext executionContext;
|
private final ExecutionContext executionContext;
|
||||||
|
|
||||||
public DatadogAsyncWrapper(
|
public DatadogAsyncWrapper(
|
||||||
Function1<HttpRequest, Future<HttpResponse>> userHandler,
|
final Function1<HttpRequest, Future<HttpResponse>> userHandler,
|
||||||
ExecutionContext executionContext) {
|
final ExecutionContext executionContext) {
|
||||||
this.userHandler = userHandler;
|
this.userHandler = userHandler;
|
||||||
this.executionContext = executionContext;
|
this.executionContext = executionContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Future<HttpResponse> apply(HttpRequest request) {
|
public Future<HttpResponse> apply(final HttpRequest request) {
|
||||||
final Scope scope = DatadogWrapperHelper.createSpan(request);
|
final Scope scope = DatadogWrapperHelper.createSpan(request);
|
||||||
Future<HttpResponse> futureResponse = null;
|
Future<HttpResponse> futureResponse = null;
|
||||||
try {
|
try {
|
||||||
futureResponse = userHandler.apply(request);
|
futureResponse = userHandler.apply(request);
|
||||||
} catch (Throwable t) {
|
} catch (final Throwable t) {
|
||||||
scope.close();
|
scope.close();
|
||||||
DatadogWrapperHelper.finishSpan(scope.span(), t);
|
DatadogWrapperHelper.finishSpan(scope.span(), t);
|
||||||
throw t;
|
throw t;
|
||||||
|
@ -188,14 +192,14 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
|
||||||
futureResponse.transform(
|
futureResponse.transform(
|
||||||
new AbstractFunction1<HttpResponse, HttpResponse>() {
|
new AbstractFunction1<HttpResponse, HttpResponse>() {
|
||||||
@Override
|
@Override
|
||||||
public HttpResponse apply(HttpResponse response) {
|
public HttpResponse apply(final HttpResponse response) {
|
||||||
DatadogWrapperHelper.finishSpan(scope.span(), response);
|
DatadogWrapperHelper.finishSpan(scope.span(), response);
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new AbstractFunction1<Throwable, Throwable>() {
|
new AbstractFunction1<Throwable, Throwable>() {
|
||||||
@Override
|
@Override
|
||||||
public Throwable apply(Throwable t) {
|
public Throwable apply(final Throwable t) {
|
||||||
DatadogWrapperHelper.finishSpan(scope.span(), t);
|
DatadogWrapperHelper.finishSpan(scope.span(), t);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
@ -209,7 +213,7 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
|
||||||
public static class AkkaHttpServerHeaders implements TextMap {
|
public static class AkkaHttpServerHeaders implements TextMap {
|
||||||
private final HttpRequest request;
|
private final HttpRequest request;
|
||||||
|
|
||||||
public AkkaHttpServerHeaders(HttpRequest request) {
|
public AkkaHttpServerHeaders(final HttpRequest request) {
|
||||||
this.request = request;
|
this.request = request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,7 +221,7 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
|
||||||
public Iterator<Map.Entry<String, String>> iterator() {
|
public Iterator<Map.Entry<String, String>> iterator() {
|
||||||
final Map<String, String> javaMap = new HashMap<>(request.headers().size());
|
final Map<String, String> javaMap = new HashMap<>(request.headers().size());
|
||||||
|
|
||||||
for (HttpHeader header : request.getHeaders()) {
|
for (final HttpHeader header : request.getHeaders()) {
|
||||||
javaMap.put(header.name(), header.value());
|
javaMap.put(header.name(), header.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,7 +229,7 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void put(String name, String value) {
|
public void put(final String name, final String value) {
|
||||||
throw new IllegalStateException("akka http server headers can only be extracted");
|
throw new IllegalStateException("akka http server headers can only be extracted");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,11 @@
|
||||||
*/
|
*/
|
||||||
package datadog.trace.instrumentation.aws.v0;
|
package datadog.trace.instrumentation.aws.v0;
|
||||||
|
|
||||||
import static io.opentracing.log.Fields.*;
|
import static io.opentracing.log.Fields.ERROR_KIND;
|
||||||
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
|
import static io.opentracing.log.Fields.EVENT;
|
||||||
|
import static io.opentracing.log.Fields.MESSAGE;
|
||||||
|
import static io.opentracing.log.Fields.STACK;
|
||||||
|
|
||||||
import com.amazonaws.AmazonWebServiceResponse;
|
import com.amazonaws.AmazonWebServiceResponse;
|
||||||
import com.amazonaws.Request;
|
import com.amazonaws.Request;
|
||||||
|
|
|
@ -13,7 +13,11 @@
|
||||||
*/
|
*/
|
||||||
package datadog.trace.instrumentation.aws.v106;
|
package datadog.trace.instrumentation.aws.v106;
|
||||||
|
|
||||||
import static io.opentracing.log.Fields.*;
|
import static io.opentracing.log.Fields.ERROR_KIND;
|
||||||
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
|
import static io.opentracing.log.Fields.EVENT;
|
||||||
|
import static io.opentracing.log.Fields.MESSAGE;
|
||||||
|
import static io.opentracing.log.Fields.STACK;
|
||||||
|
|
||||||
import com.amazonaws.AmazonWebServiceResponse;
|
import com.amazonaws.AmazonWebServiceResponse;
|
||||||
import com.amazonaws.Request;
|
import com.amazonaws.Request;
|
||||||
|
|
|
@ -13,7 +13,11 @@
|
||||||
*/
|
*/
|
||||||
package datadog.trace.instrumentation.datastax.cassandra;
|
package datadog.trace.instrumentation.datastax.cassandra;
|
||||||
|
|
||||||
import static io.opentracing.log.Fields.*;
|
import static io.opentracing.log.Fields.ERROR_KIND;
|
||||||
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
|
import static io.opentracing.log.Fields.EVENT;
|
||||||
|
import static io.opentracing.log.Fields.MESSAGE;
|
||||||
|
import static io.opentracing.log.Fields.STACK;
|
||||||
|
|
||||||
import com.datastax.driver.core.BoundStatement;
|
import com.datastax.driver.core.BoundStatement;
|
||||||
import com.datastax.driver.core.CloseFuture;
|
import com.datastax.driver.core.CloseFuture;
|
||||||
|
@ -244,7 +248,7 @@ class TracingSession implements Session {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
finishSpan(span, future.get());
|
finishSpan(span, future.get());
|
||||||
} catch (InterruptedException | ExecutionException e) {
|
} catch (final InterruptedException | ExecutionException e) {
|
||||||
finishSpan(span, e);
|
finishSpan(span, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,9 @@ import io.opentracing.Span;
|
||||||
import io.opentracing.tag.Tags;
|
import io.opentracing.tag.Tags;
|
||||||
import io.opentracing.util.GlobalTracer;
|
import io.opentracing.util.GlobalTracer;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
|
@ -34,7 +36,7 @@ public class HystrixCommandInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
isMethod().and(named("run").or(named("getFallback"))), TraceAdvice.class.getName());
|
isMethod().and(named("run").or(named("getFallback"))), TraceAdvice.class.getName());
|
||||||
return transformers;
|
return transformers;
|
||||||
|
|
|
@ -10,7 +10,8 @@ import datadog.trace.agent.tooling.Instrumenter;
|
||||||
import datadog.trace.context.TraceScope;
|
import datadog.trace.context.TraceScope;
|
||||||
import io.opentracing.Scope;
|
import io.opentracing.Scope;
|
||||||
import io.opentracing.util.GlobalTracer;
|
import io.opentracing.util.GlobalTracer;
|
||||||
import java.util.*;
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
|
|
|
@ -8,13 +8,19 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.*;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
|
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
|
||||||
import datadog.trace.context.TraceScope;
|
import datadog.trace.context.TraceScope;
|
||||||
import io.opentracing.Scope;
|
import io.opentracing.Scope;
|
||||||
import io.opentracing.util.GlobalTracer;
|
import io.opentracing.util.GlobalTracer;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
@ -98,7 +104,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
// Check for possible prefixes match only if not whitelisted already
|
// Check for possible prefixes match only if not whitelisted already
|
||||||
if (!whitelisted) {
|
if (!whitelisted) {
|
||||||
for (String name : WHITELISTED_EXECUTORS_PREFIXES) {
|
for (final String name : WHITELISTED_EXECUTORS_PREFIXES) {
|
||||||
if (target.getName().startsWith(name)) {
|
if (target.getName().startsWith(name)) {
|
||||||
whitelisted = true;
|
whitelisted = true;
|
||||||
break;
|
break;
|
||||||
|
@ -126,7 +132,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
named("execute").and(takesArgument(0, Runnable.class)), WrapRunnableAdvice.class.getName());
|
named("execute").and(takesArgument(0, Runnable.class)), WrapRunnableAdvice.class.getName());
|
||||||
transformers.put(
|
transformers.put(
|
||||||
|
@ -141,7 +147,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
public static class WrapRunnableAdvice {
|
public static class WrapRunnableAdvice {
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
@Advice.OnMethodEnter(suppress = Throwable.class)
|
@Advice.OnMethodEnter(suppress = Throwable.class)
|
||||||
public static DatadogWrapper enterJobSubmit(
|
public static DatadogWrapper enterJobSubmit(
|
||||||
@Advice.Argument(value = 0, readOnly = false) Runnable task) {
|
@Advice.Argument(value = 0, readOnly = false) Runnable task) {
|
||||||
|
@ -153,7 +158,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
|
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
|
||||||
public static void exitJobSubmit(
|
public static void exitJobSubmit(
|
||||||
@Advice.Enter final DatadogWrapper wrapper, @Advice.Thrown final Throwable throwable) {
|
@Advice.Enter final DatadogWrapper wrapper, @Advice.Thrown final Throwable throwable) {
|
||||||
|
@ -163,7 +167,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
public static class WrapCallableAdvice {
|
public static class WrapCallableAdvice {
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
@Advice.OnMethodEnter(suppress = Throwable.class)
|
@Advice.OnMethodEnter(suppress = Throwable.class)
|
||||||
public static DatadogWrapper enterJobSubmit(
|
public static DatadogWrapper enterJobSubmit(
|
||||||
@Advice.Argument(value = 0, readOnly = false) Callable<?> task) {
|
@Advice.Argument(value = 0, readOnly = false) Callable<?> task) {
|
||||||
|
@ -176,7 +179,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
|
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
|
||||||
public static void exitJobSubmit(
|
public static void exitJobSubmit(
|
||||||
@Advice.Enter final DatadogWrapper wrapper, @Advice.Thrown final Throwable throwable) {
|
@Advice.Enter final DatadogWrapper wrapper, @Advice.Thrown final Throwable throwable) {
|
||||||
|
@ -186,7 +188,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
public static class WrapCallableCollectionAdvice {
|
public static class WrapCallableCollectionAdvice {
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
@Advice.OnMethodEnter(suppress = Throwable.class)
|
@Advice.OnMethodEnter(suppress = Throwable.class)
|
||||||
public static Collection<?> wrapJob(
|
public static Collection<?> wrapJob(
|
||||||
@Advice.Argument(value = 0, readOnly = false) Collection<? extends Callable<?>> tasks) {
|
@Advice.Argument(value = 0, readOnly = false) Collection<? extends Callable<?>> tasks) {
|
||||||
|
@ -196,7 +197,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
&& tasks != null
|
&& tasks != null
|
||||||
&& DatadogWrapper.isTopLevelCall()) {
|
&& DatadogWrapper.isTopLevelCall()) {
|
||||||
final Collection<Callable<?>> wrappedTasks = new ArrayList<>(tasks.size());
|
final Collection<Callable<?>> wrappedTasks = new ArrayList<>(tasks.size());
|
||||||
for (Callable<?> task : tasks) {
|
for (final Callable<?> task : tasks) {
|
||||||
if (task != null && !(task instanceof CallableWrapper)) {
|
if (task != null && !(task instanceof CallableWrapper)) {
|
||||||
wrappedTasks.add(new CallableWrapper<>(task, (TraceScope) scope));
|
wrappedTasks.add(new CallableWrapper<>(task, (TraceScope) scope));
|
||||||
}
|
}
|
||||||
|
@ -207,7 +208,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
|
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
|
||||||
public static void checkCancel(
|
public static void checkCancel(
|
||||||
@Advice.Enter final Collection<?> wrappedJobs, @Advice.Thrown final Throwable throwable) {
|
@Advice.Enter final Collection<?> wrappedJobs, @Advice.Thrown final Throwable throwable) {
|
||||||
|
@ -250,13 +250,11 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
*
|
*
|
||||||
* @return true iff call is not nested
|
* @return true iff call is not nested
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("WeakerAccess")
|
|
||||||
public static boolean isTopLevelCall() {
|
public static boolean isTopLevelCall() {
|
||||||
return CallDepthThreadLocalMap.incrementCallDepth(ExecutorService.class) <= 0;
|
return CallDepthThreadLocalMap.incrementCallDepth(ExecutorService.class) <= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Reset nested calls to executor. */
|
/** Reset nested calls to executor. */
|
||||||
@SuppressWarnings("WeakerAccess")
|
|
||||||
public static void resetNestedCalls() {
|
public static void resetNestedCalls() {
|
||||||
CallDepthThreadLocalMap.reset(ExecutorService.class);
|
CallDepthThreadLocalMap.reset(ExecutorService.class);
|
||||||
}
|
}
|
||||||
|
@ -265,8 +263,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
* @param task task object
|
* @param task task object
|
||||||
* @return true iff given task object should be wrapped
|
* @return true iff given task object should be wrapped
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("WeakerAccess")
|
public static boolean shouldWrapTask(final Object task) {
|
||||||
public static boolean shouldWrapTask(Object task) {
|
|
||||||
final Scope scope = GlobalTracer.get().scopeManager().active();
|
final Scope scope = GlobalTracer.get().scopeManager().active();
|
||||||
return (scope instanceof TraceScope
|
return (scope instanceof TraceScope
|
||||||
&& ((TraceScope) scope).isAsyncPropagating()
|
&& ((TraceScope) scope).isAsyncPropagating()
|
||||||
|
@ -281,7 +278,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
* @param wrapper task wrapper
|
* @param wrapper task wrapper
|
||||||
* @param throwable throwable that may have been thrown
|
* @param throwable throwable that may have been thrown
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("WeakerAccess")
|
|
||||||
public static void cleanUpOnMethodExit(
|
public static void cleanUpOnMethodExit(
|
||||||
final DatadogWrapper wrapper, final Throwable throwable) {
|
final DatadogWrapper wrapper, final Throwable throwable) {
|
||||||
if (null != wrapper) {
|
if (null != wrapper) {
|
||||||
|
@ -356,7 +352,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
if (o instanceof DatadogWrapper) {
|
if (o instanceof DatadogWrapper) {
|
||||||
return (DatadogWrapper) o;
|
return (DatadogWrapper) o;
|
||||||
}
|
}
|
||||||
} catch (IllegalArgumentException | IllegalAccessException e) {
|
} catch (final IllegalArgumentException | IllegalAccessException e) {
|
||||||
} finally {
|
} finally {
|
||||||
field.setAccessible(false);
|
field.setAccessible(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,12 @@ import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.Instrumenter;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
import datadog.trace.instrumentation.java.concurrent.ExecutorInstrumentation.ConcurrentUtils;
|
import datadog.trace.instrumentation.java.concurrent.ExecutorInstrumentation.ConcurrentUtils;
|
||||||
import datadog.trace.instrumentation.java.concurrent.ExecutorInstrumentation.DatadogWrapper;
|
import datadog.trace.instrumentation.java.concurrent.ExecutorInstrumentation.DatadogWrapper;
|
||||||
import java.util.*;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
|
@ -91,7 +96,7 @@ public final class FutureInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
named("cancel").and(returns(boolean.class)), CanceledFutureAdvice.class.getName());
|
named("cancel").and(returns(boolean.class)), CanceledFutureAdvice.class.getName());
|
||||||
return transformers;
|
return transformers;
|
||||||
|
|
|
@ -14,7 +14,9 @@ import io.opentracing.tag.Tags;
|
||||||
import io.opentracing.util.GlobalTracer;
|
import io.opentracing.util.GlobalTracer;
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.*;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.Map;
|
||||||
import javax.ws.rs.HttpMethod;
|
import javax.ws.rs.HttpMethod;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
|
|
|
@ -6,7 +6,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.*;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.ws.rs.client.ClientBuilder;
|
import javax.ws.rs.client.ClientBuilder;
|
||||||
|
@ -36,7 +36,7 @@ public final class JaxRsClientInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
named("build").and(returns(hasSuperType(named("javax.ws.rs.client.Client")))),
|
named("build").and(returns(hasSuperType(named("javax.ws.rs.client.Client")))),
|
||||||
ClientBuilderAdvice.class.getName());
|
ClientBuilderAdvice.class.getName());
|
||||||
|
|
|
@ -11,7 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.*;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
import datadog.trace.api.DDSpanTypes;
|
import datadog.trace.api.DDSpanTypes;
|
||||||
import datadog.trace.api.DDTags;
|
import datadog.trace.api.DDTags;
|
||||||
import datadog.trace.instrumentation.jms.util.MessagePropertyTextMap;
|
import datadog.trace.instrumentation.jms.util.MessagePropertyTextMap;
|
||||||
|
@ -23,7 +23,9 @@ import io.opentracing.propagation.Format;
|
||||||
import io.opentracing.tag.Tags;
|
import io.opentracing.tag.Tags;
|
||||||
import io.opentracing.util.GlobalTracer;
|
import io.opentracing.util.GlobalTracer;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import javax.jms.Message;
|
import javax.jms.Message;
|
||||||
import javax.jms.MessageConsumer;
|
import javax.jms.MessageConsumer;
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
package datadog.trace.instrumentation.jsp;
|
package datadog.trace.instrumentation.jsp;
|
||||||
|
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.*;
|
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.not;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.Instrumenter;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
|
|
|
@ -2,7 +2,9 @@ package datadog.trace.instrumentation.jsp;
|
||||||
|
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.*;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.Instrumenter;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package datadog.trace.instrumentation.lettuce;
|
package datadog.trace.instrumentation.lettuce;
|
||||||
|
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.*;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.Instrumenter;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
|
@ -38,7 +40,7 @@ public class LettuceAsyncCommandsInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
isMethod()
|
isMethod()
|
||||||
.and(named("dispatch"))
|
.and(named("dispatch"))
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
package datadog.trace.instrumentation.lettuce;
|
package datadog.trace.instrumentation.lettuce;
|
||||||
|
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.*;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.isPrivate;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.nameEndsWith;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.Instrumenter;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
|
@ -42,7 +48,7 @@ public final class LettuceClientInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
isMethod()
|
isMethod()
|
||||||
.and(isPrivate())
|
.and(isPrivate())
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
package datadog.trace.instrumentation.lettuce;
|
package datadog.trace.instrumentation.lettuce;
|
||||||
|
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.*;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.nameEndsWith;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.Instrumenter;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
|
@ -43,7 +48,7 @@ public class LettuceReactiveCommandsInstrumentation extends Instrumenter.Default
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
isMethod()
|
isMethod()
|
||||||
.and(named("createMono"))
|
.and(named("createMono"))
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package datadog.trace.instrumentation.lettuce;
|
package datadog.trace.instrumentation.lettuce;
|
||||||
|
|
||||||
import io.lettuce.core.protocol.RedisCommand;
|
import io.lettuce.core.protocol.RedisCommand;
|
||||||
import java.util.*;
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class LettuceInstrumentationUtil {
|
public class LettuceInstrumentationUtil {
|
||||||
|
|
||||||
|
@ -30,7 +32,7 @@ public class LettuceInstrumentationUtil {
|
||||||
* @param commandName a redis command, without any prefixes
|
* @param commandName a redis command, without any prefixes
|
||||||
* @return true if finish the span early (the command will not have a return value)
|
* @return true if finish the span early (the command will not have a return value)
|
||||||
*/
|
*/
|
||||||
public static boolean doFinishSpanEarly(String commandName) {
|
public static boolean doFinishSpanEarly(final String commandName) {
|
||||||
return nonInstrumentingCommands.contains(commandName);
|
return nonInstrumentingCommands.contains(commandName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +53,7 @@ public class LettuceInstrumentationUtil {
|
||||||
* @return the redis command with a prefix if it is a command that will crash the trace agent,
|
* @return the redis command with a prefix if it is a command that will crash the trace agent,
|
||||||
* otherwise, the original command is returned.
|
* otherwise, the original command is returned.
|
||||||
*/
|
*/
|
||||||
public static String getCommandResourceName(String actualCommandName) {
|
public static String getCommandResourceName(final String actualCommandName) {
|
||||||
if (agentCrashingCommands.contains(actualCommandName)) {
|
if (agentCrashingCommands.contains(actualCommandName)) {
|
||||||
return AGENT_CRASHING_COMMAND_PREFIX + actualCommandName;
|
return AGENT_CRASHING_COMMAND_PREFIX + actualCommandName;
|
||||||
}
|
}
|
||||||
|
@ -64,7 +66,7 @@ public class LettuceInstrumentationUtil {
|
||||||
* @param command the lettuce RedisCommand object
|
* @param command the lettuce RedisCommand object
|
||||||
* @return the redis command as a string
|
* @return the redis command as a string
|
||||||
*/
|
*/
|
||||||
public static String getCommandName(RedisCommand command) {
|
public static String getCommandName(final RedisCommand command) {
|
||||||
String commandName = "Redis Command";
|
String commandName = "Redis Command";
|
||||||
if (command != null) {
|
if (command != null) {
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -3,11 +3,14 @@ package datadog.trace.instrumentation.play;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithMethod;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithMethod;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.*;
|
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import akka.japi.JavaPartialFunction;
|
import akka.japi.JavaPartialFunction;
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.*;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
import datadog.trace.api.DDSpanTypes;
|
import datadog.trace.api.DDSpanTypes;
|
||||||
import datadog.trace.api.DDTags;
|
import datadog.trace.api.DDTags;
|
||||||
import datadog.trace.context.TraceScope;
|
import datadog.trace.context.TraceScope;
|
||||||
|
@ -18,7 +21,10 @@ import io.opentracing.propagation.Format;
|
||||||
import io.opentracing.propagation.TextMap;
|
import io.opentracing.propagation.TextMap;
|
||||||
import io.opentracing.tag.Tags;
|
import io.opentracing.tag.Tags;
|
||||||
import io.opentracing.util.GlobalTracer;
|
import io.opentracing.util.GlobalTracer;
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
@ -66,7 +72,7 @@ public final class PlayInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
named("apply")
|
named("apply")
|
||||||
.and(takesArgument(0, named("play.api.mvc.Request")))
|
.and(takesArgument(0, named("play.api.mvc.Request")))
|
||||||
|
@ -149,7 +155,7 @@ public final class PlayInstrumentation extends Instrumenter.Default {
|
||||||
public static class PlayHeaders implements TextMap {
|
public static class PlayHeaders implements TextMap {
|
||||||
private final Request request;
|
private final Request request;
|
||||||
|
|
||||||
public PlayHeaders(Request request) {
|
public PlayHeaders(final Request request) {
|
||||||
this.request = request;
|
this.request = request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,7 +172,7 @@ public final class PlayInstrumentation extends Instrumenter.Default {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void put(String s, String s1) {
|
public void put(final String s, final String s1) {
|
||||||
throw new IllegalStateException("play headers can only be extracted");
|
throw new IllegalStateException("play headers can only be extracted");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -174,18 +180,18 @@ public final class PlayInstrumentation extends Instrumenter.Default {
|
||||||
public static class RequestError extends JavaPartialFunction<Throwable, Object> {
|
public static class RequestError extends JavaPartialFunction<Throwable, Object> {
|
||||||
private final Span span;
|
private final Span span;
|
||||||
|
|
||||||
public RequestError(Span span) {
|
public RequestError(final Span span) {
|
||||||
this.span = span;
|
this.span = span;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object apply(Throwable t, boolean isCheck) throws Exception {
|
public Object apply(final Throwable t, final boolean isCheck) throws Exception {
|
||||||
try {
|
try {
|
||||||
if (GlobalTracer.get().scopeManager().active() instanceof TraceScope) {
|
if (GlobalTracer.get().scopeManager().active() instanceof TraceScope) {
|
||||||
((TraceScope) GlobalTracer.get().scopeManager().active()).setAsyncPropagation(false);
|
((TraceScope) GlobalTracer.get().scopeManager().active()).setAsyncPropagation(false);
|
||||||
}
|
}
|
||||||
onError(span, t);
|
onError(span, t);
|
||||||
} catch (Throwable t2) {
|
} catch (final Throwable t2) {
|
||||||
LoggerFactory.getLogger(RequestCallback.class).debug("error in play instrumentation", t);
|
LoggerFactory.getLogger(RequestCallback.class).debug("error in play instrumentation", t);
|
||||||
}
|
}
|
||||||
span.finish();
|
span.finish();
|
||||||
|
@ -203,18 +209,18 @@ public final class PlayInstrumentation extends Instrumenter.Default {
|
||||||
public static class RequestCallback extends scala.runtime.AbstractFunction1<Result, Result> {
|
public static class RequestCallback extends scala.runtime.AbstractFunction1<Result, Result> {
|
||||||
private final Span span;
|
private final Span span;
|
||||||
|
|
||||||
public RequestCallback(Span span) {
|
public RequestCallback(final Span span) {
|
||||||
this.span = span;
|
this.span = span;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Result apply(Result result) {
|
public Result apply(final Result result) {
|
||||||
if (GlobalTracer.get().scopeManager().active() instanceof TraceScope) {
|
if (GlobalTracer.get().scopeManager().active() instanceof TraceScope) {
|
||||||
((TraceScope) GlobalTracer.get().scopeManager().active()).setAsyncPropagation(false);
|
((TraceScope) GlobalTracer.get().scopeManager().active()).setAsyncPropagation(false);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Tags.HTTP_STATUS.set(span, result.header().status());
|
Tags.HTTP_STATUS.set(span, result.header().status());
|
||||||
} catch (Throwable t) {
|
} catch (final Throwable t) {
|
||||||
log.debug("error in play instrumentation", t);
|
log.debug("error in play instrumentation", t);
|
||||||
}
|
}
|
||||||
span.finish();
|
span.finish();
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
package datadog.trace.instrumentation.ratpack;
|
package datadog.trace.instrumentation.ratpack;
|
||||||
|
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithMethod;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.*;
|
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.not;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.Instrumenter;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
|
@ -63,7 +70,7 @@ public final class RatpackInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
isMethod().and(isStatic()).and(named("buildBaseRegistry")),
|
isMethod().and(isStatic()).and(named("buildBaseRegistry")),
|
||||||
RatpackServerAdvice.RatpackServerRegistryAdvice.class.getName());
|
RatpackServerAdvice.RatpackServerRegistryAdvice.class.getName());
|
||||||
|
@ -106,7 +113,7 @@ public final class RatpackInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
named("register").and(takesArguments(ACTION_TYPE_DESCRIPTION)),
|
named("register").and(takesArguments(ACTION_TYPE_DESCRIPTION)),
|
||||||
RatpackServerAdvice.ExecStarterAdvice.class.getName());
|
RatpackServerAdvice.ExecStarterAdvice.class.getName());
|
||||||
|
@ -148,7 +155,7 @@ public final class RatpackInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
named("fork").and(returns(named("ratpack.exec.ExecStarter"))),
|
named("fork").and(returns(named("ratpack.exec.ExecStarter"))),
|
||||||
RatpackServerAdvice.ExecutionAdvice.class.getName());
|
RatpackServerAdvice.ExecutionAdvice.class.getName());
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
package datadog.trace.instrumentation.ratpack.impl;
|
package datadog.trace.instrumentation.ratpack.impl;
|
||||||
|
|
||||||
import io.opentracing.propagation.TextMap;
|
import io.opentracing.propagation.TextMap;
|
||||||
import java.util.*;
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
import ratpack.http.Request;
|
import ratpack.http.Request;
|
||||||
import ratpack.util.MultiValueMap;
|
import ratpack.util.MultiValueMap;
|
||||||
|
|
||||||
|
@ -12,8 +13,8 @@ import ratpack.util.MultiValueMap;
|
||||||
public class RatpackRequestExtractAdapter implements TextMap {
|
public class RatpackRequestExtractAdapter implements TextMap {
|
||||||
private final MultiValueMap<String, String> headers;
|
private final MultiValueMap<String, String> headers;
|
||||||
|
|
||||||
RatpackRequestExtractAdapter(Request request) {
|
RatpackRequestExtractAdapter(final Request request) {
|
||||||
this.headers = request.getHeaders().asMultiValueMap();
|
headers = request.getHeaders().asMultiValueMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -22,7 +23,7 @@ public class RatpackRequestExtractAdapter implements TextMap {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void put(String key, String value) {
|
public void put(final String key, final String value) {
|
||||||
throw new UnsupportedOperationException("This class should be used only with Tracer.inject()!");
|
throw new UnsupportedOperationException("This class should be used only with Tracer.inject()!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,21 +3,21 @@ package datadog.trace.instrumentation.spymemcached;
|
||||||
import io.opentracing.Span;
|
import io.opentracing.Span;
|
||||||
import io.opentracing.Tracer;
|
import io.opentracing.Tracer;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import net.spy.memcached.internal.*;
|
import net.spy.memcached.internal.BulkGetFuture;
|
||||||
|
|
||||||
public class BulkGetCompletionListener extends CompletionListener<BulkGetFuture<?>>
|
public class BulkGetCompletionListener extends CompletionListener<BulkGetFuture<?>>
|
||||||
implements net.spy.memcached.internal.BulkGetCompletionListener {
|
implements net.spy.memcached.internal.BulkGetCompletionListener {
|
||||||
public BulkGetCompletionListener(Tracer tracer, String methodName) {
|
public BulkGetCompletionListener(final Tracer tracer, final String methodName) {
|
||||||
super(tracer, methodName, true);
|
super(tracer, methodName, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onComplete(BulkGetFuture<?> future) {
|
public void onComplete(final BulkGetFuture<?> future) {
|
||||||
closeAsyncSpan(future);
|
closeAsyncSpan(future);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void processResult(Span span, BulkGetFuture<?> future)
|
protected void processResult(final Span span, final BulkGetFuture<?> future)
|
||||||
throws ExecutionException, InterruptedException {
|
throws ExecutionException, InterruptedException {
|
||||||
/*
|
/*
|
||||||
Note: for now we do not have an affective way of representing results of bulk operations,
|
Note: for now we do not have an affective way of representing results of bulk operations,
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
package datadog.trace.instrumentation.spymemcached;
|
package datadog.trace.instrumentation.spymemcached;
|
||||||
|
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithMethod;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.*;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.not;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import datadog.trace.agent.tooling.Instrumenter;
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
|
@ -55,7 +59,7 @@ public final class MemcachedClientInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
isMethod()
|
isMethod()
|
||||||
.and(isPublic())
|
.and(isPublic())
|
||||||
|
@ -96,7 +100,7 @@ public final class MemcachedClientInstrumentation extends Instrumenter.Default {
|
||||||
@Advice.Origin final Method method,
|
@Advice.Origin final Method method,
|
||||||
@Advice.Return final OperationFuture future) {
|
@Advice.Return final OperationFuture future) {
|
||||||
if (shouldInjectListener && future != null) {
|
if (shouldInjectListener && future != null) {
|
||||||
OperationCompletionListener listener =
|
final OperationCompletionListener listener =
|
||||||
new OperationCompletionListener(GlobalTracer.get(), method.getName());
|
new OperationCompletionListener(GlobalTracer.get(), method.getName());
|
||||||
future.addListener(listener);
|
future.addListener(listener);
|
||||||
CallDepthThreadLocalMap.reset(MemcachedClient.class);
|
CallDepthThreadLocalMap.reset(MemcachedClient.class);
|
||||||
|
@ -117,7 +121,7 @@ public final class MemcachedClientInstrumentation extends Instrumenter.Default {
|
||||||
@Advice.Origin final Method method,
|
@Advice.Origin final Method method,
|
||||||
@Advice.Return final GetFuture future) {
|
@Advice.Return final GetFuture future) {
|
||||||
if (shouldInjectListener && future != null) {
|
if (shouldInjectListener && future != null) {
|
||||||
GetCompletionListener listener =
|
final GetCompletionListener listener =
|
||||||
new GetCompletionListener(GlobalTracer.get(), method.getName());
|
new GetCompletionListener(GlobalTracer.get(), method.getName());
|
||||||
future.addListener(listener);
|
future.addListener(listener);
|
||||||
CallDepthThreadLocalMap.reset(MemcachedClient.class);
|
CallDepthThreadLocalMap.reset(MemcachedClient.class);
|
||||||
|
@ -138,7 +142,7 @@ public final class MemcachedClientInstrumentation extends Instrumenter.Default {
|
||||||
@Advice.Origin final Method method,
|
@Advice.Origin final Method method,
|
||||||
@Advice.Return final BulkFuture future) {
|
@Advice.Return final BulkFuture future) {
|
||||||
if (shouldInjectListener && future != null) {
|
if (shouldInjectListener && future != null) {
|
||||||
BulkGetCompletionListener listener =
|
final BulkGetCompletionListener listener =
|
||||||
new BulkGetCompletionListener(GlobalTracer.get(), method.getName());
|
new BulkGetCompletionListener(GlobalTracer.get(), method.getName());
|
||||||
future.addListener(listener);
|
future.addListener(listener);
|
||||||
CallDepthThreadLocalMap.reset(MemcachedClient.class);
|
CallDepthThreadLocalMap.reset(MemcachedClient.class);
|
||||||
|
|
|
@ -16,7 +16,12 @@
|
||||||
*/
|
*/
|
||||||
package datadog.trace.agent;
|
package datadog.trace.agent;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.lang.instrument.Instrumentation;
|
import java.lang.instrument.Instrumentation;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
@ -91,8 +96,8 @@ public class TracingAgent {
|
||||||
* @param toolingJar jar to use for the classpath of the datadog classloader
|
* @param toolingJar jar to use for the classpath of the datadog classloader
|
||||||
* @return Datadog Classloader
|
* @return Datadog Classloader
|
||||||
*/
|
*/
|
||||||
private static ClassLoader createDatadogClassLoader(File bootstrapJar, File toolingJar)
|
private static ClassLoader createDatadogClassLoader(
|
||||||
throws Exception {
|
final File bootstrapJar, final File toolingJar) throws Exception {
|
||||||
final ClassLoader agentParent;
|
final ClassLoader agentParent;
|
||||||
final String javaVersion = System.getProperty("java.version");
|
final String javaVersion = System.getProperty("java.version");
|
||||||
if (javaVersion.startsWith("1.7") || javaVersion.startsWith("1.8")) {
|
if (javaVersion.startsWith("1.7") || javaVersion.startsWith("1.8")) {
|
||||||
|
@ -101,9 +106,9 @@ public class TracingAgent {
|
||||||
// platform classloader is parent of system in java 9+
|
// platform classloader is parent of system in java 9+
|
||||||
agentParent = getPlatformClassLoader();
|
agentParent = getPlatformClassLoader();
|
||||||
}
|
}
|
||||||
Class<?> loaderClass =
|
final Class<?> loaderClass =
|
||||||
ClassLoader.getSystemClassLoader().loadClass("datadog.trace.bootstrap.DatadogClassLoader");
|
ClassLoader.getSystemClassLoader().loadClass("datadog.trace.bootstrap.DatadogClassLoader");
|
||||||
Constructor constructor =
|
final Constructor constructor =
|
||||||
loaderClass.getDeclaredConstructor(URL.class, URL.class, ClassLoader.class);
|
loaderClass.getDeclaredConstructor(URL.class, URL.class, ClassLoader.class);
|
||||||
return (ClassLoader)
|
return (ClassLoader)
|
||||||
constructor.newInstance(
|
constructor.newInstance(
|
||||||
|
@ -111,8 +116,8 @@ public class TracingAgent {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Extract sourcePath out of loader to a temporary file named destName. */
|
/** Extract sourcePath out of loader to a temporary file named destName. */
|
||||||
private static File extractToTmpFile(ClassLoader loader, String sourcePath, String destName)
|
private static File extractToTmpFile(
|
||||||
throws Exception {
|
final ClassLoader loader, final String sourcePath, final String destName) throws Exception {
|
||||||
final String destPrefix;
|
final String destPrefix;
|
||||||
final String destSuffix;
|
final String destSuffix;
|
||||||
{
|
{
|
||||||
|
@ -171,7 +176,7 @@ public class TracingAgent {
|
||||||
public static void main(final String... args) {
|
public static void main(final String... args) {
|
||||||
try {
|
try {
|
||||||
System.out.println(getAgentVersion());
|
System.out.println(getAgentVersion());
|
||||||
} catch (Exception e) {
|
} catch (final Exception e) {
|
||||||
System.out.println("Failed to parse agent version");
|
System.out.println("Failed to parse agent version");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import datadog.opentracing.decorators.AbstractDecorator;
|
import datadog.opentracing.decorators.AbstractDecorator;
|
||||||
import datadog.trace.api.DDTags;
|
import datadog.trace.api.DDTags;
|
||||||
import datadog.trace.api.sampling.PrioritySampling;
|
import datadog.trace.api.sampling.PrioritySampling;
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
@ -115,15 +118,15 @@ public class DDSpanContext implements io.opentracing.SpanContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTraceId() {
|
public String getTraceId() {
|
||||||
return this.traceId;
|
return traceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getParentId() {
|
public String getParentId() {
|
||||||
return this.parentId;
|
return parentId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSpanId() {
|
public String getSpanId() {
|
||||||
return this.spanId;
|
return spanId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getServiceName() {
|
public String getServiceName() {
|
||||||
|
@ -135,9 +138,7 @@ public class DDSpanContext implements io.opentracing.SpanContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getResourceName() {
|
public String getResourceName() {
|
||||||
return this.resourceName == null || this.resourceName.isEmpty()
|
return resourceName == null || resourceName.isEmpty() ? operationName : resourceName;
|
||||||
? this.operationName
|
|
||||||
: this.resourceName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setResourceName(final String resourceName) {
|
public void setResourceName(final String resourceName) {
|
||||||
|
@ -170,7 +171,7 @@ public class DDSpanContext implements io.opentracing.SpanContext {
|
||||||
|
|
||||||
public void setSamplingPriority(final int newPriority) {
|
public void setSamplingPriority(final int newPriority) {
|
||||||
if (trace != null) {
|
if (trace != null) {
|
||||||
DDSpan rootSpan = trace.getRootSpan();
|
final DDSpan rootSpan = trace.getRootSpan();
|
||||||
if (null != rootSpan && rootSpan.context() != this) {
|
if (null != rootSpan && rootSpan.context() != this) {
|
||||||
rootSpan.context().setSamplingPriority(newPriority);
|
rootSpan.context().setSamplingPriority(newPriority);
|
||||||
return;
|
return;
|
||||||
|
@ -197,7 +198,7 @@ public class DDSpanContext implements io.opentracing.SpanContext {
|
||||||
/** @return the sampling priority of this span's trace, or null if no priority has been set */
|
/** @return the sampling priority of this span's trace, or null if no priority has been set */
|
||||||
public int getSamplingPriority() {
|
public int getSamplingPriority() {
|
||||||
if (trace != null) {
|
if (trace != null) {
|
||||||
DDSpan rootSpan = trace.getRootSpan();
|
final DDSpan rootSpan = trace.getRootSpan();
|
||||||
if (null != rootSpan && rootSpan.context() != this) {
|
if (null != rootSpan && rootSpan.context() != this) {
|
||||||
return rootSpan.context().getSamplingPriority();
|
return rootSpan.context().getSamplingPriority();
|
||||||
}
|
}
|
||||||
|
@ -217,7 +218,7 @@ public class DDSpanContext implements io.opentracing.SpanContext {
|
||||||
*/
|
*/
|
||||||
public boolean lockSamplingPriority() {
|
public boolean lockSamplingPriority() {
|
||||||
if (trace != null) {
|
if (trace != null) {
|
||||||
DDSpan rootSpan = trace.getRootSpan();
|
final DDSpan rootSpan = trace.getRootSpan();
|
||||||
if (null != rootSpan && rootSpan.context() != this) {
|
if (null != rootSpan && rootSpan.context() != this) {
|
||||||
return rootSpan.context().lockSamplingPriority();
|
return rootSpan.context().lockSamplingPriority();
|
||||||
}
|
}
|
||||||
|
@ -236,11 +237,11 @@ public class DDSpanContext implements io.opentracing.SpanContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBaggageItem(final String key, final String value) {
|
public void setBaggageItem(final String key, final String value) {
|
||||||
this.baggageItems.put(key, value);
|
baggageItems.put(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBaggageItem(final String key) {
|
public String getBaggageItem(final String key) {
|
||||||
return this.baggageItems.get(key);
|
return baggageItems.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getBaggageItems() {
|
public Map<String, String> getBaggageItems() {
|
||||||
|
@ -252,17 +253,17 @@ public class DDSpanContext implements io.opentracing.SpanContext {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Iterable<Map.Entry<String, String>> baggageItems() {
|
public Iterable<Map.Entry<String, String>> baggageItems() {
|
||||||
return this.baggageItems.entrySet();
|
return baggageItems.entrySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public PendingTrace getTrace() {
|
public PendingTrace getTrace() {
|
||||||
return this.trace;
|
return trace;
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public DDTracer getTracer() {
|
public DDTracer getTracer() {
|
||||||
return this.tracer;
|
return tracer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, Number> getMetrics() {
|
public Map<String, Number> getMetrics() {
|
||||||
|
@ -270,7 +271,7 @@ public class DDSpanContext implements io.opentracing.SpanContext {
|
||||||
return metrics == null ? EMPTY_METRICS : metrics;
|
return metrics == null ? EMPTY_METRICS : metrics;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMetric(String key, Number value) {
|
public void setMetric(final String key, final Number value) {
|
||||||
if (metrics.get() == null) {
|
if (metrics.get() == null) {
|
||||||
metrics.compareAndSet(null, new ConcurrentHashMap<String, Number>());
|
metrics.compareAndSet(null, new ConcurrentHashMap<String, Number>());
|
||||||
}
|
}
|
||||||
|
@ -306,7 +307,7 @@ public class DDSpanContext implements io.opentracing.SpanContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addTag) {
|
if (addTag) {
|
||||||
this.tags.put(tag, value);
|
tags.put(tag, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue