diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java
index 1791eb6bf540b0f80f392c3da960411fa706cf0b..86f294ada63d4a3a2151931ca3df1f42a2c20b69 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java
@@ -163,5 +163,19 @@ public class Config {
*/
public static boolean TRACE_DSL = false;
}
+
+ public static class SpringMVC {
+ /**
+ * If true, the fully qualified method name will be used as the endpoint name instead of the request URL, default is false.
+ */
+ public static boolean USE_QUALIFIED_NAME_AS_ENDPOINT_NAME = false;
+ }
+
+ public static class Toolkit {
+ /**
+ * If true, the fully qualified method name will be used as the endpoint name instead of the operation name, default is false.
+ */
+ public static boolean USE_QUALIFIED_NAME_AS_ENDPOINT_NAME = false;
+ }
}
}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInterceptor.java
index b2cb54afe744c3fb5b00e572f483deef6ec8f39a..bb00062fb6e771eed6f71491c9cde9e4d6dbfe75 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInterceptor.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.agent.core.context.CarrierItem;
import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
import org.apache.skywalking.apm.agent.core.context.ContextManager;
@@ -56,12 +57,18 @@ public abstract class AbstractMethodInterceptor implements InstanceMethodsAround
return;
}
- EnhanceRequireObjectCache pathMappingCache = (EnhanceRequireObjectCache)objInst.getSkyWalkingDynamicField();
- String requestURL = pathMappingCache.findPathMapping(method);
- if (requestURL == null) {
- requestURL = getRequestURL(method);
- pathMappingCache.addPathMapping(method, requestURL);
- requestURL = pathMappingCache.findPathMapping(method);
+ String operationName;
+ if (Config.Plugin.SpringMVC.USE_QUALIFIED_NAME_AS_ENDPOINT_NAME) {
+ operationName = getFullyQualifiedMethodName(method);
+ } else {
+ EnhanceRequireObjectCache pathMappingCache = (EnhanceRequireObjectCache)objInst.getSkyWalkingDynamicField();
+ String requestURL = pathMappingCache.findPathMapping(method);
+ if (requestURL == null) {
+ requestURL = getRequestURL(method);
+ pathMappingCache.addPathMapping(method, requestURL);
+ requestURL = pathMappingCache.findPathMapping(method);
+ }
+ operationName = requestURL;
}
HttpServletRequest request = (HttpServletRequest)ContextManager.getRuntimeContext().get(REQUEST_KEY_IN_RUNTIME_CONTEXT);
@@ -73,7 +80,7 @@ public abstract class AbstractMethodInterceptor implements InstanceMethodsAround
next.setHeadValue(request.getHeader(next.getHeadKey()));
}
- AbstractSpan span = ContextManager.createEntrySpan(requestURL, contextCarrier);
+ AbstractSpan span = ContextManager.createEntrySpan(operationName, contextCarrier);
Tags.URL.set(span, request.getRequestURL().toString());
Tags.HTTP.METHOD.set(span, request.getMethod());
span.setComponent(ComponentsDefine.SPRING_MVC_ANNOTATION);
@@ -116,4 +123,17 @@ public abstract class AbstractMethodInterceptor implements InstanceMethodsAround
Class>[] argumentsTypes, Throwable t) {
ContextManager.activeSpan().errorOccurred().log(t);
}
+
+ public static String getFullyQualifiedMethodName(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();
+ }
}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/RequestMappingMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/RequestMappingMethodInterceptor.java
index 1dd6b77481f7fd48014951fe24ce8e8df1020871..fad198d625b6ff1cefb2e9e798affe362c0827d1 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/RequestMappingMethodInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/RequestMappingMethodInterceptor.java
@@ -16,7 +16,6 @@
*
*/
-
package org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -25,20 +24,30 @@ import java.lang.reflect.Method;
/**
* The RequestMappingMethodInterceptor
only use the first mapping value.
- * it will inteceptor with @RequestMapping
+ * it will interceptor with @RequestMapping
*
* @author clevertension
*/
public class RequestMappingMethodInterceptor extends AbstractMethodInterceptor {
@Override
public String getRequestURL(Method method) {
- String requestURL = "";
+ StringBuilder requestURL = new StringBuilder();
RequestMapping methodRequestMapping = method.getAnnotation(RequestMapping.class);
+ if (methodRequestMapping.method().length > 0) {
+ requestURL.append("{");
+ for (int i = 0; i < methodRequestMapping.method().length; i++) {
+ requestURL.append(methodRequestMapping.method()[i].toString());
+ if (methodRequestMapping.method().length > (i + 1)) {
+ requestURL.append(",");
+ }
+ }
+ requestURL = new StringBuilder("}");
+ }
if (methodRequestMapping.value().length > 0) {
- requestURL = methodRequestMapping.value()[0];
+ requestURL.append(methodRequestMapping.value()[0]);
} else if (methodRequestMapping.path().length > 0) {
- requestURL = methodRequestMapping.path()[0];
+ requestURL.append(methodRequestMapping.path()[0]);
}
- return requestURL;
+ return requestURL.toString();
}
}
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/RequestMappingMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/RequestMappingMethodInterceptor.java
index 3bace06cece365fc61a2740a66524c07a6343b28..230e720443c93db5d4d5967f7dc6d963f5c4dfc5 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/RequestMappingMethodInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/RequestMappingMethodInterceptor.java
@@ -15,14 +15,13 @@
* limitations under the License.
*/
-
package org.apache.skywalking.apm.plugin.spring.webflux.v5;
import java.lang.reflect.Method;
import org.springframework.web.bind.annotation.RequestMapping;
/**
- * The RequestMappingMethodInterceptor
only use the first mapping value. it will inteceptor with
+ * The RequestMappingMethodInterceptor
only use the first mapping value. it will interceptor with
* @RequestMapping
*
* @author clevertension
@@ -30,13 +29,23 @@ import org.springframework.web.bind.annotation.RequestMapping;
public class RequestMappingMethodInterceptor extends AbstractMethodInterceptor {
@Override
public String getRequestURL(Method method) {
- String requestURL = "";
+ StringBuilder requestURL = new StringBuilder();
RequestMapping methodRequestMapping = method.getAnnotation(RequestMapping.class);
+ if (methodRequestMapping.method().length > 0) {
+ requestURL.append("{");
+ for (int i = 0; i < methodRequestMapping.method().length; i++) {
+ requestURL.append(methodRequestMapping.method()[i].toString());
+ if (methodRequestMapping.method().length > (i + 1)) {
+ requestURL.append(",");
+ }
+ }
+ requestURL = new StringBuilder("}");
+ }
if (methodRequestMapping.value().length > 0) {
- requestURL = methodRequestMapping.value()[0];
+ requestURL.append(methodRequestMapping.value()[0]);
} else if (methodRequestMapping.path().length > 0) {
- requestURL = methodRequestMapping.path()[0];
+ requestURL.append(methodRequestMapping.path()[0]);
}
- return requestURL;
+ return requestURL.toString();
}
}
diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/TraceAnnotationMethodInterceptor.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/TraceAnnotationMethodInterceptor.java
index dd5d992ae5f60215288f1d85c6d6b56aeb320bd0..2dcb345bf4eebfcde1932405b4d0509eda651d38 100644
--- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/TraceAnnotationMethodInterceptor.java
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/trace/TraceAnnotationMethodInterceptor.java
@@ -20,6 +20,7 @@
package org.apache.skywalking.apm.toolkit.activation.trace;
import java.lang.reflect.Method;
+import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.agent.core.context.ContextManager;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
@@ -39,7 +40,7 @@ public class TraceAnnotationMethodInterceptor implements InstanceMethodsAroundIn
MethodInterceptResult result) throws Throwable {
Trace trace = method.getAnnotation(Trace.class);
String operationName = trace.operationName();
- if (operationName.length() == 0) {
+ if (operationName.length() == 0 || Config.Plugin.Toolkit.USE_QUALIFIED_NAME_AS_ENDPOINT_NAME) {
operationName = generateOperationName(method);
}