diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/AbstractClassEnhancePluginDefine.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/AbstractClassEnhancePluginDefine.java index 2c16b2866..f4cda7556 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/AbstractClassEnhancePluginDefine.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/AbstractClassEnhancePluginDefine.java @@ -24,7 +24,7 @@ public abstract class AbstractClassEnhancePluginDefine { * * @param transformClassName target class. * @param builder byte-buddy's builder to manipulate target class's bytecode. - * @return be defined builder. + * @return the new builder, or null if not be enhanced. * @throws PluginException, when set builder failure. */ public DynamicType.Builder define(String transformClassName, @@ -33,7 +33,7 @@ public abstract class AbstractClassEnhancePluginDefine { if (StringUtil.isEmpty(transformClassName)) { logger.warn("classname of being intercepted is not defined by {}.", interceptorDefineClassName); - return builder; + return null; } logger.debug("prepare to enhance class {} by {}.", transformClassName, interceptorDefineClassName); @@ -48,7 +48,7 @@ public abstract class AbstractClassEnhancePluginDefine { if (!witnessClassResolution.isResolved()) { logger.warn("enhance class {} by plugin {} is not working. Because witness class {} is not existed.", transformClassName, interceptorDefineClassName, witnessClass); - return builder; + return null; } } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginFinder.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginFinder.java index 2caa7214b..45ce1d5b5 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginFinder.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginFinder.java @@ -1,6 +1,7 @@ package org.skywalking.apm.agent.core.plugin; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -11,7 +12,7 @@ import java.util.Map; * @author wusheng */ public class PluginFinder { - private final Map pluginDefineMap = new HashMap(); + private final Map> pluginDefineMap = new HashMap>(); public PluginFinder(List plugins) { for (AbstractClassEnhancePluginDefine plugin : plugins) { @@ -21,11 +22,17 @@ public class PluginFinder { continue; } - pluginDefineMap.put(enhanceClassName, plugin); + LinkedList pluginDefinesWithSameTarget = pluginDefineMap.get(enhanceClassName); + if (pluginDefinesWithSameTarget == null) { + pluginDefinesWithSameTarget = new LinkedList(); + pluginDefineMap.put(enhanceClassName, pluginDefinesWithSameTarget); + } + + pluginDefinesWithSameTarget.add(plugin); } } - public AbstractClassEnhancePluginDefine find(String enhanceClassName) { + public List find(String enhanceClassName) { if (pluginDefineMap.containsKey(enhanceClassName)) { return pluginDefineMap.get(enhanceClassName); } diff --git a/apm-sniffer/apm-agent/src/main/java/org/skywalking/apm/agent/SkyWalkingAgent.java b/apm-sniffer/apm-agent/src/main/java/org/skywalking/apm/agent/SkyWalkingAgent.java index e8afb5d11..2fe77d5ba 100644 --- a/apm-sniffer/apm-agent/src/main/java/org/skywalking/apm/agent/SkyWalkingAgent.java +++ b/apm-sniffer/apm-agent/src/main/java/org/skywalking/apm/agent/SkyWalkingAgent.java @@ -1,5 +1,6 @@ package org.skywalking.apm.agent; +import java.util.List; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.description.NamedElement; import net.bytebuddy.description.type.TypeDescription; @@ -53,14 +54,22 @@ public class SkyWalkingAgent { new AgentBuilder.Default().type(enhanceClassMatcher(pluginFinder).and(not(isInterface()))).transform(new AgentBuilder.Transformer() { public DynamicType.Builder transform(DynamicType.Builder builder, TypeDescription typeDescription, - ClassLoader classLoader) { - AbstractClassEnhancePluginDefine pluginDefine = pluginFinder.find(typeDescription.getTypeName()); - return pluginDefine.define(typeDescription.getTypeName(), builder); + ClassLoader classLoader) { + List pluginDefines = pluginFinder.find(typeDescription.getTypeName()); + for (AbstractClassEnhancePluginDefine pluginDefine : pluginDefines) { + DynamicType.Builder newBuilder = pluginDefine.define(typeDescription.getTypeName(), builder); + if (newBuilder != null) { + return newBuilder; + } + } + + logger.warn("Matched class {}, but enhancement fail.", typeDescription.getTypeName()); + return builder; } }).with(new AgentBuilder.Listener() { @Override public void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module, - DynamicType dynamicType) { + DynamicType dynamicType) { }