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