Skip to content

Commit 995baa8

Browse files
authored
Convert Jetty 11 groovy to java (#7976)
related to #7195
1 parent 8aff20e commit 995baa8

File tree

2 files changed

+175
-143
lines changed

2 files changed

+175
-143
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.jetty.v11_0;
7+
8+
import static io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES;
9+
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR;
10+
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION;
11+
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD;
12+
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.NOT_FOUND;
13+
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT;
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
16+
import com.google.common.collect.Sets;
17+
import io.opentelemetry.api.common.Attributes;
18+
import io.opentelemetry.api.trace.SpanKind;
19+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
20+
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
21+
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension;
22+
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions;
23+
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
24+
import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
25+
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
26+
import jakarta.servlet.DispatcherType;
27+
import jakarta.servlet.ServletException;
28+
import jakarta.servlet.http.HttpServletRequest;
29+
import jakarta.servlet.http.HttpServletResponse;
30+
import java.io.IOException;
31+
import java.io.Writer;
32+
import java.util.Collections;
33+
import org.eclipse.jetty.server.Request;
34+
import org.eclipse.jetty.server.Response;
35+
import org.eclipse.jetty.server.Server;
36+
import org.eclipse.jetty.server.handler.AbstractHandler;
37+
import org.eclipse.jetty.server.handler.ErrorHandler;
38+
import org.junit.jupiter.api.extension.RegisterExtension;
39+
40+
public class JettyHandlerTest extends AbstractHttpServerTest<Server> {
41+
42+
@RegisterExtension
43+
static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent();
44+
45+
private static final ErrorHandler errorHandler =
46+
new ErrorHandler() {
47+
@Override
48+
protected void handleErrorPage(
49+
HttpServletRequest request, Writer writer, int code, String message)
50+
throws IOException {
51+
Throwable th = (Throwable) request.getAttribute("jakarta.servlet.error.exception");
52+
String errorMsg = th != null ? th.getMessage() : message;
53+
if (errorMsg != null) {
54+
writer.write(errorMsg);
55+
}
56+
}
57+
};
58+
59+
private static final TestHandler testHandler = new TestHandler();
60+
61+
@Override
62+
protected Server setupServer() {
63+
Server server = new Server(port);
64+
server.setHandler(testHandler);
65+
server.addBean(errorHandler);
66+
try {
67+
server.start();
68+
} catch (Exception e) {
69+
throw new RuntimeException(e);
70+
}
71+
return server;
72+
}
73+
74+
@Override
75+
protected void stopServer(Server server) {
76+
try {
77+
server.stop();
78+
} catch (Exception e) {
79+
throw new RuntimeException(e);
80+
}
81+
}
82+
83+
@Override
84+
protected void configure(HttpServerTestOptions options) {
85+
options.setHttpAttributes(
86+
unused ->
87+
Sets.difference(
88+
DEFAULT_HTTP_ATTRIBUTES, Collections.singleton(SemanticAttributes.HTTP_ROUTE)));
89+
options.setHasResponseSpan(endpoint -> endpoint == REDIRECT || endpoint == ERROR);
90+
options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
91+
}
92+
93+
@Override
94+
protected SpanDataAssert assertResponseSpan(
95+
SpanDataAssert span, String method, ServerEndpoint endpoint) {
96+
if (endpoint == REDIRECT) {
97+
span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect"));
98+
} else if (endpoint == ERROR) {
99+
span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendError"));
100+
}
101+
span.hasKind(SpanKind.INTERNAL).hasAttributesSatisfying(Attributes::isEmpty);
102+
return span;
103+
}
104+
105+
private static void handleRequest(Request request, HttpServletResponse response) {
106+
ServerEndpoint endpoint = ServerEndpoint.forPath(request.getRequestURI());
107+
controller(
108+
endpoint,
109+
() -> {
110+
try {
111+
return response(request, response, endpoint);
112+
} catch (IOException e) {
113+
throw new RuntimeException(e);
114+
}
115+
});
116+
}
117+
118+
private static HttpServletResponse response(
119+
Request request, HttpServletResponse response, ServerEndpoint endpoint) throws IOException {
120+
response.setContentType("text/plain");
121+
switch (endpoint) {
122+
case SUCCESS:
123+
response.setStatus(endpoint.getStatus());
124+
response.getWriter().print(endpoint.getBody());
125+
break;
126+
case QUERY_PARAM:
127+
response.setStatus(endpoint.getStatus());
128+
response.getWriter().print(request.getQueryString());
129+
break;
130+
case REDIRECT:
131+
response.sendRedirect(endpoint.getBody());
132+
break;
133+
case ERROR:
134+
response.sendError(endpoint.getStatus(), endpoint.getBody());
135+
break;
136+
case CAPTURE_HEADERS:
137+
response.setHeader("X-Test-Response", request.getHeader("X-Test-Request"));
138+
response.setStatus(endpoint.getStatus());
139+
response.getWriter().print(endpoint.getBody());
140+
break;
141+
case EXCEPTION:
142+
throw new IllegalStateException(endpoint.getBody());
143+
case INDEXED_CHILD:
144+
INDEXED_CHILD.collectSpanAttributes(name -> request.getParameter(name));
145+
response.setStatus(endpoint.getStatus());
146+
response.getWriter().print(endpoint.getBody());
147+
break;
148+
default:
149+
response.setStatus(NOT_FOUND.getStatus());
150+
response.getWriter().print(NOT_FOUND.getBody());
151+
break;
152+
}
153+
return response;
154+
}
155+
156+
private static class TestHandler extends AbstractHandler {
157+
@Override
158+
public void handle(
159+
String target,
160+
Request baseRequest,
161+
HttpServletRequest request,
162+
HttpServletResponse response)
163+
throws IOException, ServletException {
164+
// This line here is to verify that we don't break Jetty if it wants to cast to implementation
165+
// class
166+
Response jettyResponse = (Response) response;
167+
if (baseRequest.getDispatcherType() != DispatcherType.ERROR) {
168+
handleRequest(baseRequest, jettyResponse);
169+
baseRequest.setHandled(true);
170+
} else {
171+
errorHandler.handle(target, baseRequest, baseRequest, response);
172+
}
173+
}
174+
}
175+
}

instrumentation/jetty/jetty-11.0/javaagent/src/test/groovy/JettyHandlerTest.groovy

-143
This file was deleted.

0 commit comments

Comments
 (0)