Skip to content

Commit d39aafc

Browse files
committed
[#9599] spring-framework 6 support
1 parent 551cab9 commit d39aafc

File tree

13 files changed

+375
-31
lines changed

13 files changed

+375
-31
lines changed

plugins-it/spring-it/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@
5555
<artifactId>javax.servlet-api</artifactId>
5656
<scope>test</scope>
5757
</dependency>
58+
<dependency>
59+
<groupId>jakarta.servlet</groupId>
60+
<artifactId>jakarta.servlet-api</artifactId>
61+
<scope>test</scope>
62+
</dependency>
5863

5964

6065
<dependency>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.navercorp.pinpoint.plugin.spring.web;
2+
3+
import com.navercorp.pinpoint.bootstrap.plugin.test.Expectations;
4+
import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifier;
5+
import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifierHolder;
6+
import com.navercorp.pinpoint.pluginit.utils.AgentPath;
7+
import com.navercorp.pinpoint.test.plugin.Dependency;
8+
import com.navercorp.pinpoint.test.plugin.ImportPlugin;
9+
import com.navercorp.pinpoint.test.plugin.JvmVersion;
10+
import com.navercorp.pinpoint.test.plugin.PinpointAgent;
11+
import com.navercorp.pinpoint.test.plugin.PinpointPluginTestSuite;
12+
import jakarta.servlet.ServletConfig;
13+
import jakarta.servlet.ServletRequest;
14+
import jakarta.servlet.ServletResponse;
15+
import jakarta.servlet.http.HttpServletRequest;
16+
import jakarta.servlet.http.HttpServletResponse;
17+
import org.junit.Test;
18+
import org.junit.runner.RunWith;
19+
import org.springframework.mock.web.MockHttpServletRequest;
20+
import org.springframework.mock.web.MockHttpServletResponse;
21+
import org.springframework.mock.web.MockServletConfig;
22+
import org.springframework.web.servlet.DispatcherServlet;
23+
import org.springframework.web.servlet.FrameworkServlet;
24+
25+
import java.lang.reflect.Method;
26+
27+
@RunWith(PinpointPluginTestSuite.class)
28+
@PinpointAgent(AgentPath.PATH)
29+
@JvmVersion(17)
30+
@Dependency({"org.springframework:spring-webmvc:[6.0.0.RELEASE,)", "org.springframework:spring-test", "jakarta.servlet:jakarta.servlet-api:6.0.0"})
31+
@ImportPlugin({"com.navercorp.pinpoint:pinpoint-spring-plugin"})
32+
public class SpringWebMvc_6_x_IT {
33+
private static final String SPRING_MVC = "SPRING_MVC";
34+
35+
@Test
36+
public void testRequest() throws Exception {
37+
MockServletConfig config = new MockServletConfig();
38+
MockHttpServletRequest req = new MockHttpServletRequest();
39+
MockHttpServletResponse res = new MockHttpServletResponse();
40+
41+
config.addInitParameter("contextConfigLocation", "classpath:spring-web-test.xml");
42+
req.setMethod("GET");
43+
req.setRequestURI("/");
44+
req.setRemoteAddr("1.2.3.4");
45+
46+
DispatcherServlet servlet = new DispatcherServlet();
47+
DispatcherServlet.class.getMethod("init", ServletConfig.class).invoke(servlet, config);
48+
49+
DispatcherServlet.class.getMethod("service", ServletRequest.class, ServletResponse.class).invoke(servlet, req, res);
50+
51+
Method method = FrameworkServlet.class.getDeclaredMethod("doGet", HttpServletRequest.class, HttpServletResponse.class);
52+
53+
PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance();
54+
verifier.printCache();
55+
56+
verifier.verifyTrace(Expectations.event(SPRING_MVC, method));
57+
verifier.verifyTraceCount(0);
58+
}
59+
}

plugins-it/spring-it/src/test/java/com/navercorp/test/pinpoint/plugin/spring/web/beans/AbstractAutowireCapableBeanFactoryModifier_5_x_IT.java

+23-18
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,12 @@
2020
import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifier;
2121
import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifierHolder;
2222
import com.navercorp.pinpoint.pluginit.utils.AgentPath;
23-
import com.navercorp.pinpoint.test.plugin.*;
23+
import com.navercorp.pinpoint.test.plugin.Dependency;
24+
import com.navercorp.pinpoint.test.plugin.ImportPlugin;
25+
import com.navercorp.pinpoint.test.plugin.JvmVersion;
26+
import com.navercorp.pinpoint.test.plugin.PinpointAgent;
27+
import com.navercorp.pinpoint.test.plugin.PinpointConfig;
28+
import com.navercorp.pinpoint.test.plugin.PinpointPluginTestSuite;
2429
import org.junit.Test;
2530
import org.junit.runner.RunWith;
2631
import org.springframework.context.ApplicationContext;
@@ -29,44 +34,44 @@
2934
@RunWith(PinpointPluginTestSuite.class)
3035
@PinpointAgent(AgentPath.PATH)
3136
@JvmVersion(8)
32-
@Dependency({"org.springframework:spring-context:[5.0.0.RELEASE,)", "cglib:cglib-nodep:3.1"})
37+
@Dependency({"org.springframework:spring-context:[5.0.0.RELEASE,5.max)", "cglib:cglib-nodep:3.1"})
3338
@PinpointConfig("pinpoint-spring-bean-test.config")
3439
@ImportPlugin({"com.navercorp.pinpoint:pinpoint-spring-plugin"})
3540
public class AbstractAutowireCapableBeanFactoryModifier_5_x_IT {
3641

3742
@Test
3843
public void test() throws Exception {
3944
ApplicationContext context = new ClassPathXmlApplicationContext("spring-beans-test.xml");
40-
45+
4146
Maru maru = context.getBean(Maru.class);
4247
maru.publicMethod();
4348
maru.protectedMethod();
44-
45-
Morae morae = (Morae)context.getBean("morae");
49+
50+
Morae morae = (Morae) context.getBean("morae");
4651
morae.doSomething();
47-
48-
Morae duplicatedMorae = (Morae)context.getBean("duplicatedMorae");
52+
53+
Morae duplicatedMorae = (Morae) context.getBean("duplicatedMorae");
4954
duplicatedMorae.doSomething();
5055

51-
Mozzi mozzi = (Mozzi)context.getBean("mozzi");
56+
Mozzi mozzi = (Mozzi) context.getBean("mozzi");
5257
mozzi.doSomething();
53-
54-
Excluded excluded = (Excluded)context.getBean("excluded");
58+
59+
Excluded excluded = (Excluded) context.getBean("excluded");
5560
excluded.doSomething();
56-
57-
Outer outer = (Outer)context.getBean("outer");
61+
62+
Outer outer = (Outer) context.getBean("outer");
5863
outer.doSomething();
59-
64+
6065
Inner inner = outer.getInner();
6166
inner.doSomething();
62-
67+
6368
ProxyTarget proxyTarget = context.getBean(ProxyTarget.class);
6469
proxyTarget.doSomething();
65-
66-
70+
71+
6772
PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance();
6873
verifier.printCache();
69-
74+
7075
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Outer.class.getMethod("setInner", Inner.class)));
7176
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Maru.class.getMethod("publicMethod")));
7277
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Morae.class.getMethod("doSomething")));
@@ -76,7 +81,7 @@ public void test() throws Exception {
7681
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Outer.class.getMethod("getInner")));
7782
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Inner.class.getMethod("doSomething")));
7883
verifier.verifyTrace(Expectations.event("SPRING_BEAN", ProxyTarget.class.getMethod("doSomething")));
79-
84+
8085
verifier.verifyTraceCount(0);
8186
}
8287
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
2+
package com.navercorp.test.pinpoint.plugin.spring.web.beans;
3+
4+
import com.navercorp.pinpoint.bootstrap.plugin.test.Expectations;
5+
import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifier;
6+
import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifierHolder;
7+
import com.navercorp.pinpoint.pluginit.utils.AgentPath;
8+
import com.navercorp.pinpoint.test.plugin.Dependency;
9+
import com.navercorp.pinpoint.test.plugin.ImportPlugin;
10+
import com.navercorp.pinpoint.test.plugin.JvmVersion;
11+
import com.navercorp.pinpoint.test.plugin.PinpointAgent;
12+
import com.navercorp.pinpoint.test.plugin.PinpointConfig;
13+
import com.navercorp.pinpoint.test.plugin.PinpointPluginTestSuite;
14+
import org.junit.Test;
15+
import org.junit.runner.RunWith;
16+
import org.springframework.context.ApplicationContext;
17+
import org.springframework.context.support.ClassPathXmlApplicationContext;
18+
19+
@RunWith(PinpointPluginTestSuite.class)
20+
@PinpointAgent(AgentPath.PATH)
21+
@JvmVersion(17)
22+
@Dependency({"org.springframework:spring-context:[6.0.0.RELEASE,)", "cglib:cglib-nodep:3.1"})
23+
@PinpointConfig("pinpoint-spring-bean-test.config")
24+
@ImportPlugin({"com.navercorp.pinpoint:pinpoint-spring-plugin"})
25+
public class AbstractAutowireCapableBeanFactoryModifier_6_x_IT {
26+
27+
@Test
28+
public void test() throws Exception {
29+
ApplicationContext context = new ClassPathXmlApplicationContext("spring-beans-test.xml");
30+
31+
Maru maru = context.getBean(Maru.class);
32+
maru.publicMethod();
33+
maru.protectedMethod();
34+
35+
Morae morae = (Morae) context.getBean("morae");
36+
morae.doSomething();
37+
38+
Morae duplicatedMorae = (Morae) context.getBean("duplicatedMorae");
39+
duplicatedMorae.doSomething();
40+
41+
Mozzi mozzi = (Mozzi) context.getBean("mozzi");
42+
mozzi.doSomething();
43+
44+
Excluded excluded = (Excluded) context.getBean("excluded");
45+
excluded.doSomething();
46+
47+
Outer outer = (Outer) context.getBean("outer");
48+
outer.doSomething();
49+
50+
Inner inner = outer.getInner();
51+
inner.doSomething();
52+
53+
ProxyTarget proxyTarget = context.getBean(ProxyTarget.class);
54+
proxyTarget.doSomething();
55+
56+
57+
PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance();
58+
verifier.printCache();
59+
60+
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Outer.class.getMethod("setInner", Inner.class)));
61+
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Maru.class.getMethod("publicMethod")));
62+
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Morae.class.getMethod("doSomething")));
63+
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Morae.class.getMethod("doSomething")));
64+
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Mozzi.class.getMethod("doSomething")));
65+
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Outer.class.getMethod("doSomething")));
66+
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Outer.class.getMethod("getInner")));
67+
verifier.verifyTrace(Expectations.event("SPRING_BEAN", Inner.class.getMethod("doSomething")));
68+
verifier.verifyTrace(Expectations.event("SPRING_BEAN", ProxyTarget.class.getMethod("doSomething")));
69+
70+
verifier.verifyTraceCount(0);
71+
}
72+
}

plugins/spring/pom.xml

+20
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,25 @@
4242
<groupId>javax.servlet</groupId>
4343
<artifactId>javax.servlet-api</artifactId>
4444
</dependency>
45+
<dependency>
46+
<groupId>jakarta.servlet</groupId>
47+
<artifactId>jakarta.servlet-api</artifactId>
48+
</dependency>
4549
</dependencies>
50+
51+
<build>
52+
<plugins>
53+
<plugin>
54+
<groupId>org.apache.maven.plugins</groupId>
55+
<artifactId>maven-jar-plugin</artifactId>
56+
<configuration>
57+
<archive>
58+
<manifestEntries>
59+
<Pinpoint-Plugin-Package-Class-Requirements>com.navercorp.pinpoint.plugin.spring.web.javax:javax.servlet.http.HttpServletRequest, com.navercorp.pinpoint.plugin.spring.web.jakarta:jakarta.servlet.http.HttpServletRequest</Pinpoint-Plugin-Package-Class-Requirements>
60+
</manifestEntries>
61+
</archive>
62+
</configuration>
63+
</plugin>
64+
</plugins>
65+
</build>
4666
</project>

plugins/spring/src/main/java/com/navercorp/pinpoint/plugin/spring/web/SpringWebMvcPlugin.java

+49-9
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginSetupContext;
3030
import com.navercorp.pinpoint.plugin.spring.web.interceptor.ExposePathWithinMappingInterceptor;
3131
import com.navercorp.pinpoint.plugin.spring.web.interceptor.InvocableHandlerMethodInvokeForRequestMethodInterceptor;
32-
import com.navercorp.pinpoint.plugin.spring.web.interceptor.LookupHandlerMethodInterceptor;
33-
import com.navercorp.pinpoint.plugin.spring.web.interceptor.ProcessRequestInterceptor;
32+
import com.navercorp.pinpoint.plugin.spring.web.javax.interceptor.LookupHandlerMethodInterceptor;
33+
import com.navercorp.pinpoint.plugin.spring.web.javax.interceptor.ProcessRequestInterceptor;
3434

3535
import java.security.ProtectionDomain;
3636

@@ -64,6 +64,7 @@ public void setup(ProfilerPluginSetupContext context) {
6464
}
6565

6666
}
67+
6768
public static class AbstractHandlerMethodMappingTransform implements TransformCallback {
6869
@Override
6970
public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {
@@ -74,6 +75,13 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader,
7475
if (lookupHandlerMethod != null) {
7576
lookupHandlerMethod.addInterceptor(LookupHandlerMethodInterceptor.class);
7677
}
78+
79+
// Spring 6
80+
final InstrumentMethod lookupHandlerMethodJakarta = target.getDeclaredMethod("lookupHandlerMethod", "java.lang.String", "jakarta.servlet.http.HttpServletRequest");
81+
if (lookupHandlerMethodJakarta != null) {
82+
lookupHandlerMethodJakarta.addInterceptor(com.navercorp.pinpoint.plugin.spring.web.jakarta.interceptor.LookupHandlerMethodInterceptor.class);
83+
}
84+
7785
return target.toBytecode();
7886
}
7987
}
@@ -88,6 +96,13 @@ public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader,
8896
if (exposePathWithinMapping != null) {
8997
exposePathWithinMapping.addInterceptor(ExposePathWithinMappingInterceptor.class);
9098
}
99+
100+
// Spring 6
101+
final InstrumentMethod exposePathWithinMappingJakarta = target.getDeclaredMethod("exposePathWithinMapping", "java.lang.String", "java.lang.String", "jakarta.servlet.http.HttpServletRequest");
102+
if (exposePathWithinMappingJakarta != null) {
103+
exposePathWithinMappingJakarta.addInterceptor(ExposePathWithinMappingInterceptor.class);
104+
}
105+
91106
return target.toBytecode();
92107
}
93108
}
@@ -104,15 +119,40 @@ public FrameworkServletTransform(Boolean uriStatEnable, Boolean uriStatUseUserIn
104119

105120
@Override
106121
public byte[] doInTransform(Instrumentor instrumentor, ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {
107-
InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer);
108-
InstrumentMethod doGet = target.getDeclaredMethod("doGet", "javax.servlet.http.HttpServletRequest", "javax.servlet.http.HttpServletResponse");
109-
doGet.addInterceptor(BasicMethodInterceptor.class, va(SpringWebMvcConstants.SPRING_MVC));
110-
InstrumentMethod doPost = target.getDeclaredMethod("doPost", "javax.servlet.http.HttpServletRequest", "javax.servlet.http.HttpServletResponse");
111-
doPost.addInterceptor(BasicMethodInterceptor.class, va(SpringWebMvcConstants.SPRING_MVC));
122+
final InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer);
123+
124+
final InstrumentMethod doGet = target.getDeclaredMethod("doGet", "javax.servlet.http.HttpServletRequest", "javax.servlet.http.HttpServletResponse");
125+
final InstrumentMethod doPost = target.getDeclaredMethod("doPost", "javax.servlet.http.HttpServletRequest", "javax.servlet.http.HttpServletResponse");
126+
if (doGet != null) {
127+
doGet.addInterceptor(BasicMethodInterceptor.class, va(SpringWebMvcConstants.SPRING_MVC));
128+
}
129+
if (doPost != null) {
130+
doPost.addInterceptor(BasicMethodInterceptor.class, va(SpringWebMvcConstants.SPRING_MVC));
131+
}
132+
133+
// Spring 6
134+
final InstrumentMethod doGetJakarta = target.getDeclaredMethod("doGet", "jakarta.servlet.http.HttpServletRequest", "jakarta.servlet.http.HttpServletResponse");
135+
final InstrumentMethod doPostJakarta = target.getDeclaredMethod("doPost", "jakarta.servlet.http.HttpServletRequest", "jakarta.servlet.http.HttpServletResponse");
136+
if (doGetJakarta != null) {
137+
doGetJakarta.addInterceptor(BasicMethodInterceptor.class, va(SpringWebMvcConstants.SPRING_MVC));
138+
}
139+
if (doPostJakarta != null) {
140+
doPostJakarta.addInterceptor(BasicMethodInterceptor.class, va(SpringWebMvcConstants.SPRING_MVC));
141+
}
142+
112143
if (this.uriStatEnable) {
113-
InstrumentMethod processRequest = target.getDeclaredMethod("processRequest", "javax.servlet.http.HttpServletRequest", "javax.servlet.http.HttpServletResponse");
114-
processRequest.addInterceptor(ProcessRequestInterceptor.class, va(this.uriStatUseUserInput));
144+
final InstrumentMethod processRequest = target.getDeclaredMethod("processRequest", "javax.servlet.http.HttpServletRequest", "javax.servlet.http.HttpServletResponse");
145+
if (processRequest != null) {
146+
processRequest.addInterceptor(ProcessRequestInterceptor.class, va(this.uriStatUseUserInput));
147+
}
148+
149+
// Spring 6
150+
final InstrumentMethod processRequestJakarta = target.getDeclaredMethod("processRequest", "jakarta.servlet.http.HttpServletRequest", "jakarta.servlet.http.HttpServletResponse");
151+
if (processRequestJakarta != null) {
152+
processRequestJakarta.addInterceptor(com.navercorp.pinpoint.plugin.spring.web.jakarta.interceptor.ProcessRequestInterceptor.class, va(this.uriStatUseUserInput));
153+
}
115154
}
155+
116156
return target.toBytecode();
117157
}
118158
}

0 commit comments

Comments
 (0)