Fix memory leak in Dropwizard metrics: use sliding window reservoir
Change-Id: Ibd76338d8e88bfc0745dd397861b6655430ddeb0
diff --git a/utils/misc/src/main/java/org/onlab/metrics/MetricsManager.java b/utils/misc/src/main/java/org/onlab/metrics/MetricsManager.java
index 7b9df98..dacd310 100644
--- a/utils/misc/src/main/java/org/onlab/metrics/MetricsManager.java
+++ b/utils/misc/src/main/java/org/onlab/metrics/MetricsManager.java
@@ -22,6 +22,7 @@
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.SlidingWindowReservoir;
import com.codahale.metrics.Timer;
import com.google.common.collect.Sets;
@@ -180,7 +181,17 @@
final MetricsFeature feature,
final String metricName) {
final String name = generateName(component, feature, metricName);
- return metricsRegistry.timer(name);
+ Timer timer = metricsRegistry.getTimers().get(name);
+ if (timer != null) {
+ return timer;
+ }
+
+ timer = new Timer(new SlidingWindowReservoir(1028));
+ try {
+ return metricsRegistry.register(name, timer);
+ } catch (IllegalArgumentException e) {
+ return metricsRegistry.timer(name);
+ }
}
/**