Skip to content

Commit b803321

Browse files
committed
Eliminate repeated code with HttpServletRequestWrapper in mvc-annotation-commons
1 parent 762d31f commit b803321

4 files changed

Lines changed: 173 additions & 46 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.apache.skywalking.apm.plugin.spring.mvc.commons;
2+
3+
4+
import java.util.Enumeration;
5+
import java.util.Map;
6+
7+
public interface HttpServletRequestWrapper {
8+
9+
String getHeader(String name);
10+
11+
String getMethod();
12+
13+
StringBuffer getRequestURL();
14+
15+
String getRemoteHost();
16+
17+
Map<String, String[]> getParameterMap();
18+
19+
public Enumeration<String> getHeaders(String name);
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package org.apache.skywalking.apm.plugin.spring.mvc.commons;
2+
3+
4+
import java.util.Enumeration;
5+
import java.util.Map;
6+
7+
public class HttpServletRequestWrappers {
8+
9+
public static HttpServletRequestWrapper wrap(jakarta.servlet.http.HttpServletRequest request) {
10+
return new JakartaHttpServletRequest(request);
11+
}
12+
13+
public static HttpServletRequestWrapper wrap(javax.servlet.http.HttpServletRequest request) {
14+
return new JavaxHttpServletRequest(request);
15+
}
16+
17+
public static class JakartaHttpServletRequest implements HttpServletRequestWrapper {
18+
19+
private jakarta.servlet.http.HttpServletRequest jakartaRequest;
20+
21+
public JakartaHttpServletRequest(jakarta.servlet.http.HttpServletRequest jakartaRequest) {
22+
this.jakartaRequest = jakartaRequest;
23+
}
24+
25+
@Override
26+
public String getHeader(String name) {
27+
return jakartaRequest.getHeader(name);
28+
}
29+
30+
@Override
31+
public String getMethod() {
32+
return jakartaRequest.getMethod();
33+
}
34+
35+
@Override
36+
public StringBuffer getRequestURL() {
37+
return jakartaRequest.getRequestURL();
38+
}
39+
40+
@Override
41+
public String getRemoteHost() {
42+
return jakartaRequest.getRemoteHost();
43+
}
44+
45+
@Override
46+
public Map<String, String[]> getParameterMap() {
47+
return jakartaRequest.getParameterMap();
48+
}
49+
50+
@Override
51+
public Enumeration<String> getHeaders(String name) {
52+
return jakartaRequest.getHeaders(name);
53+
}
54+
55+
56+
}
57+
58+
public static class JavaxHttpServletRequest implements HttpServletRequestWrapper {
59+
private javax.servlet.http.HttpServletRequest javaxRequest;
60+
61+
public JavaxHttpServletRequest(javax.servlet.http.HttpServletRequest javaxRequest) {
62+
this.javaxRequest = javaxRequest;
63+
}
64+
65+
@Override
66+
public String getHeader(String name) {
67+
return javaxRequest.getHeader(name);
68+
}
69+
70+
@Override
71+
public String getMethod() {
72+
return javaxRequest.getMethod();
73+
}
74+
75+
@Override
76+
public StringBuffer getRequestURL() {
77+
return javaxRequest.getRequestURL();
78+
}
79+
80+
@Override
81+
public String getRemoteHost() {
82+
return javaxRequest.getRemoteHost();
83+
}
84+
85+
@Override
86+
public Map<String, String[]> getParameterMap() {
87+
return javaxRequest.getParameterMap();
88+
}
89+
90+
@Override
91+
public Enumeration<String> getHeaders(String name) {
92+
return javaxRequest.getHeaders(name);
93+
}
94+
95+
96+
}
97+
}

apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/RequestUtil.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ public static void collectHttpParam(jakarta.servlet.http.HttpServletRequest requ
5252
}
5353
}
5454

55+
public static void collectHttpParam(HttpServletRequestWrapper request, AbstractSpan span) {
56+
final Map<String, String[]> parameterMap = request.getParameterMap();
57+
if (parameterMap != null && !parameterMap.isEmpty()) {
58+
String tagValue = CollectionUtil.toString(parameterMap);
59+
tagValue = SpringMVCPluginConfig.Plugin.Http.HTTP_PARAMS_LENGTH_THRESHOLD > 0 ?
60+
StringUtil.cut(tagValue, SpringMVCPluginConfig.Plugin.Http.HTTP_PARAMS_LENGTH_THRESHOLD) : tagValue;
61+
Tags.HTTP.PARAMS.set(span, tagValue);
62+
}
63+
}
64+
5565
public static void collectHttpParam(ServerHttpRequest request, AbstractSpan span) {
5666
Map<String, String[]> parameterMap = new HashMap<>(request.getQueryParams().size());
5767
request.getQueryParams().forEach((key, value) -> {
@@ -65,6 +75,25 @@ public static void collectHttpParam(ServerHttpRequest request, AbstractSpan span
6575
}
6676
}
6777

78+
public static void collectHttpHeaders(HttpServletRequestWrapper request, AbstractSpan span) {
79+
final List<String> headersList = new ArrayList<>(SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS.size());
80+
SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS.stream()
81+
.filter(
82+
headerName -> request.getHeaders(headerName) != null)
83+
.forEach(headerName -> {
84+
Enumeration<String> headerValues = request.getHeaders(
85+
headerName);
86+
List<String> valueList = Collections.list(
87+
headerValues);
88+
if (!CollectionUtil.isEmpty(valueList)) {
89+
String headerValue = valueList.toString();
90+
headersList.add(headerName + "=" + headerValue);
91+
}
92+
});
93+
94+
collectHttpHeaders(headersList, span);
95+
}
96+
6897
public static void collectHttpHeaders(HttpServletRequest request, AbstractSpan span) {
6998
final List<String> headersList = new ArrayList<>(SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS.size());
7099
SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS.stream()

apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInterceptor.java

Lines changed: 27 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@
3333
import org.apache.skywalking.apm.agent.core.util.CollectionUtil;
3434
import org.apache.skywalking.apm.agent.core.util.MethodUtil;
3535
import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
36-
import org.apache.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache;
37-
import org.apache.skywalking.apm.plugin.spring.mvc.commons.RequestUtil;
38-
import org.apache.skywalking.apm.plugin.spring.mvc.commons.SpringMVCPluginConfig;
36+
import org.apache.skywalking.apm.plugin.spring.mvc.commons.*;
3937
import org.apache.skywalking.apm.plugin.spring.mvc.commons.exception.IllegalMethodStackDepthException;
4038
import org.apache.skywalking.apm.plugin.spring.mvc.commons.exception.ServletResponseNotFoundException;
4139
import org.springframework.http.server.reactive.ServerHttpRequest;
@@ -113,53 +111,12 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr
113111

114112
if (IN_SERVLET_CONTAINER && IS_JAVAX && HttpServletRequest.class.isAssignableFrom(request.getClass())) {
115113
final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
116-
CarrierItem next = contextCarrier.items();
117-
while (next.hasNext()) {
118-
next = next.next();
119-
next.setHeadValue(httpServletRequest.getHeader(next.getHeadKey()));
120-
}
121-
122-
String operationName = this.buildOperationName(method, httpServletRequest.getMethod(),
123-
(EnhanceRequireObjectCache) objInst.getSkyWalkingDynamicField());
124-
AbstractSpan span = ContextManager.createEntrySpan(operationName, contextCarrier);
125-
Tags.URL.set(span, httpServletRequest.getRequestURL().toString());
126-
Tags.HTTP.METHOD.set(span, httpServletRequest.getMethod());
127-
span.setComponent(ComponentsDefine.SPRING_MVC_ANNOTATION);
128-
SpanLayer.asHttp(span);
114+
handleBeforeMethod(objInst, method, HttpServletRequestWrappers.wrap(httpServletRequest), contextCarrier);
129115

130-
if (SpringMVCPluginConfig.Plugin.SpringMVC.COLLECT_HTTP_PARAMS) {
131-
RequestUtil.collectHttpParam(httpServletRequest, span);
132-
}
133-
134-
if (!CollectionUtil.isEmpty(SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS)) {
135-
RequestUtil.collectHttpHeaders(httpServletRequest, span);
136-
}
137116
} else if (IN_SERVLET_CONTAINER && IS_JAKARTA && jakarta.servlet.http.HttpServletRequest.class.isAssignableFrom(request.getClass())) {
138117
final jakarta.servlet.http.HttpServletRequest httpServletRequest = (jakarta.servlet.http.HttpServletRequest) request;
139-
CarrierItem next = contextCarrier.items();
140-
while (next.hasNext()) {
141-
next = next.next();
142-
next.setHeadValue(httpServletRequest.getHeader(next.getHeadKey()));
143-
}
144-
145-
String operationName =
146-
this.buildOperationName(method, httpServletRequest.getMethod(),
147-
(EnhanceRequireObjectCache) objInst.getSkyWalkingDynamicField());
148-
AbstractSpan span =
149-
ContextManager.createEntrySpan(operationName, contextCarrier);
150-
Tags.URL.set(span, httpServletRequest.getRequestURL().toString());
151-
Tags.HTTP.METHOD.set(span, httpServletRequest.getMethod());
152-
span.setComponent(ComponentsDefine.SPRING_MVC_ANNOTATION);
153-
SpanLayer.asHttp(span);
118+
handleBeforeMethod(objInst, method, HttpServletRequestWrappers.wrap(httpServletRequest), contextCarrier);
154119

155-
if (SpringMVCPluginConfig.Plugin.SpringMVC.COLLECT_HTTP_PARAMS) {
156-
RequestUtil.collectHttpParam(httpServletRequest, span);
157-
}
158-
159-
if (!CollectionUtil
160-
.isEmpty(SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS)) {
161-
RequestUtil.collectHttpHeaders(httpServletRequest, span);
162-
}
163120
} else if (ServerHttpRequest.class.isAssignableFrom(request.getClass())) {
164121
final ServerHttpRequest serverHttpRequest = (ServerHttpRequest) request;
165122
CarrierItem next = contextCarrier.items();
@@ -198,6 +155,30 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr
198155
}
199156
}
200157

158+
private void handleBeforeMethod(EnhancedInstance objInst, Method method,
159+
HttpServletRequestWrapper httpServletRequest, ContextCarrier contextCarrier){
160+
CarrierItem next = contextCarrier.items();
161+
while (next.hasNext()) {
162+
next = next.next();
163+
next.setHeadValue(httpServletRequest.getHeader(next.getHeadKey()));
164+
}
165+
166+
String operationName = this.buildOperationName(method, httpServletRequest.getMethod(),(EnhanceRequireObjectCache) objInst.getSkyWalkingDynamicField());
167+
AbstractSpan span = ContextManager.createEntrySpan(operationName, contextCarrier);
168+
Tags.URL.set(span, httpServletRequest.getRequestURL().toString());
169+
Tags.HTTP.METHOD.set(span, httpServletRequest.getMethod());
170+
span.setComponent(ComponentsDefine.SPRING_MVC_ANNOTATION);
171+
SpanLayer.asHttp(span);
172+
173+
if (SpringMVCPluginConfig.Plugin.SpringMVC.COLLECT_HTTP_PARAMS) {
174+
RequestUtil.collectHttpParam(httpServletRequest, span);
175+
}
176+
177+
if (!CollectionUtil.isEmpty(SpringMVCPluginConfig.Plugin.Http.INCLUDE_HTTP_HEADERS)) {
178+
RequestUtil.collectHttpHeaders(httpServletRequest, span);
179+
}
180+
}
181+
201182
@Override
202183
public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
203184
Object ret) throws Throwable {

0 commit comments

Comments
 (0)