From 84030ff8fa546f173518ee51e40c149b38be6fa4 Mon Sep 17 00:00:00 2001 From: Tom Denley Date: Mon, 28 Jul 2014 10:41:33 +0100 Subject: [PATCH] tomd: support sample rates for counters, for issue #10 --- .../ConvenienceMethodProvidingStatsDClient.java | 5 +++++ .../com/timgroup/statsd/NoOpStatsDClient.java | 2 +- .../timgroup/statsd/NonBlockingStatsDClient.java | 14 +++++++++++--- .../java/com/timgroup/statsd/StatsDClient.java | 15 +++++++++++++++ .../statsd/NonBlockingStatsDClientTest.java | 8 ++++++++ 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java b/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java index bf640fc..db2516c 100644 --- a/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java +++ b/src/main/java/com/timgroup/statsd/ConvenienceMethodProvidingStatsDClient.java @@ -6,6 +6,11 @@ public ConvenienceMethodProvidingStatsDClient() { super(); } + @Override + public final void count(String aspect, long delta) { + count(aspect, delta, 1.0); + } + /** * Convenience method equivalent to {@link #count(String, long)} with a value of 1. */ diff --git a/src/main/java/com/timgroup/statsd/NoOpStatsDClient.java b/src/main/java/com/timgroup/statsd/NoOpStatsDClient.java index 9ee3917..a4df110 100644 --- a/src/main/java/com/timgroup/statsd/NoOpStatsDClient.java +++ b/src/main/java/com/timgroup/statsd/NoOpStatsDClient.java @@ -9,7 +9,7 @@ */ public final class NoOpStatsDClient extends ConvenienceMethodProvidingStatsDClient { @Override public void stop() { } - @Override public void count(String aspect, long delta) { } + @Override public void count(String aspect, long delta, double sampleRate) { } @Override public void recordGaugeValue(String aspect, long value) { } @Override public void recordGaugeDelta(String aspect, long delta) { } @Override public void recordSetEvent(String aspect, String value) { } diff --git a/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java b/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java index 5421fe1..d768d61 100644 --- a/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java +++ b/src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java @@ -140,10 +140,13 @@ public void stop() { * the name of the counter to adjust * @param delta * the amount to adjust the counter by + * @param sampleRate + * the sampling rate being employed. For example, a rate of 0.1 would tell StatsD that this counter is being sent + * sampled every 1/10th of the time. */ @Override - public void count(String aspect, long delta) { - send(messageFor(aspect, delta, "c")); + public void count(String aspect, long delta, double sampleRate) { + send(messageFor(aspect, delta, "c", sampleRate)); } /** @@ -201,7 +204,12 @@ public void recordExecutionTime(String aspect, long timeInMs) { } private String messageFor(String aspect, Object value, String type) { - return String.format("%s%s:%s|%s", prefix, aspect, value, type); + return messageFor(aspect, value, type, 1.0); + } + + private String messageFor(String aspect, Object value, String type, double sampleRate) { + final String messageFormat = (sampleRate == 1.0) ? "%s%s:%s|%s" : "%s%s:%s|%s@%f"; + return String.format(messageFormat, prefix, aspect, value, type, sampleRate); } private void send(final String message) { diff --git a/src/main/java/com/timgroup/statsd/StatsDClient.java b/src/main/java/com/timgroup/statsd/StatsDClient.java index a9053bd..83f64ac 100644 --- a/src/main/java/com/timgroup/statsd/StatsDClient.java +++ b/src/main/java/com/timgroup/statsd/StatsDClient.java @@ -36,6 +36,21 @@ public interface StatsDClient { */ void count(String aspect, long delta); + /** + * Adjusts the specified counter by a given delta. + * + *

This method is non-blocking and is guaranteed not to throw an exception.

+ * + * @param aspect + * the name of the counter to adjust + * @param delta + * the amount to adjust the counter by + * @param sampleRate + * the sampling rate being employed. For example, a rate of 0.1 would tell StatsD that this counter is being sent + * sampled every 1/10th of the time. + */ + void count(String aspect, long delta, double sampleRate); + /** * Increments the specified counter by one. * diff --git a/src/test/java/com/timgroup/statsd/NonBlockingStatsDClientTest.java b/src/test/java/com/timgroup/statsd/NonBlockingStatsDClientTest.java index 03fe37f..c4ea93f 100644 --- a/src/test/java/com/timgroup/statsd/NonBlockingStatsDClientTest.java +++ b/src/test/java/com/timgroup/statsd/NonBlockingStatsDClientTest.java @@ -39,6 +39,14 @@ public void stop() throws Exception { assertThat(server.messagesReceived(), contains("my.prefix.mycount:9223372036854775807|c")); } + @Test(timeout=5000L) public void + sends_counter_value_with_rate_to_statsd() throws Exception { + client.count("mycount", Long.MAX_VALUE, 0.00024); + server.waitForMessage(); + + assertThat(server.messagesReceived(), contains("my.prefix.mycount:9223372036854775807|c@0.000240")); + } + @Test(timeout=5000L) public void sends_counter_increment_to_statsd() throws Exception { client.incrementCounter("myinc");