From fa2fdb4e953e69d9a5b5a29a6fed2a7323b3af5c Mon Sep 17 00:00:00 2001 From: ascrutae Date: Fri, 12 Aug 2016 07:06:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ai/cloud/skywalking/conf/Config.java | 6 ++ .../skywalking/model/Identification.java | 5 -- .../ClassStaticMethodsInterceptor.java | 2 +- .../enhance/InstanceMethodInvokeContext.java | 26 +++---- .../enhance/MethodInvokeContext.java | 59 +++++++++------- .../define/JedisClusterPluginDefine.java | 1 - .../skywalking-sdk-plugin/pom.xml | 1 + .../self-define-interceptor-plugin/pom.xml | 19 +++++ .../plugin/SelfDefineMethodInterceptor.java | 69 +++++++++++++++++++ .../define/plugin/SelfDefineSpanType.java | 16 +++++ .../define/SelfDefineMethodPluginDefine.java | 47 +++++++++++++ .../src/main/resources/skywalking-plugin.def | 1 + 12 files changed, 209 insertions(+), 43 deletions(-) create mode 100644 skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/pom.xml create mode 100644 skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/SelfDefineMethodInterceptor.java create mode 100644 skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/SelfDefineSpanType.java create mode 100644 skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/define/SelfDefineMethodPluginDefine.java create mode 100644 skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/resources/skywalking-plugin.def diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java index a4eec243e..f45a8104d 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java @@ -18,6 +18,12 @@ public class Config { public static boolean IS_PREMAIN_MODE = false; public static String AGENT_BASE_PATH = ""; + + public static boolean SELF_DEFINE_METHOD_INTERCEPTOR = false; + + public static String SELF_DEFINE_METHOD_PACKAGE = ""; + + public static boolean RECORD_PARAM = false; } diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/model/Identification.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/model/Identification.java index 3a22f6c12..ca2c7010f 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/model/Identification.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/model/Identification.java @@ -60,11 +60,6 @@ public class Identification { return this; } - public IdentificationBuilder setParameter(String key, String value) { - sendData.parameters.put(key, value); - return this; - } - public IdentificationBuilder addParameter(String value){ parameterIdx++; sendData.parameters.put("_" + parameterIdx, value); diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java index b4b00ecf9..28d6b5587 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java @@ -29,7 +29,7 @@ public class ClassStaticMethodsInterceptor { public Object intercept(@Origin Class clazz, @AllArguments Object[] allArguments, @Origin Method method, @SuperCall Callable zuper) throws Exception { StaticMethodsAroundInterceptor interceptor = InterceptorInstanceLoader.load(staticMethodsAroundInterceptorClassName, clazz.getClassLoader()); - MethodInvokeContext interceptorContext = new MethodInvokeContext(method.getName(), allArguments); + MethodInvokeContext interceptorContext = new MethodInvokeContext(clazz,method.getName(), allArguments); MethodInterceptResult result = new MethodInterceptResult(); try { interceptor.beforeMethod(interceptorContext, result); diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/InstanceMethodInvokeContext.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/InstanceMethodInvokeContext.java index 901d7ac9e..42738624c 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/InstanceMethodInvokeContext.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/InstanceMethodInvokeContext.java @@ -1,17 +1,17 @@ package com.ai.cloud.skywalking.plugin.interceptor.enhance; public class InstanceMethodInvokeContext extends MethodInvokeContext { - /** - * 代理类实例 - */ - private Object objInst; - - InstanceMethodInvokeContext(Object objInst, String methodName, Object[] allArguments) { - super(methodName, allArguments); - this.objInst = objInst; - } - - public Object inst(){ - return objInst; - } + /** + * 代理类实例 + */ + private Object objInst; + + InstanceMethodInvokeContext(Object objInst, String methodName, Object[] allArguments) { + super(objInst.getClass(), methodName, allArguments); + this.objInst = objInst; + } + + public Object inst() { + return objInst; + } } diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/MethodInvokeContext.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/MethodInvokeContext.java index e7c96fc6d..f5dbbb1e4 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/MethodInvokeContext.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/MethodInvokeContext.java @@ -2,30 +2,43 @@ package com.ai.cloud.skywalking.plugin.interceptor.enhance; /** * 方法执行拦截上下文 - * - * @author wusheng * + * @author wusheng */ public class MethodInvokeContext { - /** - * 方法名称 - */ - private String methodName; - /** - * 方法参数 - */ - private Object[] allArguments; - - MethodInvokeContext(String methodName, Object[] allArguments) { - this.methodName = methodName; - this.allArguments = allArguments; - } - - public Object[] allArguments(){ - return this.allArguments; - } - - public String methodName(){ - return methodName; - } + /** + * 方法名称 + */ + private String methodName; + /** + * 方法参数 + */ + private Object[] allArguments; + + MethodInvokeContext(Class clazz, String methodName, Object[] allArguments) { + this.methodName = appendMethodName(clazz, methodName, allArguments); + this.allArguments = allArguments; + } + + public Object[] allArguments() { + return this.allArguments; + } + + public String methodName() { + return methodName; + } + + private String appendMethodName(Class clazz, String simpleMethodName, Object[] allArguments) { + StringBuilder methodName = new StringBuilder(clazz.getName() + "." + simpleMethodName + "("); + for (Object argument : allArguments) { + methodName.append(argument.getClass() + ","); + } + + if (allArguments.length > 0){ + methodName.deleteCharAt(methodName.length() - 1); + } + + methodName.append(")"); + return methodName.toString(); + } } diff --git a/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java index 0f9e6f322..175c23a29 100644 --- a/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java +++ b/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java @@ -1,6 +1,5 @@ package com.ai.cloud.skywalking.jedis.v2.plugin.define; -import com.ai.cloud.skywalking.jedis.v2.plugin.JedisClusterInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; import com.ai.cloud.skywalking.plugin.interceptor.matcher.AnyMethodsMatcher; diff --git a/skywalking-collector/skywalking-sdk-plugin/pom.xml b/skywalking-collector/skywalking-sdk-plugin/pom.xml index 6634a1e06..35c5d9c0d 100644 --- a/skywalking-collector/skywalking-sdk-plugin/pom.xml +++ b/skywalking-collector/skywalking-sdk-plugin/pom.xml @@ -16,6 +16,7 @@ httpClient-4.x-plugin jedis-2.x-plugin tomcat-7.x-8.x-plugin + self-define-interceptor-plugin pom diff --git a/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/pom.xml b/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/pom.xml new file mode 100644 index 000000000..18e4d63b1 --- /dev/null +++ b/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/pom.xml @@ -0,0 +1,19 @@ + + + skywalking-sdk-plugin + com.ai.cloud + 1.0-Final + + 4.0.0 + + self-define-interceptor-plugin + jar + + self-define-interceptor-plugin + http://maven.apache.org + + + UTF-8 + + diff --git a/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/SelfDefineMethodInterceptor.java b/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/SelfDefineMethodInterceptor.java new file mode 100644 index 000000000..a73805e4e --- /dev/null +++ b/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/SelfDefineMethodInterceptor.java @@ -0,0 +1,69 @@ +package com.ai.cloud.skywalking.self.define.plugin; + +import com.ai.cloud.skywalking.conf.Config; +import com.ai.cloud.skywalking.invoke.monitor.LocalMethodInvokeMonitor; +import com.ai.cloud.skywalking.model.Identification; +import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.*; +import com.google.gson.Gson; + +public class SelfDefineMethodInterceptor implements InstanceMethodsAroundInterceptor, StaticMethodsAroundInterceptor { + + @Override + public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { + } + + @Override + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, + MethodInterceptResult result) { + Identification.IdentificationBuilder identificationBuilder = buildIdentificationBuilder(interceptorContext); + new LocalMethodInvokeMonitor().beforeInvoke(identificationBuilder.build()); + } + + private Identification.IdentificationBuilder buildIdentificationBuilder(MethodInvokeContext interceptorContext) { + Identification.IdentificationBuilder identificationBuilder = Identification.newBuilder(); + if (Config.SkyWalking.RECORD_PARAM) { + for (Object param : interceptorContext.allArguments()) { + String paramStr; + try { + paramStr = new Gson().toJson(param); + } catch (Exception e) { + paramStr = "N/A"; + } + identificationBuilder.addParameter(paramStr); + } + } + + identificationBuilder.spanType(new SelfDefineSpanType()).viewPoint(interceptorContext.methodName()); + return identificationBuilder; + } + + @Override + public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, + Object ret) { + new LocalMethodInvokeMonitor().afterInvoke(); + return ret; + } + + @Override + public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, + InstanceMethodInvokeContext interceptorContext) { + new LocalMethodInvokeMonitor().occurException(t); + } + + @Override + public void beforeMethod(MethodInvokeContext interceptorContext, MethodInterceptResult result) { + new LocalMethodInvokeMonitor().beforeInvoke(buildIdentificationBuilder(interceptorContext).build()); + } + + @Override + public Object afterMethod(MethodInvokeContext interceptorContext, Object ret) { + new LocalMethodInvokeMonitor().afterInvoke(); + return ret; + } + + @Override + public void handleMethodException(Throwable t, MethodInvokeContext interceptorContext) { + new LocalMethodInvokeMonitor().occurException(t); + } +} diff --git a/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/SelfDefineSpanType.java b/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/SelfDefineSpanType.java new file mode 100644 index 000000000..7c854e5d6 --- /dev/null +++ b/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/SelfDefineSpanType.java @@ -0,0 +1,16 @@ +package com.ai.cloud.skywalking.self.define.plugin; + +import com.ai.cloud.skywalking.api.IBuriedPointType; +import com.ai.cloud.skywalking.protocol.common.CallType; + +public class SelfDefineSpanType implements IBuriedPointType { + @Override + public String getTypeName() { + return "L"; + } + + @Override + public CallType getCallType() { + return CallType.SYNC; + } +} diff --git a/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/define/SelfDefineMethodPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/define/SelfDefineMethodPluginDefine.java new file mode 100644 index 000000000..760370cd5 --- /dev/null +++ b/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/java/com/ai/cloud/skywalking/self/define/plugin/define/SelfDefineMethodPluginDefine.java @@ -0,0 +1,47 @@ +package com.ai.cloud.skywalking.self.define.plugin.define; + +import com.ai.cloud.skywalking.conf.Config; +import com.ai.cloud.skywalking.plugin.PluginException; +import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassEnhancePluginDefine; +import com.ai.cloud.skywalking.plugin.interceptor.matcher.AnyMethodsMatcher; +import net.bytebuddy.dynamic.DynamicType; + +public class SelfDefineMethodPluginDefine extends ClassEnhancePluginDefine { + + @Override + protected DynamicType.Builder enhance(String enhanceOriginClassName, DynamicType.Builder newClassBuilder) + throws PluginException { + return Config.SkyWalking.SELF_DEFINE_METHOD_INTERCEPTOR ? + super.enhance(enhanceOriginClassName, newClassBuilder) : + newClassBuilder; + } + + @Override + protected MethodMatcher[] getInstanceMethodsMatchers() { + return new MethodMatcher[] {new AnyMethodsMatcher()}; + } + + @Override + protected String getInstanceMethodsInterceptor() { + return "com.ai.cloud.skywalking.self.define.plugin.SelfDefineMethodInterceptor"; + } + + @Override + protected MethodMatcher[] getStaticMethodsMatchers() { + return new MethodMatcher[] {new AnyMethodsMatcher()}; + } + + @Override + protected String getStaticMethodsInterceptor() { + return "com.ai.cloud.skywalking.self.define.plugin.SelfDefineMethodInterceptor"; + } + + @Override + protected String enhanceClassName() { + if (!Config.SkyWalking.SELF_DEFINE_METHOD_PACKAGE.endsWith(".*")) { + return Config.SkyWalking.SELF_DEFINE_METHOD_PACKAGE + ".*"; + } + return Config.SkyWalking.SELF_DEFINE_METHOD_PACKAGE; + } +} diff --git a/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/resources/skywalking-plugin.def b/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/resources/skywalking-plugin.def new file mode 100644 index 000000000..bf7f2aa7f --- /dev/null +++ b/skywalking-collector/skywalking-sdk-plugin/self-define-interceptor-plugin/src/main/resources/skywalking-plugin.def @@ -0,0 +1 @@ +com.ai.cloud.skywalking.self.define.plugin.define.SelfDefineMethodPluginDefine -- GitLab