From fdb531eb8f1567441f1d8350007d79a4c558725c Mon Sep 17 00:00:00 2001 From: Dan McKinley Date: Tue, 9 Jun 2015 21:26:41 -0700 Subject: [PATCH 1/3] implements sampling --- build.xml | 1 + .../statsd/ConvenienceMethodProvidingStatsDClient.java | 9 ++++++++- .../com/timgroup/statsd/NonBlockingStatsDClient.java | 9 ++++++++- .../timgroup/statsd/NonBlockingStatsDClientTest.java | 10 +++++----- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/build.xml b/build.xml index 7af39b3..51c7087 100644 --- a/build.xml +++ b/build.xml @@ -73,6 +73,7 @@ + diff --git a/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java b/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java index 60f6aa6..fbfb419 100644 --- a/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java +++ b/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java @@ -84,4 +84,11 @@ public final void recordExecutionTime(String aspect, long timeInMs) { public void recordExecutionTimeToNow(String aspect, long systemTimeMillisAtStart) { time(aspect, Math.max(0, System.currentTimeMillis() - systemTimeMillisAtStart)); } -} \ No newline at end of file + + /** + * Returns true when the client should send a message, given a sample rate. + */ + protected Boolean shouldSend(double sampleRate) { + return Math.random() <= sampleRate; + } +} diff --git a/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java b/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java index 6d75a9c..797902c 100644 --- a/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java +++ b/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java @@ -3,6 +3,7 @@ import java.nio.charset.Charset; import java.text.NumberFormat; import java.util.Locale; +import java.lang.Math; /** * A simple StatsD client implementation facilitating metrics recording. @@ -120,6 +121,9 @@ public void stop() { */ @Override public void count(String aspect, long delta, double sampleRate) { + if (!shouldSend(sampleRate)) { + return; + } send(messageFor(aspect, Long.toString(delta), "c", sampleRate)); } @@ -190,6 +194,9 @@ public void recordSetEvent(String aspect, String eventName) { */ @Override public void recordExecutionTime(String aspect, long timeInMs, double sampleRate) { + if (!shouldSend(sampleRate)) { + return; + } send(messageFor(aspect, Long.toString(timeInMs), "ms", sampleRate)); } @@ -197,7 +204,7 @@ private String messageFor(String aspect, String value, String type) { return messageFor(aspect, value, type, 1.0); } - private String messageFor(String aspect, String value, String type, double sampleRate) { + private String messageFor(String aspect, String value, String type, double sampleRate) { final String message = prefix + aspect + ':' + value + '|' + type; return (sampleRate == 1.0) ? message diff --git a/src/test/java/com/timgroup/statsd/NonBlockingStatsDClientTest.java b/src/test/java/com/timgroup/statsd/NonBlockingStatsDClientTest.java index 3927ca2..b5d5b19 100644 --- a/src/test/java/com/timgroup/statsd/NonBlockingStatsDClientTest.java +++ b/src/test/java/com/timgroup/statsd/NonBlockingStatsDClientTest.java @@ -42,10 +42,10 @@ public void stop() throws Exception { @Test(timeout=5000L) public void sends_counter_value_with_rate_to_statsd() throws Exception { - client.count("mycount", Long.MAX_VALUE, 0.00024); + client.count("mycount", Long.MAX_VALUE, 0.999999); server.waitForMessage(); - assertThat(server.messagesReceived(), contains("my.prefix.mycount:9223372036854775807|c|@0.00024")); + assertThat(server.messagesReceived(), contains("my.prefix.mycount:9223372036854775807|c|@0.999999")); } @Test(timeout=5000L) public void @@ -146,10 +146,10 @@ public void stop() throws Exception { @Test(timeout=5000L) public void sends_timer_with_rate_to_statsd() throws Exception { - client.recordExecutionTime("mytime", 123L, 0.000123); + client.recordExecutionTime("mytime", 123L, 0.999999); server.waitForMessage(); - assertThat(server.messagesReceived(), contains("my.prefix.mytime:123|ms|@0.000123")); + assertThat(server.messagesReceived(), contains("my.prefix.mytime:123|ms|@0.999999")); } @Test(timeout=5000L) public void @@ -240,4 +240,4 @@ public List messagesReceived() { return new ArrayList(messagesReceived); } } -} \ No newline at end of file +} From 526a2bbe019943a5ab58d1dc7fcac352987ca7e3 Mon Sep 17 00:00:00 2001 From: Dan McKinley Date: Tue, 9 Jun 2015 21:40:38 -0700 Subject: [PATCH 2/3] removing unused import --- src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java b/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java index 797902c..0f5b060 100644 --- a/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java +++ b/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java @@ -3,7 +3,6 @@ import java.nio.charset.Charset; import java.text.NumberFormat; import java.util.Locale; -import java.lang.Math; /** * A simple StatsD client implementation facilitating metrics recording. From 71b4eec526479573109a3a4db8ad2e0263f585e0 Mon Sep 17 00:00:00 2001 From: Dan McKinley Date: Wed, 10 Jun 2015 09:21:26 -0700 Subject: [PATCH 3/3] using a nonblocking random source --- .../statsd/ConvenienceMethodProvidingStatsDClient.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java b/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java index fbfb419..59ad555 100644 --- a/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java +++ b/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java @@ -1,5 +1,8 @@ package com.timgroup.statsd; +import java.util.concurrent.ThreadLocalRandom; + + public abstract class ConvenienceMethodProvidingStatsDClient implements StatsDClient { public ConvenienceMethodProvidingStatsDClient() { @@ -89,6 +92,6 @@ public void recordExecutionTimeToNow(String aspect, long systemTimeMillisAtStart * Returns true when the client should send a message, given a sample rate. */ protected Boolean shouldSend(double sampleRate) { - return Math.random() <= sampleRate; + return ThreadLocalRandom.current().nextDouble() <= sampleRate; } }