Skip to content

Commit d4900a0

Browse files
authored
fix: 修复熔断规则关闭后,没有清除缓存导致prometheus仍能采集到熔断,半熔断等状态数量 (#442)
1 parent faebe17 commit d4900a0

File tree

3 files changed

+57
-19
lines changed

3 files changed

+57
-19
lines changed

polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/pojo/CircuitBreakerStatus.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ public class CircuitBreakerStatus {
4747
*/
4848
private final FallbackInfo fallbackInfo;
4949

50+
/**
51+
* 是否被销毁
52+
*/
53+
private boolean isDestroy;
54+
5055
public CircuitBreakerStatus(String circuitBreaker, Status status, long startTimeMs) {
5156
this(circuitBreaker, status, startTimeMs, null);
5257
}
@@ -74,6 +79,14 @@ public FallbackInfo getFallbackInfo() {
7479
return fallbackInfo;
7580
}
7681

82+
public boolean isDestroy() {
83+
return isDestroy;
84+
}
85+
86+
public void setDestroy(boolean destroy) {
87+
this.isDestroy = destroy;
88+
}
89+
7790
/**
7891
* 是否可以继续分配请求
7992
*
@@ -120,7 +133,11 @@ public enum Status {
120133
/**
121134
* 熔断器打开状态,实例不提供服务
122135
*/
123-
OPEN
136+
OPEN,
137+
/**
138+
* 熔断规则被销毁,实例可提供服务
139+
*/
140+
DESTROY
124141
}
125142

126143

polaris-plugins/polaris-plugins-circuitbreaker/circuitbreaker-composite/src/main/java/com/tencent/polaris/plugins/circuitbreaker/composite/ResourceCounters.java

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717

1818
package com.tencent.polaris.plugins.circuitbreaker.composite;
1919

20-
import static com.tencent.polaris.logging.LoggingConsts.LOGGING_CIRCUITBREAKER_EVENT;
21-
2220
import com.tencent.polaris.api.plugin.Plugin;
2321
import com.tencent.polaris.api.plugin.cache.FlowCache;
2422
import com.tencent.polaris.api.plugin.circuitbreaker.ResourceStat;
@@ -44,27 +42,20 @@
4442
import com.tencent.polaris.plugins.circuitbreaker.composite.trigger.ErrRateCounter;
4543
import com.tencent.polaris.plugins.circuitbreaker.composite.trigger.TriggerCounter;
4644
import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto;
47-
import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto.CircuitBreakerRule;
48-
import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto.ErrorCondition;
49-
import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto.FallbackConfig;
50-
import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto.FallbackResponse;
45+
import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto.*;
5146
import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto.FallbackResponse.MessageHeader;
52-
import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto.Level;
53-
import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto.TriggerCondition;
5447
import com.tencent.polaris.specification.api.v1.model.ModelProto.MatchString;
55-
import java.util.ArrayList;
56-
import java.util.Collection;
57-
import java.util.HashMap;
58-
import java.util.List;
59-
import java.util.Map;
60-
import java.util.Objects;
48+
import org.slf4j.Logger;
49+
50+
import java.util.*;
6151
import java.util.concurrent.ScheduledExecutorService;
6252
import java.util.concurrent.TimeUnit;
6353
import java.util.concurrent.atomic.AtomicBoolean;
6454
import java.util.concurrent.atomic.AtomicReference;
6555
import java.util.function.Function;
6656
import java.util.regex.Pattern;
67-
import org.slf4j.Logger;
57+
58+
import static com.tencent.polaris.logging.LoggingConsts.LOGGING_CIRCUITBREAKER_EVENT;
6859

6960
public class ResourceCounters implements StatusChangeHandler {
7061

@@ -367,5 +358,21 @@ public void reportCircuitStatus() {
367358

368359
public void setDestroyed(boolean value) {
369360
destroyed.set(value);
361+
toDestroy();
362+
}
363+
364+
private void toDestroy() {
365+
synchronized (this) {
366+
CircuitBreakerStatus circuitBreakerStatus = circuitBreakerStatusReference.get();
367+
circuitBreakerStatus.setDestroy(true);
368+
circuitBreakerStatusReference.set(circuitBreakerStatus);
369+
CB_EVENT_LOG.info("previous status {}, current status {}, resource {}, rule {}",
370+
circuitBreakerStatus.getStatus(),
371+
Status.DESTROY, resource, circuitBreakerStatus.getCircuitBreaker());
372+
for (TriggerCounter triggerCounter : counters) {
373+
triggerCounter.resume();
374+
}
375+
reportCircuitStatus();
376+
}
370377
}
371378
}

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717

1818
package com.tencent.polaris.plugins.stat.common.model;
1919

20-
import static com.tencent.polaris.api.pojo.CircuitBreakerStatus.Status.HALF_OPEN;
21-
import static com.tencent.polaris.api.pojo.CircuitBreakerStatus.Status.OPEN;
22-
2320
import com.tencent.polaris.api.plugin.stat.CircuitBreakGauge;
2421
import com.tencent.polaris.api.plugin.stat.RateLimitGauge;
2522
import com.tencent.polaris.api.pojo.InstanceGauge;
2623
import com.tencent.polaris.api.pojo.RetStatus;
2724

25+
import static com.tencent.polaris.api.pojo.CircuitBreakerStatus.Status.HALF_OPEN;
26+
import static com.tencent.polaris.api.pojo.CircuitBreakerStatus.Status.OPEN;
27+
2828
public class MetricValueAggregationStrategyCollections {
2929

3030
public static MetricValueAggregationStrategy<InstanceGauge>[] SERVICE_CALL_STRATEGY;
@@ -283,6 +283,15 @@ public void updateMetricValue(StatMetric targetValue, CircuitBreakGauge dataSour
283283
return;
284284
}
285285

286+
if (targetValue instanceof StatStatefulMetric) {
287+
StatStatefulMetric markMetric = ((StatStatefulMetric) targetValue);
288+
if (dataSource.getCircuitBreakStatus().isDestroy()) {
289+
targetValue.setValue(0);
290+
markMetric.removeMarkedName(dataSource.getCircuitBreakStatus().getCircuitBreaker());
291+
return;
292+
}
293+
}
294+
286295
if (OPEN == dataSource.getCircuitBreakStatus().getStatus()) {
287296
targetValue.incValue();
288297
} else if (HALF_OPEN == dataSource.getCircuitBreakStatus().getStatus()) {
@@ -323,6 +332,11 @@ public void updateMetricValue(StatMetric targetValue, CircuitBreakGauge dataSour
323332

324333
if (targetValue instanceof StatStatefulMetric) {
325334
StatStatefulMetric markMetric = ((StatStatefulMetric) targetValue);
335+
if (dataSource.getCircuitBreakStatus().isDestroy()) {
336+
targetValue.setValue(0);
337+
markMetric.removeMarkedName(dataSource.getCircuitBreakStatus().getCircuitBreaker());
338+
return;
339+
}
326340
switch (dataSource.getCircuitBreakStatus().getStatus()) {
327341
case OPEN:
328342
if (markMetric.contain(dataSource.getCircuitBreakStatus().getCircuitBreaker())) {

0 commit comments

Comments
 (0)