Skip to content

Commit eb00a87

Browse files
committed
fix:support old monitor view of rate-limit.
1 parent a2fb3a5 commit eb00a87

File tree

9 files changed

+108
-18
lines changed

9 files changed

+108
-18
lines changed

polaris-common/polaris-config-default/src/main/resources/conf/default-config.yml

+2
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,8 @@ provider:
271271
limiterService: polaris.limiter
272272
# 匀速排队最大排队时间,ms
273273
maxQueuingTime: 1000
274+
# 是否上报限流监控视图, 该开关默认关闭,如果需要使用限流的老监控视图,则需要开启此监控数据上报开关
275+
reportMetrics: false
274276
# 配置中心默认配置
275277
config:
276278
# 类型转化缓存的key数量

polaris-common/polaris-config/src/main/java/com/tencent/polaris/api/config/provider/RateLimitConfig.java

+7
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ public interface RateLimitConfig extends PluginConfig, Verifier {
7979
*/
8080
long getMaxQueuingTime();
8181

82+
/**
83+
* 是否上报限流监控视图, 该开关默认关闭,如果需要使用限流的老监控视图,则需要开启此监控数据上报开关
84+
*
85+
* @return boolean
86+
*/
87+
boolean isReportMetrics();
88+
8289
enum Fallback {
8390
pass, reject,
8491
}

polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/provider/RateLimitConfigImpl.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.tencent.polaris.api.config.provider.RateLimitConfig;
2222
import com.tencent.polaris.factory.config.plugin.PluginConfigImpl;
2323
import com.tencent.polaris.factory.util.ConfigUtils;
24+
2425
import java.util.List;
2526

2627
public class RateLimitConfigImpl extends PluginConfigImpl implements RateLimitConfig {
@@ -49,6 +50,9 @@ public class RateLimitConfigImpl extends PluginConfigImpl implements RateLimitCo
4950
@JsonProperty
5051
private Long maxQueuingTime;
5152

53+
@JsonProperty
54+
private Boolean reportMetrics;
55+
5256
public boolean isEnable() {
5357
if (null == enable) {
5458
return false;
@@ -135,6 +139,18 @@ public void setMaxQueuingTime(Long maxQueuingTime) {
135139
this.maxQueuingTime = maxQueuingTime;
136140
}
137141

142+
@Override
143+
public boolean isReportMetrics() {
144+
if (null == reportMetrics) {
145+
return false;
146+
}
147+
return reportMetrics;
148+
}
149+
150+
public void setReportMetrics(boolean reportMetrics) {
151+
this.reportMetrics = reportMetrics;
152+
}
153+
138154
@Override
139155
public void setDefault(Object defaultObject) {
140156
if (null != defaultObject) {
@@ -163,7 +179,10 @@ public void setDefault(Object defaultObject) {
163179
if (null == maxQueuingTime) {
164180
setMaxQueuingTime(rateLimitConfig.getMaxQueuingTime());
165181
}
182+
if (null == reportMetrics) {
183+
setReportMetrics(rateLimitConfig.isReportMetrics());
184+
}
166185
setDefaultPluginConfig(rateLimitConfig);
167186
}
168187
}
169-
}
188+
}

polaris-plugins/polaris-plugins-observability/stat-common/src/main/java/com/tencent/polaris/plugins/stat/common/model/StatInfoCollectorContainer.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,29 @@
2626

2727
public class StatInfoCollectorContainer {
2828
private final StatInfoRevisionCollector<InstanceGauge> insCollector;
29+
private final StatInfoRevisionCollector<RateLimitGauge> rateLimitCollector;
2930
private final StatInfoStatefulCollector<CircuitBreakGauge> circuitBreakerCollector;
3031

3132
public StatInfoCollectorContainer() {
3233
this.insCollector = new StatInfoRevisionCollector<InstanceGauge>();
34+
this.rateLimitCollector = new StatInfoRevisionCollector<RateLimitGauge>();
3335
this.circuitBreakerCollector = new StatInfoStatefulCollector<CircuitBreakGauge>();
3436
}
3537

3638
public StatInfoRevisionCollector<InstanceGauge> getInsCollector() {
3739
return insCollector;
3840
}
3941

42+
public StatInfoRevisionCollector<RateLimitGauge> getRateLimitCollector() {
43+
return rateLimitCollector;
44+
}
45+
4046
public StatInfoStatefulCollector<CircuitBreakGauge> getCircuitBreakerCollector() {
4147
return circuitBreakerCollector;
4248
}
4349

4450
public List<StatInfoCollector<?, ? extends StatMetric>> getCollectors() {
45-
return Arrays.asList(insCollector, circuitBreakerCollector);
51+
return Arrays.asList(insCollector, rateLimitCollector, circuitBreakerCollector);
4652
}
4753
}
4854

polaris-plugins/polaris-plugins-observability/stat-common/src/main/java/com/tencent/polaris/plugins/stat/common/model/SystemMetricModel.java

+9
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ public static class SystemMetricLabelOrder {
3737
SystemMetricName.METRIC_NAME_LABEL,
3838
};
3939

40+
public static final String[] RATELIMIT_GAUGE_LABEL_ORDER = new String[]{
41+
SystemMetricName.CALLEE_NAMESPACE,
42+
SystemMetricName.CALLEE_SERVICE,
43+
SystemMetricName.CALLEE_METHOD,
44+
SystemMetricName.CALLER_LABELS,
45+
SystemMetricName.METRIC_NAME_LABEL,
46+
SystemMetricName.RULE_NAME,
47+
};
48+
4049
public static final String[] CIRCUIT_BREAKER_LABEL_ORDER = new String[]{
4150
SystemMetricName.CALLEE_NAMESPACE,
4251
SystemMetricName.CALLEE_SERVICE,

polaris-plugins/polaris-plugins-observability/stat-prometheus/src/main/java/com/tencent/polaris/plugins/stat/prometheus/handler/CommonHandler.java

+28-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ public static void putDataFromContainerInOrder(Map<String, Gauge> sampleMapping,
6363
} else if (rs.getRevision() < currentRevision) {
6464
// 如果版本为老版本,则清零数据
6565
gauge.remove(CommonHandler.getOrderedMetricLabelValues(s.getLabels(), order));
66-
Gauge.Child child = gauge.labels(CommonHandler.getOrderedMetricLabelValues(s.getLabels(), order));
66+
Gauge.Child child = gauge.labels(CommonHandler.getOrderedMetricLabelValues(s.getLabels(),
67+
order));
6768
if (null != child) {
6869
child.set(0);
6970
}
@@ -182,6 +183,32 @@ public static Map<String, String> convertCircuitBreakToLabels(CircuitBreakGauge
182183
return labels;
183184
}
184185

186+
public static Map<String, String> convertRateLimitGaugeToLabels(RateLimitGauge rateLimitGauge) {
187+
Map<String, String> labels = new HashMap<>();
188+
for (String labelName : SystemMetricModel.SystemMetricLabelOrder.RATELIMIT_GAUGE_LABEL_ORDER) {
189+
switch (labelName) {
190+
case SystemMetricName.CALLEE_NAMESPACE:
191+
addLabel(labelName, rateLimitGauge.getNamespace(), labels);
192+
break;
193+
case SystemMetricName.CALLEE_SERVICE:
194+
addLabel(labelName, rateLimitGauge.getService(), labels);
195+
break;
196+
case SystemMetricName.CALLEE_METHOD:
197+
addLabel(labelName, rateLimitGauge.getMethod(), labels);
198+
break;
199+
case SystemMetricName.CALLER_LABELS:
200+
addLabel(labelName, rateLimitGauge.getLabels(), labels);
201+
break;
202+
case SystemMetricName.RULE_NAME:
203+
addLabel(labelName, rateLimitGauge.getRuleName(), labels);
204+
break;
205+
default:
206+
}
207+
}
208+
209+
return labels;
210+
}
211+
185212
public static void addLabel(String key, String value, Map<String, String> target) {
186213
if (null == key) {
187214
return;

polaris-plugins/polaris-plugins-observability/stat-prometheus/src/main/java/com/tencent/polaris/plugins/stat/prometheus/plugin/PrometheusReporter.java

+24-5
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@
4646
import com.tencent.polaris.plugins.stat.prometheus.handler.CommonHandler;
4747
import com.tencent.polaris.plugins.stat.prometheus.handler.PrometheusHandlerConfig;
4848
import com.tencent.polaris.plugins.stat.prometheus.handler.PrometheusHttpServer;
49+
import io.prometheus.client.CollectorRegistry;
50+
import io.prometheus.client.Gauge;
51+
import org.slf4j.Logger;
4952

5053
import java.io.IOException;
5154
import java.util.Collections;
@@ -58,10 +61,6 @@
5861
import java.util.concurrent.TimeUnit;
5962
import java.util.concurrent.atomic.AtomicBoolean;
6063

61-
import io.prometheus.client.CollectorRegistry;
62-
import io.prometheus.client.Gauge;
63-
import org.slf4j.Logger;
64-
6564
/**
6665
* PrometheusReporter plugin
6766
*
@@ -103,6 +102,8 @@ public PrometheusReporter() {
103102
SystemMetricLabelOrder.INSTANCE_GAUGE_LABEL_ORDER);
104103
initSampleMapping(MetricValueAggregationStrategyCollections.CIRCUIT_BREAK_STRATEGY,
105104
SystemMetricLabelOrder.CIRCUIT_BREAKER_LABEL_ORDER);
105+
initSampleMapping(MetricValueAggregationStrategyCollections.RATE_LIMIT_STRATEGY,
106+
SystemMetricLabelOrder.RATELIMIT_GAUGE_LABEL_ORDER);
106107
}
107108

108109
@Override
@@ -155,6 +156,9 @@ public void handle(StatInfo statInfo) {
155156
if (null != statInfo.getCircuitBreakGauge()) {
156157
handleCircuitBreakGauge(statInfo.getCircuitBreakGauge());
157158
}
159+
if (null != statInfo.getRateLimitGauge()) {
160+
handleRateLimitGauge(statInfo.getRateLimitGauge());
161+
}
158162
}
159163

160164
public void handleRouterGauge(InstanceGauge instanceGauge) {
@@ -173,6 +177,14 @@ public void handleCircuitBreakGauge(CircuitBreakGauge circuitBreakGauge) {
173177
}
174178
}
175179

180+
public void handleRateLimitGauge(RateLimitGauge rateLimitGauge) {
181+
if (null != container && null != container.getRateLimitCollector()) {
182+
container.getRateLimitCollector().collectStatInfo(rateLimitGauge,
183+
CommonHandler.convertRateLimitGaugeToLabels(rateLimitGauge),
184+
MetricValueAggregationStrategyCollections.RATE_LIMIT_STRATEGY);
185+
}
186+
}
187+
176188
private void initSampleMapping(MetricValueAggregationStrategy<?>[] strategies, String[] order) {
177189
for (MetricValueAggregationStrategy<?> strategy : strategies) {
178190
Gauge strategyGauge = new Gauge.Builder()
@@ -245,7 +257,8 @@ private void startScheduleAggregationTask() {
245257
CommonHandler.DEFAULT_INTERVAL_MILLI,
246258
CommonHandler.DEFAULT_INTERVAL_MILLI,
247259
TimeUnit.MILLISECONDS);
248-
LOGGER.info("start schedule metric aggregation task, task interval {}", CommonHandler.DEFAULT_INTERVAL_MILLI);
260+
LOGGER.info("start schedule metric aggregation task, task interval {}",
261+
CommonHandler.DEFAULT_INTERVAL_MILLI);
249262
}
250263
}
251264

@@ -256,6 +269,9 @@ private void doAggregation() {
256269
CommonHandler.putDataFromContainerInOrder(sampleMapping, container.getCircuitBreakerCollector(),
257270
0,
258271
SystemMetricLabelOrder.CIRCUIT_BREAKER_LABEL_ORDER);
272+
CommonHandler.putDataFromContainerInOrder(sampleMapping, container.getRateLimitCollector(),
273+
container.getRateLimitCollector().getCurrentRevision(),
274+
SystemMetricLabelOrder.RATELIMIT_GAUGE_LABEL_ORDER);
259275

260276
for (StatInfoCollector<?, ? extends StatMetric> s : container.getCollectors()) {
261277
if (s instanceof StatInfoRevisionCollector<?>) {
@@ -292,6 +308,9 @@ private void doPush() {
292308
CommonHandler.putDataFromContainerInOrder(sampleMapping, container.getCircuitBreakerCollector(),
293309
0,
294310
SystemMetricLabelOrder.CIRCUIT_BREAKER_LABEL_ORDER);
311+
CommonHandler.putDataFromContainerInOrder(sampleMapping, container.getRateLimitCollector(),
312+
container.getRateLimitCollector().getCurrentRevision(),
313+
SystemMetricLabelOrder.RATELIMIT_GAUGE_LABEL_ORDER);
295314

296315
try {
297316
if (Objects.isNull(pushGateway)) {

polaris-ratelimit/polaris-ratelimit-client/src/main/java/com/tencent/polaris/ratelimit/client/api/DefaultLimitAPI.java

+10-9
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717

1818
package com.tencent.polaris.ratelimit.client.api;
1919

20-
import static com.tencent.polaris.ratelimit.api.rpc.QuotaResultCode.QuotaResultOk;
21-
2220
import com.tencent.polaris.api.control.Destroyable;
2321
import com.tencent.polaris.api.exception.PolarisException;
2422
import com.tencent.polaris.api.plugin.Plugin;
@@ -37,12 +35,15 @@
3735
import com.tencent.polaris.ratelimit.client.pojo.CommonQuotaRequest;
3836
import com.tencent.polaris.ratelimit.client.utils.LimitValidator;
3937
import com.tencent.polaris.ratelimit.client.utils.RateLimitConstants;
38+
import org.slf4j.Logger;
39+
4040
import java.util.ArrayList;
4141
import java.util.Collection;
4242
import java.util.Collections;
4343
import java.util.List;
4444
import java.util.Map;
45-
import org.slf4j.Logger;
45+
46+
import static com.tencent.polaris.ratelimit.api.rpc.QuotaResultCode.QuotaResultOk;
4647

4748
/**
4849
* 默认的限流API实现
@@ -77,15 +78,14 @@ public QuotaResponse getQuota(QuotaRequest request) throws PolarisException {
7778
LimitValidator.validateQuotaRequest(request);
7879
CommonQuotaRequest commonQuotaRequest = new CommonQuotaRequest(request, sdkContext.getConfig());
7980
QuotaResponse response = quotaFlow.getQuota(commonQuotaRequest);
80-
// reportRateLimit(request, response);
81+
reportRateLimit(request, response);
8182
return response;
8283
}
8384

84-
/**
85-
* 限流指标不在保留单独的指标视图,全部合并到 upstream_xxx 的指标视图中
86-
*/
87-
@Deprecated
8885
private void reportRateLimit(QuotaRequest req, QuotaResponse rsp) {
86+
if (!sdkContext.getConfig().getProvider().getRateLimit().isReportMetrics()) {
87+
return;
88+
}
8989
if (null != statPlugins && !RateLimitConstants.REASON_DISABLED.equals(rsp.getInfo())) {
9090
try {
9191
DefaultRateLimitResult rateLimitGauge = new DefaultRateLimitResult();
@@ -95,7 +95,8 @@ private void reportRateLimit(QuotaRequest req, QuotaResponse rsp) {
9595
rateLimitGauge.setService(req.getService());
9696
rateLimitGauge.setResult(
9797
rsp.getCode() == QuotaResultOk ? RateLimitGauge.Result.PASSED : RateLimitGauge.Result.LIMITED);
98-
rateLimitGauge.setRuleName(rsp.getActiveRule() == null ? null : rsp.getActiveRule().getName().getValue());
98+
rateLimitGauge.setRuleName(rsp.getActiveRule() == null ? null :
99+
rsp.getActiveRule().getName().getValue());
99100
StatInfo statInfo = new StatInfo();
100101
statInfo.setRateLimitGauge(rateLimitGauge);
101102

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464

6565
<properties>
6666
<!-- Project revision -->
67-
<revision>1.12.10</revision>
67+
<revision>1.12.11</revision>
6868

6969
<timestamp>${maven.build.timestamp}</timestamp>
7070
<skip.maven.deploy>false</skip.maven.deploy>

0 commit comments

Comments
 (0)