diff --git a/agent-testweb/jetty-plugin-testweb/README.md b/agent-testweb/jetty-plugin-testweb/README.md
new file mode 100644
index 000000000000..aff94249dcf8
--- /dev/null
+++ b/agent-testweb/jetty-plugin-testweb/README.md
@@ -0,0 +1,13 @@
+
+## Install
+```
+$ mvn install
+```
+
+## Run
+```
+$ mvn exec:java -Dexec.mainClass="com.pinpoint.test.plugin.JettyServerStarterMain"
+```
+You can then access here: http://localhost:18080/
+
+## Stop
diff --git a/agent-testweb/jetty-plugin-testweb/pom.xml b/agent-testweb/jetty-plugin-testweb/pom.xml
new file mode 100644
index 000000000000..b48930001f80
--- /dev/null
+++ b/agent-testweb/jetty-plugin-testweb/pom.xml
@@ -0,0 +1,47 @@
+
+
+ 4.0.0
+
+ com.navercorp.pinpoint
+ pinpoint-agent-testweb
+ 2.5.0-SNAPSHOT
+
+
+ pinpoint-jetty-plugin-testweb
+
+ jar
+
+
+
+ ${pinpoint.agent.default.jvmargument}
+
+ 9.4.42.v20210604
+
+
+
+
+ javax.servlet
+ javax.servlet-api
+ 3.1.0
+ compile
+
+
+ org.eclipse.jetty
+ jetty-server
+ ${jetty.version}
+
+
+ javax.servlet
+ javax.servlet-api
+
+
+
+
+ org.eclipse.jetty
+ jetty-servlet
+ ${jetty.version}
+
+
+
+
\ No newline at end of file
diff --git a/agent-testweb/jetty-plugin-testweb/src/main/java/com/pinpoint/test/plugin/AsyncServlet.java b/agent-testweb/jetty-plugin-testweb/src/main/java/com/pinpoint/test/plugin/AsyncServlet.java
new file mode 100644
index 000000000000..5906d1fe5c86
--- /dev/null
+++ b/agent-testweb/jetty-plugin-testweb/src/main/java/com/pinpoint/test/plugin/AsyncServlet.java
@@ -0,0 +1,42 @@
+package com.pinpoint.test.plugin;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+
+public class AsyncServlet extends HttpServlet {
+ private static final String HEAVY_RESOURCE = "This is some heavy resource that will be served in an async way";
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ ByteBuffer content = ByteBuffer.wrap(HEAVY_RESOURCE.getBytes(StandardCharsets.UTF_8));
+
+ AsyncContext async = request.startAsync();
+ ServletOutputStream out = response.getOutputStream();
+ out.setWriteListener(new WriteListener() {
+ @Override
+ public void onWritePossible() throws IOException {
+ while (out.isReady()) {
+ if (!content.hasRemaining()) {
+ response.setStatus(200);
+ async.complete();
+ return;
+ }
+ out.write(content.get());
+ }
+ }
+
+ @Override
+ public void onError(Throwable t) {
+ getServletContext().log("Async Error", t);
+ async.complete();
+ }
+ });
+ }
+}
diff --git a/agent-testweb/jetty-plugin-testweb/src/main/java/com/pinpoint/test/plugin/BlockingServlet.java b/agent-testweb/jetty-plugin-testweb/src/main/java/com/pinpoint/test/plugin/BlockingServlet.java
new file mode 100644
index 000000000000..7c3de7a43c11
--- /dev/null
+++ b/agent-testweb/jetty-plugin-testweb/src/main/java/com/pinpoint/test/plugin/BlockingServlet.java
@@ -0,0 +1,16 @@
+package com.pinpoint.test.plugin;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+public class BlockingServlet extends HttpServlet {
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ response.setContentType("application/json");
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.getWriter().println("{ \"status\": \"ok\"}");
+ }
+}
diff --git a/agent-testweb/jetty-plugin-testweb/src/main/java/com/pinpoint/test/plugin/JettyServerStarterMain.java b/agent-testweb/jetty-plugin-testweb/src/main/java/com/pinpoint/test/plugin/JettyServerStarterMain.java
new file mode 100644
index 000000000000..6aa790f9e289
--- /dev/null
+++ b/agent-testweb/jetty-plugin-testweb/src/main/java/com/pinpoint/test/plugin/JettyServerStarterMain.java
@@ -0,0 +1,49 @@
+package com.pinpoint.test.plugin;
+
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.servlet.ServletHandler;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+
+public class JettyServerStarterMain {
+
+ private Server server;
+
+ void start() throws Exception {
+
+ int maxThreads = 10;
+ int minThreads = 3;
+ int idleTimeout = 30;
+
+ QueuedThreadPool threadPool = new QueuedThreadPool(maxThreads, minThreads, idleTimeout);
+
+ server = new Server(threadPool);
+ ServerConnector connector = new ServerConnector(server);
+ connector.setPort(18080);
+ server.setConnectors(new Connector[]{connector});
+
+ ServletHandler servletHandler = new ServletHandler();
+ server.setHandler(servletHandler);
+
+ servletHandler.addServletWithMapping(BlockingServlet.class, "/status");
+ servletHandler.addServletWithMapping(AsyncServlet.class, "/async");
+
+ server.start();
+ }
+
+ void stop() throws Exception {
+ if (server != null) {
+ server.stop();
+ }
+ }
+
+ public static void main(String[] args) {
+ JettyServerStarterMain starter = new JettyServerStarterMain();
+ try {
+ starter.start();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/agent-testweb/pom.xml b/agent-testweb/pom.xml
index dd12ed6b8d25..e52d8bb660fa 100644
--- a/agent-testweb/pom.xml
+++ b/agent-testweb/pom.xml
@@ -72,6 +72,7 @@
postgresql-plugin-testweb
undertow-plugin-testweb
redis-lettuce-plugin-testweb
+ jetty-plugin-testweb