diff --git a/apm-application-toolkit/apm-toolkit-trace/pom.xml b/apm-application-toolkit/apm-toolkit-trace/pom.xml
new file mode 100644
index 000000000..a4a5a4ad8
--- /dev/null
+++ b/apm-application-toolkit/apm-toolkit-trace/pom.xml
@@ -0,0 +1,45 @@
+
+
+ apm-application-toolkit
+ org.skywalking
+ 3.2-2017
+
+ 4.0.0
+
+ apm-toolkit-trace
+ jar
+
+ http://maven.apache.org
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+
+ attach-sources
+
+ jar
+
+
+
+ 2.4
+
+
+
+
+
+
+ bintray-wu-sheng-sky-walking-repository
+ wu-sheng-sky-walking-repository
+
+ https://api.bintray.com/maven/wu-sheng/skywalking/org.skywalking.apm-toolkit-trace/;publish=1
+
+
+
+
diff --git a/apm-application-toolkit/apm-toolkit-trace/src/main/java/org/skywalking/apm/toolkit/trace/ActiveSpan.java b/apm-application-toolkit/apm-toolkit-trace/src/main/java/org/skywalking/apm/toolkit/trace/ActiveSpan.java
new file mode 100644
index 000000000..a1776d7a8
--- /dev/null
+++ b/apm-application-toolkit/apm-toolkit-trace/src/main/java/org/skywalking/apm/toolkit/trace/ActiveSpan.java
@@ -0,0 +1,16 @@
+package org.skywalking.apm.toolkit.trace;
+
+/**
+ * provide custom api that set tag for current active span.
+ *
+ * @author zhangxin
+ */
+public class ActiveSpan {
+ /**
+ * @param key tag key
+ * @param value tag value
+ */
+ public static void tag(String key, String value) {
+
+ }
+}
diff --git a/apm-application-toolkit/apm-toolkit-trace/src/main/java/org/skywalking/apm/toolkit/trace/Trace.java b/apm-application-toolkit/apm-toolkit-trace/src/main/java/org/skywalking/apm/toolkit/trace/Trace.java
new file mode 100644
index 000000000..6d5f7f462
--- /dev/null
+++ b/apm-application-toolkit/apm-toolkit-trace/src/main/java/org/skywalking/apm/toolkit/trace/Trace.java
@@ -0,0 +1,22 @@
+package org.skywalking.apm.toolkit.trace;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The agent create local span if the method that annotation with {@link Trace}. The value of span operation name will
+ * fetch by {@link #operationName()}. if the value of {@link #operationName()} is blank string. the operation name will
+ * be set the class name + method name.
+ *
+ * @author zhangxin
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Trace {
+ /**
+ * @return operation name, the default value is blank string.
+ */
+ String operationName() default "";
+}
diff --git a/apm-application-toolkit/pom.xml b/apm-application-toolkit/pom.xml
index c786e2fff..b8f68ffd7 100644
--- a/apm-application-toolkit/pom.xml
+++ b/apm-application-toolkit/pom.xml
@@ -19,5 +19,6 @@
apm-toolkit-logback-1.x
apm-toolkit-trace-context
apm-toolkit-opentracing
+ apm-toolkit-trace
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/match/MethodAnnotationMatch.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/match/MethodAnnotationMatch.java
index b8059aea0..0a91ff56a 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/match/MethodAnnotationMatch.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/match/MethodAnnotationMatch.java
@@ -1,5 +1,6 @@
package org.skywalking.apm.agent.core.plugin.match;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.bytebuddy.description.annotation.AnnotationDescription;
@@ -47,7 +48,7 @@ public class MethodAnnotationMatch implements IndirectMatch {
@Override
public boolean isMatch(TypeDescription typeDescription) {
for (MethodDescription.InDefinedShape methodDescription : typeDescription.getDeclaredMethods()) {
- List annotationList = Arrays.asList(annotations);
+ List annotationList = new ArrayList(Arrays.asList(annotations));
AnnotationList declaredAnnotations = methodDescription.getDeclaredAnnotations();
for (AnnotationDescription annotation : declaredAnnotations) {
diff --git a/apm-sniffer/apm-agent/pom.xml b/apm-sniffer/apm-agent/pom.xml
index bda4d7137..b9d1845b1 100644
--- a/apm-sniffer/apm-agent/pom.xml
+++ b/apm-sniffer/apm-agent/pom.xml
@@ -126,6 +126,12 @@
${project.version}
+
+ org.skywalking
+ apm-toolkit-trace-activation
+ ${project.version}
+
+
skywalking-agent
diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/SpanHelper.java b/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/SpanHelper.java
index 0b752e947..ff5ba7034 100644
--- a/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/SpanHelper.java
+++ b/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/helper/SpanHelper.java
@@ -24,10 +24,16 @@ public class SpanHelper {
public static List getLogs(AbstractSpan tracingSpan) {
try {
- return FieldGetter.get2LevelParentFieldValue(tracingSpan, "logs");
+ List logs = FieldGetter.get2LevelParentFieldValue(tracingSpan, "logs");
+ if (logs != null) {
+ return logs;
+ }
} catch (Exception e) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "logs");
+ List logs = FieldGetter.getParentFieldValue(tracingSpan, "logs");
+ if (logs != null) {
+ return logs;
+ }
} catch (Exception e1) {
}
@@ -38,10 +44,16 @@ public class SpanHelper {
public static List getTags(AbstractSpan tracingSpan) {
try {
- return FieldGetter.get2LevelParentFieldValue(tracingSpan, "tags");
+ List tags = FieldGetter.get2LevelParentFieldValue(tracingSpan, "tags");
+ if (tags != null) {
+ return tags;
+ }
} catch (Exception e) {
try {
- return FieldGetter.getParentFieldValue(tracingSpan, "tags");
+ List tags = FieldGetter.getParentFieldValue(tracingSpan, "tags");
+ if (tags != null) {
+ return tags;
+ }
} catch (Exception e1) {
}
diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/tools/SpanAssert.java b/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/tools/SpanAssert.java
index 584c870f7..ca6280e11 100644
--- a/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/tools/SpanAssert.java
+++ b/apm-sniffer/apm-test-tools/src/main/java/org/skywalking/apm/agent/test/tools/SpanAssert.java
@@ -17,6 +17,10 @@ public class SpanAssert {
assertThat(SpanHelper.getLogs(span).size(), is(exceptedSize));
}
+ public static void assertTagSize(AbstractSpan span, int exceptedSize) {
+ assertThat(SpanHelper.getTags(span).size(), is(exceptedSize));
+ }
+
public static void assertException(LogDataEntity logDataEntity, Class extends Throwable> throwableClass,
String message) {
Assert.assertThat(logDataEntity.getLogs().size(), is(4));
diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/pom.xml
new file mode 100644
index 000000000..ff76498e8
--- /dev/null
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ apm-toolkit-activation
+ org.skywalking
+ 3.2-2017
+
+ 4.0.0
+
+ apm-toolkit-trace-activation
+
+
+
+ org.skywalking
+ apm-toolkit-trace
+ ${project.version}
+ provided
+
+
+
diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/ActiveSpanTagActivation.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/ActiveSpanTagActivation.java
new file mode 100644
index 000000000..ba810d9a9
--- /dev/null
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/ActiveSpanTagActivation.java
@@ -0,0 +1,50 @@
+package org.skywalking.apm.toolkit.activation.trace;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import org.skywalking.apm.agent.core.plugin.interceptor.StaticMethodsInterceptPoint;
+import org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassStaticMethodsEnhancePluginDefine;
+import org.skywalking.apm.agent.core.plugin.match.ClassMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static org.skywalking.apm.agent.core.plugin.match.NameMatch.byName;
+
+/**
+ * {@link TraceAnnotationActivation} enhance the tag method of org.skywalking.apm.toolkit.trace.ActiveSpan
+ * by org.skywalking.apm.toolkit.activation.trace.ActiveSpanTagInterceptor.
+ *
+ * @author zhangxin
+ */
+public class ActiveSpanTagActivation extends ClassStaticMethodsEnhancePluginDefine {
+
+ public static final String ENHANCE_CLASS = "org.skywalking.apm.toolkit.trace.ActiveSpan";
+ public static final String INTERCEPTOR_CLASS = "org.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 getMethodsMatcher() {
+ return named(INTERCEPTOR_METHOD_NAME);
+ }
+
+ @Override public String getMethodsInterceptor() {
+ return INTERCEPTOR_CLASS;
+ }
+
+ @Override public boolean isOverrideArgs() {
+ return false;
+ }
+ }
+ };
+ }
+
+ @Override protected ClassMatch enhanceClass() {
+ return byName(ENHANCE_CLASS);
+ }
+}
diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/ActiveSpanTagInterceptor.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/ActiveSpanTagInterceptor.java
new file mode 100644
index 000000000..17f474133
--- /dev/null
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/ActiveSpanTagInterceptor.java
@@ -0,0 +1,26 @@
+package org.skywalking.apm.toolkit.activation.trace;
+
+import java.lang.reflect.Method;
+import org.skywalking.apm.agent.core.context.ContextManager;
+import org.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor;
+
+public class ActiveSpanTagInterceptor implements StaticMethodsAroundInterceptor {
+ @Override public void beforeMethod(Class clazz, Method method, Object[] allArguments, Class>[] parameterTypes,
+ MethodInterceptResult result) {
+ AbstractSpan activeSpan = ContextManager.activeSpan();
+ activeSpan.tag(String.valueOf(allArguments[0]), String.valueOf(allArguments[1]));
+ }
+
+ @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/skywalking/apm/toolkit/activation/trace/TraceAnnotationActivation.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/TraceAnnotationActivation.java
new file mode 100644
index 000000000..8145fd77a
--- /dev/null
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/TraceAnnotationActivation.java
@@ -0,0 +1,50 @@
+package org.skywalking.apm.toolkit.activation.trace;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import org.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
+import org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.skywalking.apm.agent.core.plugin.match.ClassMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static org.skywalking.apm.agent.core.plugin.match.MethodAnnotationMatch.byMethodAnnotationMatch;
+
+/**
+ * {@link TraceAnnotationActivation} enhance all method that annotated with org.skywalking.apm.toolkit.trace.annotation.Trace
+ * by org.skywalking.apm.toolkit.activation.trace.TraceAnnotationMethodInterceptor.
+ *
+ * @author zhangxin
+ */
+public class TraceAnnotationActivation extends ClassInstanceMethodsEnhancePluginDefine {
+
+ public static final String TRACE_ANNOTATION_METHOD_INTERCEPTOR = "org.skywalking.apm.toolkit.activation.trace.TraceAnnotationMethodInterceptor";
+ public static final String TRACE_ANNOTATION = "org.skywalking.apm.toolkit.trace.annotation.Trace";
+
+ @Override protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
+ return new ConstructorInterceptPoint[0];
+ }
+
+ @Override protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
+ return new InstanceMethodsInterceptPoint[] {
+ new InstanceMethodsInterceptPoint() {
+ @Override public ElementMatcher getMethodsMatcher() {
+ return isAnnotatedWith(named(TRACE_ANNOTATION));
+ }
+
+ @Override public String getMethodsInterceptor() {
+ return TRACE_ANNOTATION_METHOD_INTERCEPTOR;
+ }
+
+ @Override public boolean isOverrideArgs() {
+ return false;
+ }
+ }
+ };
+ }
+
+ @Override protected ClassMatch enhanceClass() {
+ return byMethodAnnotationMatch(new String[] {TRACE_ANNOTATION});
+ }
+}
diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/TraceAnnotationMethodInterceptor.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/TraceAnnotationMethodInterceptor.java
new file mode 100644
index 000000000..39f0988bb
--- /dev/null
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/skywalking/apm/toolkit/activation/trace/TraceAnnotationMethodInterceptor.java
@@ -0,0 +1,54 @@
+package org.skywalking.apm.toolkit.activation.trace;
+
+import java.lang.reflect.Method;
+import org.skywalking.apm.agent.core.context.ContextManager;
+import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.skywalking.apm.toolkit.trace.Trace;
+
+/**
+ * {@link TraceAnnotationMethodInterceptor} create a local span and set the operation name which fetch from
+ * org.skywalking.apm.toolkit.trace.annotation.Trace.operationName. if the fetch value is blank string, and
+ * the operation name will be the method name.
+ *
+ * @author zhangxin
+ */
+public class TraceAnnotationMethodInterceptor implements InstanceMethodsAroundInterceptor {
+ @Override
+ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes,
+ MethodInterceptResult result) throws Throwable {
+ Trace trace = method.getAnnotation(Trace.class);
+ String operationName = trace.operationName();
+ if (operationName.length() == 0) {
+ operationName = generateOperationName(method);
+ }
+
+ ContextManager.createLocalSpan(operationName);
+ }
+
+ private String generateOperationName(Method method) {
+ StringBuilder operationName = new StringBuilder(method.getDeclaringClass().getName() + "." + method.getName() + "(");
+ Class>[] parameterTypes = method.getParameterTypes();
+ for (int i = 0; i < parameterTypes.length; i++) {
+ operationName.append(parameterTypes[i].getName());
+ if (i < (parameterTypes.length - 1)) {
+ operationName.append(",");
+ }
+ }
+ operationName.append(")");
+ return operationName.toString();
+ }
+
+ @Override
+ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes,
+ Object ret) throws Throwable {
+ ContextManager.stopSpan();
+ return ret;
+ }
+
+ @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
+ Class>[] argumentsTypes, Throwable t) {
+ ContextManager.activeSpan().errorOccurred().log(t);
+ }
+}
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
new file mode 100644
index 000000000..42ba1a8e6
--- /dev/null
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/resources/skywalking-plugin.def
@@ -0,0 +1,2 @@
+trace-annotation=org.skywalking.apm.toolkit.activation.trace.ActiveSpanTagActivation
+trace-annotation=org.skywalking.apm.toolkit.activation.trace.TraceAnnotationActivation
diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/test/java/org/skywalking/apm/toolkit/activation/trace/TraceAnnotationTest.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/test/java/org/skywalking/apm/toolkit/activation/trace/TraceAnnotationTest.java
new file mode 100644
index 000000000..ce5350e6f
--- /dev/null
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/test/java/org/skywalking/apm/toolkit/activation/trace/TraceAnnotationTest.java
@@ -0,0 +1,103 @@
+package org.skywalking.apm.toolkit.activation.trace;
+
+import java.lang.reflect.Method;
+import java.util.List;
+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 org.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
+import org.skywalking.apm.agent.core.context.trace.TraceSegment;
+import org.skywalking.apm.agent.core.context.util.KeyValuePair;
+import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import org.skywalking.apm.agent.test.helper.SegmentHelper;
+import org.skywalking.apm.agent.test.helper.SpanHelper;
+import org.skywalking.apm.agent.test.tools.AgentServiceRule;
+import org.skywalking.apm.agent.test.tools.SegmentStorage;
+import org.skywalking.apm.agent.test.tools.SegmentStoragePoint;
+import org.skywalking.apm.agent.test.tools.TracingSegmentRunner;
+import org.skywalking.apm.toolkit.trace.Trace;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.skywalking.apm.agent.test.tools.SpanAssert.assertLogSize;
+import static org.skywalking.apm.agent.test.tools.SpanAssert.assertTagSize;
+
+@RunWith(PowerMockRunner.class)
+@PowerMockRunnerDelegate(TracingSegmentRunner.class)
+public class TraceAnnotationTest {
+
+ @SegmentStoragePoint
+ private SegmentStorage storage;
+
+ @Rule
+ public AgentServiceRule serviceRule = new AgentServiceRule();
+
+ @Mock
+ private EnhancedInstance enhancedInstance;
+
+ private TraceAnnotationMethodInterceptor methodInterceptor;
+ private ActiveSpanTagInterceptor tagInterceptor;
+ private Object[] tagParameters;
+ private Class[] tagParameterTypes;
+
+ @Before
+ public void setUp() throws Exception {
+ methodInterceptor = new TraceAnnotationMethodInterceptor();
+ tagInterceptor = new ActiveSpanTagInterceptor();
+ tagParameters = new Object[] {"testTagKey", "testTagValue"};
+ tagParameterTypes = new Class[] {String.class, String.class};
+ }
+
+ @Test
+ public void testTraceWithOperationName() throws Throwable {
+ Method withOperationNameMethod = TestAnnotationMethodClass.class.getDeclaredMethod("testMethodWithOperationName");
+ methodInterceptor.beforeMethod(enhancedInstance, withOperationNameMethod, null, null, null);
+ tagInterceptor.beforeMethod(TestAnnotationMethodClass.class, withOperationNameMethod, tagParameters, tagParameterTypes, null);
+ tagInterceptor.afterMethod(TestAnnotationMethodClass.class, withOperationNameMethod, tagParameters, tagParameterTypes, null);
+ methodInterceptor.afterMethod(enhancedInstance, withOperationNameMethod, null, null, null);
+
+ assertThat(storage.getTraceSegments().size(), is(1));
+ TraceSegment traceSegment = storage.getTraceSegments().get(0);
+ List spans = SegmentHelper.getSpans(traceSegment);
+ assertThat(spans.size(), is(1));
+
+ AbstractTracingSpan tracingSpan = spans.get(0);
+ assertThat(tracingSpan.getOperationName(), is("testMethod"));
+ assertLogSize(tracingSpan, 0);
+ assertTagSize(tracingSpan, 1);
+ List tags = SpanHelper.getTags(tracingSpan);
+ assertThat(tags.get(0).getKey(), is("testTagKey"));
+ assertThat(tags.get(0).getValue(), is("testTagValue"));
+ }
+
+ @Test
+ public void testTrace() throws Throwable {
+ Method withOperationNameMethod = TestAnnotationMethodClass.class.getDeclaredMethod("testMethodWithDefaultValue");
+ methodInterceptor.beforeMethod(enhancedInstance, withOperationNameMethod, null, null, null);
+ methodInterceptor.afterMethod(enhancedInstance, withOperationNameMethod, null, null, null);
+
+ assertThat(storage.getTraceSegments().size(), is(1));
+ TraceSegment traceSegment = storage.getTraceSegments().get(0);
+ List spans = SegmentHelper.getSpans(traceSegment);
+ assertThat(spans.size(), is(1));
+
+ AbstractTracingSpan tracingSpan = spans.get(0);
+ assertThat(tracingSpan.getOperationName(), is(TestAnnotationMethodClass.class.getName() + "." + withOperationNameMethod.getName() + "()"));
+ assertLogSize(tracingSpan, 0);
+ assertTagSize(tracingSpan, 0);
+ }
+
+ private class TestAnnotationMethodClass {
+ @Trace(operationName = "testMethod")
+ public void testMethodWithOperationName() {
+ }
+
+ @Trace
+ public void testMethodWithDefaultValue() {
+ }
+ }
+}
diff --git a/apm-sniffer/apm-toolkit-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/pom.xml
index 655cfd01f..32b2aa533 100644
--- a/apm-sniffer/apm-toolkit-activation/pom.xml
+++ b/apm-sniffer/apm-toolkit-activation/pom.xml
@@ -15,6 +15,7 @@
apm-toolkit-logback-1.x-activation
apm-toolkit-trace-context-activation
apm-toolkit-opentracing-activation
+ apm-toolkit-trace-activation
apm-toolkit-activation