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 2022/01/17 00:57:15 UTC

[servicecomb-java-chassis] branch 1.3.x updated: [SCB-2369] improve fow control logs and message (#2696)

This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch 1.3.x
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/1.3.x by this push:
     new ad53a38  [SCB-2369] improve fow control logs and message (#2696)
ad53a38 is described below

commit ad53a38dd7a18cfe76705f16f8772859bdf890c4
Author: david6969xin <86...@users.noreply.github.com>
AuthorDate: Mon Jan 17 08:57:07 2022 +0800

    [SCB-2369] improve fow control logs and message (#2696)
---
 .../apache/servicecomb/demo/pojo/client/TestFlowControl.java |  4 ++--
 .../servicecomb/qps/ConsumerQpsFlowControlHandler.java       |  2 +-
 .../servicecomb/qps/ProviderQpsFlowControlHandler.java       |  2 +-
 .../apache/servicecomb/qps/strategy/FixedWindowStrategy.java | 12 +++++++++++-
 .../apache/servicecomb/qps/strategy/LeakyBucketStrategy.java |  6 ++++++
 .../servicecomb/qps/TestConsumerQpsFlowControlHandler.java   |  2 +-
 .../servicecomb/qps/TestProviderQpsFlowControlHandler.java   |  2 +-
 7 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/TestFlowControl.java b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/TestFlowControl.java
index b558d22..937c9e7 100644
--- a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/TestFlowControl.java
+++ b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/TestFlowControl.java
@@ -43,8 +43,8 @@ public class TestFlowControl {
 
   public void testAllTransport() throws Exception {
     // 1.3.2 未统一。 2.1.5 统一了。
-    String serverMsg = "InvocationException: code=429;msg={message=rejected by qps flowcontrol}";
-    String clientMsg = "InvocationException: code=429;msg=CommonExceptionData [message=rejected by qps flowcontrol]";
+    String serverMsg = "InvocationException: code=429;msg={message=provider request rejected by qps flowcontrol}";
+    String clientMsg = "InvocationException: code=429;msg=CommonExceptionData [message=consumer request rejected by qps flowcontrol]";
 
     testFlowControl((num) -> client1.foo(num), true, serverMsg);
     testFlowControl((num) -> client1.bar(num), false, serverMsg);
diff --git a/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/ConsumerQpsFlowControlHandler.java b/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/ConsumerQpsFlowControlHandler.java
index 1d81311..f04ace8 100644
--- a/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/ConsumerQpsFlowControlHandler.java
+++ b/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/ConsumerQpsFlowControlHandler.java
@@ -40,7 +40,7 @@ public class ConsumerQpsFlowControlHandler implements Handler {
     QpsStrategy qpsStrategy = qpsControllerMgr.getOrCreate(invocation.getMicroserviceName(), invocation);
     if (qpsStrategy.isLimitNewRequest()) {
       // return http status 429
-      CommonExceptionData errorData = new CommonExceptionData("rejected by qps flowcontrol");
+      CommonExceptionData errorData = new CommonExceptionData("consumer request rejected by qps flowcontrol");
       asyncResp.consumerFail(
           new InvocationException(QpsConst.TOO_MANY_REQUESTS_STATUS, errorData));
       return;
diff --git a/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/ProviderQpsFlowControlHandler.java b/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/ProviderQpsFlowControlHandler.java
index 0abdd47..009f81c 100644
--- a/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/ProviderQpsFlowControlHandler.java
+++ b/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/ProviderQpsFlowControlHandler.java
@@ -49,7 +49,7 @@ public class ProviderQpsFlowControlHandler implements Handler {
 
   private boolean isLimitNewRequest(QpsStrategy qpsStrategy, AsyncResponse asyncResp) {
     if (qpsStrategy.isLimitNewRequest()) {
-      CommonExceptionData errorData = new CommonExceptionData("rejected by qps flowcontrol");
+      CommonExceptionData errorData = new CommonExceptionData("provider request rejected by qps flowcontrol");
       asyncResp.producerFail(new InvocationException(QpsConst.TOO_MANY_REQUESTS_STATUS, errorData));
       return true;
     } else {
diff --git a/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/strategy/FixedWindowStrategy.java b/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/strategy/FixedWindowStrategy.java
index f91f87f..4fd884e 100644
--- a/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/strategy/FixedWindowStrategy.java
+++ b/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/strategy/FixedWindowStrategy.java
@@ -18,8 +18,13 @@ package org.apache.servicecomb.qps.strategy;
 
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 public class FixedWindowStrategy extends AbstractQpsStrategy {
 
+  private static final Logger LOGGER = LoggerFactory.getLogger(FixedWindowStrategy.class);
+
   // Interval begin time
   private volatile long msCycleBegin;
 
@@ -49,7 +54,12 @@ public class FixedWindowStrategy extends AbstractQpsStrategy {
 
     // Configuration update and use is at the situation of multi-threaded concurrency
     // It is possible that operation level updated to null,but schema level or microservice level does not updated
-    return newCount - lastRequestCount >= this.getQpsLimit();
+    boolean isLimitRequest = newCount - lastRequestCount >= this.getQpsLimit();
+    if (isLimitRequest) {
+      LOGGER.warn("qps flowcontrol open, qpsLimit is {} and tps is {}", this.getQpsLimit(),
+          newCount - lastRequestCount + 1);
+    }
+    return isLimitRequest;
   }
 
   @Override
diff --git a/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/strategy/LeakyBucketStrategy.java b/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/strategy/LeakyBucketStrategy.java
index d65d43b..180be4d 100644
--- a/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/strategy/LeakyBucketStrategy.java
+++ b/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/strategy/LeakyBucketStrategy.java
@@ -19,6 +19,9 @@ package org.apache.servicecomb.qps.strategy;
 
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * leaky bucket algorithm include 2 implementation :
  * 1. as a meter : it's same as the token bucket.
@@ -27,6 +30,8 @@ import java.util.concurrent.atomic.AtomicLong;
  **/
 public class LeakyBucketStrategy extends AbstractQpsStrategy {
 
+  private static final Logger LOGGER = LoggerFactory.getLogger(LeakyBucketStrategy.class);
+
   // Request count between Interval begin and now in one interval
   private volatile AtomicLong requestCount = new AtomicLong();
 
@@ -60,6 +65,7 @@ public class LeakyBucketStrategy extends AbstractQpsStrategy {
       requestCount.incrementAndGet();
       return false;
     }
+    LOGGER.warn("qps flowcontrol open, qpsLimit is {} and tps is {}", this.getQpsLimit(), requestCount.longValue() + 1);
     return true;
   }
 
diff --git a/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestConsumerQpsFlowControlHandler.java b/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestConsumerQpsFlowControlHandler.java
index 5aef2dd..1043d58 100644
--- a/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestConsumerQpsFlowControlHandler.java
+++ b/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestConsumerQpsFlowControlHandler.java
@@ -109,7 +109,7 @@ public class TestConsumerQpsFlowControlHandler {
     Mockito.verify(asyncResp).consumerFail(captor.capture());
     InvocationException invocationException = captor.getValue();
     assertEquals(QpsConst.TOO_MANY_REQUESTS_STATUS, invocationException.getStatus());
-    assertEquals("rejected by qps flowcontrol",
+    assertEquals("consumer request rejected by qps flowcontrol",
         ((CommonExceptionData) invocationException.getErrorData()).getMessage());
   }
 
diff --git a/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestProviderQpsFlowControlHandler.java b/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestProviderQpsFlowControlHandler.java
index dfbecfd..d1fb48e 100644
--- a/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestProviderQpsFlowControlHandler.java
+++ b/handlers/handler-flowcontrol-qps/src/test/java/org/apache/servicecomb/qps/TestProviderQpsFlowControlHandler.java
@@ -161,7 +161,7 @@ public class TestProviderQpsFlowControlHandler {
 
     InvocationException invocationException = captor.getValue();
     assertEquals(QpsConst.TOO_MANY_REQUESTS_STATUS, invocationException.getStatus());
-    assertEquals("rejected by qps flowcontrol",
+    assertEquals("provider request rejected by qps flowcontrol",
         ((CommonExceptionData) invocationException.getErrorData()).getMessage());
   }