Apply formatter on java files.

This commit is contained in:
Tyler Benson 2018-07-31 12:07:43 +10:00
parent bc3af56b08
commit 51919a77bb
31 changed files with 243 additions and 140 deletions

View File

@ -3,7 +3,11 @@ package datadog.trace.agent.tooling;
import datadog.trace.bootstrap.DatadogClassLoader;
import datadog.trace.bootstrap.PatchLogger;
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 net.bytebuddy.matcher.ElementMatcher;
@ -44,7 +48,7 @@ public class ClassLoaderMatcher {
private static final Set<String> CLASSLOADER_CLASSES_TO_SKIP;
static {
final Set<String> classesToSkip = new HashSet<String>();
final Set<String> classesToSkip = new HashSet<>();
classesToSkip.add("org.codehaus.groovy.runtime.callsite.CallSiteClassLoader");
classesToSkip.add("sun.reflect.DelegatingClassLoader");
classesToSkip.add("jdk.internal.reflect.DelegatingClassLoader");
@ -55,7 +59,7 @@ public class ClassLoaderMatcher {
private SkipClassLoaderMatcher() {}
@Override
public boolean matches(ClassLoader target) {
public boolean matches(final ClassLoader target) {
if (target == BOOTSTRAP_CLASSLOADER) {
// Don't skip bootstrap loader
return false;
@ -63,7 +67,7 @@ public class ClassLoaderMatcher {
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());
}
@ -77,7 +81,7 @@ public class ClassLoaderMatcher {
if (null != cached) {
return cached.booleanValue();
}
boolean skip = !delegatesToBootstrap(loader);
final boolean skip = !delegatesToBootstrap(loader);
if (skip) {
log.debug(
"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;
if (!loadsExpectedClass(loader, GlobalTracer.class)) {
log.debug("loader {} failed to delegate bootstrap opentracing class", loader);
@ -100,10 +104,10 @@ public class ClassLoaderMatcher {
return delegates;
}
private boolean loadsExpectedClass(ClassLoader loader, Class<?> expectedClass) {
private boolean loadsExpectedClass(final ClassLoader loader, final Class<?> expectedClass) {
try {
return loader.loadClass(expectedClass.getName()) == expectedClass;
} catch (ClassNotFoundException e) {
} catch (final ClassNotFoundException e) {
return false;
}
}

View File

@ -12,7 +12,12 @@ import net.bytebuddy.description.field.FieldList;
import net.bytebuddy.description.method.MethodList;
import net.bytebuddy.description.type.TypeDescription;
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;
/** Visit a class and add: a private instrumenationMuzzle field and getter */

View File

@ -3,7 +3,10 @@ package datadog.trace.agent.tooling.muzzle;
import static datadog.trace.agent.tooling.ClassLoaderMatcher.BOOTSTRAP_CLASSLOADER;
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. */
public class Reference {

View File

@ -3,8 +3,17 @@ package datadog.trace.agent.tooling.muzzle;
import datadog.trace.agent.tooling.Utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import net.bytebuddy.jar.asm.*;
import java.util.ArrayDeque;
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. */
public class ReferenceCreator extends ClassVisitor {

View File

@ -3,7 +3,14 @@ package datadog.trace.agent.tooling.muzzle;
import static net.bytebuddy.dynamic.loading.ClassLoadingStrategy.BOOTSTRAP_LOADER;
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;
/** Matches a set of references against a classloader. */

View File

@ -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.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 {

View File

@ -1,7 +1,9 @@
package datadog.trace.instrumentation.akkahttp;
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.http.javadsl.model.headers.RawHeader;
@ -10,7 +12,7 @@ import akka.http.scaladsl.model.HttpRequest;
import akka.http.scaladsl.model.HttpResponse;
import akka.stream.scaladsl.Flow;
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.DDTags;
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_URL.getKey(), request.getUri().toString());
}
Scope scope = builder.startActive(false);
final Scope scope = builder.startActive(false);
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);
// Request is immutable, so we have to assign new value once we update headers
request = headers.getRequest();
@ -111,7 +113,7 @@ public final class AkkaHttpClientInstrumentation extends Instrumenter.Default {
@Advice.Return final Future<HttpResponse> responseFuture,
@Advice.Enter final Scope scope,
@Advice.Thrown final Throwable throwable) {
Span span = scope.span();
final Span span = scope.span();
if (throwable == null) {
responseFuture.onComplete(new OnCompleteHandler(span), thiz.system().dispatcher());
} else {
@ -135,12 +137,12 @@ public final class AkkaHttpClientInstrumentation extends Instrumenter.Default {
public static class OnCompleteHandler extends AbstractFunction1<Try<HttpResponse>, Void> {
private final Span span;
public OnCompleteHandler(Span span) {
public OnCompleteHandler(final Span span) {
this.span = span;
}
@Override
public Void apply(Try<HttpResponse> result) {
public Void apply(final Try<HttpResponse> result) {
if (result.isSuccess()) {
Tags.HTTP_STATUS.set(span, result.get().status().intValue());
} else {
@ -155,7 +157,7 @@ public final class AkkaHttpClientInstrumentation extends Instrumenter.Default {
public static class AkkaHttpHeaders implements TextMap {
private HttpRequest request;
public AkkaHttpHeaders(HttpRequest request) {
public AkkaHttpHeaders(final HttpRequest request) {
this.request = request;
}

View File

@ -1,14 +1,15 @@
package datadog.trace.instrumentation.akkahttp;
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.scaladsl.model.HttpRequest;
import akka.http.scaladsl.model.HttpResponse;
import akka.stream.*;
import akka.stream.Materializer;
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.DDTags;
import datadog.trace.context.TraceScope;
@ -19,7 +20,10 @@ import io.opentracing.propagation.Format;
import io.opentracing.propagation.TextMap;
import io.opentracing.tag.Tags;
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 net.bytebuddy.asm.Advice;
import net.bytebuddy.description.type.TypeDescription;
@ -90,13 +94,13 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
public static void wrapHandler(
@Advice.Argument(value = 0, readOnly = false)
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());
}
}
public static class DatadogWrapperHelper {
public static Scope createSpan(HttpRequest request) {
public static Scope createSpan(final HttpRequest request) {
final SpanContext extractedContext =
GlobalTracer.get()
.extract(Format.Builtin.HTTP_HEADERS, new AkkaHttpServerHeaders(request));
@ -117,7 +121,7 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
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());
if (GlobalTracer.get().scopeManager().active() instanceof TraceScope) {
@ -126,7 +130,7 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
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);
span.log(Collections.singletonMap(ERROR_OBJECT, t));
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> {
private final Function1<HttpRequest, HttpResponse> userHandler;
public DatadogSyncWrapper(Function1<HttpRequest, HttpResponse> userHandler) {
public DatadogSyncWrapper(final Function1<HttpRequest, HttpResponse> userHandler) {
this.userHandler = userHandler;
}
@Override
public HttpResponse apply(HttpRequest request) {
public HttpResponse apply(final HttpRequest request) {
final Scope scope = DatadogWrapperHelper.createSpan(request);
try {
final HttpResponse response = userHandler.apply(request);
scope.close();
DatadogWrapperHelper.finishSpan(scope.span(), response);
return response;
} catch (Throwable t) {
} catch (final Throwable t) {
scope.close();
DatadogWrapperHelper.finishSpan(scope.span(), t);
throw t;
@ -167,19 +171,19 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
private final ExecutionContext executionContext;
public DatadogAsyncWrapper(
Function1<HttpRequest, Future<HttpResponse>> userHandler,
ExecutionContext executionContext) {
final Function1<HttpRequest, Future<HttpResponse>> userHandler,
final ExecutionContext executionContext) {
this.userHandler = userHandler;
this.executionContext = executionContext;
}
@Override
public Future<HttpResponse> apply(HttpRequest request) {
public Future<HttpResponse> apply(final HttpRequest request) {
final Scope scope = DatadogWrapperHelper.createSpan(request);
Future<HttpResponse> futureResponse = null;
try {
futureResponse = userHandler.apply(request);
} catch (Throwable t) {
} catch (final Throwable t) {
scope.close();
DatadogWrapperHelper.finishSpan(scope.span(), t);
throw t;
@ -188,14 +192,14 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
futureResponse.transform(
new AbstractFunction1<HttpResponse, HttpResponse>() {
@Override
public HttpResponse apply(HttpResponse response) {
public HttpResponse apply(final HttpResponse response) {
DatadogWrapperHelper.finishSpan(scope.span(), response);
return response;
}
},
new AbstractFunction1<Throwable, Throwable>() {
@Override
public Throwable apply(Throwable t) {
public Throwable apply(final Throwable t) {
DatadogWrapperHelper.finishSpan(scope.span(), t);
return t;
}
@ -209,7 +213,7 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
public static class AkkaHttpServerHeaders implements TextMap {
private final HttpRequest request;
public AkkaHttpServerHeaders(HttpRequest request) {
public AkkaHttpServerHeaders(final HttpRequest request) {
this.request = request;
}
@ -217,7 +221,7 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
public Iterator<Map.Entry<String, String>> iterator() {
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());
}
@ -225,7 +229,7 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default {
}
@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");
}
}

View File

@ -13,7 +13,11 @@
*/
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.Request;

View File

@ -13,7 +13,11 @@
*/
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.Request;

View File

@ -13,7 +13,11 @@
*/
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.CloseFuture;
@ -244,7 +248,7 @@ class TracingSession implements Session {
public void run() {
try {
finishSpan(span, future.get());
} catch (InterruptedException | ExecutionException e) {
} catch (final InterruptedException | ExecutionException e) {
finishSpan(span, e);
}
}

View File

@ -14,7 +14,9 @@ import io.opentracing.Span;
import io.opentracing.tag.Tags;
import io.opentracing.util.GlobalTracer;
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.matcher.ElementMatcher;
@ -34,7 +36,7 @@ public class HystrixCommandInstrumentation extends Instrumenter.Default {
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
isMethod().and(named("run").or(named("getFallback"))), TraceAdvice.class.getName());
return transformers;

View File

@ -10,7 +10,8 @@ import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.context.TraceScope;
import io.opentracing.Scope;
import io.opentracing.util.GlobalTracer;
import java.util.*;
import java.util.HashMap;
import java.util.Map;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.matcher.ElementMatcher;

View File

@ -8,13 +8,19 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
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.context.TraceScope;
import io.opentracing.Scope;
import io.opentracing.util.GlobalTracer;
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.ConcurrentHashMap;
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
if (!whitelisted) {
for (String name : WHITELISTED_EXECUTORS_PREFIXES) {
for (final String name : WHITELISTED_EXECUTORS_PREFIXES) {
if (target.getName().startsWith(name)) {
whitelisted = true;
break;
@ -126,7 +132,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
named("execute").and(takesArgument(0, Runnable.class)), WrapRunnableAdvice.class.getName());
transformers.put(
@ -141,7 +147,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
public static class WrapRunnableAdvice {
@SuppressWarnings("unused")
@Advice.OnMethodEnter(suppress = Throwable.class)
public static DatadogWrapper enterJobSubmit(
@Advice.Argument(value = 0, readOnly = false) Runnable task) {
@ -153,7 +158,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
return null;
}
@SuppressWarnings("unused")
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
public static void exitJobSubmit(
@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 {
@SuppressWarnings("unused")
@Advice.OnMethodEnter(suppress = Throwable.class)
public static DatadogWrapper enterJobSubmit(
@Advice.Argument(value = 0, readOnly = false) Callable<?> task) {
@ -176,7 +179,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
return null;
}
@SuppressWarnings("unused")
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
public static void exitJobSubmit(
@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 {
@SuppressWarnings("unused")
@Advice.OnMethodEnter(suppress = Throwable.class)
public static Collection<?> wrapJob(
@Advice.Argument(value = 0, readOnly = false) Collection<? extends Callable<?>> tasks) {
@ -196,7 +197,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
&& tasks != null
&& DatadogWrapper.isTopLevelCall()) {
final Collection<Callable<?>> wrappedTasks = new ArrayList<>(tasks.size());
for (Callable<?> task : tasks) {
for (final Callable<?> task : tasks) {
if (task != null && !(task instanceof CallableWrapper)) {
wrappedTasks.add(new CallableWrapper<>(task, (TraceScope) scope));
}
@ -207,7 +208,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
return null;
}
@SuppressWarnings("unused")
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
public static void checkCancel(
@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
*/
@SuppressWarnings("WeakerAccess")
public static boolean isTopLevelCall() {
return CallDepthThreadLocalMap.incrementCallDepth(ExecutorService.class) <= 0;
}
/** Reset nested calls to executor. */
@SuppressWarnings("WeakerAccess")
public static void resetNestedCalls() {
CallDepthThreadLocalMap.reset(ExecutorService.class);
}
@ -265,8 +263,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
* @param task task object
* @return true iff given task object should be wrapped
*/
@SuppressWarnings("WeakerAccess")
public static boolean shouldWrapTask(Object task) {
public static boolean shouldWrapTask(final Object task) {
final Scope scope = GlobalTracer.get().scopeManager().active();
return (scope instanceof TraceScope
&& ((TraceScope) scope).isAsyncPropagating()
@ -281,7 +278,6 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
* @param wrapper task wrapper
* @param throwable throwable that may have been thrown
*/
@SuppressWarnings("WeakerAccess")
public static void cleanUpOnMethodExit(
final DatadogWrapper wrapper, final Throwable throwable) {
if (null != wrapper) {
@ -356,7 +352,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
if (o instanceof DatadogWrapper) {
return (DatadogWrapper) o;
}
} catch (IllegalArgumentException | IllegalAccessException e) {
} catch (final IllegalArgumentException | IllegalAccessException e) {
} finally {
field.setAccessible(false);
}

View File

@ -10,7 +10,12 @@ import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.instrumentation.java.concurrent.ExecutorInstrumentation.ConcurrentUtils;
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 lombok.extern.slf4j.Slf4j;
import net.bytebuddy.asm.Advice;
@ -91,7 +96,7 @@ public final class FutureInstrumentation extends Instrumenter.Default {
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
named("cancel").and(returns(boolean.class)), CanceledFutureAdvice.class.getName());
return transformers;

View File

@ -14,7 +14,9 @@ import io.opentracing.tag.Tags;
import io.opentracing.util.GlobalTracer;
import java.lang.annotation.Annotation;
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.Path;
import net.bytebuddy.asm.Advice;

View File

@ -6,7 +6,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.returns;
import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.*;
import datadog.trace.agent.tooling.Instrumenter;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.client.ClientBuilder;
@ -36,7 +36,7 @@ public final class JaxRsClientInstrumentation extends Instrumenter.Default {
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
named("build").and(returns(hasSuperType(named("javax.ws.rs.client.Client")))),
ClientBuilderAdvice.class.getName());

View File

@ -11,7 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
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.DDTags;
import datadog.trace.instrumentation.jms.util.MessagePropertyTextMap;
@ -23,7 +23,9 @@ import io.opentracing.propagation.Format;
import io.opentracing.tag.Tags;
import io.opentracing.util.GlobalTracer;
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 javax.jms.Message;
import javax.jms.MessageConsumer;

View File

@ -1,7 +1,12 @@
package datadog.trace.instrumentation.jsp;
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 datadog.trace.agent.tooling.Instrumenter;

View File

@ -2,7 +2,9 @@ package datadog.trace.instrumentation.jsp;
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
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 datadog.trace.agent.tooling.Instrumenter;

View File

@ -1,7 +1,9 @@
package datadog.trace.instrumentation.lettuce;
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 datadog.trace.agent.tooling.Instrumenter;
@ -38,7 +40,7 @@ public class LettuceAsyncCommandsInstrumentation extends Instrumenter.Default {
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
isMethod()
.and(named("dispatch"))

View File

@ -1,7 +1,13 @@
package datadog.trace.instrumentation.lettuce;
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 datadog.trace.agent.tooling.Instrumenter;
@ -42,7 +48,7 @@ public final class LettuceClientInstrumentation extends Instrumenter.Default {
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
isMethod()
.and(isPrivate())

View File

@ -1,7 +1,12 @@
package datadog.trace.instrumentation.lettuce;
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 datadog.trace.agent.tooling.Instrumenter;
@ -43,7 +48,7 @@ public class LettuceReactiveCommandsInstrumentation extends Instrumenter.Default
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
isMethod()
.and(named("createMono"))

View File

@ -1,7 +1,9 @@
package datadog.trace.instrumentation.lettuce;
import io.lettuce.core.protocol.RedisCommand;
import java.util.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class LettuceInstrumentationUtil {
@ -30,7 +32,7 @@ public class LettuceInstrumentationUtil {
* @param commandName a redis command, without any prefixes
* @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);
}
@ -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,
* otherwise, the original command is returned.
*/
public static String getCommandResourceName(String actualCommandName) {
public static String getCommandResourceName(final String actualCommandName) {
if (agentCrashingCommands.contains(actualCommandName)) {
return AGENT_CRASHING_COMMAND_PREFIX + actualCommandName;
}
@ -64,7 +66,7 @@ public class LettuceInstrumentationUtil {
* @param command the lettuce RedisCommand object
* @return the redis command as a string
*/
public static String getCommandName(RedisCommand command) {
public static String getCommandName(final RedisCommand command) {
String commandName = "Redis Command";
if (command != null) {
/*

View File

@ -3,11 +3,14 @@ package datadog.trace.instrumentation.play;
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithMethod;
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
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 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.DDTags;
import datadog.trace.context.TraceScope;
@ -18,7 +21,10 @@ import io.opentracing.propagation.Format;
import io.opentracing.propagation.TextMap;
import io.opentracing.tag.Tags;
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 net.bytebuddy.asm.Advice;
import net.bytebuddy.matcher.ElementMatcher;
@ -66,7 +72,7 @@ public final class PlayInstrumentation extends Instrumenter.Default {
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
named("apply")
.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 {
private final Request request;
public PlayHeaders(Request request) {
public PlayHeaders(final Request request) {
this.request = request;
}
@ -166,7 +172,7 @@ public final class PlayInstrumentation extends Instrumenter.Default {
}
@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");
}
}
@ -174,18 +180,18 @@ public final class PlayInstrumentation extends Instrumenter.Default {
public static class RequestError extends JavaPartialFunction<Throwable, Object> {
private final Span span;
public RequestError(Span span) {
public RequestError(final Span span) {
this.span = span;
}
@Override
public Object apply(Throwable t, boolean isCheck) throws Exception {
public Object apply(final Throwable t, final boolean isCheck) throws Exception {
try {
if (GlobalTracer.get().scopeManager().active() instanceof TraceScope) {
((TraceScope) GlobalTracer.get().scopeManager().active()).setAsyncPropagation(false);
}
onError(span, t);
} catch (Throwable t2) {
} catch (final Throwable t2) {
LoggerFactory.getLogger(RequestCallback.class).debug("error in play instrumentation", t);
}
span.finish();
@ -203,18 +209,18 @@ public final class PlayInstrumentation extends Instrumenter.Default {
public static class RequestCallback extends scala.runtime.AbstractFunction1<Result, Result> {
private final Span span;
public RequestCallback(Span span) {
public RequestCallback(final Span span) {
this.span = span;
}
@Override
public Result apply(Result result) {
public Result apply(final Result result) {
if (GlobalTracer.get().scopeManager().active() instanceof TraceScope) {
((TraceScope) GlobalTracer.get().scopeManager().active()).setAsyncPropagation(false);
}
try {
Tags.HTTP_STATUS.set(span, result.header().status());
} catch (Throwable t) {
} catch (final Throwable t) {
log.debug("error in play instrumentation", t);
}
span.finish();

View File

@ -1,7 +1,14 @@
package datadog.trace.instrumentation.ratpack;
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 datadog.trace.agent.tooling.Instrumenter;
@ -63,7 +70,7 @@ public final class RatpackInstrumentation extends Instrumenter.Default {
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
isMethod().and(isStatic()).and(named("buildBaseRegistry")),
RatpackServerAdvice.RatpackServerRegistryAdvice.class.getName());
@ -106,7 +113,7 @@ public final class RatpackInstrumentation extends Instrumenter.Default {
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
named("register").and(takesArguments(ACTION_TYPE_DESCRIPTION)),
RatpackServerAdvice.ExecStarterAdvice.class.getName());
@ -148,7 +155,7 @@ public final class RatpackInstrumentation extends Instrumenter.Default {
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
named("fork").and(returns(named("ratpack.exec.ExecStarter"))),
RatpackServerAdvice.ExecutionAdvice.class.getName());

View File

@ -1,7 +1,8 @@
package datadog.trace.instrumentation.ratpack.impl;
import io.opentracing.propagation.TextMap;
import java.util.*;
import java.util.Iterator;
import java.util.Map;
import ratpack.http.Request;
import ratpack.util.MultiValueMap;
@ -12,8 +13,8 @@ import ratpack.util.MultiValueMap;
public class RatpackRequestExtractAdapter implements TextMap {
private final MultiValueMap<String, String> headers;
RatpackRequestExtractAdapter(Request request) {
this.headers = request.getHeaders().asMultiValueMap();
RatpackRequestExtractAdapter(final Request request) {
headers = request.getHeaders().asMultiValueMap();
}
@Override
@ -22,7 +23,7 @@ public class RatpackRequestExtractAdapter implements TextMap {
}
@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()!");
}
}

View File

@ -3,21 +3,21 @@ package datadog.trace.instrumentation.spymemcached;
import io.opentracing.Span;
import io.opentracing.Tracer;
import java.util.concurrent.ExecutionException;
import net.spy.memcached.internal.*;
import net.spy.memcached.internal.BulkGetFuture;
public class BulkGetCompletionListener extends CompletionListener<BulkGetFuture<?>>
implements net.spy.memcached.internal.BulkGetCompletionListener {
public BulkGetCompletionListener(Tracer tracer, String methodName) {
public BulkGetCompletionListener(final Tracer tracer, final String methodName) {
super(tracer, methodName, true);
}
@Override
public void onComplete(BulkGetFuture<?> future) {
public void onComplete(final BulkGetFuture<?> future) {
closeAsyncSpan(future);
}
@Override
protected void processResult(Span span, BulkGetFuture<?> future)
protected void processResult(final Span span, final BulkGetFuture<?> future)
throws ExecutionException, InterruptedException {
/*
Note: for now we do not have an affective way of representing results of bulk operations,

View File

@ -1,7 +1,11 @@
package datadog.trace.instrumentation.spymemcached;
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 datadog.trace.agent.tooling.Instrumenter;
@ -55,7 +59,7 @@ public final class MemcachedClientInstrumentation extends Instrumenter.Default {
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
isMethod()
.and(isPublic())
@ -96,7 +100,7 @@ public final class MemcachedClientInstrumentation extends Instrumenter.Default {
@Advice.Origin final Method method,
@Advice.Return final OperationFuture future) {
if (shouldInjectListener && future != null) {
OperationCompletionListener listener =
final OperationCompletionListener listener =
new OperationCompletionListener(GlobalTracer.get(), method.getName());
future.addListener(listener);
CallDepthThreadLocalMap.reset(MemcachedClient.class);
@ -117,7 +121,7 @@ public final class MemcachedClientInstrumentation extends Instrumenter.Default {
@Advice.Origin final Method method,
@Advice.Return final GetFuture future) {
if (shouldInjectListener && future != null) {
GetCompletionListener listener =
final GetCompletionListener listener =
new GetCompletionListener(GlobalTracer.get(), method.getName());
future.addListener(listener);
CallDepthThreadLocalMap.reset(MemcachedClient.class);
@ -138,7 +142,7 @@ public final class MemcachedClientInstrumentation extends Instrumenter.Default {
@Advice.Origin final Method method,
@Advice.Return final BulkFuture future) {
if (shouldInjectListener && future != null) {
BulkGetCompletionListener listener =
final BulkGetCompletionListener listener =
new BulkGetCompletionListener(GlobalTracer.get(), method.getName());
future.addListener(listener);
CallDepthThreadLocalMap.reset(MemcachedClient.class);

View File

@ -16,7 +16,12 @@
*/
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.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@ -91,8 +96,8 @@ public class TracingAgent {
* @param toolingJar jar to use for the classpath of the datadog classloader
* @return Datadog Classloader
*/
private static ClassLoader createDatadogClassLoader(File bootstrapJar, File toolingJar)
throws Exception {
private static ClassLoader createDatadogClassLoader(
final File bootstrapJar, final File toolingJar) throws Exception {
final ClassLoader agentParent;
final String javaVersion = System.getProperty("java.version");
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+
agentParent = getPlatformClassLoader();
}
Class<?> loaderClass =
final Class<?> loaderClass =
ClassLoader.getSystemClassLoader().loadClass("datadog.trace.bootstrap.DatadogClassLoader");
Constructor constructor =
final Constructor constructor =
loaderClass.getDeclaredConstructor(URL.class, URL.class, ClassLoader.class);
return (ClassLoader)
constructor.newInstance(
@ -111,8 +116,8 @@ public class TracingAgent {
}
/** Extract sourcePath out of loader to a temporary file named destName. */
private static File extractToTmpFile(ClassLoader loader, String sourcePath, String destName)
throws Exception {
private static File extractToTmpFile(
final ClassLoader loader, final String sourcePath, final String destName) throws Exception {
final String destPrefix;
final String destSuffix;
{
@ -171,7 +176,7 @@ public class TracingAgent {
public static void main(final String... args) {
try {
System.out.println(getAgentVersion());
} catch (Exception e) {
} catch (final Exception e) {
System.out.println("Failed to parse agent version");
e.printStackTrace();
}

View File

@ -4,7 +4,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import datadog.opentracing.decorators.AbstractDecorator;
import datadog.trace.api.DDTags;
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.atomic.AtomicReference;
import lombok.extern.slf4j.Slf4j;
@ -115,15 +118,15 @@ public class DDSpanContext implements io.opentracing.SpanContext {
}
public String getTraceId() {
return this.traceId;
return traceId;
}
public String getParentId() {
return this.parentId;
return parentId;
}
public String getSpanId() {
return this.spanId;
return spanId;
}
public String getServiceName() {
@ -135,9 +138,7 @@ public class DDSpanContext implements io.opentracing.SpanContext {
}
public String getResourceName() {
return this.resourceName == null || this.resourceName.isEmpty()
? this.operationName
: this.resourceName;
return resourceName == null || resourceName.isEmpty() ? operationName : resourceName;
}
public void setResourceName(final String resourceName) {
@ -170,7 +171,7 @@ public class DDSpanContext implements io.opentracing.SpanContext {
public void setSamplingPriority(final int newPriority) {
if (trace != null) {
DDSpan rootSpan = trace.getRootSpan();
final DDSpan rootSpan = trace.getRootSpan();
if (null != rootSpan && rootSpan.context() != this) {
rootSpan.context().setSamplingPriority(newPriority);
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 */
public int getSamplingPriority() {
if (trace != null) {
DDSpan rootSpan = trace.getRootSpan();
final DDSpan rootSpan = trace.getRootSpan();
if (null != rootSpan && rootSpan.context() != this) {
return rootSpan.context().getSamplingPriority();
}
@ -217,7 +218,7 @@ public class DDSpanContext implements io.opentracing.SpanContext {
*/
public boolean lockSamplingPriority() {
if (trace != null) {
DDSpan rootSpan = trace.getRootSpan();
final DDSpan rootSpan = trace.getRootSpan();
if (null != rootSpan && rootSpan.context() != this) {
return rootSpan.context().lockSamplingPriority();
}
@ -236,11 +237,11 @@ public class DDSpanContext implements io.opentracing.SpanContext {
}
public void setBaggageItem(final String key, final String value) {
this.baggageItems.put(key, value);
baggageItems.put(key, value);
}
public String getBaggageItem(final String key) {
return this.baggageItems.get(key);
return baggageItems.get(key);
}
public Map<String, String> getBaggageItems() {
@ -252,17 +253,17 @@ public class DDSpanContext implements io.opentracing.SpanContext {
*/
@Override
public Iterable<Map.Entry<String, String>> baggageItems() {
return this.baggageItems.entrySet();
return baggageItems.entrySet();
}
@JsonIgnore
public PendingTrace getTrace() {
return this.trace;
return trace;
}
@JsonIgnore
public DDTracer getTracer() {
return this.tracer;
return tracer;
}
public Map<String, Number> getMetrics() {
@ -270,7 +271,7 @@ public class DDSpanContext implements io.opentracing.SpanContext {
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) {
metrics.compareAndSet(null, new ConcurrentHashMap<String, Number>());
}
@ -306,7 +307,7 @@ public class DDSpanContext implements io.opentracing.SpanContext {
}
if (addTag) {
this.tags.put(tag, value);
tags.put(tag, value);
}
}