From 741a88f0428f424fbe01d0918d902bfa11fdfd60 Mon Sep 17 00:00:00 2001 From: Brian Harrington Date: Thu, 14 Jan 2016 21:19:44 -0800 Subject: [PATCH] delay reporting until there is activity For the servo registry delay marking the counter, timer, or distribution summary as active until there is some activity such as a call to increment on the counter. This is mainly for use-cases that cache the meter instance to avoid the lookup cost, but may not get used for quite a while. --- .../com/netflix/spectator/servo/ServoCounter.java | 2 +- .../spectator/servo/ServoDistributionSummary.java | 2 +- .../com/netflix/spectator/servo/ServoTimer.java | 2 +- .../netflix/spectator/servo/ServoCounterTest.java | 14 +++++++++----- .../netflix/spectator/servo/ServoTimerTest.java | 11 ++++++++--- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoCounter.java b/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoCounter.java index cea99bb03..a0b0cd298 100644 --- a/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoCounter.java +++ b/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoCounter.java @@ -38,7 +38,7 @@ class ServoCounter implements Counter, ServoMeter { this.clock = clock; this.impl = impl; this.count = new AtomicLong(0L); - this.lastUpdated = new AtomicLong(clock.wallTime()); + this.lastUpdated = new AtomicLong(0L); } @Override public void addMonitors(List> monitors) { diff --git a/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoDistributionSummary.java b/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoDistributionSummary.java index ff520136c..6b27d58e0 100644 --- a/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoDistributionSummary.java +++ b/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoDistributionSummary.java @@ -59,7 +59,7 @@ class ServoDistributionSummary implements DistributionSummary, ServoMeter { r.toMonitorConfig(id.withTag(Statistic.totalOfSquares))); servoMax = new MaxGauge(r.toMonitorConfig(id.withTag(Statistic.max))); - lastUpdated = new AtomicLong(clock.wallTime()); + lastUpdated = new AtomicLong(0L); } @Override public void addMonitors(List> monitors) { diff --git a/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoTimer.java b/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoTimer.java index a0ed6d545..45c33e6df 100644 --- a/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoTimer.java +++ b/spectator-reg-servo/src/main/java/com/netflix/spectator/servo/ServoTimer.java @@ -66,7 +66,7 @@ class ServoTimer extends AbstractTimer implements ServoMeter { // Constructor that takes a clock param is not public servoMax = new MaxGauge(r.toMonitorConfig(id.withTag(Statistic.max))); - lastUpdated = new AtomicLong(clock.wallTime()); + lastUpdated = new AtomicLong(0L); } @Override public void addMonitors(List> monitors) { diff --git a/spectator-reg-servo/src/test/java/com/netflix/spectator/servo/ServoCounterTest.java b/spectator-reg-servo/src/test/java/com/netflix/spectator/servo/ServoCounterTest.java index b1d9bfaaa..e312db392 100644 --- a/spectator-reg-servo/src/test/java/com/netflix/spectator/servo/ServoCounterTest.java +++ b/spectator-reg-servo/src/test/java/com/netflix/spectator/servo/ServoCounterTest.java @@ -52,18 +52,22 @@ public void testInit() { @Test public void expiration() { - // Not expired on init - clock.setWallTime(0L); + final long initTime = TimeUnit.MINUTES.toMillis(30); + final long fifteenMinutes = TimeUnit.MINUTES.toMillis(15); + + // Expired on init, wait for activity to mark as active + clock.setWallTime(initTime); Counter c = newCounter("foo"); - Assert.assertTrue(!c.hasExpired()); + Assert.assertTrue(c.hasExpired()); c.increment(42); + Assert.assertTrue(!c.hasExpired()); // Expires with inactivity, total count in memory is maintained - clock.setWallTime(TimeUnit.MINUTES.toMillis(15)); + clock.setWallTime(initTime + fifteenMinutes); Assert.assertTrue(!c.hasExpired()); // Expires with inactivity, total count in memory is maintained - clock.setWallTime(TimeUnit.MINUTES.toMillis(15) + 1); + clock.setWallTime(initTime + fifteenMinutes + 1); Assert.assertEquals(c.count(), 42); Assert.assertTrue(c.hasExpired()); diff --git a/spectator-reg-servo/src/test/java/com/netflix/spectator/servo/ServoTimerTest.java b/spectator-reg-servo/src/test/java/com/netflix/spectator/servo/ServoTimerTest.java index 96a9f381a..831de8578 100644 --- a/spectator-reg-servo/src/test/java/com/netflix/spectator/servo/ServoTimerTest.java +++ b/spectator-reg-servo/src/test/java/com/netflix/spectator/servo/ServoTimerTest.java @@ -222,13 +222,18 @@ public void totalOfSquaresManyBigValues() { @Test public void expiration() { - // Not expired on init - clock.setWallTime(0L); + final long initTime = TimeUnit.MINUTES.toMillis(30); + final long fifteenMinutes = TimeUnit.MINUTES.toMillis(15); + + // Expired on init, wait for activity to mark as active + clock.setWallTime(initTime); Timer t = newTimer("foo"); + Assert.assertTrue(t.hasExpired()); + t.record(1, TimeUnit.SECONDS); Assert.assertTrue(!t.hasExpired()); // Expires with inactivity - clock.setWallTime(TimeUnit.MINUTES.toMillis(16)); + clock.setWallTime(initTime + fifteenMinutes + 1); Assert.assertTrue(t.hasExpired()); // Activity brings it back