You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2023/11/01 07:57:30 UTC
(servicecomb-java-chassis) branch master updated: [#3727]Fix metrics not correct when timeout/connection timeout (#4005)
This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/master by this push:
new 58bef312b [#3727]Fix metrics not correct when timeout/connection timeout (#4005)
58bef312b is described below
commit 58bef312b02e24e52eb1aa63ba3b01d70ea50142
Author: liubao68 <bi...@qq.com>
AuthorDate: Wed Nov 1 15:57:25 2023 +0800
[#3727]Fix metrics not correct when timeout/connection timeout (#4005)
---
.../rest/client/RestClientCodecFilter.java | 8 ++++---
.../transport/rest/client/RestClientSender.java | 28 ++++++++++++----------
2 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientCodecFilter.java b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientCodecFilter.java
index 9f3c89152..e77f58e99 100644
--- a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientCodecFilter.java
+++ b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientCodecFilter.java
@@ -18,6 +18,7 @@ package org.apache.servicecomb.transport.rest.client;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionStage;
import org.apache.servicecomb.common.rest.RestConst;
import org.apache.servicecomb.core.CoreConst;
@@ -77,8 +78,11 @@ public class RestClientCodecFilter implements ConsumerFilter {
public CompletableFuture<Response> onFilter(Invocation invocation, FilterNode nextNode) {
invocation.getInvocationStageTrace().startGetConnection();
startClientFiltersRequest(invocation);
+ CompletionStage<HttpClientRequest> createRequest =
+ transportContextFactory.createHttpClientRequest(invocation).toCompletionStage()
+ .whenComplete((c, e) -> invocation.getInvocationStageTrace().finishGetConnection());
return CompletableFuture.completedFuture(null)
- .thenCompose(v -> transportContextFactory.createHttpClientRequest(invocation).toCompletionStage())
+ .thenCompose(v -> createRequest)
.thenAccept(httpClientRequest -> prepareTransportContext(invocation, httpClientRequest))
.thenAccept(v -> invocation.onStartSendRequest())
.thenAccept(v -> encoder.encode(invocation))
@@ -92,8 +96,6 @@ public class RestClientCodecFilter implements ConsumerFilter {
}
protected void prepareTransportContext(Invocation invocation, HttpClientRequest httpClientRequest) {
- invocation.getInvocationStageTrace().finishGetConnection();
-
copyExtraHttpHeaders(invocation, httpClientRequest);
RestClientTransportContext transportContext = transportContextFactory.create(invocation, httpClientRequest);
diff --git a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientSender.java b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientSender.java
index 5d3e879bc..30ab71f7d 100644
--- a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientSender.java
+++ b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestClientSender.java
@@ -22,8 +22,6 @@ import static org.apache.servicecomb.transport.rest.client.RestClientEncoder.gen
import java.util.Map.Entry;
import java.util.concurrent.CompletableFuture;
-import jakarta.servlet.http.Part;
-
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.invocation.InvocationStageTrace;
import org.apache.servicecomb.foundation.common.http.HttpStatus;
@@ -41,6 +39,7 @@ import io.vertx.core.MultiMap;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.http.HttpClientRequest;
import io.vertx.core.http.HttpClientResponse;
+import jakarta.servlet.http.Part;
public class RestClientSender {
private static final Logger LOGGER = LoggerFactory.getLogger(RestClientSender.class);
@@ -75,9 +74,11 @@ public class RestClientSender {
protected void runInVertxContext() {
sendInVertxContext()
- .exceptionally(throwable -> {
- future.completeExceptionally(throwable);
- return null;
+ .whenComplete((v, e) -> {
+ if (e != null) {
+ future.completeExceptionally(e);
+ }
+ writeFinished();
});
}
@@ -87,11 +88,12 @@ public class RestClientSender {
Multimap<String, Part> uploads = requestParameters.getUploads();
if (uploads == null) {
if (requestParameters.getBodyBuffer() != null) {
- httpClientRequest.end(requestParameters.getBodyBuffer());
+ return CompletableFuture.completedFuture(null).thenCompose(
+ v -> httpClientRequest.end(requestParameters.getBodyBuffer()).toCompletionStage());
} else {
- httpClientRequest.end();
+ return CompletableFuture.completedFuture(null).thenCompose(
+ v -> httpClientRequest.end().toCompletionStage());
}
- return CompletableFuture.completedFuture(null);
}
if (requestParameters.getBodyBuffer() != null) {
@@ -100,6 +102,10 @@ public class RestClientSender {
return sendFiles();
}
+ private void writeFinished() {
+ invocation.getInvocationStageTrace().finishWriteToBuffer(System.nanoTime());
+ }
+
protected CompletableFuture<Void> sendFiles() {
CompletableFuture<Void> sendFileFuture = CompletableFuture.completedFuture(null);
@@ -111,8 +117,7 @@ public class RestClientSender {
sendFileFuture = sendFileFuture.thenCompose(v -> sendFile(entry.getValue(), name, boundary));
}
- return sendFileFuture
- .thenAccept(v -> httpClientRequest.end(genBoundaryEndBuffer(boundary)));
+ return sendFileFuture.thenCompose(v -> httpClientRequest.end(genBoundaryEndBuffer(boundary)).toCompletionStage());
}
private CompletableFuture<Void> sendFile(Part part, String name, String boundary) {
@@ -167,8 +172,7 @@ public class RestClientSender {
protected void processMetrics() {
InvocationStageTrace stageTrace = invocation.getInvocationStageTrace();
- stageTrace.finishWriteToBuffer(System.nanoTime());
- // even failed and did not received response, still set time for it
+ // even failed and did not receive response, still set time for it
// that will help to know the real timeout time
stageTrace.finishReceiveResponse();
stageTrace.startClientFiltersResponse();