diff --git a/spectator-ext-sandbox/src/main/java/com/netflix/spectator/sandbox/DoubleDistributionSummary.java b/spectator-ext-sandbox/src/main/java/com/netflix/spectator/sandbox/DoubleDistributionSummary.java index c8f3de042..5a03abb24 100644 --- a/spectator-ext-sandbox/src/main/java/com/netflix/spectator/sandbox/DoubleDistributionSummary.java +++ b/spectator-ext-sandbox/src/main/java/com/netflix/spectator/sandbox/DoubleDistributionSummary.java @@ -17,12 +17,16 @@ import com.netflix.spectator.api.Clock; +import com.netflix.spectator.api.ExtendedRegistry; import com.netflix.spectator.api.Id; import com.netflix.spectator.api.Measurement; import com.netflix.spectator.api.Meter; +import com.netflix.spectator.api.Registry; +import com.netflix.spectator.api.Spectator; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; /** @@ -31,6 +35,48 @@ */ public class DoubleDistributionSummary implements Meter { + private static final ConcurrentHashMap INSTANCES = + new ConcurrentHashMap<>(); + + // https://github.com/Netflix/spectator/issues/43 + private static final long RESET_FREQ = 60000L; + + /** + * Get or create a double distribution summary with the specified id. + * + * @param id + * Identifier for the metric being registered. + * @return + * Distribution summary corresponding to the id. + */ + public static DoubleDistributionSummary get(Id id) { + return get(Spectator.registry(), id); + } + + /** + * Get or create a double distribution summary with the specified id. + * + * @param registry + * Registry to use. + * @param id + * Identifier for the metric being registered. + * @return + * Distribution summary corresponding to the id. + */ + static DoubleDistributionSummary get(Registry registry, Id id) { + DoubleDistributionSummary instance = INSTANCES.get(id); + if (instance == null) { + final Clock c = registry.clock(); + DoubleDistributionSummary tmp = new DoubleDistributionSummary(c, id, RESET_FREQ); + instance = INSTANCES.putIfAbsent(id, tmp); + if (instance == null) { + instance = tmp; + registry.register(tmp); + } + } + return instance; + } + private static final long ZERO = Double.doubleToLongBits(0.0); private final Clock clock; @@ -49,7 +95,12 @@ public class DoubleDistributionSummary implements Meter { private final Id totalOfSquaresId; private final Id maxId; - /** Create a new instance. */ + /** + * Create a new instance. + * + * @deprecated Use DoubleDistributionSummary.get(id). This will be made package private in 0.15. + */ + @Deprecated public DoubleDistributionSummary(Clock clock, Id id, long resetFreq) { this.clock = clock; this.id = id; diff --git a/spectator-ext-sandbox/src/test/java/com/netflix/spectator/sandbox/DoubleDistributionSummaryTest.java b/spectator-ext-sandbox/src/test/java/com/netflix/spectator/sandbox/DoubleDistributionSummaryTest.java index 23d0f084d..a484fcd08 100644 --- a/spectator-ext-sandbox/src/test/java/com/netflix/spectator/sandbox/DoubleDistributionSummaryTest.java +++ b/spectator-ext-sandbox/src/test/java/com/netflix/spectator/sandbox/DoubleDistributionSummaryTest.java @@ -170,4 +170,12 @@ public void testRegister() { } } + @Test + public void staticGet() { + Id id = registry.createId("foo"); + DoubleDistributionSummary t = DoubleDistributionSummary.get(registry, id); + Assert.assertSame(t, DoubleDistributionSummary.get(registry, id)); + Assert.assertNotNull(registry.get(id)); + } + }