diff --git a/implementations/micrometer-registry-statsd/src/main/java/io/micrometer/statsd/StatsdMeterRegistry.java b/implementations/micrometer-registry-statsd/src/main/java/io/micrometer/statsd/StatsdMeterRegistry.java index a1843cbe25..a57585e98b 100644 --- a/implementations/micrometer-registry-statsd/src/main/java/io/micrometer/statsd/StatsdMeterRegistry.java +++ b/implementations/micrometer-registry-statsd/src/main/java/io/micrometer/statsd/StatsdMeterRegistry.java @@ -175,7 +175,11 @@ private void removePollableMeter(M m) { void poll() { for (StatsdPollable pollableMeter : pollableMeters.values()) { - pollableMeter.poll(); + try { + pollableMeter.poll(); + } catch (RuntimeException e) { + // Silently ignore misbehaving pollable meter + } } } diff --git a/implementations/micrometer-registry-statsd/src/test/java/io/micrometer/statsd/StatsdMeterRegistryTest.java b/implementations/micrometer-registry-statsd/src/test/java/io/micrometer/statsd/StatsdMeterRegistryTest.java index 77c5fcf2d8..629b4d652f 100644 --- a/implementations/micrometer-registry-statsd/src/test/java/io/micrometer/statsd/StatsdMeterRegistryTest.java +++ b/implementations/micrometer-registry-statsd/src/test/java/io/micrometer/statsd/StatsdMeterRegistryTest.java @@ -45,8 +45,7 @@ import static java.util.Collections.singletonList; import static java.util.stream.IntStream.range; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; +import static org.assertj.core.api.Assertions.*; /** * Tests for {@link StatsdMeterRegistry}. @@ -544,6 +543,17 @@ void stopTrackingMetersThatAreRemoved() { assertThat(lines.get("functioncounter")).isEqualTo(1); } + @Test + void pollFailureNotFatal() { + registry = StatsdMeterRegistry.builder(StatsdConfig.DEFAULT).build(); + Gauge.builder("fails", "", o -> { + throw new RuntimeException(); + }).register(registry); + Gauge.builder("works", () -> 42).register(registry); + + assertThatCode(() -> registry.poll()).doesNotThrowAnyException(); + } + @Test @Issue("#2064") void publishLongTaskTimerMax() throws InterruptedException {