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..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() { @@ -84,4 +87,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 ThreadLocalRandom.current().nextDouble() <= sampleRate; + } +} diff --git a/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java b/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java index 6d75a9c..0f5b060 100644 --- a/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java +++ b/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java @@ -120,6 +120,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 +193,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 +203,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 +}