This is an automated email from the ASF dual-hosted git repository.
xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 42d9f11f06 [type:feature] enhance metrics-ratelimiter collect (#5461)
42d9f11f06 is described below
commit 42d9f11f06afe91e37569460f9101c6370641883
Author: moremind <[email protected]>
AuthorDate: Mon Mar 11 10:00:28 2024 +0800
[type:feature] enhance metrics-ratelimiter collect (#5461)
* [type:refactor] enhance metrics-ratelimiter collect
* [type:refactor] enhance metrics-ratelimiter collect
---------
Co-authored-by: xiaoyu <[email protected]>
Co-authored-by: loongs-zhang <[email protected]>
---
.../main/java/org/apache/shenyu/common/constant/Constants.java | 7 ++++++-
.../org/apache/shenyu/plugin/ratelimiter/RateLimiterPlugin.java | 4 ++++
.../main/java/org/apache/shenyu/plugin/metrics/MetricsPlugin.java | 8 ++++++++
.../org/apache/shenyu/plugin/metrics/constant/LabelNames.java | 5 +++++
.../apache/shenyu/plugin/metrics/reporter/MetricsReporter.java | 1 +
.../shenyu/plugin/metrics/reporter/MetricsReporterTest.java | 4 ++--
6 files changed, 26 insertions(+), 3 deletions(-)
diff --git
a/shenyu-common/src/main/java/org/apache/shenyu/common/constant/Constants.java
b/shenyu-common/src/main/java/org/apache/shenyu/common/constant/Constants.java
index 10f97a5c94..a3c4193e70 100644
---
a/shenyu-common/src/main/java/org/apache/shenyu/common/constant/Constants.java
+++
b/shenyu-common/src/main/java/org/apache/shenyu/common/constant/Constants.java
@@ -799,7 +799,12 @@ public interface Constants {
* the plugin end time of plugin lifecycle.
*/
String PLUGIN_END_TIME = "pluginEndTime:";
-
+
+ /**
+ * ratelimiter plugin metrics.
+ */
+ String METRICS_RATE_LIMITER = "metricsRateLimiter";
+
/**
* String q.
*/
diff --git
a/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/RateLimiterPlugin.java
b/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/RateLimiterPlugin.java
index 2eb2cbeb8f..888133c25f 100644
---
a/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/RateLimiterPlugin.java
+++
b/shenyu-plugin/shenyu-plugin-fault-tolerance/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/RateLimiterPlugin.java
@@ -17,6 +17,7 @@
package org.apache.shenyu.plugin.ratelimiter;
+import org.apache.shenyu.common.constant.Constants;
import org.apache.shenyu.common.dto.RuleData;
import org.apache.shenyu.common.dto.SelectorData;
import org.apache.shenyu.common.dto.convert.rule.RateLimiterHandle;
@@ -37,6 +38,7 @@ import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Optional;
+import java.util.function.Consumer;
/**
* RateLimiter Plugin.
@@ -75,6 +77,8 @@ public class RateLimiterPlugin extends AbstractShenyuPlugin {
.flatMap(response -> {
if (!response.isAllowed()) {
exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
+ final Consumer<HttpStatus> consumer =
exchange.getAttribute(Constants.METRICS_RATE_LIMITER);
+ Optional.ofNullable(consumer).ifPresent(c ->
c.accept(exchange.getResponse().getStatusCode()));
Object error = ShenyuResultWrap.error(exchange,
ShenyuResultEnum.TOO_MANY_REQUESTS);
return WebFluxResultUtils.result(exchange, error);
}
diff --git
a/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/MetricsPlugin.java
b/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/MetricsPlugin.java
index c8d2d54578..f9cc5f545d 100644
---
a/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/MetricsPlugin.java
+++
b/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/MetricsPlugin.java
@@ -25,12 +25,15 @@ import org.apache.shenyu.plugin.api.ShenyuPluginChain;
import org.apache.shenyu.plugin.api.context.ShenyuContext;
import org.apache.shenyu.plugin.metrics.constant.LabelNames;
import org.apache.shenyu.plugin.metrics.reporter.MetricsReporter;
+import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
+import java.util.Objects;
import java.util.Optional;
+import java.util.function.Consumer;
/**
* the monitor plugin.
@@ -44,6 +47,11 @@ public class MetricsPlugin implements ShenyuPlugin {
assert shenyuContext != null;
MetricsReporter.counterIncrement(LabelNames.REQUEST_TYPE_TOTAL, new
String[]{exchange.getRequest().getURI().getRawPath(),
shenyuContext.getRpcType()});
LocalDateTime startDateTime =
Optional.of(shenyuContext).map(ShenyuContext::getStartDateTime).orElseGet(LocalDateTime::now);
+ exchange.getAttributes().put(Constants.METRICS_RATE_LIMITER,
(Consumer<HttpStatus>) status -> {
+ if (Objects.nonNull(status) &&
HttpStatus.TOO_MANY_REQUESTS.equals(status)) {
+
MetricsReporter.counterIncrement(LabelNames.RATELIMITER_REQUEST_RESTRICT_TOTAL);
+ }
+ });
return chain.execute(exchange).doOnSuccess(e ->
responseCommitted(exchange, startDateTime))
.doOnError(throwable -> {
MetricsReporter.counterIncrement(LabelNames.REQUEST_THROW_TOTAL);
diff --git
a/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/constant/LabelNames.java
b/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/constant/LabelNames.java
index 2d515df154..d73b4e3260 100644
---
a/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/constant/LabelNames.java
+++
b/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/constant/LabelNames.java
@@ -41,4 +41,9 @@ public final class LabelNames {
* The constant EXECUTE_LATENCY_NAME.
*/
public static final String EXECUTE_LATENCY_NAME =
"shenyu_execute_latency_millis";
+
+ /**
+ * The constant RATELIMITER_REQUEST_RESTRICT_TOTAL.
+ */
+ public static final String RATELIMITER_REQUEST_RESTRICT_TOTAL =
"shenyu_ratelimiter_request_restrict_total";
}
diff --git
a/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/reporter/MetricsReporter.java
b/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/reporter/MetricsReporter.java
index 737344566c..d18d7779d9 100644
---
a/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/reporter/MetricsReporter.java
+++
b/shenyu-plugin/shenyu-plugin-metrics/src/main/java/org/apache/shenyu/plugin/metrics/reporter/MetricsReporter.java
@@ -43,6 +43,7 @@ public final class MetricsReporter {
MetricsReporter.registerCounter(LabelNames.REQUEST_TYPE_TOTAL, new
String[]{"path", "type"}, "shenyu http request type total count");
MetricsReporter.registerCounter(LabelNames.REQUEST_THROW_TOTAL,
"shenyu request error total count");
MetricsReporter.registerHistogram(LabelNames.EXECUTE_LATENCY_NAME,
"the shenyu executor latency millis");
+
MetricsReporter.registerCounter(LabelNames.RATELIMITER_REQUEST_RESTRICT_TOTAL,
"shenyu ratelimiter request restrict total count");
}
/**
diff --git
a/shenyu-plugin/shenyu-plugin-metrics/src/test/java/org/apache/shenyu/plugin/metrics/reporter/MetricsReporterTest.java
b/shenyu-plugin/shenyu-plugin-metrics/src/test/java/org/apache/shenyu/plugin/metrics/reporter/MetricsReporterTest.java
index 946bb72dd3..457b0f6266 100644
---
a/shenyu-plugin/shenyu-plugin-metrics/src/test/java/org/apache/shenyu/plugin/metrics/reporter/MetricsReporterTest.java
+++
b/shenyu-plugin/shenyu-plugin-metrics/src/test/java/org/apache/shenyu/plugin/metrics/reporter/MetricsReporterTest.java
@@ -57,7 +57,7 @@ public final class MetricsReporterTest {
Field field1 =
metricsRegister.getClass().getDeclaredField("COUNTER_MAP");
field1.setAccessible(true);
Map<String, Counter> map1 = (Map<String, Counter>)
field1.get(metricsRegister);
- Assertions.assertEquals(map1.size(), 3);
+ Assertions.assertEquals(map1.size(), 4);
Field field2 =
metricsRegister.getClass().getDeclaredField("HISTOGRAM_MAP");
field2.setAccessible(true);
Map<String, Histogram> map2 = (Map<String, Histogram>)
field2.get(metricsRegister);
@@ -72,7 +72,7 @@ public final class MetricsReporterTest {
Field field3 =
metricsRegister.getClass().getDeclaredField("COUNTER_MAP");
field3.setAccessible(true);
Map<String, Counter> map3 = (Map<String, Counter>)
field3.get(metricsRegister);
- Assertions.assertEquals(map3.size(), 4);
+ Assertions.assertEquals(map3.size(), 5);
Field field4 =
metricsRegister.getClass().getDeclaredField("HISTOGRAM_MAP");
field4.setAccessible(true);
Map<String, Histogram> map4 = (Map<String, Histogram>)
field4.get(metricsRegister);