From 839ed9f0cb2f65f36128a55fb34f54a95e12d391 Mon Sep 17 00:00:00 2001 From: Andrew Kent Date: Tue, 23 Jan 2018 15:36:25 -0800 Subject: [PATCH 1/2] Use a thread-safe synchronized weak hash map. --- .../instrumentation/jdbc/ConnectionInstrumentation.java | 7 +++++-- .../springweb/SpringWebInstrumentation.java | 4 +++- .../trace_annotation/TraceAnnotationInstrumentation.java | 3 ++- .../datadog/trace/agent/tooling/ClassLoaderMatcher.java | 8 ++++++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java index ef28b63d94..110a257d5f 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java @@ -14,6 +14,7 @@ import datadog.trace.agent.tooling.DDAdvice; import datadog.trace.agent.tooling.Instrumenter; import java.sql.Connection; import java.sql.PreparedStatement; +import java.util.Collections; import java.util.Map; import java.util.WeakHashMap; import lombok.Data; @@ -22,8 +23,10 @@ import net.bytebuddy.asm.Advice; @AutoService(Instrumenter.class) public final class ConnectionInstrumentation implements Instrumenter { - public static final Map connectionInfo = new WeakHashMap<>(); - public static final Map preparedStatements = new WeakHashMap<>(); + public static final Map connectionInfo = + Collections.synchronizedMap(new WeakHashMap()); + public static final Map preparedStatements = + Collections.synchronizedMap(new WeakHashMap()); @Override public AgentBuilder instrument(final AgentBuilder agentBuilder) { diff --git a/dd-java-agent/instrumentation/spring-web/src/main/java/datadog/trace/instrumentation/springweb/SpringWebInstrumentation.java b/dd-java-agent/instrumentation/spring-web/src/main/java/datadog/trace/instrumentation/springweb/SpringWebInstrumentation.java index a38b5cfcba..c5c31f9960 100644 --- a/dd-java-agent/instrumentation/spring-web/src/main/java/datadog/trace/instrumentation/springweb/SpringWebInstrumentation.java +++ b/dd-java-agent/instrumentation/spring-web/src/main/java/datadog/trace/instrumentation/springweb/SpringWebInstrumentation.java @@ -17,6 +17,7 @@ import datadog.trace.api.DDTags; import io.opentracing.Scope; import io.opentracing.util.GlobalTracer; import java.sql.PreparedStatement; +import java.util.Collections; import java.util.Map; import java.util.WeakHashMap; import javax.servlet.http.HttpServletRequest; @@ -26,7 +27,8 @@ import org.springframework.web.servlet.HandlerMapping; @AutoService(Instrumenter.class) public final class SpringWebInstrumentation implements Instrumenter { - public static final Map preparedStatements = new WeakHashMap<>(); + public static final Map preparedStatements = + Collections.synchronizedMap(new WeakHashMap()); @Override public AgentBuilder instrument(final AgentBuilder agentBuilder) { diff --git a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationInstrumentation.java b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationInstrumentation.java index 696fb96f9a..cc88640c3c 100644 --- a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationInstrumentation.java +++ b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationInstrumentation.java @@ -22,7 +22,8 @@ import net.bytebuddy.asm.Advice; @AutoService(Instrumenter.class) public final class TraceAnnotationInstrumentation implements Instrumenter { - public static final Map preparedStatements = new WeakHashMap<>(); + public static final Map preparedStatements = + Collections.synchronizedMap(new WeakHashMap()); @Override public AgentBuilder instrument(final AgentBuilder agentBuilder) { diff --git a/dd-java-agent/tooling/src/main/java/datadog/trace/agent/tooling/ClassLoaderMatcher.java b/dd-java-agent/tooling/src/main/java/datadog/trace/agent/tooling/ClassLoaderMatcher.java index d1d141c93a..aea5ee0617 100644 --- a/dd-java-agent/tooling/src/main/java/datadog/trace/agent/tooling/ClassLoaderMatcher.java +++ b/dd-java-agent/tooling/src/main/java/datadog/trace/agent/tooling/ClassLoaderMatcher.java @@ -1,5 +1,7 @@ package datadog.trace.agent.tooling; +import java.util.Collections; +import java.util.Map; import java.util.WeakHashMap; import net.bytebuddy.matcher.ElementMatcher; @@ -46,7 +48,8 @@ public class ClassLoaderMatcher { public static class ClassLoaderHasClassMatcher extends ElementMatcher.Junction.AbstractBase { - private final WeakHashMap cache = new WeakHashMap<>(); + private final Map cache = + Collections.synchronizedMap(new WeakHashMap()); private final String[] names; @@ -80,7 +83,8 @@ public class ClassLoaderMatcher { public static class ClassLoaderHasClassWithFieldMatcher extends ElementMatcher.Junction.AbstractBase { - private final WeakHashMap cache = new WeakHashMap<>(); + private final Map cache = + Collections.synchronizedMap(new WeakHashMap()); private final String className; private final String fieldName; From d731789d3868863f5cadc402d20067770dcf222b Mon Sep 17 00:00:00 2001 From: Andrew Kent Date: Thu, 25 Jan 2018 09:45:47 -0800 Subject: [PATCH 2/2] Remove copy-paste from spring and trace instrumentation --- .../instrumentation/springweb/SpringWebInstrumentation.java | 6 ------ .../trace_annotation/TraceAnnotationInstrumentation.java | 5 ----- 2 files changed, 11 deletions(-) diff --git a/dd-java-agent/instrumentation/spring-web/src/main/java/datadog/trace/instrumentation/springweb/SpringWebInstrumentation.java b/dd-java-agent/instrumentation/spring-web/src/main/java/datadog/trace/instrumentation/springweb/SpringWebInstrumentation.java index c5c31f9960..bf75ff014d 100644 --- a/dd-java-agent/instrumentation/spring-web/src/main/java/datadog/trace/instrumentation/springweb/SpringWebInstrumentation.java +++ b/dd-java-agent/instrumentation/spring-web/src/main/java/datadog/trace/instrumentation/springweb/SpringWebInstrumentation.java @@ -16,10 +16,6 @@ import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.api.DDTags; import io.opentracing.Scope; import io.opentracing.util.GlobalTracer; -import java.sql.PreparedStatement; -import java.util.Collections; -import java.util.Map; -import java.util.WeakHashMap; import javax.servlet.http.HttpServletRequest; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.asm.Advice; @@ -27,8 +23,6 @@ import org.springframework.web.servlet.HandlerMapping; @AutoService(Instrumenter.class) public final class SpringWebInstrumentation implements Instrumenter { - public static final Map preparedStatements = - Collections.synchronizedMap(new WeakHashMap()); @Override public AgentBuilder instrument(final AgentBuilder agentBuilder) { diff --git a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationInstrumentation.java b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationInstrumentation.java index cc88640c3c..e11be63d78 100644 --- a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationInstrumentation.java +++ b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationInstrumentation.java @@ -13,17 +13,12 @@ import io.opentracing.Span; import io.opentracing.tag.Tags; import io.opentracing.util.GlobalTracer; import java.lang.reflect.Method; -import java.sql.PreparedStatement; import java.util.Collections; -import java.util.Map; -import java.util.WeakHashMap; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.asm.Advice; @AutoService(Instrumenter.class) public final class TraceAnnotationInstrumentation implements Instrumenter { - public static final Map preparedStatements = - Collections.synchronizedMap(new WeakHashMap()); @Override public AgentBuilder instrument(final AgentBuilder agentBuilder) {