From 13aa2d29b1d3692226f1af7111090f4605c682a4 Mon Sep 17 00:00:00 2001 From: Sebastian Steiner Date: Tue, 22 Oct 2024 11:00:10 +0200 Subject: [PATCH] Enable Gauges builders to take a subclass of Number --- .../io/micrometer/core/instrument/Gauge.java | 2 +- .../core/instrument/MultiGauge.java | 2 +- .../micrometer/core/instrument/TimeGauge.java | 2 +- .../core/instrument/MultiGaugeTest.java | 9 +++++ .../simple/SimpleMeterRegistryTest.java | 34 +++++++++++++++++++ 5 files changed, 46 insertions(+), 3 deletions(-) diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/Gauge.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/Gauge.java index 54d2b88af8..dec1042359 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/Gauge.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/Gauge.java @@ -53,7 +53,7 @@ static Builder builder(String name, @Nullable T obj, ToDoubleFunction * @since 1.1.0 */ @Incubating(since = "1.1.0") - static Builder> builder(String name, Supplier f) { + static Builder> builder(String name, Supplier f) { return new Builder<>(name, f, f2 -> { Number val = f2.get(); return val == null ? Double.NaN : val.doubleValue(); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/MultiGauge.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/MultiGauge.java index dd7a854505..b1e4b16757 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/MultiGauge.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/MultiGauge.java @@ -112,7 +112,7 @@ public static Row of(Tags uniqueTags, Number number) { return new Row<>(uniqueTags, number, Number::doubleValue); } - public static Row> of(Tags uniqueTags, Supplier valueFunction) { + public static Row> of(Tags uniqueTags, Supplier valueFunction) { return new Row<>(uniqueTags, valueFunction, f -> { Number value = valueFunction.get(); return value == null ? Double.NaN : value.doubleValue(); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/TimeGauge.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/TimeGauge.java index 0537c4ddd4..21ff8e3078 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/TimeGauge.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/TimeGauge.java @@ -46,7 +46,7 @@ static Builder builder(String name, @Nullable T obj, TimeUnit fUnits, ToD * @since 1.7.0 */ @Incubating(since = "1.7.0") - static Builder> builder(String name, Supplier f, TimeUnit fUnits) { + static Builder> builder(String name, Supplier f, TimeUnit fUnits) { return new Builder<>(name, f, fUnits, f2 -> { Number val = f2.get(); return val == null ? Double.NaN : val.doubleValue(); diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/MultiGaugeTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/MultiGaugeTest.java index d080c217d2..5ea202712a 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/MultiGaugeTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/MultiGaugeTest.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -93,6 +94,14 @@ void rowGaugesHoldStrongReferences() { assertThat(registry.get("colors").tag("color", "red").gauge().value()).isEqualTo(1); } + @Test + void rowGaugesCanTakeSubClassOfNumberSuppliers() { + final Supplier supplier = () -> 1L; + colorGauges.register(Collections.singletonList(Row.of(Tags.of("color", "red"), supplier))); + + assertThat(registry.get("colors").tag("color", "red").gauge().value()).isEqualTo(1); + } + @Test void overwrite() { testOverwrite(); diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/simple/SimpleMeterRegistryTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/simple/SimpleMeterRegistryTest.java index def2adbfc0..1f69dd08dc 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/simple/SimpleMeterRegistryTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/simple/SimpleMeterRegistryTest.java @@ -22,12 +22,17 @@ import io.micrometer.core.instrument.step.StepFunctionCounter; import io.micrometer.core.instrument.step.StepFunctionTimer; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import java.math.BigInteger; import java.time.Duration; import java.util.Arrays; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Supplier; +import java.util.stream.Stream; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.assertj.core.api.Assertions.assertThat; @@ -165,6 +170,35 @@ void stringRepresentationOfMetersShouldBeOk() { sample.stop(); } + @ParameterizedTest + @MethodSource("getSuppliers") + void newGaugeWhenSupplierProvidesSubClassOfNumberShouldReportCorrectly(Supplier supplier) { + Gauge.builder("temperature", supplier).register(registry); + assertThat(registry.getMeters()).singleElement().satisfies(meter -> { + assertThat(meter.getId().getName()).isEqualTo("temperature"); + assertThat(meter.measure()).singleElement() + .satisfies(measurement -> assertThat(measurement.getValue()).isEqualTo(70)); + }); + } + + @ParameterizedTest + @MethodSource("getSuppliers") + void newTimeGaugeWhenSupplierProvidesSubClassOfNumberShouldReportCorrectly(Supplier supplier) { + TimeGauge.builder("processing.time", supplier, TimeUnit.SECONDS).register(registry); + assertThat(registry.getMeters()).singleElement().satisfies(meter -> { + assertThat(meter.getId().getName()).isEqualTo("processing.time"); + assertThat(meter.getId().getBaseUnit()).isEqualTo("seconds"); + assertThat(meter.measure()).singleElement() + .satisfies(measurement -> assertThat(measurement.getValue()).isEqualTo(70)); + }); + } + + private static Stream> getSuppliers() { + return Stream.of((Supplier) () -> 70, (Supplier) () -> 70.0, (Supplier) () -> 70L, + (Supplier) () -> new AtomicInteger(70), + (Supplier) () -> new BigInteger("70")); + } + private SimpleMeterRegistry createRegistry(CountingMode mode) { return new SimpleMeterRegistry(new SimpleConfig() {