Skip to content

Commit 066dc35

Browse files
authored
Refactored TaggedTimeLimiterMetrics to be similar to TaggedCircuitBreakerMetrics (ReactiveX#601)
1 parent ff52916 commit 066dc35

File tree

2 files changed

+47
-107
lines changed

2 files changed

+47
-107
lines changed

resilience4j-micrometer/src/main/java/io/github/resilience4j/micrometer/tagged/TaggedTimeLimiterMetrics.java

Lines changed: 22 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
*/
3535
public class TaggedTimeLimiterMetrics extends AbstractMetrics implements MeterBinder {
3636

37+
private static final String KIND_FAILED = "failed";
38+
private static final String KIND_SUCCESSFUL = "successful";
39+
private static final String KIND_TIMEOUT = "timeout";
40+
3741
/**
3842
* Creates a new binder that uses given {@code registry} as source of time limiters.
3943
*
@@ -78,17 +82,20 @@ public void bindTo(MeterRegistry registry) {
7882
}
7983

8084
private void addMetrics(MeterRegistry registry, TimeLimiter timeLimiter) {
81-
Counter successes = Counter.builder(names.getSuccessfulMetricName())
85+
Counter successes = Counter.builder(names.getCallsMetricName())
8286
.description("The number of successful calls")
8387
.tag(TagNames.NAME, timeLimiter.getName())
88+
.tag(TagNames.KIND, KIND_SUCCESSFUL)
8489
.register(registry);
85-
Counter failures = Counter.builder(names.getFailedMetricName())
90+
Counter failures = Counter.builder(names.getCallsMetricName())
8691
.description("The number of failed calls")
8792
.tag(TagNames.NAME, timeLimiter.getName())
93+
.tag(TagNames.KIND, KIND_FAILED)
8894
.register(registry);
89-
Counter timeouts = Counter.builder(names.getTimeoutMetricName())
95+
Counter timeouts = Counter.builder(names.getCallsMetricName())
9096
.description("The number of timed out calls")
9197
.tag(TagNames.NAME, timeLimiter.getName())
98+
.tag(TagNames.KIND, KIND_TIMEOUT)
9299
.register(registry);
93100

94101
timeLimiter.getEventPublisher()
@@ -106,9 +113,9 @@ private void addMetrics(MeterRegistry registry, TimeLimiter timeLimiter) {
106113
public static class MetricNames {
107114

108115
private static final String DEFAULT_PREFIX = "resilience4j.timelimiter";
109-
public static final String SUCCESSFUL_METRIC_NAME = DEFAULT_PREFIX + ".successful";
110-
public static final String FAILED_METRIC_NAME = DEFAULT_PREFIX + ".failed";
111-
public static final String TIMEOUT_METRIC_NAME = DEFAULT_PREFIX + ".timeout";
116+
public static final String DEFAULT_TIME_LIMITER_CALLS = DEFAULT_PREFIX + ".calls";
117+
118+
private String callsMetricName = DEFAULT_TIME_LIMITER_CALLS;
112119

113120
/**
114121
* Returns a builder for creating custom metric names.
@@ -129,35 +136,11 @@ public static MetricNames ofDefaults() {
129136
return new MetricNames();
130137
}
131138

132-
private String successfulMetricName = SUCCESSFUL_METRIC_NAME;
133-
private String failedMetricName = FAILED_METRIC_NAME;
134-
private String timeoutMetricName = TIMEOUT_METRIC_NAME;
135-
136-
/**
137-
* Returns the metric name for successful calls, defaults to {@value SUCCESSFUL_METRIC_NAME}.
138-
*
139-
* @return The successful calls metric name.
140-
*/
141-
public String getSuccessfulMetricName() {
142-
return successfulMetricName;
143-
}
144-
145-
/**
146-
* Returns the metric name for failed calls, defaults to {@value FAILED_METRIC_NAME}.
147-
*
148-
* @return The failed calls metric name.
149-
*/
150-
public String getFailedMetricName() {
151-
return failedMetricName;
152-
}
153-
154-
/**
155-
* Returns the metric name for timed out calls, defaults to {@value TIMEOUT_METRIC_NAME}.
156-
*
157-
* @return The timed out calls metric name.
139+
/** Returns the metric name for circuit breaker calls, defaults to {@value DEFAULT_TIME_LIMITER_CALLS}.
140+
* @return The circuit breaker calls metric name.
158141
*/
159-
public String getTimeoutMetricName() {
160-
return timeoutMetricName;
142+
public String getCallsMetricName() {
143+
return callsMetricName;
161144
}
162145

163146
/**
@@ -167,36 +150,11 @@ public static class Builder {
167150

168151
private final MetricNames metricNames = new MetricNames();
169152

170-
/**
171-
* Overrides the default metric name {@value MetricNames#SUCCESSFUL_METRIC_NAME} with a given one.
172-
*
173-
* @param successfulMetricName The successful calls metric name.
174-
* @return The builder.
175-
*/
176-
public Builder successfulMetricName(String successfulMetricName) {
177-
metricNames.successfulMetricName = requireNonNull(successfulMetricName);
178-
return this;
179-
}
180-
181-
/**
182-
* Overrides the default metric name {@value MetricNames#FAILED_METRIC_NAME} with a given one.
183-
*
184-
* @param failedMetricName The failed calls metric name.
185-
* @return The builder.
186-
*/
187-
public Builder failedMetricName(String failedMetricName) {
188-
metricNames.failedMetricName = requireNonNull(failedMetricName);
189-
return this;
190-
}
191-
192-
/**
193-
* Overrides the default metric name {@value MetricNames#TIMEOUT_METRIC_NAME} with a given one.
194-
*
195-
* @param timeoutMetricName The timed out calls metric name.
196-
* @return The builder.
197-
*/
198-
public Builder timeoutMetricName(String timeoutMetricName) {
199-
metricNames.timeoutMetricName = requireNonNull(timeoutMetricName);
153+
/** Overrides the default metric name {@value TaggedTimeLimiterMetrics.MetricNames#DEFAULT_TIME_LIMITER_CALLS} with a given one.
154+
* @param callsMetricName The calls metric name.
155+
* @return The builder.*/
156+
public TaggedTimeLimiterMetrics.MetricNames.Builder callsMetricName(String callsMetricName) {
157+
metricNames.callsMetricName = requireNonNull(callsMetricName);
200158
return this;
201159
}
202160

resilience4j-micrometer/src/test/java/io/github/resilience4j/micrometer/tagged/TaggedTimeLimiterMetricsTest.java

Lines changed: 25 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,20 @@
2828
import java.util.Set;
2929
import java.util.concurrent.Callable;
3030
import java.util.concurrent.CompletableFuture;
31+
import java.util.concurrent.TimeUnit;
32+
import java.util.concurrent.TimeoutException;
3133
import java.util.stream.Collectors;
3234

3335
import org.junit.Before;
3436
import org.junit.Test;
3537

36-
import static io.github.resilience4j.micrometer.tagged.MetricsTestHelper.findCounterByNamesTag;
38+
import static io.github.resilience4j.micrometer.tagged.MetricsTestHelper.*;
39+
import static io.github.resilience4j.micrometer.tagged.TaggedCircuitBreakerMetrics.MetricNames.DEFAULT_CIRCUIT_BREAKER_BUFFERED_CALLS;
40+
import static io.github.resilience4j.micrometer.tagged.TaggedTimeLimiterMetrics.MetricNames.DEFAULT_TIME_LIMITER_CALLS;
3741
import static org.assertj.core.api.Assertions.assertThat;
3842

3943
public class TaggedTimeLimiterMetricsTest {
4044

41-
private static final String DEFAULT_PREFIX = "resilience4j.timelimiter";
42-
private static final String SUCCESSFUL = DEFAULT_PREFIX + ".successful";
43-
private static final String FAILED = DEFAULT_PREFIX + ".failed";
44-
private static final String TIMEOUT = DEFAULT_PREFIX + ".timeout";
45-
4645
private MeterRegistry meterRegistry;
4746
private TimeLimiter timeLimiter;
4847
private TimeLimiterRegistry timeLimiterRegistry;
@@ -61,17 +60,18 @@ public void setUp() {
6160
@Test
6261
public void shouldAddMetricsForANewlyCreatedTimeLimiter() {
6362
TimeLimiter newTimeLimiter = timeLimiterRegistry.timeLimiter("backendB");
63+
newTimeLimiter.onSuccess();
6464

6565
assertThat(taggedTimeLimiterMetrics.meterIdMap).containsKeys("backendA", "backendB");
6666
assertThat(taggedTimeLimiterMetrics.meterIdMap.get("backendA")).hasSize(3);
6767
assertThat(taggedTimeLimiterMetrics.meterIdMap.get("backendB")).hasSize(3);
6868

6969
assertThat(meterRegistry.getMeters()).hasSize(6);
7070

71-
Collection<Counter> counters = meterRegistry.get(SUCCESSFUL).counters();
71+
Collection<Counter> counters = meterRegistry.get(DEFAULT_TIME_LIMITER_CALLS).counters();
7272

73-
Optional<Counter> successful = findCounterByNamesTag(counters, newTimeLimiter.getName());
74-
assertThat(successful).map(Counter::count).contains(0d);
73+
Optional<Counter> successful = findCounterByKindAndNameTags(counters, "successful", newTimeLimiter.getName());
74+
assertThat(successful).map(Counter::count).contains(1d);
7575
}
7676

7777
@Test
@@ -88,69 +88,53 @@ public void shouldRemovedMetricsForRemovedRetry() {
8888

8989
@Test
9090
public void shouldReplaceMetrics() {
91-
Counter before = meterRegistry.get(SUCCESSFUL).counter();
91+
Counter before = meterRegistry.get(DEFAULT_TIME_LIMITER_CALLS).counter();
9292
assertThat(before).isNotNull();
9393
assertThat(before.count()).isEqualTo(0);
9494
assertThat(before.getId().getTag(TagNames.NAME)).isEqualTo(timeLimiter.getName());
9595

9696
timeLimiterRegistry.replace(timeLimiter.getName(), TimeLimiter.ofDefaults());
9797

98-
Counter after = meterRegistry.get(SUCCESSFUL).counter();
98+
Counter after = meterRegistry.get(DEFAULT_TIME_LIMITER_CALLS).counter();
9999
assertThat(after).isNotNull();
100100
assertThat(after.count()).isEqualTo(0);
101101
assertThat(after.getId().getTag(TagNames.NAME)).isEqualTo(TimeLimiter.ofDefaults().getName());
102102
}
103103

104104
@Test
105105
public void successfulCounterIsRegistered() {
106-
Counter successful = meterRegistry.get(SUCCESSFUL).counter();
106+
Collection<Counter> counters = meterRegistry.get(DEFAULT_TIME_LIMITER_CALLS).counters();
107+
timeLimiter.onSuccess();
107108

108-
assertThat(successful).isNotNull();
109-
assertThat(successful.count()).isEqualTo(0);
110-
assertThat(successful.getId().getTag(TagNames.NAME)).isEqualTo(timeLimiter.getName());
109+
Optional<Counter> successful = findCounterByKindAndNameTags(counters, "successful", timeLimiter.getName());
110+
assertThat(successful).map(Counter::count).contains(1d);
111111
}
112112

113113
@Test
114114
public void failedCounterIsRegistered() {
115-
Counter failed = meterRegistry.get(FAILED).counter();
115+
Collection<Counter> counters = meterRegistry.get(DEFAULT_TIME_LIMITER_CALLS).counters();
116+
timeLimiter.onError(new RuntimeException());
116117

117-
assertThat(failed).isNotNull();
118-
assertThat(failed.count()).isEqualTo(0);
119-
assertThat(failed.getId().getTag(TagNames.NAME)).isEqualTo(timeLimiter.getName());
118+
Optional<Counter> failed = findCounterByKindAndNameTags(counters, "failed", timeLimiter.getName());
119+
assertThat(failed).map(Counter::count).contains(1d);
120120
}
121121

122122
@Test
123123
public void timoutCounterIsRegistered() {
124-
Counter timout = meterRegistry.get(TIMEOUT).counter();
124+
Collection<Counter> counters = meterRegistry.get(DEFAULT_TIME_LIMITER_CALLS).counters();
125+
timeLimiter.onError(new TimeoutException());
125126

126-
assertThat(timout).isNotNull();
127-
assertThat(timout.count()).isEqualTo(0);
128-
assertThat(timout.getId().getTag(TagNames.NAME)).isEqualTo(timeLimiter.getName());
127+
Optional<Counter> timeout = findCounterByKindAndNameTags(counters, "timeout", timeLimiter.getName());
128+
assertThat(timeout).map(Counter::count).contains(1d);
129129
}
130-
131-
@Test
132-
public void successfulCounterIsIncremented() throws Exception {
133-
Callable<String> decoratedSupplier = timeLimiter.decorateFutureSupplier(() ->
134-
CompletableFuture.completedFuture("Hello world"));
135-
136-
decoratedSupplier.call();
137-
decoratedSupplier.call();
138-
139-
assertThat(meterRegistry.get(SUCCESSFUL).counter().count()).isEqualTo(2);
140-
assertThat(meterRegistry.get(FAILED).counter().count()).isEqualTo(0);
141-
assertThat(meterRegistry.get(TIMEOUT).counter().count()).isEqualTo(0);
142-
}
143-
144130
@Test
145131
public void customMetricNamesGetApplied() {
146132
MeterRegistry meterRegistry = new SimpleMeterRegistry();
147133
TimeLimiterRegistry timeLimiterRegistry = TimeLimiterRegistry.ofDefaults();
148134
timeLimiterRegistry.timeLimiter("backendA");
149135
TaggedTimeLimiterMetrics.ofTimeLimiterRegistry(
150136
TaggedTimeLimiterMetrics.MetricNames.custom()
151-
.successfulMetricName("custom_successful")
152-
.failedMetricName("custom_failed")
153-
.timeoutMetricName("custom_timeout")
137+
.callsMetricName("custom_calls")
154138
.build(),
155139
timeLimiterRegistry
156140
).bindTo(meterRegistry);
@@ -162,9 +146,7 @@ public void customMetricNamesGetApplied() {
162146
.collect(Collectors.toSet());
163147

164148
assertThat(metricNames).hasSameElementsAs(Arrays.asList(
165-
"custom_successful",
166-
"custom_failed",
167-
"custom_timeout"
149+
"custom_calls"
168150
));
169151
}
170152
}

0 commit comments

Comments
 (0)