From 90725492d39053675ed4e08e3420bc41ad0ad906 Mon Sep 17 00:00:00 2001
From: xhrg <634789257@qq.com>
Date: Thu, 25 Sep 2025 11:36:32 +0800
Subject: [PATCH 1/4] Fix Jetty client cannot receive the HTTP response body
---
CHANGES.md | 1 +
.../AsyncHttpRequestSendInterceptor.java | 9 +-
.../v90/client/ResponseListenerWrapper.java | 85 ++++++++++++++++++
.../define/HttpRequestInstrumentation.java | 2 +-
.../AsyncHttpRequestSendInterceptor.java | 9 +-
.../v9/client/ResponseListenerWrapper.java | 86 +++++++++++++++++++
.../controller/CaseController.java | 24 ++++--
.../jettyserver/servlet/AsyncCaseServlet.java | 4 +
.../jettyserver/servlet/CaseServlet.java | 4 +
9 files changed, 211 insertions(+), 13 deletions(-)
create mode 100644 apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java
create mode 100644 apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java
diff --git a/CHANGES.md b/CHANGES.md
index 731f74226a..7d9f030558 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -16,6 +16,7 @@ Release Notes.
* Update Maven to 3.6.3 in mvnw.
* Fix OOM due to too many span logs.
* Fix ClassLoader cache OOM issue with WeakHashMap.
+* Fix Jetty client cannot receive the HTTP response body.
All issues and pull requests are [here](https://github.com/apache/skywalking/milestone/242?closed=1)
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java
index 669b43ffda..33b0531b41 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java
@@ -58,8 +58,13 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr
span.prepareForAsync();
request.attribute(Constants.SW_JETTY_EXIT_SPAN_KEY, span);
- Response.CompleteListener callback = (Response.CompleteListener) allArguments[0];
- allArguments[0] = new CompleteListenerWrapper(callback, ContextManager.capture());
+ if (allArguments[0] instanceof Response.Listener) {
+ Response.Listener callback = (Response.Listener) allArguments[0];
+ allArguments[0] = new ResponseListenerWrapper(callback, ContextManager.capture());
+ } else {
+ Response.CompleteListener callback = (Response.CompleteListener) allArguments[0];
+ allArguments[0] = new CompleteListenerWrapper(callback, ContextManager.capture());
+ }
}
@Override
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java
new file mode 100644
index 0000000000..7be4e8fe1f
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.plugin.jetty.v90.client;
+
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+import org.eclipse.jetty.client.api.Response;
+import org.eclipse.jetty.client.api.Result;
+import org.eclipse.jetty.http.HttpField;
+import java.nio.ByteBuffer;
+
+public class ResponseListenerWrapper implements Response.Listener {
+
+ private final Response.Listener callback;
+
+ private final ContextSnapshot context;
+
+ public ResponseListenerWrapper(Response.Listener callback, ContextSnapshot context) {
+ this.callback = callback;
+ this.context = context;
+ }
+
+ @Override
+ public void onComplete(Result result) {
+ AbstractSpan span = ContextManager.createLocalSpan(Constants.PLUGIN_NAME + "/CompleteListener/onComplete");
+ span.setComponent(ComponentsDefine.JETTY_CLIENT);
+ SpanLayer.asHttp(span);
+ if (context != null) {
+ ContextManager.continued(context);
+ }
+ if (callback != null) {
+ callback.onComplete(result);
+ }
+ ContextManager.stopSpan();
+ }
+
+ @Override
+ public void onHeaders(Response response) {
+ callback.onHeaders(response);
+ }
+
+ @Override
+ public void onContent(Response response, ByteBuffer content) {
+ callback.onContent(response, content);
+ }
+
+ @Override
+ public void onBegin(Response response) {
+ callback.onBegin(response);
+ }
+
+ @Override
+ public boolean onHeader(Response response, HttpField field) {
+ return callback.onHeader(response, field);
+ }
+
+ @Override
+ public void onSuccess(Response response) {
+ callback.onSuccess(response);
+ }
+
+ @Override
+ public void onFailure(Response response, Throwable failure) {
+ callback.onFailure(response, failure);
+ }
+}
\ No newline at end of file
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java
index ef8daf105a..4d701c14af 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java
@@ -41,7 +41,7 @@ public class HttpRequestInstrumentation extends ClassInstanceMethodsEnhancePlugi
private static final String ENHANCE_CLASS = "org.eclipse.jetty.client.HttpRequest";
private static final String ENHANCE_CLASS_NAME = "send";
public static final String SYNC_SEND_INTERCEPTOR =
- "org.apache.skywalking.apm.plugin.jetty.v90.client.SyncHttpRequestSendV90Interceptor";
+ "org.apache.skywalking.apm.plugin.jetty.v90.client.SyncHttpRequestSendInterceptor";
public static final String ASYNC_SEND_INTERCEPTOR =
"org.apache.skywalking.apm.plugin.jetty.v90.client.AsyncHttpRequestSendInterceptor";
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java
index 6f8870af49..fa7f12b49b 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java
@@ -57,8 +57,13 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr
span.prepareForAsync();
request.attribute(Constants.SW_JETTY_EXIT_SPAN_KEY, span);
- Response.CompleteListener callback = (Response.CompleteListener) allArguments[0];
- allArguments[0] = new CompleteListenerWrapper(callback, ContextManager.capture());
+ if (allArguments[0] instanceof Response.Listener) {
+ Response.Listener callback = (Response.Listener) allArguments[0];
+ allArguments[0] = new ResponseListenerWrapper(callback, ContextManager.capture());
+ } else {
+ Response.CompleteListener callback = (Response.CompleteListener) allArguments[0];
+ allArguments[0] = new CompleteListenerWrapper(callback, ContextManager.capture());
+ }
}
@Override
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java
new file mode 100644
index 0000000000..49ad2e8f1e
--- /dev/null
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.apm.plugin.jetty.v9.client;
+
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+import org.eclipse.jetty.client.api.Response;
+import org.eclipse.jetty.client.api.Result;
+import org.eclipse.jetty.http.HttpField;
+
+import java.nio.ByteBuffer;
+
+public class ResponseListenerWrapper implements Response.Listener {
+
+ private final Response.Listener callback;
+
+ private final ContextSnapshot context;
+
+ public ResponseListenerWrapper(Response.Listener callback, ContextSnapshot context) {
+ this.callback = callback;
+ this.context = context;
+ }
+
+ @Override
+ public void onComplete(Result result) {
+ AbstractSpan span = ContextManager.createLocalSpan(Constants.PLUGIN_NAME + "/CompleteListener/onComplete");
+ span.setComponent(ComponentsDefine.JETTY_CLIENT);
+ SpanLayer.asHttp(span);
+ if (context != null) {
+ ContextManager.continued(context);
+ }
+ if (callback != null) {
+ callback.onComplete(result);
+ }
+ ContextManager.stopSpan();
+ }
+
+ @Override
+ public void onHeaders(Response response) {
+ callback.onHeaders(response);
+ }
+
+ @Override
+ public void onContent(Response response, ByteBuffer content) {
+ callback.onContent(response, content);
+ }
+
+ @Override
+ public void onBegin(Response response) {
+ callback.onBegin(response);
+ }
+
+ @Override
+ public boolean onHeader(Response response, HttpField field) {
+ return callback.onHeader(response, field);
+ }
+
+ @Override
+ public void onSuccess(Response response) {
+ callback.onSuccess(response);
+ }
+
+ @Override
+ public void onFailure(Response response, Throwable failure) {
+ callback.onFailure(response, failure);
+ }
+}
\ No newline at end of file
diff --git a/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java b/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java
index d45d8adfed..4e31db9383 100644
--- a/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java
+++ b/test/plugin/scenarios/jetty-scenario/jettyclient-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyclient/controller/CaseController.java
@@ -16,7 +16,7 @@
*
*/
-package org.apache.skywalking.apm.testcase.jettyclient.contr;
+package org.apache.skywalking.apm.testcase.jettyclient.controller;
import javax.annotation.PostConstruct;
import java.io.IOException;
@@ -26,6 +26,8 @@
import org.apache.http.impl.client.HttpClients;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.Response;
+import org.eclipse.jetty.client.api.Result;
+import org.eclipse.jetty.client.util.BufferingResponseListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Controller;
@@ -51,13 +53,19 @@ public void init() throws Exception {
@ResponseBody
public String jettyClientScenario() throws Exception {
client.newRequest("http://" + jettyServerHost + ":18080/jettyserver-case/case/receiveContext-0").send();
- Response.CompleteListener listener = result -> {
- CloseableHttpClient httpclient = HttpClients.createDefault();
- HttpGet httpget = new HttpGet("http://" + jettyServerHost + ":18080/jettyserver-case/case/receiveContext-0");
- try {
- httpclient.execute(httpget);
- } catch (IOException e) {
- throw new RuntimeException(e);
+ Response.Listener listener = new BufferingResponseListener() {
+ public void onComplete(Result result) {
+ byte[] bytes = this.getContent();
+ if (bytes == null || bytes.length == 0) {
+ throw new RuntimeException("content cant be empty");
+ }
+ CloseableHttpClient httpclient = HttpClients.createDefault();
+ HttpGet httpget = new HttpGet("http://" + jettyServerHost + ":18080/jettyserver-case/case/receiveContext-0");
+ try {
+ httpclient.execute(httpget);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
}
};
client.newRequest("http://" + jettyServerHost + ":18080/jettyserver-case/case/receiveContext-1").send(listener);
diff --git a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java
index 667fdafd16..4075fc0e34 100644
--- a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java
+++ b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/AsyncCaseServlet.java
@@ -19,6 +19,7 @@
package org.apache.skywalking.apm.testcase.jettyserver.servlet;
import java.io.IOException;
+import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@@ -31,6 +32,9 @@ public class AsyncCaseServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
Thread.sleep(2000);
+ resp.setContentType("text/plain;charset=UTF-8");
+ PrintWriter out = resp.getWriter();
+ out.print("Success");
} catch (InterruptedException e) {
}
}
diff --git a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java
index 9dfae15f64..22b6eeac90 100644
--- a/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java
+++ b/test/plugin/scenarios/jetty-scenario/jettyserver-scenario/src/main/java/org/apache/skywalking/apm/testcase/jettyserver/servlet/CaseServlet.java
@@ -19,6 +19,7 @@
package org.apache.skywalking.apm.testcase.jettyserver.servlet;
import java.io.IOException;
+import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@@ -31,6 +32,9 @@ public class CaseServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
Thread.sleep(2000);
+ resp.setContentType("text/plain;charset=UTF-8");
+ PrintWriter out = resp.getWriter();
+ out.print("Success");
} catch (InterruptedException e) {
}
}
From 568a158aac43f8e82e74dbe87d180d395421986a Mon Sep 17 00:00:00 2001
From: xhrg <634789257@qq.com>
Date: Thu, 25 Sep 2025 13:28:59 +0800
Subject: [PATCH 2/4] fix jetty-client-9.0 class name error and isOverrideArgs
error
---
.../jetty/v90/client/define/HttpRequestInstrumentation.java | 2 +-
.../v90/client/define/ResponseNotifierInstrumentation.java | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java
index 4d701c14af..2bee7ecdc1 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/HttpRequestInstrumentation.java
@@ -85,7 +85,7 @@ public String getMethodsInterceptor() {
@Override
public boolean isOverrideArgs() {
- return false;
+ return true;
}
}
};
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java
index c4f39c4147..5502c8dc78 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/define/ResponseNotifierInstrumentation.java
@@ -41,10 +41,10 @@
*/
public class ResponseNotifierInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
- private static final String ENHANCE_CLASS = "org.eclipse.jetty.client.tar";
+ private static final String ENHANCE_CLASS = "org.eclipse.jetty.client.ResponseNotifier";
private static final String ENHANCE_CLASS_NAME = "notifyComplete";
public static final String SYNC_SEND_INTERCEPTOR =
- "org.apache.skywalking.apm.plugin.jetty.v9.client.ResponseNotifierInterceptor";
+ "org.apache.skywalking.apm.plugin.jetty.v90.client.ResponseNotifierInterceptor";
@Override
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
From edaa3af91a193535fea3d6e416ddc0913ccc7d9d Mon Sep 17 00:00:00 2001
From: xhrg <634789257@qq.com>
Date: Thu, 25 Sep 2025 17:10:54 +0800
Subject: [PATCH 3/4] Add compatibility for the AsyncContentListener interface
and modify callback names
---
.../AsyncHttpRequestSendInterceptor.java | 8 +++---
.../v90/client/CompleteListenerWrapper.java | 12 ++++----
.../v90/client/ResponseListenerWrapper.java | 22 +++++++--------
.../jetty-client-9.x-plugin/pom.xml | 2 +-
.../AsyncHttpRequestSendInterceptor.java | 8 +++---
.../v9/client/CompleteListenerWrapper.java | 12 ++++----
.../v9/client/ResponseListenerWrapper.java | 28 +++++++++++--------
7 files changed, 49 insertions(+), 43 deletions(-)
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java
index 33b0531b41..2858afce44 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/AsyncHttpRequestSendInterceptor.java
@@ -59,11 +59,11 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr
span.prepareForAsync();
request.attribute(Constants.SW_JETTY_EXIT_SPAN_KEY, span);
if (allArguments[0] instanceof Response.Listener) {
- Response.Listener callback = (Response.Listener) allArguments[0];
- allArguments[0] = new ResponseListenerWrapper(callback, ContextManager.capture());
+ Response.Listener listener = (Response.Listener) allArguments[0];
+ allArguments[0] = new ResponseListenerWrapper(listener, ContextManager.capture());
} else {
- Response.CompleteListener callback = (Response.CompleteListener) allArguments[0];
- allArguments[0] = new CompleteListenerWrapper(callback, ContextManager.capture());
+ Response.CompleteListener listener = (Response.CompleteListener) allArguments[0];
+ allArguments[0] = new CompleteListenerWrapper(listener, ContextManager.capture());
}
}
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java
index 0318bd4c00..294b32fe7d 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/CompleteListenerWrapper.java
@@ -27,11 +27,11 @@
import org.eclipse.jetty.client.api.Result;
public class CompleteListenerWrapper implements Response.CompleteListener {
- private Response.CompleteListener callback;
+ private Response.CompleteListener listener;
private ContextSnapshot context;
- public CompleteListenerWrapper(Response.CompleteListener callback, ContextSnapshot context) {
- this.callback = callback;
+ public CompleteListenerWrapper(Response.CompleteListener listener, ContextSnapshot context) {
+ this.listener = listener;
this.context = context;
}
@@ -43,9 +43,9 @@ public void onComplete(Result result) {
if (context != null) {
ContextManager.continued(context);
}
- if (callback != null) {
- callback.onComplete(result);
+ if (listener != null) {
+ listener.onComplete(result);
}
ContextManager.stopSpan();
}
-}
+}
\ No newline at end of file
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java
index 7be4e8fe1f..cf3e097dda 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v90/client/ResponseListenerWrapper.java
@@ -30,12 +30,12 @@
public class ResponseListenerWrapper implements Response.Listener {
- private final Response.Listener callback;
+ private final Response.Listener listener;
private final ContextSnapshot context;
- public ResponseListenerWrapper(Response.Listener callback, ContextSnapshot context) {
- this.callback = callback;
+ public ResponseListenerWrapper(Response.Listener listener, ContextSnapshot context) {
+ this.listener = listener;
this.context = context;
}
@@ -47,39 +47,39 @@ public void onComplete(Result result) {
if (context != null) {
ContextManager.continued(context);
}
- if (callback != null) {
- callback.onComplete(result);
+ if (listener != null) {
+ listener.onComplete(result);
}
ContextManager.stopSpan();
}
@Override
public void onHeaders(Response response) {
- callback.onHeaders(response);
+ listener.onHeaders(response);
}
@Override
public void onContent(Response response, ByteBuffer content) {
- callback.onContent(response, content);
+ listener.onContent(response, content);
}
@Override
public void onBegin(Response response) {
- callback.onBegin(response);
+ listener.onBegin(response);
}
@Override
public boolean onHeader(Response response, HttpField field) {
- return callback.onHeader(response, field);
+ return listener.onHeader(response, field);
}
@Override
public void onSuccess(Response response) {
- callback.onSuccess(response);
+ listener.onSuccess(response);
}
@Override
public void onFailure(Response response, Throwable failure) {
- callback.onFailure(response, failure);
+ listener.onFailure(response, failure);
}
}
\ No newline at end of file
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml
index 6b92929f8b..229c401f21 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml
@@ -31,7 +31,7 @@
http://maven.apache.org
- 9.1.0.v20131115
+ 9.2.23.v20171218
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java
index fa7f12b49b..6f39452e0c 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptor.java
@@ -58,11 +58,11 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr
span.prepareForAsync();
request.attribute(Constants.SW_JETTY_EXIT_SPAN_KEY, span);
if (allArguments[0] instanceof Response.Listener) {
- Response.Listener callback = (Response.Listener) allArguments[0];
- allArguments[0] = new ResponseListenerWrapper(callback, ContextManager.capture());
+ Response.Listener listener = (Response.Listener) allArguments[0];
+ allArguments[0] = new ResponseListenerWrapper(listener, ContextManager.capture());
} else {
- Response.CompleteListener callback = (Response.CompleteListener) allArguments[0];
- allArguments[0] = new CompleteListenerWrapper(callback, ContextManager.capture());
+ Response.CompleteListener listener = (Response.CompleteListener) allArguments[0];
+ allArguments[0] = new CompleteListenerWrapper(listener, ContextManager.capture());
}
}
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java
index 50697bf3e4..156e636884 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/CompleteListenerWrapper.java
@@ -27,11 +27,11 @@
import org.eclipse.jetty.client.api.Result;
public class CompleteListenerWrapper implements Response.CompleteListener {
- private Response.CompleteListener callback;
+ private Response.CompleteListener listener;
private ContextSnapshot context;
- public CompleteListenerWrapper(Response.CompleteListener callback, ContextSnapshot context) {
- this.callback = callback;
+ public CompleteListenerWrapper(Response.CompleteListener listener, ContextSnapshot context) {
+ this.listener = listener;
this.context = context;
}
@@ -43,9 +43,9 @@ public void onComplete(Result result) {
if (context != null) {
ContextManager.continued(context);
}
- if (callback != null) {
- callback.onComplete(result);
+ if (listener != null) {
+ listener.onComplete(result);
}
ContextManager.stopSpan();
}
-}
+}
\ No newline at end of file
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java
index 49ad2e8f1e..09102cdc43 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jetty/v9/client/ResponseListenerWrapper.java
@@ -26,17 +26,18 @@
import org.eclipse.jetty.client.api.Response;
import org.eclipse.jetty.client.api.Result;
import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.util.Callback;
import java.nio.ByteBuffer;
public class ResponseListenerWrapper implements Response.Listener {
- private final Response.Listener callback;
+ private final Response.Listener listener;
private final ContextSnapshot context;
- public ResponseListenerWrapper(Response.Listener callback, ContextSnapshot context) {
- this.callback = callback;
+ public ResponseListenerWrapper(Response.Listener listener, ContextSnapshot context) {
+ this.listener = listener;
this.context = context;
}
@@ -48,39 +49,44 @@ public void onComplete(Result result) {
if (context != null) {
ContextManager.continued(context);
}
- if (callback != null) {
- callback.onComplete(result);
+ if (listener != null) {
+ listener.onComplete(result);
}
ContextManager.stopSpan();
}
@Override
public void onHeaders(Response response) {
- callback.onHeaders(response);
+ listener.onHeaders(response);
+ }
+
+ @Override
+ public void onContent(Response response, ByteBuffer content, Callback callback) {
+ listener.onContent(response, content, callback);
}
@Override
public void onContent(Response response, ByteBuffer content) {
- callback.onContent(response, content);
+ listener.onContent(response, content);
}
@Override
public void onBegin(Response response) {
- callback.onBegin(response);
+ listener.onBegin(response);
}
@Override
public boolean onHeader(Response response, HttpField field) {
- return callback.onHeader(response, field);
+ return listener.onHeader(response, field);
}
@Override
public void onSuccess(Response response) {
- callback.onSuccess(response);
+ listener.onSuccess(response);
}
@Override
public void onFailure(Response response, Throwable failure) {
- callback.onFailure(response, failure);
+ listener.onFailure(response, failure);
}
}
\ No newline at end of file
From 290084a9e646494dd874d45b8c7db4893cf12b80 Mon Sep 17 00:00:00 2001
From: xhrg <634789257@qq.com>
Date: Fri, 26 Sep 2025 06:44:23 +0800
Subject: [PATCH 4/4] fix jetty-client unit test
---
.../client/AsyncHttpRequestSendInterceptorTest.java | 13 +++++++------
.../client/SyncHttpRequestSendInterceptorTest.java | 7 ++++---
2 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java
index ae3dc47db1..fb044435da 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/AsyncHttpRequestSendInterceptorTest.java
@@ -33,6 +33,7 @@
import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpConversation;
import org.eclipse.jetty.client.HttpRequest;
import org.eclipse.jetty.client.ResponseNotifier;
import org.eclipse.jetty.client.api.Response;
@@ -82,8 +83,8 @@ public class AsyncHttpRequestSendInterceptorTest {
@Before
public void setUp() throws Exception {
- httpRequestEnhancedInstance = new MockHttpRequest(httpClient, uri);
- responseNotifierEnhancedInstance = new MockResponseNotifier(httpClient);
+ httpRequestEnhancedInstance = new MockHttpRequest(httpClient, new HttpConversation(), uri);
+ responseNotifierEnhancedInstance = new MockResponseNotifier();
Result results = new Result(httpRequestEnhancedInstance, response);
allArguments = new Object[]{(Response.CompleteListener) result -> { }, results};
@@ -146,8 +147,8 @@ private void assertJettySpan() {
}
private class MockHttpRequest extends HttpRequest implements EnhancedInstance {
- public MockHttpRequest(HttpClient httpClient, URI uri) {
- super(httpClient, uri);
+ public MockHttpRequest(HttpClient client, HttpConversation conversation, URI uri) {
+ super(httpClient, conversation, uri);
}
@Override
@@ -172,8 +173,8 @@ public void setSkyWalkingDynamicField(Object value) {
}
private class MockResponseNotifier extends ResponseNotifier implements EnhancedInstance {
- public MockResponseNotifier(HttpClient client) {
- super(client);
+ public MockResponseNotifier() {
+ super();
}
@Override
diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java
index e4a861fbc7..6f9d2ec489 100644
--- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java
+++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/client/SyncHttpRequestSendInterceptorTest.java
@@ -34,6 +34,7 @@
import org.apache.skywalking.apm.agent.test.tools.SpanAssert;
import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpConversation;
import org.eclipse.jetty.client.HttpRequest;
import org.junit.Assert;
import org.junit.Before;
@@ -67,7 +68,7 @@ public class SyncHttpRequestSendInterceptorTest {
@Before
public void setUp() throws Exception {
- enhancedInstance = new MockHttpRequest(httpClient, uri);
+ enhancedInstance = new MockHttpRequest(httpClient, new HttpConversation(), uri);
allArguments = new Object[] {
"OperationKey",
"OperationValue"
@@ -123,8 +124,8 @@ public void testMethodsAroundError() throws Throwable {
}
private class MockHttpRequest extends HttpRequest implements EnhancedInstance {
- public MockHttpRequest(HttpClient httpClient, URI uri) {
- super(httpClient, uri);
+ public MockHttpRequest(HttpClient client, HttpConversation conversation, URI uri) {
+ super(httpClient, conversation, uri);
}
@Override