From 17024fb0eda50cb7d062f75713cdfd4428e2ed1c Mon Sep 17 00:00:00 2001 From: Matthew Lowry Date: Wed, 14 Apr 2021 11:24:01 +0930 Subject: [PATCH 1/2] Isolate polling of pollables in StatsdMeterRegistry (#2549) This prevents a misbehaving pollable meter (a gauge with a custom value function that might throw an NPE, for example) from preventing other ongoing polling of other pollable meters. Fixes gh-2543 --- .../main/java/io/micrometer/statsd/StatsdMeterRegistry.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 38ae382c6e..3ba437cc93 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 @@ -161,7 +161,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 + } } } From bd419786cbad691b4486d7dd66245adb22a8c6b1 Mon Sep 17 00:00:00 2001 From: Tommy Ludwig <8924140+shakuzen@users.noreply.github.com> Date: Wed, 14 Apr 2021 10:56:04 +0900 Subject: [PATCH 2/2] Add test for failed poll scenario See gh-2549 --- .../micrometer/statsd/StatsdMeterRegistryTest.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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 774709ce33..e94c533335 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 @@ -44,8 +44,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}. @@ -543,6 +542,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(); + } + private UnicastProcessor lineProcessor() { return UnicastProcessor.create(Queues.unboundedMultiproducer().get()); }