diff --git a/CHANGES.md b/CHANGES.md index ce5160ba7c52c923c7efee336f569d236fe75c6f..d07099601517ae9f34b2377566bbeb2e20960c32 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -29,6 +29,7 @@ Release Notes. * Fix bug that springmvn-annotation-4.x-plugin, witness class does not exist in some versions. * Add Redis command parameters to 'db.statement' field on Lettuce span UI for displaying more info * Fix NullPointerException with `ReactiveRequestHolder.getHeaders`. +* Fix bug that asynchttpclient plugin does not record the response status code #### OAP-Backend * Allow user-defined `JAVA_OPTS` in the startup script. diff --git a/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/asynchttpclient/v2/AsyncHandlerWrapper.java b/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/asynchttpclient/v2/AsyncHandlerWrapper.java index 0562d34fd5de03b9027285343f91d80ebf9c75c2..c668231c0545399ddfdd6cc700784cd24ded9a0a 100644 --- a/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/asynchttpclient/v2/AsyncHandlerWrapper.java +++ b/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/asynchttpclient/v2/AsyncHandlerWrapper.java @@ -22,6 +22,7 @@ import io.netty.handler.codec.http.HttpHeaders; import java.net.InetSocketAddress; import java.util.List; import javax.net.ssl.SSLSession; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; import org.apache.skywalking.apm.agent.core.logging.api.ILog; import org.apache.skywalking.apm.agent.core.logging.api.LogManager; @@ -40,7 +41,7 @@ public class AsyncHandlerWrapper implements AsyncHandler { private final AsyncHandler userAsyncHandler; private final AbstractSpan asyncSpan; - private static ILog LOGGER = LogManager.getLogger(AsyncHandlerWrapper.class); + private static final ILog LOGGER = LogManager.getLogger(AsyncHandlerWrapper.class); public AsyncHandlerWrapper(AsyncHandler asyncHandler, AbstractSpan span) { this.userAsyncHandler = asyncHandler == null ? new AsyncCompletionHandlerBase() : asyncHandler; @@ -49,6 +50,11 @@ public class AsyncHandlerWrapper implements AsyncHandler { @Override public State onStatusReceived(final HttpResponseStatus httpResponseStatus) throws Exception { + int statusCode = httpResponseStatus.getStatusCode(); + Tags.STATUS_CODE.set(asyncSpan, String.valueOf(statusCode)); + if (statusCode >= 400) { + asyncSpan.errorOccurred(); + } return userAsyncHandler.onStatusReceived(httpResponseStatus); } diff --git a/test/plugin/scenarios/asynchttpclient-scenario/config/expectedData.yaml b/test/plugin/scenarios/asynchttpclient-scenario/config/expectedData.yaml index 1eed6c1e57f0766f3ce3061873044e4b5f30a0bf..1db379fab9b5d1ee93ee3a0ed9347e7a67f45180 100644 --- a/test/plugin/scenarios/asynchttpclient-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/asynchttpclient-scenario/config/expectedData.yaml @@ -34,6 +34,7 @@ segmentItems: tags: - {key: http.method, value: GET} - {key: url, value: 'http://localhost:8080/asynchttpclient/back'} + - {key: status_code, value: '200'} - operationName: /asynchttpclient/case operationId: 0 parentSpanId: -1