From f0c04741970d767e127ef5ba1fe6a89c67060acf Mon Sep 17 00:00:00 2001 From: wusheng Date: Mon, 1 Aug 2016 09:51:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BAtransform=E5=A2=9E=E5=8A=A0Listenser?= =?UTF-8?q?=E3=80=82=E4=BF=AE=E6=94=B9AbstractClassEnhancePluginDefine?= =?UTF-8?q?=EF=BC=8C=E6=BB=A1=E8=B6=B3=E6=A8=A1=E7=B3=8A=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E7=B1=BB=E5=90=8D=E8=BF=9B=E8=A1=8Ctransform=E7=9A=84=E8=A6=81?= =?UTF-8?q?=E6=B1=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skywalking-collector/skywalking-agent/pom.xml | 2 +- .../skywalking/agent/SkywalkingAgent.java | 44 +++++++++++++------ skywalking-collector/skywalking-api/pom.xml | 2 +- .../AbstractClassEnhancePluginDefine.java | 15 +++---- .../skywalking/plugin/PluginException.java | 2 +- .../skywalking/plugin/TracingBootstrap.java | 2 +- 6 files changed, 41 insertions(+), 26 deletions(-) diff --git a/skywalking-collector/skywalking-agent/pom.xml b/skywalking-collector/skywalking-agent/pom.xml index f0945d62f..ef9948dbf 100644 --- a/skywalking-collector/skywalking-agent/pom.xml +++ b/skywalking-collector/skywalking-agent/pom.xml @@ -16,7 +16,7 @@ UTF-8 - com.ai.cloud.skywalking.agent.SkywalkingAgent + com.ai.cloud.skywalking.agent.SkyWalkingAgent net.bytebuddy com.ai.cloud.skywalking.api.dependencies.net.bytebuddy io.netty diff --git a/skywalking-collector/skywalking-agent/src/main/java/com/ai/cloud/skywalking/agent/SkywalkingAgent.java b/skywalking-collector/skywalking-agent/src/main/java/com/ai/cloud/skywalking/agent/SkywalkingAgent.java index 9697a1550..6e62f5bf3 100644 --- a/skywalking-collector/skywalking-agent/src/main/java/com/ai/cloud/skywalking/agent/SkywalkingAgent.java +++ b/skywalking-collector/skywalking-agent/src/main/java/com/ai/cloud/skywalking/agent/SkywalkingAgent.java @@ -12,31 +12,47 @@ import net.bytebuddy.description.NamedElement; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.matcher.ElementMatcher; +import net.bytebuddy.utility.JavaModule; import java.io.File; import java.lang.instrument.Instrumentation; import java.net.URL; import java.util.List; -public class SkywalkingAgent { - - private static Logger logger = LogManager.getLogger(SkywalkingAgent.class); - private static final PluginDefineCategory pluginDefineCategory = PluginDefineCategory.category(new PluginBootstrap().loadPlugins()); +public class SkyWalkingAgent { + private static Logger logger = LogManager.getLogger(SkyWalkingAgent.class); public static void premain(String agentArgs, Instrumentation instrumentation) throws PluginException { initConfig(); if (AuthDesc.isAuth()) { + final PluginDefineCategory pluginDefineCategory = PluginDefineCategory.category(new PluginBootstrap().loadPlugins()); + startBootPluginDefines(pluginDefineCategory.getBootPluginsDefines()); - new AgentBuilder.Default().type(enhanceClassMatcher()).transform(new AgentBuilder.Transformer() { + new AgentBuilder.Default().type(enhanceClassMatcher(pluginDefineCategory)).transform(new AgentBuilder.Transformer() { public DynamicType.Builder transform(DynamicType.Builder builder, TypeDescription typeDescription, ClassLoader classLoader) { AbstractClassEnhancePluginDefine pluginDefine = pluginDefineCategory.findPluginDefine(typeDescription.getTypeName()); - try { - return pluginDefine.define(builder); - } catch (Throwable e) { - logger.error("Failed to enhance plugin " + pluginDefine.getClass().getName(), e); - return builder; - } + return pluginDefine.define(typeDescription.getTypeName(), builder); + } + }).with(new AgentBuilder.Listener() { + @Override + public void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module, DynamicType dynamicType) { + + } + + @Override + public void onIgnored(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) { + logger.info("ignore to enhance class " + typeDescription.getTypeName()); + } + + @Override + public void onError(String typeName, ClassLoader classLoader, JavaModule module, Throwable throwable) { + logger.error("Failed to enhance class " + typeName, throwable); + } + + @Override + public void onComplete(String typeName, ClassLoader classLoader, JavaModule module) { + logger.info("enhance class " + typeName + " complete."); } }).installOn(instrumentation); @@ -44,7 +60,7 @@ public class SkywalkingAgent { } - private static ElementMatcher.Junction enhanceClassMatcher() { + private static ElementMatcher.Junction enhanceClassMatcher(PluginDefineCategory pluginDefineCategory) { return new SkyWalkingEnhanceMatcher(pluginDefineCategory); } @@ -57,7 +73,7 @@ public class SkywalkingAgent { private static String generateLocationPath() { - return SkywalkingAgent.class.getName().replaceAll("\\.", "/") + ".class"; + return SkyWalkingAgent.class.getName().replaceAll("\\.", "/") + ".class"; } @@ -68,7 +84,7 @@ public class SkywalkingAgent { private static String initAgentBasePath() { try { - String urlString = SkywalkingAgent.class.getClassLoader().getSystemClassLoader().getResource(generateLocationPath()).toString(); + String urlString = SkyWalkingAgent.class.getClassLoader().getSystemClassLoader().getResource(generateLocationPath()).toString(); urlString = urlString.substring(urlString.indexOf("file:"), urlString.indexOf('!')); return new File(new URL(urlString).getFile()).getParentFile().getAbsolutePath(); } catch (Exception e) { diff --git a/skywalking-collector/skywalking-api/pom.xml b/skywalking-collector/skywalking-api/pom.xml index 41f400f46..f1ac60254 100644 --- a/skywalking-collector/skywalking-api/pom.xml +++ b/skywalking-collector/skywalking-api/pom.xml @@ -29,7 +29,7 @@ net.bytebuddy byte-buddy - 1.3.0 + 1.4.16 diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/AbstractClassEnhancePluginDefine.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/AbstractClassEnhancePluginDefine.java index b9ab16b47..99a3603af 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/AbstractClassEnhancePluginDefine.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/AbstractClassEnhancePluginDefine.java @@ -14,16 +14,15 @@ import static com.ai.cloud.skywalking.plugin.PluginBootstrap.CLASS_TYPE_POOL; public abstract class AbstractClassEnhancePluginDefine implements IPlugin { private static Logger logger = LogManager.getLogger(AbstractClassEnhancePluginDefine.class); - public DynamicType.Builder define(DynamicType.Builder builder) throws PluginException { + public DynamicType.Builder define(String transformClassName, DynamicType.Builder builder) throws PluginException { String interceptorDefineClassName = this.getClass().getName(); - String enhanceOriginClassName = enhanceClassName(); - if (StringUtil.isEmpty(enhanceOriginClassName)) { + if (StringUtil.isEmpty(transformClassName)) { logger.warn("classname of being intercepted is not defined by {}.", interceptorDefineClassName); return builder; } - logger.debug("prepare to enhance class {} by {}.", enhanceOriginClassName, interceptorDefineClassName); + logger.debug("prepare to enhance class {} by {}.", transformClassName, interceptorDefineClassName); /** * find witness classes for enhance class @@ -33,7 +32,7 @@ public abstract class AbstractClassEnhancePluginDefine implements IPlugin { for (String witnessClass : witnessClasses) { Resolution witnessClassResolution = CLASS_TYPE_POOL.describe(witnessClass); if (!witnessClassResolution.isResolved()) { - logger.warn("enhance class {} by plugin {} is not working. Because witness class {} is not existed.", enhanceOriginClassName, interceptorDefineClassName, + logger.warn("enhance class {} by plugin {} is not working. Because witness class {} is not existed.", transformClassName, interceptorDefineClassName, witnessClass); return builder; } @@ -43,10 +42,10 @@ public abstract class AbstractClassEnhancePluginDefine implements IPlugin { /** * find origin class source code for interceptor */ - DynamicType.Builder newClassBuilder = this.enhance(enhanceOriginClassName, builder); + DynamicType.Builder newClassBuilder = this.enhance(transformClassName, builder); - logger.debug("enhance class {} by {} completely.", enhanceOriginClassName, interceptorDefineClassName); + logger.debug("enhance class {} by {} completely.", transformClassName, interceptorDefineClassName); return newClassBuilder; } @@ -54,7 +53,7 @@ public abstract class AbstractClassEnhancePluginDefine implements IPlugin { protected abstract DynamicType.Builder enhance(String enhanceOriginClassName, DynamicType.Builder newClassBuilder) throws PluginException; /** - * 返回要被增强的类,应当返回类全名 + * 返回要被增强的类,应当返回类全名或前匹配(返回*号结尾) * * @return */ diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginException.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginException.java index ac501d2a9..7c3fa1d67 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginException.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginException.java @@ -1,6 +1,6 @@ package com.ai.cloud.skywalking.plugin; -public class PluginException extends Exception { +public class PluginException extends RuntimeException { private static final long serialVersionUID = -6020188711867490724L; public PluginException(String message) { diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/TracingBootstrap.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/TracingBootstrap.java index fb6373a7f..92d0c663c 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/TracingBootstrap.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/TracingBootstrap.java @@ -48,7 +48,7 @@ public class TracingBootstrap { continue; } DynamicType.Builder newClassBuilder = new ByteBuddy().rebase(resolution.resolve(), ClassFileLocator.ForClassLoader.ofClassPath()); - newClassBuilder = ((AbstractClassEnhancePluginDefine)plugin).define(newClassBuilder); + newClassBuilder = ((AbstractClassEnhancePluginDefine)plugin).define(enhanceClassName, newClassBuilder); newClassBuilder.make().load(ClassLoader.getSystemClassLoader(), ClassLoadingStrategy.Default.INJECTION).getLoaded(); }