diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java index 9491120d3ea..d517de17018 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java @@ -22,6 +22,7 @@ import org.apache.servicecomb.core.event.InvocationFinishEvent; import org.apache.servicecomb.core.event.InvocationStartEvent; import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx; +import org.apache.servicecomb.metrics.core.publish.PublishUtils; import org.apache.servicecomb.swagger.invocation.Response; import com.netflix.spectator.api.Id; @@ -55,7 +56,7 @@ protected AbstractInvocationMeter getOrCreateMeters(Invocation invocation, Respo .append(invocationName) .append(invocation.getRealTransportName()) .append(invocation.getMicroserviceQualifiedName()) - .append(response.getStatusCode()); + .append(PublishUtils.refactorStatus(invocation, response)); if (keyBuilder.length() > maxKeyLen) { maxKeyLen = keyBuilder.length(); } @@ -69,7 +70,7 @@ protected AbstractInvocationMeter getOrCreateMeters(Invocation invocation, Respo MeterInvocationConst.TAG_OPERATION, invocation.getMicroserviceQualifiedName(), MeterInvocationConst.TAG_STATUS, - String.valueOf(response.getStatusCode())); + PublishUtils.refactorStatus(invocation, response)); AbstractInvocationMeter meter = createMeter(id); SpectatorUtils.registerMeter(registry, meter); diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java index 3196120d7b4..940d0f51dd3 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java @@ -19,16 +19,24 @@ import java.util.HashMap; import java.util.Map; +import org.apache.servicecomb.core.Invocation; import org.apache.servicecomb.foundation.metrics.publish.spectator.MeasurementNode; +import org.apache.servicecomb.foundation.vertx.http.VertxServerRequestToHttpServletRequest; import org.apache.servicecomb.metrics.core.meter.invocation.MeterInvocationConst; import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerf; import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroup; import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroups; import org.apache.servicecomb.metrics.core.publish.model.invocation.PerfInfo; +import org.apache.servicecomb.swagger.invocation.Response; import com.netflix.spectator.api.Statistic; +import io.vertx.core.http.HttpServerResponse; +import io.vertx.ext.web.RoutingContext; + public final class PublishUtils { + public static final String EMPTY_RESULT = "-"; + private PublishUtils() { } @@ -73,4 +81,18 @@ public static void addOperationPerfGroups(OperationPerfGroups operationPerfGroup OperationPerf operationPerf = createOperationPerf(operation, statusNode); group.addOperationPerf(operationPerf); } + + public static String refactorStatus(Invocation invocation, Response response) { + if (invocation.getRequestEx() instanceof VertxServerRequestToHttpServletRequest) { + RoutingContext context = ((VertxServerRequestToHttpServletRequest) invocation.getRequestEx()).getContext(); + if (context == null) { + return String.valueOf(response.getStatusCode()); + } + HttpServerResponse contextResponse = context.response(); + if (response.getStatusCode() == 200 && contextResponse.closed() && !contextResponse.ended()) { + return EMPTY_RESULT; + } + } + return String.valueOf(response.getStatusCode()); + } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/SlowInvocationLogger.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/SlowInvocationLogger.java index a72f56250a2..3faf950d3f2 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/SlowInvocationLogger.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/SlowInvocationLogger.java @@ -102,7 +102,7 @@ private void logSlowProducer(Invocation invocation, Response response, Operation restOperationMeta.getHttpMethod(), restOperationMeta.getAbsolutePath(), collectClientAddress(invocation), - response.getStatusCode(), + PublishUtils.refactorStatus(invocation, response), formatTime(stageTrace.calcTotalTime()), formatTime(stageTrace.calcInvocationPrepareTime()), formatTime(stageTrace.calcThreadPoolQueueTime()),