From 3bbdccc49cc07f87dff808c52aec459a8f59392a Mon Sep 17 00:00:00 2001 From: Enriqueta De Leon Date: Mon, 31 Jul 2023 10:06:53 -0700 Subject: [PATCH] edeleon/nr 80764 (#1329) * added instrumentation for the HttpServlet class in servlet-2.4, servlet-5.0 and servlet-6.0 * added instrumentation for the HttpServlet class in servlet-5.0 * added instrumentation for the HttpServlet class in servlet-6.0 * updated build.gradle --- .../http/HttpServlet_Instrumentation.java | 32 ++ .../http/HttpServlet_Instrumentation.java | 31 ++ .../HttpServletInstrumentationTest.java | 102 +++++ .../servlet/HttpServletTestRequest.java | 379 ++++++++++++++++++ .../servlet/HttpServletTestResponse.java | 196 +++++++++ .../test/java/notjavax/servlet/MyServlet.java | 57 +++ .../servlet-5.0/src/test/resources/debug.yml | 9 + instrumentation/servlet-6.0/build.gradle | 6 + .../http/HttpServlet_Instrumentation.java | 31 ++ .../http/HttpServletInstrumentationTest.java | 109 +++++ .../servlet/http/HttpServletTestRequest.java | 372 +++++++++++++++++ .../servlet/http/HttpServletTestResponse.java | 182 +++++++++ .../notjakarta/servlet/http/MyServlet.java | 57 +++ .../servlet-6.0/src/test/resources/debug.yml | 9 + 14 files changed, 1572 insertions(+) create mode 100644 instrumentation/servlet-2.4/src/main/java/javax/servlet/http/HttpServlet_Instrumentation.java create mode 100644 instrumentation/servlet-5.0/src/main/java/jakarta/servlet/http/HttpServlet_Instrumentation.java create mode 100644 instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletInstrumentationTest.java create mode 100644 instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletTestRequest.java create mode 100644 instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletTestResponse.java create mode 100644 instrumentation/servlet-5.0/src/test/java/notjavax/servlet/MyServlet.java create mode 100644 instrumentation/servlet-5.0/src/test/resources/debug.yml create mode 100644 instrumentation/servlet-6.0/src/main/java/jakarta/servlet/http/HttpServlet_Instrumentation.java create mode 100644 instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletInstrumentationTest.java create mode 100644 instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletTestRequest.java create mode 100644 instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletTestResponse.java create mode 100644 instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/MyServlet.java create mode 100644 instrumentation/servlet-6.0/src/test/resources/debug.yml diff --git a/instrumentation/servlet-2.4/src/main/java/javax/servlet/http/HttpServlet_Instrumentation.java b/instrumentation/servlet-2.4/src/main/java/javax/servlet/http/HttpServlet_Instrumentation.java new file mode 100644 index 0000000000..4f5a899fcf --- /dev/null +++ b/instrumentation/servlet-2.4/src/main/java/javax/servlet/http/HttpServlet_Instrumentation.java @@ -0,0 +1,32 @@ +package javax.servlet.http; + + +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; + +import javax.servlet.ServletException; +import java.io.IOException; + + +@Weave(type = MatchType.BaseClass, originalName = "javax.servlet.http.HttpServlet") +public abstract class HttpServlet_Instrumentation { + + + @Trace + protected abstract void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; + + + @Trace + protected abstract void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; + + + @Trace + protected abstract void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; + + + @Trace + protected abstract void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; + + +} \ No newline at end of file diff --git a/instrumentation/servlet-5.0/src/main/java/jakarta/servlet/http/HttpServlet_Instrumentation.java b/instrumentation/servlet-5.0/src/main/java/jakarta/servlet/http/HttpServlet_Instrumentation.java new file mode 100644 index 0000000000..4df6aed04f --- /dev/null +++ b/instrumentation/servlet-5.0/src/main/java/jakarta/servlet/http/HttpServlet_Instrumentation.java @@ -0,0 +1,31 @@ +package jakarta.servlet.http; + + +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import jakarta.servlet.ServletException; + + +import java.io.IOException; + + +@Weave(type = MatchType.BaseClass, originalName = "jakarta.servlet.http.HttpServlet") +public abstract class HttpServlet_Instrumentation { + + + @Trace + protected abstract void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; + + + @Trace + protected abstract void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; + + + @Trace + protected abstract void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; + + + @Trace + protected abstract void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; +} diff --git a/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletInstrumentationTest.java b/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletInstrumentationTest.java new file mode 100644 index 0000000000..1864da28ff --- /dev/null +++ b/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletInstrumentationTest.java @@ -0,0 +1,102 @@ +package notjavax.servlet; + +import com.newrelic.agent.introspec.*; +import org.junit.Test; +import org.junit.runner.RunWith; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.util.Collection; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +@RunWith(InstrumentationTestRunner.class) +@InstrumentationTestConfig(includePrefixes = "jakarta.servlet", configName = "debug.yml") +public class HttpServletInstrumentationTest { + + @Test + public void doGetShouldAddMetricsForTransaction() throws InterruptedException, ServletException, IOException { + + String currentMethod = "GET"; + String transactionName = "WebTransaction/Uri/Unknown"; + + startTx(currentMethod); + Introspector introspector = InstrumentationTestRunner.getIntrospector(); + Collection traces = introspector.getTransactionTracesForTransaction(transactionName); + Map metricsForTransaction = introspector.getMetricsForTransaction(transactionName); + String methodInTrace = traces.iterator().next().getInitialTraceSegment().getChildren().get(0).getMethodName(); + + assertEquals(1, traces.size()); + assertEquals(2, metricsForTransaction.size()); + assertEquals("doGet", methodInTrace); + assertTrue(metricsForTransaction.containsKey("Java/notjavax.servlet.MyServlet/doGet")); + } + + @Test + public void doPostShouldAddMetricsForTransaction() throws InterruptedException, ServletException, IOException { + + String currentMethod = "POST"; + String transactionName = "WebTransaction/Uri/Unknown"; + + startTx(currentMethod); + Introspector introspector = InstrumentationTestRunner.getIntrospector(); + Collection traces = introspector.getTransactionTracesForTransaction(transactionName); + Map metricsForTransaction = introspector.getMetricsForTransaction(transactionName); + String methodInTrace = traces.iterator().next().getInitialTraceSegment().getChildren().get(0).getMethodName(); + + assertEquals(1, traces.size()); + assertEquals(2, metricsForTransaction.size()); + assertEquals("doPost", methodInTrace); + assertTrue(metricsForTransaction.containsKey("Java/notjavax.servlet.MyServlet/doPost")); + } + + @Test + public void doPutShouldAddMetricsForTransaction() throws InterruptedException, ServletException, IOException { + + String currentMethod = "PUT"; + String transactionName = "WebTransaction/Uri/Unknown"; + + startTx(currentMethod); + Introspector introspector = InstrumentationTestRunner.getIntrospector(); + Collection traces = introspector.getTransactionTracesForTransaction(transactionName); + Map metricsForTransaction = introspector.getMetricsForTransaction(transactionName); + String methodInTrace = traces.iterator().next().getInitialTraceSegment().getChildren().get(0).getMethodName(); + + assertEquals(1, traces.size()); + assertEquals(2, metricsForTransaction.size()); + assertEquals("doPut", methodInTrace); + assertTrue(metricsForTransaction.containsKey("Java/notjavax.servlet.MyServlet/doPut")); + } + + @Test + public void doDeleteShouldAddMetricsForTransaction() throws InterruptedException, ServletException, IOException { + + String currentMethod = "DELETE"; + String transactionName = "WebTransaction/Uri/Unknown"; + + startTx(currentMethod); + Introspector introspector = InstrumentationTestRunner.getIntrospector(); + Collection traces = introspector.getTransactionTracesForTransaction(transactionName); + Map metricsForTransaction = introspector.getMetricsForTransaction(transactionName); + String methodInTrace = traces.iterator().next().getInitialTraceSegment().getChildren().get(0).getMethodName(); + + assertEquals(1, traces.size()); + assertEquals(2, metricsForTransaction.size()); + assertEquals("doDelete", methodInTrace); + assertTrue(metricsForTransaction.containsKey("Java/notjavax.servlet.MyServlet/doDelete")); + } + + private void startTx(String currentMethod) throws ServletException, IOException { + + MyServlet myServlet = new MyServlet(); + HttpServletTestRequest request = new HttpServletTestRequest(); + HttpServletTestResponse response = new HttpServletTestResponse(); + + request.setCurrentMethod(currentMethod); + myServlet.service(request, response); + } +} diff --git a/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletTestRequest.java b/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletTestRequest.java new file mode 100644 index 0000000000..98cd5b4bee --- /dev/null +++ b/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletTestRequest.java @@ -0,0 +1,379 @@ +package notjavax.servlet; + +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; + +import jakarta.servlet.AsyncContext; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import jakarta.servlet.http.HttpUpgradeHandler; +import jakarta.servlet.http.Part; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.Principal; +import java.util.Collection; +import java.util.Enumeration; +import java.util.Locale; +import java.util.Map; + +public class HttpServletTestRequest implements HttpServletRequest { + private String currentMethod; + + public void setCurrentMethod(String currentMethod) { + this.currentMethod = currentMethod; + } + + @Override + public String getAuthType() { + return null; + } + + @Override + public Cookie[] getCookies() { + return new Cookie[0]; + } + + @Override + public long getDateHeader(String name) { + return 0; + } + + @Override + public String getHeader(String name) { + return null; + } + + @Override + public Enumeration getHeaders(String name) { + return null; + } + + @Override + public Enumeration getHeaderNames() { + return null; + } + + @Override + public int getIntHeader(String name) { + return 0; + } + + @Override + public String getMethod() { + return this.currentMethod; + } + + @Override + public String getPathInfo() { + return null; + } + + @Override + public String getPathTranslated() { + return null; + } + + @Override + public String getContextPath() { + return null; + } + + @Override + public String getQueryString() { + return null; + } + + @Override + public String getRemoteUser() { + return null; + } + + @Override + public boolean isUserInRole(String role) { + return false; + } + + @Override + public Principal getUserPrincipal() { + return null; + } + + @Override + public String getRequestedSessionId() { + return null; + } + + @Override + public String getRequestURI() { + return null; + } + + @Override + public StringBuffer getRequestURL() { + return null; + } + + @Override + public String getServletPath() { + return null; + } + + @Override + public HttpSession getSession(boolean create) { + return null; + } + + @Override + public HttpSession getSession() { + return null; + } + + @Override + public String changeSessionId() { + return null; + } + + @Override + public boolean isRequestedSessionIdValid() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromCookie() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromURL() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromUrl() { + return false; + } + + @Override + public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { + return false; + } + + @Override + public void login(String username, String password) throws ServletException { + + } + + @Override + public void logout() throws ServletException { + + } + + @Override + public Collection getParts() throws IOException, ServletException { + return null; + } + + @Override + public Part getPart(String name) throws IOException, ServletException { + return null; + } + + @Override + public T upgrade(Class handlerClass) throws IOException, ServletException { + return null; + } + + @Override + public Object getAttribute(String name) { + return null; + } + + @Override + public Enumeration getAttributeNames() { + return null; + } + + @Override + public String getCharacterEncoding() { + return null; + } + + @Override + public void setCharacterEncoding(String env) throws UnsupportedEncodingException { + + } + + @Override + public int getContentLength() { + return 0; + } + + @Override + public long getContentLengthLong() { + return 0; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public ServletInputStream getInputStream() throws IOException { + return null; + } + + @Override + public String getParameter(String name) { + return null; + } + + @Override + public Enumeration getParameterNames() { + return null; + } + + @Override + public String[] getParameterValues(String name) { + return new String[0]; + } + + @Override + public Map getParameterMap() { + return null; + } + + @Override + public String getProtocol() { + return "1.1"; + } + + @Override + public String getScheme() { + return null; + } + + @Override + public String getServerName() { + return null; + } + + @Override + public int getServerPort() { + return 0; + } + + @Override + public BufferedReader getReader() throws IOException { + return null; + } + + @Override + public String getRemoteAddr() { + return null; + } + + @Override + public String getRemoteHost() { + return null; + } + + @Override + public void setAttribute(String name, Object o) { + + } + + @Override + public void removeAttribute(String name) { + + } + + @Override + public Locale getLocale() { + return null; + } + + @Override + public Enumeration getLocales() { + return null; + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public RequestDispatcher getRequestDispatcher(String path) { + return null; + } + + @Override + public String getRealPath(String path) { + return null; + } + + @Override + public int getRemotePort() { + return 0; + } + + @Override + public String getLocalName() { + return null; + } + + @Override + public String getLocalAddr() { + return null; + } + + @Override + public int getLocalPort() { + return 0; + } + + @Override + public ServletContext getServletContext() { + return null; + } + + @Override + public AsyncContext startAsync() throws IllegalStateException { + return null; + } + + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { + return null; + } + + @Override + public boolean isAsyncStarted() { + return false; + } + + @Override + public boolean isAsyncSupported() { + return false; + } + + @Override + public AsyncContext getAsyncContext() { + return null; + } + + @Override + public DispatcherType getDispatcherType() { + return null; + } +} diff --git a/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletTestResponse.java b/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletTestResponse.java new file mode 100644 index 0000000000..60aab87fa6 --- /dev/null +++ b/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/HttpServletTestResponse.java @@ -0,0 +1,196 @@ +package notjavax.servlet; + +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Collection; +import java.util.Locale; + +public class HttpServletTestResponse implements HttpServletResponse { + @Override + public void addCookie(Cookie cookie) { + + } + + @Override + public boolean containsHeader(String name) { + return false; + } + + @Override + public String encodeURL(String url) { + return null; + } + + @Override + public String encodeRedirectURL(String url) { + return null; + } + + @Override + public String encodeUrl(String url) { + return null; + } + + @Override + public String encodeRedirectUrl(String url) { + return null; + } + + @Override + public void sendError(int sc, String msg) throws IOException { + + } + + @Override + public void sendError(int sc) throws IOException { + + } + + @Override + public void sendRedirect(String location) throws IOException { + + } + + @Override + public void setDateHeader(String name, long date) { + + } + + @Override + public void addDateHeader(String name, long date) { + + } + + @Override + public void setHeader(String name, String value) { + + } + + @Override + public void addHeader(String name, String value) { + + } + + @Override + public void setIntHeader(String name, int value) { + + } + + @Override + public void addIntHeader(String name, int value) { + + } + + @Override + public void setStatus(int sc) { + + } + + @Override + public void setStatus(int sc, String sm) { + + } + + @Override + public int getStatus() { + return 0; + } + + @Override + public String getHeader(String name) { + return null; + } + + @Override + public Collection getHeaders(String name) { + return null; + } + + @Override + public Collection getHeaderNames() { + return null; + } + + @Override + public String getCharacterEncoding() { + return null; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public ServletOutputStream getOutputStream() throws IOException { + return null; + } + + @Override + public PrintWriter getWriter() throws IOException { + return null; + } + + @Override + public void setCharacterEncoding(String charset) { + + } + + @Override + public void setContentLength(int len) { + + } + + @Override + public void setContentLengthLong(long len) { + + } + + @Override + public void setContentType(String type) { + + } + + @Override + public void setBufferSize(int size) { + + } + + @Override + public int getBufferSize() { + return 0; + } + + @Override + public void flushBuffer() throws IOException { + + } + + @Override + public void resetBuffer() { + + } + + @Override + public boolean isCommitted() { + return false; + } + + @Override + public void reset() { + + } + + @Override + public void setLocale(Locale loc) { + + } + + @Override + public Locale getLocale() { + return null; + } +} diff --git a/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/MyServlet.java b/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/MyServlet.java new file mode 100644 index 0000000000..215404eee2 --- /dev/null +++ b/instrumentation/servlet-5.0/src/test/java/notjavax/servlet/MyServlet.java @@ -0,0 +1,57 @@ +package notjavax.servlet; + +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +class MyServlet extends HttpServlet { + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + try { + Thread.sleep(200L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + resp.setStatus(200); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + try { + Thread.sleep(200L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + resp.setStatus(200); + } + + @Override + protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + try { + Thread.sleep(200L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + resp.setStatus(200); + } + + @Override + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + try { + Thread.sleep(200L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + resp.setStatus(200); + } + +} \ No newline at end of file diff --git a/instrumentation/servlet-5.0/src/test/resources/debug.yml b/instrumentation/servlet-5.0/src/test/resources/debug.yml new file mode 100644 index 0000000000..7251bc2bea --- /dev/null +++ b/instrumentation/servlet-5.0/src/test/resources/debug.yml @@ -0,0 +1,9 @@ +common: &default_settings + + app_name: My Application + + log_level: finest + log_file_name: STDOUT + +production: + <<: *default_settings diff --git a/instrumentation/servlet-6.0/build.gradle b/instrumentation/servlet-6.0/build.gradle index 805f83512c..29347b8745 100644 --- a/instrumentation/servlet-6.0/build.gradle +++ b/instrumentation/servlet-6.0/build.gradle @@ -26,3 +26,9 @@ site { title 'Servlet' type 'Framework' } + +test { + onlyIf { + !project.hasProperty('test8') + } +} diff --git a/instrumentation/servlet-6.0/src/main/java/jakarta/servlet/http/HttpServlet_Instrumentation.java b/instrumentation/servlet-6.0/src/main/java/jakarta/servlet/http/HttpServlet_Instrumentation.java new file mode 100644 index 0000000000..8c07ec9fa2 --- /dev/null +++ b/instrumentation/servlet-6.0/src/main/java/jakarta/servlet/http/HttpServlet_Instrumentation.java @@ -0,0 +1,31 @@ +package jakarta.servlet.http; + + +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import jakarta.servlet.ServletException; + + +import java.io.IOException; + + +@Weave(type = MatchType.BaseClass, originalName = "jakarta.servlet.http.HttpServlet") +public abstract class HttpServlet_Instrumentation { + + + @Trace + protected abstract void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; + + + @Trace + protected abstract void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; + + + @Trace + protected abstract void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; + + + @Trace + protected abstract void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException; +} \ No newline at end of file diff --git a/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletInstrumentationTest.java b/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletInstrumentationTest.java new file mode 100644 index 0000000000..9f3564d651 --- /dev/null +++ b/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletInstrumentationTest.java @@ -0,0 +1,109 @@ +package notjakarta.servlet.http; + + +import com.newrelic.agent.introspec.InstrumentationTestConfig; +import com.newrelic.agent.introspec.InstrumentationTestRunner; +import com.newrelic.test.marker.Java8IncompatibleTest; +import jakarta.servlet.ServletException; + +import com.newrelic.agent.introspec.*; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.util.Collection; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +@RunWith(InstrumentationTestRunner.class) +@InstrumentationTestConfig(includePrefixes = "jakarta.servlet", configName = "debug.yml") +@Category({ Java8IncompatibleTest.class }) +public class HttpServletInstrumentationTest { + + @Test + public void doGetShouldAddMetricsForTransaction() throws InterruptedException, ServletException, IOException { + + String currentMethod = "GET"; + String transactionName = "WebTransaction/Uri/Unknown"; + + startTx(currentMethod); + Introspector introspector = InstrumentationTestRunner.getIntrospector(); + Collection traces = introspector.getTransactionTracesForTransaction(transactionName); + Map metricsForTransaction = introspector.getMetricsForTransaction(transactionName); + String methodInTrace = traces.iterator().next().getInitialTraceSegment().getChildren().get(0).getMethodName(); + + assertEquals(1, traces.size()); + assertEquals(2, metricsForTransaction.size()); + assertEquals("doGet", methodInTrace); + assertTrue(metricsForTransaction.containsKey("Java/notjakarta.servlet.http.MyServlet/doGet")); + } + + @Test + public void doPutShouldAddMetricsForTransaction() throws InterruptedException, ServletException, IOException { + + String currentMethod = "PUT"; + String transactionName = "WebTransaction/Uri/Unknown"; + + startTx(currentMethod); + Introspector introspector = InstrumentationTestRunner.getIntrospector(); + Collection traces = introspector.getTransactionTracesForTransaction(transactionName); + Map metricsForTransaction = introspector.getMetricsForTransaction(transactionName); + String methodInTrace = traces.iterator().next().getInitialTraceSegment().getChildren().get(0).getMethodName(); + + assertEquals(1, traces.size()); + assertEquals(2, metricsForTransaction.size()); + assertEquals("doPut", methodInTrace); + assertTrue(metricsForTransaction.containsKey("Java/notjakarta.servlet.http.MyServlet/doPut")); + } + + @Test + public void doPostShouldAddMetricsForTransaction() throws InterruptedException, ServletException, IOException { + + String currentMethod = "POST"; + String transactionName = "WebTransaction/Uri/Unknown"; + + startTx(currentMethod); + Introspector introspector = InstrumentationTestRunner.getIntrospector(); + Collection traces = introspector.getTransactionTracesForTransaction(transactionName); + Map metricsForTransaction = introspector.getMetricsForTransaction(transactionName); + String methodInTrace = traces.iterator().next().getInitialTraceSegment().getChildren().get(0).getMethodName(); + + assertEquals(1, traces.size()); + assertEquals(2, metricsForTransaction.size()); + assertEquals("doPost", methodInTrace); + assertTrue(metricsForTransaction.containsKey("Java/notjakarta.servlet.http.MyServlet/doPost")); + } + + @Test + public void doDeleteShouldAddMetricsForTransaction() throws InterruptedException, ServletException, IOException { + + String currentMethod = "DELETE"; + String transactionName = "WebTransaction/Uri/Unknown"; + + startTx(currentMethod); + Introspector introspector = InstrumentationTestRunner.getIntrospector(); + Collection traces = introspector.getTransactionTracesForTransaction(transactionName); + Map metricsForTransaction = introspector.getMetricsForTransaction(transactionName); + String methodInTrace = traces.iterator().next().getInitialTraceSegment().getChildren().get(0).getMethodName(); + + assertEquals(1, traces.size()); + assertEquals(2, metricsForTransaction.size()); + assertEquals("doDelete", methodInTrace); + assertTrue(metricsForTransaction.containsKey("Java/notjakarta.servlet.http.MyServlet/doDelete")); + } + + private void startTx(String currentMethod) throws ServletException, IOException { + + MyServlet myServlet = new MyServlet(); + HttpServletTestRequest request = new HttpServletTestRequest(); + HttpServletTestResponse response = new HttpServletTestResponse(); + + request.setCurrentMethod(currentMethod); + myServlet.service(request, response); + } + +} diff --git a/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletTestRequest.java b/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletTestRequest.java new file mode 100644 index 0000000000..e24b9f5002 --- /dev/null +++ b/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletTestRequest.java @@ -0,0 +1,372 @@ +package notjakarta.servlet.http; + +import jakarta.servlet.*; +import jakarta.servlet.http.*; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.Principal; +import java.util.Collection; +import java.util.Enumeration; +import java.util.Locale; +import java.util.Map; + +public class HttpServletTestRequest implements HttpServletRequest { + + private String currentMethod; + + public void setCurrentMethod(String currentMethod) { + this.currentMethod = currentMethod; + } + + @Override + public String getAuthType() { + return null; + } + + @Override + public Cookie[] getCookies() { + return new Cookie[0]; + } + + @Override + public long getDateHeader(String s) { + return 0; + } + + @Override + public String getHeader(String s) { + return null; + } + + @Override + public Enumeration getHeaders(String s) { + return null; + } + + @Override + public Enumeration getHeaderNames() { + return null; + } + + @Override + public int getIntHeader(String s) { + return 0; + } + + @Override + public String getMethod() { + return this.currentMethod; + } + + @Override + public String getPathInfo() { + return null; + } + + @Override + public String getPathTranslated() { + return null; + } + + @Override + public String getContextPath() { + return null; + } + + @Override + public String getQueryString() { + return null; + } + + @Override + public String getRemoteUser() { + return null; + } + + @Override + public boolean isUserInRole(String s) { + return false; + } + + @Override + public Principal getUserPrincipal() { + return null; + } + + @Override + public String getRequestedSessionId() { + return null; + } + + @Override + public String getRequestURI() { + return null; + } + + @Override + public StringBuffer getRequestURL() { + return null; + } + + @Override + public String getServletPath() { + return null; + } + + @Override + public HttpSession getSession(boolean b) { + return null; + } + + @Override + public HttpSession getSession() { + return null; + } + + @Override + public String changeSessionId() { + return null; + } + + @Override + public boolean isRequestedSessionIdValid() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromCookie() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromURL() { + return false; + } + + @Override + public boolean authenticate(HttpServletResponse httpServletResponse) throws IOException, ServletException { + return false; + } + + @Override + public void login(String s, String s1) throws ServletException { + + } + + @Override + public void logout() throws ServletException { + + } + + @Override + public Collection getParts() throws IOException, ServletException { + return null; + } + + @Override + public Part getPart(String s) throws IOException, ServletException { + return null; + } + + @Override + public T upgrade(Class aClass) throws IOException, ServletException { + return null; + } + + @Override + public Object getAttribute(String s) { + return null; + } + + @Override + public Enumeration getAttributeNames() { + return null; + } + + @Override + public String getCharacterEncoding() { + return null; + } + + @Override + public void setCharacterEncoding(String s) throws UnsupportedEncodingException { + + } + + @Override + public int getContentLength() { + return 0; + } + + @Override + public long getContentLengthLong() { + return 0; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public ServletInputStream getInputStream() throws IOException { + return null; + } + + @Override + public String getParameter(String s) { + return null; + } + + @Override + public Enumeration getParameterNames() { + return null; + } + + @Override + public String[] getParameterValues(String s) { + return new String[0]; + } + + @Override + public Map getParameterMap() { + return null; + } + + @Override + public String getProtocol() { + return "1.1"; + } + + @Override + public String getScheme() { + return null; + } + + @Override + public String getServerName() { + return null; + } + + @Override + public int getServerPort() { + return 0; + } + + @Override + public BufferedReader getReader() throws IOException { + return null; + } + + @Override + public String getRemoteAddr() { + return null; + } + + @Override + public String getRemoteHost() { + return null; + } + + @Override + public void setAttribute(String s, Object o) { + + } + + @Override + public void removeAttribute(String s) { + + } + + @Override + public Locale getLocale() { + return null; + } + + @Override + public Enumeration getLocales() { + return null; + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public RequestDispatcher getRequestDispatcher(String s) { + return null; + } + + @Override + public int getRemotePort() { + return 0; + } + + @Override + public String getLocalName() { + return null; + } + + @Override + public String getLocalAddr() { + return null; + } + + @Override + public int getLocalPort() { + return 0; + } + + @Override + public ServletContext getServletContext() { + return null; + } + + @Override + public AsyncContext startAsync() throws IllegalStateException { + return null; + } + + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { + return null; + } + + @Override + public boolean isAsyncStarted() { + return false; + } + + @Override + public boolean isAsyncSupported() { + return false; + } + + @Override + public AsyncContext getAsyncContext() { + return null; + } + + @Override + public DispatcherType getDispatcherType() { + return null; + } + + @Override + public String getRequestId() { + return null; + } + + @Override + public String getProtocolRequestId() { + return null; + } + + @Override + public ServletConnection getServletConnection() { + return null; + } +} diff --git a/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletTestResponse.java b/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletTestResponse.java new file mode 100644 index 0000000000..478e709dec --- /dev/null +++ b/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/HttpServletTestResponse.java @@ -0,0 +1,182 @@ +package notjakarta.servlet.http; + +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Collection; +import java.util.Locale; + +public class HttpServletTestResponse implements HttpServletResponse { + @Override + public void addCookie(Cookie cookie) { + + } + + @Override + public boolean containsHeader(String s) { + return false; + } + + @Override + public String encodeURL(String s) { + return null; + } + + @Override + public String encodeRedirectURL(String s) { + return null; + } + + @Override + public void sendError(int i, String s) throws IOException { + + } + + @Override + public void sendError(int i) throws IOException { + + } + + @Override + public void sendRedirect(String s) throws IOException { + + } + + @Override + public void setDateHeader(String s, long l) { + + } + + @Override + public void addDateHeader(String s, long l) { + + } + + @Override + public void setHeader(String s, String s1) { + + } + + @Override + public void addHeader(String s, String s1) { + + } + + @Override + public void setIntHeader(String s, int i) { + + } + + @Override + public void addIntHeader(String s, int i) { + + } + + @Override + public void setStatus(int i) { + + } + + @Override + public int getStatus() { + return 0; + } + + @Override + public String getHeader(String s) { + return null; + } + + @Override + public Collection getHeaders(String s) { + return null; + } + + @Override + public Collection getHeaderNames() { + return null; + } + + @Override + public String getCharacterEncoding() { + return null; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public ServletOutputStream getOutputStream() throws IOException { + return null; + } + + @Override + public PrintWriter getWriter() throws IOException { + return null; + } + + @Override + public void setCharacterEncoding(String s) { + + } + + @Override + public void setContentLength(int i) { + + } + + @Override + public void setContentLengthLong(long l) { + + } + + @Override + public void setContentType(String s) { + + } + + @Override + public void setBufferSize(int i) { + + } + + @Override + public int getBufferSize() { + return 0; + } + + @Override + public void flushBuffer() throws IOException { + + } + + @Override + public void resetBuffer() { + + } + + @Override + public boolean isCommitted() { + return false; + } + + @Override + public void reset() { + + } + + @Override + public void setLocale(Locale locale) { + + } + + @Override + public Locale getLocale() { + return null; + } +} diff --git a/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/MyServlet.java b/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/MyServlet.java new file mode 100644 index 0000000000..017550ede9 --- /dev/null +++ b/instrumentation/servlet-6.0/src/test/java/notjakarta/servlet/http/MyServlet.java @@ -0,0 +1,57 @@ +package notjakarta.servlet.http; + +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +class MyServlet extends HttpServlet { + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + try { + Thread.sleep(200L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + resp.setStatus(200); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + try { + Thread.sleep(200L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + resp.setStatus(200); + } + + @Override + protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + try { + Thread.sleep(200L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + resp.setStatus(200); + } + + @Override + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + try { + Thread.sleep(200L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + resp.setStatus(200); + } + +} \ No newline at end of file diff --git a/instrumentation/servlet-6.0/src/test/resources/debug.yml b/instrumentation/servlet-6.0/src/test/resources/debug.yml new file mode 100644 index 0000000000..7251bc2bea --- /dev/null +++ b/instrumentation/servlet-6.0/src/test/resources/debug.yml @@ -0,0 +1,9 @@ +common: &default_settings + + app_name: My Application + + log_level: finest + log_file_name: STDOUT + +production: + <<: *default_settings