This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new dd9d178  Support span#error in toolkit (#2605)
dd9d178 is described below

commit dd9d178cb31165a5a1192ccc78fa3fea9de1f6e1
Author: caoyixiong <[email protected]>
AuthorDate: Fri May 10 11:14:39 2019 +0800

    Support span#error in toolkit (#2605)
    
    * Fix #2546
---
 .../skywalking/apm/toolkit/trace/ActiveSpan.java   |  16 +-
 .../activation/trace/ActiveSpanActivation.java     | 154 +++++++++++++++++
 .../trace/ActiveSpanDebugInterceptor.java          |  58 +++++++
 .../trace/ActiveSpanErrorInterceptor.java          |  53 ++++++
 .../trace/ActiveSpanErrorMsgInterceptor.java       |  59 +++++++
 .../trace/ActiveSpanErrorThrowableInteceptor.java  |  53 ++++++
 .../trace/ActiveSpanInfoInterceptor.java           |  58 +++++++
 .../activation/trace/ActiveSpanTagActivation.java  |  69 --------
 .../src/main/resources/skywalking-plugin.def       |   2 +-
 .../toolkit/activation/trace/ActiveSpanTest.java   | 187 +++++++++++++++++++++
 .../java-agent/Application-toolkit-trace.md        |  14 ++
 11 files changed, 652 insertions(+), 71 deletions(-)

diff --git 
a/apm-application-toolkit/apm-toolkit-trace/src/main/java/org/apache/skywalking/apm/toolkit/trace/ActiveSpan.java
 
b/apm-application-toolkit/apm-toolkit-trace/src/main/java/org/apache/skywalking/apm/toolkit/trace/ActiveSpan.java
index 0c6e495..a34707f 100644
--- 
a/apm-application-toolkit/apm-toolkit-trace/src/main/java/org/apache/skywalking/apm/toolkit/trace/ActiveSpan.java
+++ 
b/apm-application-toolkit/apm-toolkit-trace/src/main/java/org/apache/skywalking/apm/toolkit/trace/ActiveSpan.java
@@ -26,10 +26,24 @@ package org.apache.skywalking.apm.toolkit.trace;
  */
 public class ActiveSpan {
     /**
-     * @param key tag key
+     * @param key   tag key
      * @param value tag value
      */
     public static void tag(String key, String value) {
+    }
+
+    public static void error() {
+    }
+
+    public static void error(String errorMsg) {
+    }
+
+    public static void error(Throwable throwable) {
+    }
+
+    public static void debug(String debugMsg) {
+    }
 
+    public static void info(String infoMsg) {
     }
 }
diff --git 
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanActivation.java
 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanActivation.java
new file mode 100644
index 0000000..79f3fba
--- /dev/null
+++ 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanActivation.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+package org.apache.skywalking.apm.toolkit.activation.trace;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassStaticMethodsEnhancePluginDefine;
+import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.StaticMethodsInterceptPoint;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
+import static 
org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType;
+
+/**
+ * {@link TraceAnnotationActivation} enhance the <code>tag</code> method of 
<code>ActiveSpan</code>
+ * by <code>ActiveSpanTagInterceptor</code>.
+ *
+ * @author zhangxin
+ */
+public class ActiveSpanActivation extends 
ClassStaticMethodsEnhancePluginDefine {
+
+    private static final String ENHANCE_CLASS = 
"org.apache.skywalking.apm.toolkit.trace.ActiveSpan";
+
+    private static final String TAG_INTERCEPTOR_CLASS = 
"org.apache.skywalking.apm.toolkit.activation.trace.ActiveSpanTagInterceptor";
+    private static final String TAG_INTERCEPTOR_METHOD_NAME = "tag";
+
+    private static final String ERROR_INTERCEPTOR_METHOD_NAME = "error";
+    private static final String ERROR_INTERCEPTOR_CLASS = 
"org.apache.skywalking.apm.toolkit.activation.trace.ActiveSpanErrorInterceptor";
+    private static final String ERROR_MSG_INTERCEPTOR_CLASS = 
"org.apache.skywalking.apm.toolkit.activation.trace.ActiveSpanErrorMsgInterceptor";
+    private static final String ERROR_THROWABLE_INTERCEPTOR_CLASS = 
"org.apache.skywalking.apm.toolkit.activation.trace.ActiveSpanErrorThrowableInteceptor";
+
+    private static final String DEBUG_INTERCEPTOR_METHOD_NAME = "debug";
+    private static final String DEBUG_INTERCEPTOR_CLASS = 
"org.apache.skywalking.apm.toolkit.activation.trace.ActiveSpanDebugInterceptor";
+
+    private static final String INFO_INTERCEPTOR_METHOD_NAME = "info";
+    private static final String INFO_INTERCEPTOR_CLASS = 
"org.apache.skywalking.apm.toolkit.activation.trace.ActiveSpanInfoInterceptor";
+
+
+    @Override protected ConstructorInterceptPoint[] 
getConstructorsInterceptPoints() {
+        return new ConstructorInterceptPoint[0];
+    }
+
+    @Override protected StaticMethodsInterceptPoint[] 
getStaticMethodsInterceptPoints() {
+        return new StaticMethodsInterceptPoint[] {
+            new StaticMethodsInterceptPoint() {
+                @Override public ElementMatcher<MethodDescription> 
getMethodsMatcher() {
+                    return named(TAG_INTERCEPTOR_METHOD_NAME);
+                }
+
+                @Override public String getMethodsInterceptor() {
+                    return TAG_INTERCEPTOR_CLASS;
+                }
+
+                @Override public boolean isOverrideArgs() {
+                    return false;
+                }
+            },
+            new StaticMethodsInterceptPoint() {
+                @Override public ElementMatcher<MethodDescription> 
getMethodsMatcher() {
+                    return named(DEBUG_INTERCEPTOR_METHOD_NAME)
+                            .and(takesArgumentWithType(0, "java.lang.String"));
+                }
+
+                @Override public String getMethodsInterceptor() {
+                    return DEBUG_INTERCEPTOR_CLASS;
+                }
+
+                @Override public boolean isOverrideArgs() {
+                    return false;
+                }
+            },
+            new StaticMethodsInterceptPoint() {
+                @Override public ElementMatcher<MethodDescription> 
getMethodsMatcher() {
+                    return named(INFO_INTERCEPTOR_METHOD_NAME)
+                            .and(takesArgumentWithType(0, "java.lang.String"));
+                }
+
+                @Override public String getMethodsInterceptor() {
+                    return INFO_INTERCEPTOR_CLASS;
+                }
+
+                @Override public boolean isOverrideArgs() {
+                    return false;
+                }
+            },
+            new StaticMethodsInterceptPoint() {
+                @Override public ElementMatcher<MethodDescription> 
getMethodsMatcher() {
+                    return named(ERROR_INTERCEPTOR_METHOD_NAME)
+                            .and(takesArgumentWithType(0, 
"java.lang.Throwable"));
+                }
+
+                @Override public String getMethodsInterceptor() {
+                    return ERROR_THROWABLE_INTERCEPTOR_CLASS;
+                }
+
+                @Override public boolean isOverrideArgs() {
+                    return false;
+                }
+            },
+            new StaticMethodsInterceptPoint() {
+                @Override public ElementMatcher<MethodDescription> 
getMethodsMatcher() {
+                    return named(ERROR_INTERCEPTOR_METHOD_NAME)
+                            .and(takesArgumentWithType(0, "java.lang.String"));
+                }
+
+                @Override public String getMethodsInterceptor() {
+                    return ERROR_MSG_INTERCEPTOR_CLASS;
+                }
+
+                @Override public boolean isOverrideArgs() {
+                    return false;
+                }
+            },
+            new StaticMethodsInterceptPoint() {
+                @Override public ElementMatcher<MethodDescription> 
getMethodsMatcher() {
+                    return named(ERROR_INTERCEPTOR_METHOD_NAME)
+                            .and(takesArguments(0));
+                }
+
+                @Override public String getMethodsInterceptor() {
+                    return ERROR_INTERCEPTOR_CLASS;
+                }
+
+                @Override public boolean isOverrideArgs() {
+                    return false;
+                }
+            }
+        };
+    }
+
+    @Override protected ClassMatch enhanceClass() {
+        return NameMatch.byName(ENHANCE_CLASS);
+    }
+}
diff --git 
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanDebugInterceptor.java
 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanDebugInterceptor.java
new file mode 100644
index 0000000..54b5bce
--- /dev/null
+++ 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanDebugInterceptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.toolkit.activation.trace;
+
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author caoyixiong
+ */
+public class ActiveSpanDebugInterceptor implements 
StaticMethodsAroundInterceptor {
+    @Override public void beforeMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                       MethodInterceptResult result) {
+        AbstractSpan activeSpan = null;
+        try {
+            activeSpan = ContextManager.activeSpan();
+            Map<String, String> event = new HashMap<String, String>();
+            event.put("event", "debug");
+            event.put("message", String.valueOf(allArguments[0]));
+            activeSpan.log(System.currentTimeMillis(), event);
+
+        } catch (NullPointerException e) {
+        }
+    }
+
+    @Override public Object afterMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                        Object ret) {
+        return ret;
+    }
+
+    @Override
+    public void handleMethodException(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                      Throwable t) {
+
+    }
+}
diff --git 
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanErrorInterceptor.java
 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanErrorInterceptor.java
new file mode 100644
index 0000000..9dd0363
--- /dev/null
+++ 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanErrorInterceptor.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+package org.apache.skywalking.apm.toolkit.activation.trace;
+
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author caoyixiong
+ */
+public class ActiveSpanErrorInterceptor implements 
StaticMethodsAroundInterceptor {
+    @Override public void beforeMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                       MethodInterceptResult result) {
+        AbstractSpan activeSpan = null;
+        try {
+            activeSpan = ContextManager.activeSpan();
+            activeSpan.errorOccurred();
+        } catch (NullPointerException e) {
+        }
+    }
+
+    @Override public Object afterMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                        Object ret) {
+        return ret;
+    }
+
+    @Override
+    public void handleMethodException(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                      Throwable t) {
+
+    }
+}
\ No newline at end of file
diff --git 
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanErrorMsgInterceptor.java
 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanErrorMsgInterceptor.java
new file mode 100644
index 0000000..647b2f9
--- /dev/null
+++ 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanErrorMsgInterceptor.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.toolkit.activation.trace;
+
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author caoyixiong
+ */
+public class ActiveSpanErrorMsgInterceptor implements 
StaticMethodsAroundInterceptor {
+    @Override public void beforeMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                       MethodInterceptResult result) {
+        AbstractSpan activeSpan = null;
+        try {
+            activeSpan = ContextManager.activeSpan();
+            activeSpan.errorOccurred();
+            Map<String, String> event = new HashMap<String, String>();
+            event.put("event", "error");
+            event.put("message", String.valueOf(allArguments[0]));
+            activeSpan.log(System.currentTimeMillis(), event);
+
+        } catch (NullPointerException e) {
+        }
+    }
+
+    @Override public Object afterMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                        Object ret) {
+        return ret;
+    }
+
+    @Override
+    public void handleMethodException(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                      Throwable t) {
+
+    }
+}
\ No newline at end of file
diff --git 
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanErrorThrowableInteceptor.java
 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanErrorThrowableInteceptor.java
new file mode 100644
index 0000000..e22f18b
--- /dev/null
+++ 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanErrorThrowableInteceptor.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.toolkit.activation.trace;
+
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author caoyixiong
+ */
+public class ActiveSpanErrorThrowableInteceptor implements 
StaticMethodsAroundInterceptor {
+    @Override public void beforeMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                       MethodInterceptResult result) {
+        AbstractSpan activeSpan = null;
+        try {
+            activeSpan = ContextManager.activeSpan();
+            activeSpan.errorOccurred();
+            activeSpan.log((Throwable) allArguments[0]);
+        } catch (NullPointerException e) {
+        }
+    }
+
+    @Override public Object afterMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                        Object ret) {
+        return ret;
+    }
+
+    @Override
+    public void handleMethodException(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                      Throwable t) {
+
+    }
+}
diff --git 
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanInfoInterceptor.java
 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanInfoInterceptor.java
new file mode 100644
index 0000000..ddcb27e
--- /dev/null
+++ 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanInfoInterceptor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.toolkit.activation.trace;
+
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author caoyixiong
+ */
+public class ActiveSpanInfoInterceptor implements 
StaticMethodsAroundInterceptor {
+    @Override public void beforeMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                       MethodInterceptResult result) {
+        AbstractSpan activeSpan = null;
+        try {
+            activeSpan = ContextManager.activeSpan();
+            Map<String, String> event = new HashMap<String, String>();
+            event.put("event", "info");
+            event.put("message", String.valueOf(allArguments[0]));
+            activeSpan.log(System.currentTimeMillis(), event);
+
+        } catch (NullPointerException e) {
+        }
+    }
+
+    @Override public Object afterMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                        Object ret) {
+        return ret;
+    }
+
+    @Override
+    public void handleMethodException(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
+                                      Throwable t) {
+
+    }
+}
diff --git 
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanTagActivation.java
 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanTagActivation.java
deleted file mode 100644
index c71c435..0000000
--- 
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanTagActivation.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-
-package org.apache.skywalking.apm.toolkit.activation.trace;
-
-import net.bytebuddy.description.method.MethodDescription;
-import net.bytebuddy.matcher.ElementMatcher;
-import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassStaticMethodsEnhancePluginDefine;
-import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
-import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
-import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.StaticMethodsInterceptPoint;
-import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
-
-import static net.bytebuddy.matcher.ElementMatchers.named;
-
-/**
- * {@link TraceAnnotationActivation} enhance the <code>tag</code> method of 
<code>ActiveSpan</code>
- * by <code>ActiveSpanTagInterceptor</code>.
- *
- * @author zhangxin
- */
-public class ActiveSpanTagActivation extends 
ClassStaticMethodsEnhancePluginDefine {
-
-    public static final String ENHANCE_CLASS = 
"org.apache.skywalking.apm.toolkit.trace.ActiveSpan";
-    public static final String INTERCEPTOR_CLASS = 
"org.apache.skywalking.apm.toolkit.activation.trace.ActiveSpanTagInterceptor";
-    public static final String INTERCEPTOR_METHOD_NAME = "tag";
-
-    @Override protected ConstructorInterceptPoint[] 
getConstructorsInterceptPoints() {
-        return new ConstructorInterceptPoint[0];
-    }
-
-    @Override protected StaticMethodsInterceptPoint[] 
getStaticMethodsInterceptPoints() {
-        return new StaticMethodsInterceptPoint[] {
-            new StaticMethodsInterceptPoint() {
-                @Override public ElementMatcher<MethodDescription> 
getMethodsMatcher() {
-                    return named(INTERCEPTOR_METHOD_NAME);
-                }
-
-                @Override public String getMethodsInterceptor() {
-                    return INTERCEPTOR_CLASS;
-                }
-
-                @Override public boolean isOverrideArgs() {
-                    return false;
-                }
-            }
-        };
-    }
-
-    @Override protected ClassMatch enhanceClass() {
-        return NameMatch.byName(ENHANCE_CLASS);
-    }
-}
diff --git 
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/resources/skywalking-plugin.def
 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/resources/skywalking-plugin.def
index 2d540d5..a0e2fc8 100644
--- 
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/resources/skywalking-plugin.def
+++ 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/resources/skywalking-plugin.def
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-toolkit-trace=org.apache.skywalking.apm.toolkit.activation.trace.ActiveSpanTagActivation
+toolkit-trace=org.apache.skywalking.apm.toolkit.activation.trace.ActiveSpanActivation
 
toolkit-trace=org.apache.skywalking.apm.toolkit.activation.trace.TraceAnnotationActivation
 
toolkit-trace=org.apache.skywalking.apm.toolkit.activation.trace.TraceContextActivation
 
toolkit-trace=org.apache.skywalking.apm.toolkit.activation.trace.CallableOrRunnableActivation
diff --git 
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanTest.java
 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanTest.java
new file mode 100644
index 0000000..de53303
--- /dev/null
+++ 
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/trace/ActiveSpanTest.java
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.skywalking.apm.toolkit.activation.trace;
+
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import org.apache.skywalking.apm.agent.test.helper.SegmentHelper;
+import org.apache.skywalking.apm.agent.test.tools.*;
+import org.apache.skywalking.apm.toolkit.trace.ActiveSpan;
+import org.apache.skywalking.apm.toolkit.trace.Trace;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.powermock.modules.junit4.PowerMockRunnerDelegate;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author caoyixiong
+ */
+@RunWith(PowerMockRunner.class)
+@PowerMockRunnerDelegate(TracingSegmentRunner.class)
+public class ActiveSpanTest {
+
+    private TraceAnnotationMethodInterceptor methodInterceptor;
+    private ActiveSpanErrorInterceptor activeSpanErrorInterceptor;
+    private ActiveSpanErrorMsgInterceptor activeSpanErrorMsgInterceptor;
+    private ActiveSpanErrorThrowableInteceptor 
activeSpanErrorThrowableInteceptor;
+    private ActiveSpanInfoInterceptor activeSpanInfoInterceptor;
+
+
+    @Mock
+    private EnhancedInstance enhancedInstance;
+    @Rule
+    public AgentServiceRule serviceRule = new AgentServiceRule();
+    @SegmentStoragePoint
+    private SegmentStorage storage;
+
+    private Object[] tagParametersMsg;
+    private Class[] tagParameterTypesMsg;
+
+    private Object[] tagParametersThrowable;
+    private Class[] tagParameterTypesThrowable;
+
+    @Before
+    public void setUp() throws Exception {
+        methodInterceptor = new TraceAnnotationMethodInterceptor();
+        activeSpanErrorInterceptor = new ActiveSpanErrorInterceptor();
+        activeSpanErrorMsgInterceptor = new ActiveSpanErrorMsgInterceptor();
+        activeSpanErrorThrowableInteceptor = new 
ActiveSpanErrorThrowableInteceptor();
+        activeSpanInfoInterceptor = new ActiveSpanInfoInterceptor();
+
+        tagParametersMsg = new Object[]{"testMsgValue"};
+        tagParameterTypesMsg = new Class[]{String.class};
+
+        tagParametersThrowable = new Object[]{new 
RuntimeException("test-Throwable")};
+        tagParameterTypesThrowable = new Class[]{Throwable.class};
+    }
+
+    @Test
+    public void testActiveSpanError() throws Throwable {
+        Method withOperationNameMethod = 
MockActiveSpan.class.getDeclaredMethod("testErrorMethod");
+        methodInterceptor.beforeMethod(enhancedInstance, 
withOperationNameMethod, null, null, null);
+        activeSpanErrorMsgInterceptor.beforeMethod(MockActiveSpan.class, 
withOperationNameMethod, tagParametersMsg, tagParameterTypesMsg, null);
+        activeSpanErrorMsgInterceptor.afterMethod(MockActiveSpan.class, 
withOperationNameMethod, tagParametersMsg, tagParameterTypesMsg, null);
+        methodInterceptor.afterMethod(enhancedInstance, 
withOperationNameMethod, null, null, null);
+
+        assertThat(storage.getTraceSegments().size(), is(1));
+        TraceSegment traceSegment = storage.getTraceSegments().get(0);
+        List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
+        assertThat(spans.size(), is(1));
+
+        AbstractTracingSpan tracingSpan = spans.get(0);
+        Field field = 
AbstractTracingSpan.class.getDeclaredField("errorOccurred");
+        field.setAccessible(true);
+        assertTrue(field.getBoolean(tracingSpan));
+        SpanAssert.assertLogSize(tracingSpan, 1);
+        SpanAssert.assertTagSize(tracingSpan, 0);
+    }
+
+    @Test
+    public void testActiveSpanErrorNoMsg() throws Throwable {
+        Method withOperationNameMethod = 
MockActiveSpan.class.getDeclaredMethod("testErrorNoMsgMethod");
+        methodInterceptor.beforeMethod(enhancedInstance, 
withOperationNameMethod, null, null, null);
+        activeSpanErrorInterceptor.beforeMethod(MockActiveSpan.class, 
withOperationNameMethod, null, null, null);
+        activeSpanErrorInterceptor.afterMethod(MockActiveSpan.class, 
withOperationNameMethod, null, null, null);
+        methodInterceptor.afterMethod(enhancedInstance, 
withOperationNameMethod, null, null, null);
+
+        assertThat(storage.getTraceSegments().size(), is(1));
+        TraceSegment traceSegment = storage.getTraceSegments().get(0);
+        List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
+        assertThat(spans.size(), is(1));
+
+        AbstractTracingSpan tracingSpan = spans.get(0);
+        Field field = 
AbstractTracingSpan.class.getDeclaredField("errorOccurred");
+        field.setAccessible(true);
+        assertTrue(field.getBoolean(tracingSpan));
+        SpanAssert.assertLogSize(tracingSpan, 0);
+        SpanAssert.assertTagSize(tracingSpan, 0);
+    }
+
+    @Test
+    public void testActiveSpanErrorThrowable() throws Throwable {
+        Method withOperationNameMethod = 
MockActiveSpan.class.getDeclaredMethod("testErrorThrowableMethod");
+        methodInterceptor.beforeMethod(enhancedInstance, 
withOperationNameMethod, null, null, null);
+        activeSpanErrorThrowableInteceptor.beforeMethod(MockActiveSpan.class, 
withOperationNameMethod, tagParametersThrowable, tagParameterTypesThrowable, 
null);
+        activeSpanErrorThrowableInteceptor.afterMethod(MockActiveSpan.class, 
withOperationNameMethod, tagParametersThrowable, tagParameterTypesThrowable, 
null);
+        methodInterceptor.afterMethod(enhancedInstance, 
withOperationNameMethod, null, null, null);
+
+        assertThat(storage.getTraceSegments().size(), is(1));
+        TraceSegment traceSegment = storage.getTraceSegments().get(0);
+        List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
+        assertThat(spans.size(), is(1));
+        AbstractTracingSpan tracingSpan = spans.get(0);
+        Field field = 
AbstractTracingSpan.class.getDeclaredField("errorOccurred");
+        field.setAccessible(true);
+        assertTrue(field.getBoolean(tracingSpan));
+        SpanAssert.assertLogSize(tracingSpan, 1);
+        SpanAssert.assertTagSize(tracingSpan, 0);
+    }
+
+    @Test
+    public void testActiveSpanInfo() throws Throwable {
+        Method withOperationNameMethod = 
MockActiveSpan.class.getDeclaredMethod("testInfoMethod");
+        methodInterceptor.beforeMethod(enhancedInstance, 
withOperationNameMethod, null, null, null);
+        activeSpanInfoInterceptor.beforeMethod(MockActiveSpan.class, 
withOperationNameMethod, tagParametersThrowable, tagParameterTypesThrowable, 
null);
+        activeSpanInfoInterceptor.afterMethod(MockActiveSpan.class, 
withOperationNameMethod, tagParametersThrowable, tagParameterTypesThrowable, 
null);
+        methodInterceptor.afterMethod(enhancedInstance, 
withOperationNameMethod, null, null, null);
+
+        assertThat(storage.getTraceSegments().size(), is(1));
+        TraceSegment traceSegment = storage.getTraceSegments().get(0);
+        List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
+        assertThat(spans.size(), is(1));
+
+        AbstractTracingSpan tracingSpan = spans.get(0);
+        SpanAssert.assertLogSize(tracingSpan, 1);
+        SpanAssert.assertTagSize(tracingSpan, 0);
+    }
+
+    private class MockActiveSpan {
+        @Trace
+        public void testErrorMethod() {
+            ActiveSpan.error("testValue");
+        }
+
+        @Trace
+        public void testInfoMethod() {
+            ActiveSpan.info("testValue");
+        }
+
+        @Trace
+        public void testErrorNoMsgMethod() {
+            ActiveSpan.error();
+        }
+
+        @Trace
+        public void testErrorThrowableMethod() {
+            ActiveSpan.error(new RuntimeException("test-Throwable"));
+        }
+    }
+}
diff --git 
a/docs/en/setup/service-agent/java-agent/Application-toolkit-trace.md 
b/docs/en/setup/service-agent/java-agent/Application-toolkit-trace.md
index bbd8df6..16b135e 100644
--- a/docs/en/setup/service-agent/java-agent/Application-toolkit-trace.md
+++ b/docs/en/setup/service-agent/java-agent/Application-toolkit-trace.md
@@ -18,6 +18,20 @@ _Sample codes only_
 
 * Add `@Trace` to any method you want to trace. After that, you can see the 
span in the Stack.
 * Add custom tag in  the context of traced method .
+
+* `ActiveSpan.error()` Mark the current span as error status.
+* `ActiveSpan.error(String errorMsg)` Mark the current span as error status 
with a message.
+* `ActiveSpan.error(Throwable throwable)` Mark the current span as error 
status with a Throwable.
+* `ActiveSpan.debug(String debugMsg)` Add a debug level log message in the 
current span.
+* `ActiveSpan.info(String infoMsg)` Add an info level log message in the 
current span.
+
 ```java
 ActiveSpan.tag("my_tag", "my_value");
+ActiveSpan.error();
+ActiveSpan.error("Test-Error-Reason");
+
+ActiveSpan.error(new RuntimeException("Test-Error-Throwable"));
+ActiveSpan.info("Test-Info-Msg");
+ActiveSpan.debug("Test-debug-Msg");
 ```
+

Reply via email to