Skip to content

Commit 659ae47

Browse files
authored
Enable Gauge builders to take a subclass of Number (#5601)
This helps with type erasure issues.
1 parent b9f252a commit 659ae47

File tree

5 files changed

+46
-3
lines changed

5 files changed

+46
-3
lines changed

micrometer-core/src/main/java/io/micrometer/core/instrument/Gauge.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ static <T> Builder<T> builder(String name, @Nullable T obj, ToDoubleFunction<T>
5353
* @since 1.1.0
5454
*/
5555
@Incubating(since = "1.1.0")
56-
static Builder<Supplier<Number>> builder(String name, Supplier<Number> f) {
56+
static <T extends Number> Builder<Supplier<T>> builder(String name, Supplier<T> f) {
5757
return new Builder<>(name, f, f2 -> {
5858
Number val = f2.get();
5959
return val == null ? Double.NaN : val.doubleValue();

micrometer-core/src/main/java/io/micrometer/core/instrument/MultiGauge.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public static Row<Number> of(Tags uniqueTags, Number number) {
112112
return new Row<>(uniqueTags, number, Number::doubleValue);
113113
}
114114

115-
public static Row<Supplier<Number>> of(Tags uniqueTags, Supplier<Number> valueFunction) {
115+
public static <T extends Number> Row<Supplier<T>> of(Tags uniqueTags, Supplier<T> valueFunction) {
116116
return new Row<>(uniqueTags, valueFunction, f -> {
117117
Number value = valueFunction.get();
118118
return value == null ? Double.NaN : value.doubleValue();

micrometer-core/src/main/java/io/micrometer/core/instrument/TimeGauge.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ static <T> Builder<T> builder(String name, @Nullable T obj, TimeUnit fUnits, ToD
4646
* @since 1.7.0
4747
*/
4848
@Incubating(since = "1.7.0")
49-
static Builder<Supplier<Number>> builder(String name, Supplier<Number> f, TimeUnit fUnits) {
49+
static <T extends Number> Builder<Supplier<T>> builder(String name, Supplier<T> f, TimeUnit fUnits) {
5050
return new Builder<>(name, f, fUnits, f2 -> {
5151
Number val = f2.get();
5252
return val == null ? Double.NaN : val.doubleValue();

micrometer-core/src/test/java/io/micrometer/core/instrument/MultiGaugeTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Map;
2727
import java.util.concurrent.ConcurrentHashMap;
2828
import java.util.concurrent.atomic.AtomicInteger;
29+
import java.util.function.Supplier;
2930
import java.util.stream.Collectors;
3031
import java.util.stream.Stream;
3132

@@ -93,6 +94,14 @@ void rowGaugesHoldStrongReferences() {
9394
assertThat(registry.get("colors").tag("color", "red").gauge().value()).isEqualTo(1);
9495
}
9596

97+
@Test
98+
void rowGaugesCanTakeSubClassOfNumberSuppliers() {
99+
final Supplier<Long> supplier = () -> 1L;
100+
colorGauges.register(Collections.singletonList(Row.of(Tags.of("color", "red"), supplier)));
101+
102+
assertThat(registry.get("colors").tag("color", "red").gauge().value()).isEqualTo(1);
103+
}
104+
96105
@Test
97106
void overwrite() {
98107
testOverwrite();

micrometer-core/src/test/java/io/micrometer/core/instrument/simple/SimpleMeterRegistryTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,17 @@
2222
import io.micrometer.core.instrument.step.StepFunctionCounter;
2323
import io.micrometer.core.instrument.step.StepFunctionTimer;
2424
import org.junit.jupiter.api.Test;
25+
import org.junit.jupiter.params.ParameterizedTest;
26+
import org.junit.jupiter.params.provider.MethodSource;
2527

28+
import java.math.BigInteger;
2629
import java.time.Duration;
2730
import java.util.Arrays;
2831
import java.util.concurrent.TimeUnit;
2932
import java.util.concurrent.atomic.AtomicInteger;
3033
import java.util.concurrent.atomic.AtomicLong;
34+
import java.util.function.Supplier;
35+
import java.util.stream.Stream;
3136

3237
import static java.util.concurrent.TimeUnit.MILLISECONDS;
3338
import static org.assertj.core.api.Assertions.assertThat;
@@ -165,6 +170,35 @@ void stringRepresentationOfMetersShouldBeOk() {
165170
sample.stop();
166171
}
167172

173+
@ParameterizedTest
174+
@MethodSource("getSuppliers")
175+
void newGaugeWhenSupplierProvidesSubClassOfNumberShouldReportCorrectly(Supplier<? extends Number> supplier) {
176+
Gauge.builder("temperature", supplier).register(registry);
177+
assertThat(registry.getMeters()).singleElement().satisfies(meter -> {
178+
assertThat(meter.getId().getName()).isEqualTo("temperature");
179+
assertThat(meter.measure()).singleElement()
180+
.satisfies(measurement -> assertThat(measurement.getValue()).isEqualTo(70));
181+
});
182+
}
183+
184+
@ParameterizedTest
185+
@MethodSource("getSuppliers")
186+
void newTimeGaugeWhenSupplierProvidesSubClassOfNumberShouldReportCorrectly(Supplier<? extends Number> supplier) {
187+
TimeGauge.builder("processing.time", supplier, TimeUnit.SECONDS).register(registry);
188+
assertThat(registry.getMeters()).singleElement().satisfies(meter -> {
189+
assertThat(meter.getId().getName()).isEqualTo("processing.time");
190+
assertThat(meter.getId().getBaseUnit()).isEqualTo("seconds");
191+
assertThat(meter.measure()).singleElement()
192+
.satisfies(measurement -> assertThat(measurement.getValue()).isEqualTo(70));
193+
});
194+
}
195+
196+
private static Stream<Supplier<? extends Number>> getSuppliers() {
197+
return Stream.of((Supplier<Integer>) () -> 70, (Supplier<Double>) () -> 70.0, (Supplier<Long>) () -> 70L,
198+
(Supplier<AtomicInteger>) () -> new AtomicInteger(70),
199+
(Supplier<BigInteger>) () -> new BigInteger("70"));
200+
}
201+
168202
private SimpleMeterRegistry createRegistry(CountingMode mode) {
169203
return new SimpleMeterRegistry(new SimpleConfig() {
170204

0 commit comments

Comments
 (0)