From f5ecd4737973eb22314b5a8b5024c24bbd4c6e29 Mon Sep 17 00:00:00 2001 From: Andrew Kent Date: Tue, 19 Dec 2017 08:37:20 -0800 Subject: [PATCH] Remove dead code --- .../datadoghq/agent/AgentRulesManager.java | 46 ------ .../agent/ClassLoaderIntegrationInjector.java | 93 ------------ .../agent/InstrumentationChecker.java | 141 ------------------ .../agent/InstrumentationRulesManager.java | 36 ----- .../datadoghq/agent/TracingAgentConfig.java | 30 ---- .../agent/InstrumentationCheckerTest.groovy | 34 ----- 6 files changed, 380 deletions(-) delete mode 100644 dd-java-agent/src/main/java/com/datadoghq/agent/AgentRulesManager.java delete mode 100644 dd-java-agent/src/main/java/com/datadoghq/agent/ClassLoaderIntegrationInjector.java delete mode 100644 dd-java-agent/src/main/java/com/datadoghq/agent/InstrumentationChecker.java delete mode 100644 dd-java-agent/src/main/java/com/datadoghq/agent/InstrumentationRulesManager.java delete mode 100644 dd-java-agent/src/main/java/com/datadoghq/agent/TracingAgentConfig.java delete mode 100644 dd-java-agent/src/test/groovy/com/datadoghq/agent/InstrumentationCheckerTest.groovy diff --git a/dd-java-agent/src/main/java/com/datadoghq/agent/AgentRulesManager.java b/dd-java-agent/src/main/java/com/datadoghq/agent/AgentRulesManager.java deleted file mode 100644 index cc89b63730..0000000000 --- a/dd-java-agent/src/main/java/com/datadoghq/agent/AgentRulesManager.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.datadoghq.agent; - -import com.datadoghq.trace.DDTraceAnnotationsInfo; -import com.datadoghq.trace.DDTraceInfo; -import com.datadoghq.trace.resolver.DDTracerFactory; -import com.datadoghq.trace.resolver.FactoryUtils; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class AgentRulesManager { - - // Initialize the info classes so they print out their version info: - private static final String ddJavaAgentVersion = DDJavaAgentInfo.VERSION; - private static final String ddTraceVersion = DDTraceInfo.VERSION; - private static final String ddTraceAnnotationsVersion = DDTraceAnnotationsInfo.VERSION; - - private static final String INITIALIZER_RULES = "initializer-rules.btm"; - - protected static volatile AgentRulesManager INSTANCE; - - protected final TracingAgentConfig agentTracerConfig; - protected final InstrumentationRulesManager instrumentationRulesManager; - - public AgentRulesManager(final TracingAgentConfig config) { - agentTracerConfig = config; - instrumentationRulesManager = new InstrumentationRulesManager(config, this); - instrumentationRulesManager.initTracer(); - } - - /** This method initializes the manager. */ - public static void initialize() { - log.debug("Initializing {}", AgentRulesManager.class.getSimpleName()); - - final TracingAgentConfig config = - FactoryUtils.loadConfigFromFilePropertyOrResource( - DDTracerFactory.SYSTEM_PROPERTY_CONFIG_PATH, - DDTracerFactory.CONFIG_PATH, - TracingAgentConfig.class); - - log.debug("Configuration: {}", config.toString()); - - final AgentRulesManager manager = new AgentRulesManager(config); - - INSTANCE = manager; - } -} diff --git a/dd-java-agent/src/main/java/com/datadoghq/agent/ClassLoaderIntegrationInjector.java b/dd-java-agent/src/main/java/com/datadoghq/agent/ClassLoaderIntegrationInjector.java deleted file mode 100644 index 7a2aee0be0..0000000000 --- a/dd-java-agent/src/main/java/com/datadoghq/agent/ClassLoaderIntegrationInjector.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.datadoghq.agent; - -import com.google.common.collect.Maps; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.zip.ZipEntry; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -// TODO: consider augmenting with com.sun.xml.internal.bind.v2.runtime.reflect.opt.Injector -public class ClassLoaderIntegrationInjector { - private final Map entries; - private final Map invocationPoints = Maps.newConcurrentMap(); - - public ClassLoaderIntegrationInjector(final Map allEntries) { - this.entries = Maps.newHashMap(allEntries); - for (final Iterator> it = entries.entrySet().iterator(); - it.hasNext(); - ) { - final Map.Entry entry = it.next(); - if (!entry.getKey().getName().endsWith(".class")) { - // remove all non-class files - it.remove(); - } - } - } - - public void inject(final ClassLoader cl) { - try { - final Method inovcationPoint = getInovcationPoint(cl); - final Map toInject = Maps.newHashMap(entries); - final Map injectedEntries = Maps.newHashMap(); - final List lastErrors = new LinkedList<>(); - boolean successfulyAdded = true; - while (!toInject.isEmpty() && successfulyAdded) { - log.debug("Attempting to inject {} entries into {}", toInject.size(), cl); - successfulyAdded = false; - lastErrors.clear(); - for (final Map.Entry entry : toInject.entrySet()) { - final byte[] bytes = entry.getValue(); - try { - inovcationPoint.invoke(cl, bytes, 0, bytes.length); - injectedEntries.put(entry.getKey(), entry.getValue()); - successfulyAdded = true; - } catch (final InvocationTargetException e) { - lastErrors.add(e); - } - } - toInject.keySet().removeAll(injectedEntries.keySet()); - } - log.info("Successfully injected {} classes into {}", injectedEntries.size(), cl); - log.info("Failed injecting {} classes into {}", toInject.size(), cl); - log.debug("\nSuccesses: {}", injectedEntries); - log.debug("\nFailures: {}", toInject); - for (final Throwable error : lastErrors) { - log.debug("Injection error", error.getCause()); - } - - } catch (final NoSuchMethodException e) { - log.error("Error getting 'defineClass' method from {}", cl); - } catch (final IllegalAccessException e) { - log.error("Error accessing 'defineClass' method on {}", cl); - } - } - - private Method getInovcationPoint(final ClassLoader cl) throws NoSuchMethodException { - if (invocationPoints.containsKey(invocationPoints)) { - return invocationPoints.get(invocationPoints); - } - Class clazz = cl.getClass(); - NoSuchMethodException firstException = null; - while (clazz != null) { - try { - // defineClass is protected so we may need to check up the class hierarchy. - final Method invocationPoint = - clazz.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); - invocationPoint.setAccessible(true); - invocationPoints.put(cl, invocationPoint); - return invocationPoint; - } catch (final NoSuchMethodException e) { - if (firstException == null) { - firstException = e; - } - clazz = clazz.getSuperclass(); - } - } - throw firstException; - } -} diff --git a/dd-java-agent/src/main/java/com/datadoghq/agent/InstrumentationChecker.java b/dd-java-agent/src/main/java/com/datadoghq/agent/InstrumentationChecker.java deleted file mode 100644 index aa092a8ff1..0000000000 --- a/dd-java-agent/src/main/java/com/datadoghq/agent/InstrumentationChecker.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.datadoghq.agent; - -import com.datadoghq.trace.resolver.FactoryUtils; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.core.type.TypeReference; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -/** - * Utility class to check the validity of the classpath concerning the java automated - * instrumentations - */ -@Slf4j -public class InstrumentationChecker { - - private static final String CONFIG_FILE = "dd-trace-supported-framework"; - - private final Map> rules; - - /* For testing purpose */ - InstrumentationChecker( - final Map> rules, final Map frameworks) { - this.rules = rules; - } - - public InstrumentationChecker() { - rules = - FactoryUtils.loadConfigFromResource( - CONFIG_FILE, new TypeReference>>() {}); - } - - public List getUnsupportedRules(final ClassLoader classLoader) { - log.debug("Checking rule compatibility on classloader {}", classLoader); - - final List unsupportedRules = new ArrayList<>(); - for (final String rule : rules.keySet()) { - - // Check rules - boolean supported = false; - for (final ArtifactSupport check : rules.get(rule)) { - log.debug("Checking rule {}", check); - - boolean matched = - (check.identifyingPresentClasses != null - && !check.identifyingPresentClasses.entrySet().isEmpty()) - || (check.identifyingMissingClasses != null - && !check.identifyingMissingClasses.isEmpty()); - if (check.identifyingPresentClasses != null) { - for (final Map.Entry identifier : - check.identifyingPresentClasses.entrySet()) { - final boolean classPresent = isClassPresent(identifier.getKey(), classLoader); - if (!classPresent) { - log.debug( - "Instrumentation {} not applied due to missing class {}.", rule, identifier); - } else { - final String identifyingMethod = identifier.getValue(); - if (identifyingMethod != null && !identifyingMethod.isEmpty()) { - final Class clazz = getClassIfPresent(identifier.getKey(), classLoader); - // already confirmed above the class is there. - final Method[] declaredMethods = clazz.getDeclaredMethods(); - boolean methodFound = false; - for (final Method m : declaredMethods) { - if (m.getName().equals(identifyingMethod)) { - methodFound = true; - break; - } - } - if (!methodFound) { - log.debug( - "Instrumentation {} not applied due to missing method {}.{}", - rule, - identifier.getKey(), - identifyingMethod); - matched = false; - } - } - } - matched &= classPresent; - } - } - if (check.identifyingMissingClasses != null) { - for (final String identifyingClass : check.identifyingMissingClasses) { - final boolean classMissing = !isClassPresent(identifyingClass, classLoader); - if (!classMissing) { - log.debug( - "Instrumentation {} not applied due to present class {}.", - rule, - identifyingClass); - } - matched &= classMissing; - } - } - - supported |= matched; - if (supported) { - break; - } - } - - if (!supported) { - log.info("Instrumentation rule={} is not supported", rule); - unsupportedRules.add(rule); - } - } - - return unsupportedRules; - } - - static boolean isClassPresent( - final String identifyingPresentClass, final ClassLoader classLoader) { - return getClassIfPresent(identifyingPresentClass, classLoader) != null; - } - - static Class getClassIfPresent( - final String identifyingPresentClass, final ClassLoader classLoader) { - try { - return Class.forName(identifyingPresentClass, false, classLoader); - } catch (final Exception e) { - return null; - } - } - - @Data - static class ArtifactSupport { - private String artifact; - - @JsonProperty("supported_version") - private String supportedVersion; - - @JsonProperty("identifying_present_classes") - private Map identifyingPresentClasses = Collections.emptyMap(); - - @JsonProperty("identifying_missing_classes") - private List identifyingMissingClasses = Collections.emptyList(); - } -} diff --git a/dd-java-agent/src/main/java/com/datadoghq/agent/InstrumentationRulesManager.java b/dd-java-agent/src/main/java/com/datadoghq/agent/InstrumentationRulesManager.java deleted file mode 100644 index 92eeea2e33..0000000000 --- a/dd-java-agent/src/main/java/com/datadoghq/agent/InstrumentationRulesManager.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.datadoghq.agent; - -import io.opentracing.Tracer; -import io.opentracing.contrib.tracerresolver.TracerResolver; -import io.opentracing.util.GlobalTracer; -import lombok.extern.slf4j.Slf4j; - -/** - * This manager is loaded at pre-main. It loads all the scripts contained in all the 'oatrules.btm' - * resource files. - */ -@Slf4j -public class InstrumentationRulesManager { - private static final Object SYNC = new Object(); - - public InstrumentationRulesManager( - final TracingAgentConfig config, final AgentRulesManager agentRulesManager) {} - - void initTracer() { - synchronized (SYNC) { - if (!GlobalTracer.isRegistered()) { - // Try to obtain a tracer using the TracerResolver - final Tracer resolved = TracerResolver.resolveTracer(); - if (resolved != null) { - try { - GlobalTracer.register(resolved); - } catch (final RuntimeException re) { - log.warn("Failed to register tracer '" + resolved + "'", re); - } - } else { - log.warn("Failed to resolve dd tracer"); - } - } - } - } -} diff --git a/dd-java-agent/src/main/java/com/datadoghq/agent/TracingAgentConfig.java b/dd-java-agent/src/main/java/com/datadoghq/agent/TracingAgentConfig.java deleted file mode 100644 index 292d165125..0000000000 --- a/dd-java-agent/src/main/java/com/datadoghq/agent/TracingAgentConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.datadoghq.agent; - -import com.datadoghq.trace.resolver.TracerConfig; -import java.util.ArrayList; -import java.util.List; - -/** Configuration POJO for the agent */ -public class TracingAgentConfig extends TracerConfig { - - private List disabledInstrumentations = new ArrayList<>(); - - private String[] enableCustomAnnotationTracingOver = {}; - - public String[] getEnableCustomAnnotationTracingOver() { - return enableCustomAnnotationTracingOver; - } - - public void setEnableCustomAnnotationTracingOver( - final String[] enableCustomAnnotationTracingOver) { - this.enableCustomAnnotationTracingOver = enableCustomAnnotationTracingOver; - } - - public List getDisabledInstrumentations() { - return disabledInstrumentations; - } - - public void setDisabledInstrumentations(final List uninstallContributions) { - this.disabledInstrumentations = uninstallContributions; - } -} diff --git a/dd-java-agent/src/test/groovy/com/datadoghq/agent/InstrumentationCheckerTest.groovy b/dd-java-agent/src/test/groovy/com/datadoghq/agent/InstrumentationCheckerTest.groovy deleted file mode 100644 index 9540bbf315..0000000000 --- a/dd-java-agent/src/test/groovy/com/datadoghq/agent/InstrumentationCheckerTest.groovy +++ /dev/null @@ -1,34 +0,0 @@ -package com.datadoghq.agent - -import com.datadoghq.trace.resolver.FactoryUtils -import com.fasterxml.jackson.core.type.TypeReference -import spock.lang.Specification - -class InstrumentationCheckerTest extends Specification { - Map>> rules = - FactoryUtils.loadConfigFromResource("supported-version-test", new TypeReference>>() { - }) - Map frameworks = [ - "artifact-1": "1.2.3.1232", - "artifact-2": "4.y.z", - "artifact-3": "5.123-1" - ] - - def checker = new InstrumentationChecker(rules, frameworks) - - def "test rules"() { - setup: - def rules = checker.getUnsupportedRules(getClass().getClassLoader()) - - expect: - rules.sort() == ["unsupportedRuleOne", "unsupportedRuleThree", "unsupportedRuleTwo"] - } - - static class DemoClass1 { - void testMethod(String arg) {} - } - - static class DemoClass2 {} - - static class DemoClass3 {} -}