指标统计的方式是被类CircuitBreakerMetrics维护的。并且每个ID【某个Feign客户端中某个方法】与该类是一一对应的关系。
在请求过程中有且仅有创建一次CircuitBreakerMetrics实例,并完成FixedSizeSlidingWindowMetrics、SlidingTimeWindowMetrics仅有的一次实例化。
resilience4j.circuitbreaker.configs.default.slidingWindowSize是通过CircuitBreakerConfig完成赋值的【默认为100】。
class AbstractAggregation {
long totalDurationInMillis = 0;
int numberOfSlowCalls = 0;
int numberOfSlowFailedCalls = 0;
int numberOfFailedCalls = 0;
int numberOfCalls = 0;
void record(long duration, TimeUnit durationUnit, Metrics.Outcome outcome) {
this.numberOfCalls++;
this.totalDurationInMillis += durationUnit.toMillis(duration);
switch (outcome) {
case SLOW_SUCCESS:
numberOfSlowCalls++;
break;
case SLOW_ERROR:
numberOfSlowCalls++;
numberOfFailedCalls++;
numberOfSlowFailedCalls++;
break;
case ERROR:
numberOfFailedCalls++;
break;
}
}
}
numberOfCalls:当前ID被调用的总次数。
numberOfFailedCalls:当前ID被调用的失败总次数。
totalDurationInMillis:是指截止当前,调用numberOfCalls次当前ID其响应花费的总时间。
numberOfSlowCalls:当前ID慢调用的总次数。
numberOfSlowFailedCalls:当前ID慢调用的失败总次数。
class TotalAggregation extends AbstractAggregation {
void removeBucket(AbstractAggregation bucket) {
this.totalDurationInMillis -= bucket.totalDurationInMillis;
this.numberOfSlowCalls -= bucket.numberOfSlowCalls;
this.numberOfSlowFailedCalls -= bucket.numberOfSlowFailedCalls;
this.numberOfFailedCalls -= bucket.numberOfFailedCalls;
this.numberOfCalls -= bucket.numberOfCalls;
}
}
为啥要移除Measurement对应的统计值呢?
public class FixedSizeSlidingWindowMetrics