From 3fb0ae3e3bb0bb17ec8bd36b7efc0823f3a0e78f Mon Sep 17 00:00:00 2001 From: Jay Anderson Date: Thu, 17 Sep 2015 13:06:05 -0700 Subject: [PATCH] Register dropwizard gauges once and then update them The previous implementation would remove and add a new Gauge each time a metric was written. After this change the Gauge is registered once and the value is updated on subsequent calls. --- .../dropwizard/DropwizardMetricServices.java | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServices.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServices.java index a3d9856ff79..4f24bfa038d 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServices.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServices.java @@ -51,7 +51,7 @@ public class DropwizardMetricServices implements CounterService, GaugeService { private final MetricRegistry registry; - private final ConcurrentMap gaugeLocks = new ConcurrentHashMap(); + private final ConcurrentMap gauges = new ConcurrentHashMap(); private final ConcurrentHashMap names = new ConcurrentHashMap(); @@ -99,15 +99,22 @@ public class DropwizardMetricServices implements CounterService, GaugeService { } else { name = wrapGaugeName(name); - final double gauge = value; - // Ensure we synchronize to avoid another thread pre-empting this thread after - // remove causing an error in Dropwizard metrics - // NOTE: Dropwizard provides no way to do this atomically - synchronized (getGaugeLock(name)) { - this.registry.remove(name); - this.registry.register(name, new SimpleGauge(gauge)); + setGaugeValue(name, value); + } + } + + private void setGaugeValue(final String name, final double value) { + // NOTE: Dropwizard provides no way to do this atomically + SimpleGauge gauge = this.gauges.get(name); + if (gauge == null) { + final SimpleGauge newGauge = new SimpleGauge(value); + gauge = this.gauges.putIfAbsent(name, newGauge); + if (gauge == null) { + gauge = newGauge; + this.registry.register(name, gauge); } } + gauge.setValue(value); } private String wrapGaugeName(String metricName) { @@ -130,16 +137,6 @@ public class DropwizardMetricServices implements CounterService, GaugeService { return name; } - private Object getGaugeLock(String name) { - Object lock = this.gaugeLocks.get(name); - if (lock == null) { - Object newLock = new Object(); - lock = this.gaugeLocks.putIfAbsent(name, newLock); - lock = (lock == null ? newLock : lock); - } - return lock; - } - @Override public void reset(String name) { if (!name.startsWith("meter")) { @@ -153,7 +150,7 @@ public class DropwizardMetricServices implements CounterService, GaugeService { */ private final static class SimpleGauge implements Gauge { - private final double value; + private volatile double value; private SimpleGauge(double value) { this.value = value; @@ -163,6 +160,10 @@ public class DropwizardMetricServices implements CounterService, GaugeService { public Double getValue() { return this.value; } + + public void setValue(final double value) { + this.value = value; + } } }