From ff666638ca1f8c0930e1f2c6a3926d8761a19cff Mon Sep 17 00:00:00 2001 From: Chai Nadig Date: Sat, 16 May 2020 17:29:50 -0700 Subject: [PATCH 1/2] tags - encode tags set for a metric --- .../client/statsd/MetricToBytesEncoder.java | 14 ++++++++++- .../statsd/GaugeToBytesEncoderTest.java | 12 ++++++++++ .../statsd/MetricToBytesEncoderTest.java | 23 ++++++++++++++----- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/metrics-statsd/src/main/java/com/flozano/metrics/client/statsd/MetricToBytesEncoder.java b/metrics-statsd/src/main/java/com/flozano/metrics/client/statsd/MetricToBytesEncoder.java index 63a5f99..b4e2a8c 100644 --- a/metrics-statsd/src/main/java/com/flozano/metrics/client/statsd/MetricToBytesEncoder.java +++ b/metrics-statsd/src/main/java/com/flozano/metrics/client/statsd/MetricToBytesEncoder.java @@ -3,9 +3,11 @@ import java.nio.charset.StandardCharsets; import java.util.function.Consumer; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.flozano.metrics.Tags; import com.flozano.metrics.client.MetricValue; import com.flozano.metrics.client.MetricsClient; @@ -51,6 +53,16 @@ public static void toStringParts(MetricValue msg, Consumer parts) { parts.accept("|@"); parts.accept(String.format("%1.2f", r)); } - } + Tags tags = msg.getTags(); + if (!tags.isEmpty()) { + parts.accept("|#"); + parts.accept(tags + .stream() + .sorted() + .map(tag -> String.valueOf(tag.name) + ':' + tag.value) + .collect(Collectors.joining(",")) + ); + } + } } diff --git a/metrics-statsd/src/test/java/com/flozano/metrics/client/statsd/GaugeToBytesEncoderTest.java b/metrics-statsd/src/test/java/com/flozano/metrics/client/statsd/GaugeToBytesEncoderTest.java index c42aeca..cf60e30 100644 --- a/metrics-statsd/src/test/java/com/flozano/metrics/client/statsd/GaugeToBytesEncoderTest.java +++ b/metrics-statsd/src/test/java/com/flozano/metrics/client/statsd/GaugeToBytesEncoderTest.java @@ -2,6 +2,8 @@ import static org.junit.Assert.assertEquals; + +import com.flozano.metrics.Tags; import org.junit.Test; import com.flozano.metrics.client.GaugeValue; @@ -27,4 +29,14 @@ public void deltaValue() { public void deltaNegativeValue() { assertEquals("gauge:-1234|g", MetricToBytesEncoder.toString(new GaugeValue("gauge", -1234, true))); } + + @Test + public void tagsWithDeltaValue() { + assertEquals("gauge:+1|g|#lab:val", MetricToBytesEncoder.toString( + new GaugeValue("gauge", 1, true, Tags.empty().with("lab", "val")))); + + assertEquals("gauge:-1|g|#gel:lib,lab:val", MetricToBytesEncoder.toString( + new GaugeValue("gauge", -1, true, Tags.empty() + .with("lab", "val").with("gel", "lib")))); + } } diff --git a/metrics-statsd/src/test/java/com/flozano/metrics/client/statsd/MetricToBytesEncoderTest.java b/metrics-statsd/src/test/java/com/flozano/metrics/client/statsd/MetricToBytesEncoderTest.java index ca8b168..3819a63 100644 --- a/metrics-statsd/src/test/java/com/flozano/metrics/client/statsd/MetricToBytesEncoderTest.java +++ b/metrics-statsd/src/test/java/com/flozano/metrics/client/statsd/MetricToBytesEncoderTest.java @@ -4,12 +4,15 @@ import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; + +import com.flozano.metrics.Tags; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -22,14 +25,15 @@ @RunWith(Parameterized.class) public class MetricToBytesEncoderTest { - @Parameters(name = "{index}: type={0}, name={1}, value={2}, sampleRate={3}") + @Parameters(name = "{index}: type={0}, name={1}, value={2}, sampleRate={3}, tags={4}") public static Collection params() { List params = new LinkedList<>(); + Tags tags = Tags.empty().with("lab", "val").with("gel", "lib"); for (Class c : Arrays.asList(GaugeValue.class, CountValue.class, TimingValue.class)) { for (String name : Arrays.asList("some", "thing")) { for (long value : Arrays.asList(100, 100000, 20000)) { for (Double sampleRate : Arrays. asList(0.1, 0.5, 1d, null)) { - params.add(new Object[] { c, name, value, sampleRate }); + params.add(new Object[] { c, name, value, sampleRate, tags }); } } } @@ -43,12 +47,14 @@ public static Collection params() { String name = "something"; long value; Double sampleRate; + Tags tags; - public MetricToBytesEncoderTest(Class type, String name, long value, Double sampleRate) { + public MetricToBytesEncoderTest(Class type, String name, long value, Double sampleRate, Tags tags) { this.type = type; this.name = name; this.value = value; this.sampleRate = sampleRate; + this.tags = tags; } @Test @@ -61,15 +67,20 @@ public void toStringPartsTest() { String expectedValue(String suffix) { + String formattedTags = tags + .stream() + .sorted() + .map(tag -> String.valueOf(tag.name) + ':' + tag.value) + .collect(Collectors.joining(",")); if (sampleRate == null) { - return String.format("%s:%d|%s", name, value, suffix); + return String.format("%s:%d|%s|#%s", name, value, suffix, formattedTags); } - return String.format("%s:%d|%s|@%.2f", name, value, suffix, sampleRate); + return String.format("%s:%d|%s|@%.2f|#%s", name, value, suffix, sampleRate, formattedTags); } MetricValue newMetric() { try { - return type.getConstructor(String.class, long.class, Double.class).newInstance(name, value, sampleRate); + return type.getConstructor(String.class, long.class, Double.class, Tags.class).newInstance(name, value, sampleRate, tags); } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { throw new RuntimeException(e); From 3cd19a1f29acbf894a9d6225d66bd151e0f370ec Mon Sep 17 00:00:00 2001 From: Chai Nadig Date: Sat, 16 May 2020 17:31:28 -0700 Subject: [PATCH 2/2] formatting --- .../com/flozano/metrics/client/statsd/MetricToBytesEncoder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metrics-statsd/src/main/java/com/flozano/metrics/client/statsd/MetricToBytesEncoder.java b/metrics-statsd/src/main/java/com/flozano/metrics/client/statsd/MetricToBytesEncoder.java index b4e2a8c..843f2b7 100644 --- a/metrics-statsd/src/main/java/com/flozano/metrics/client/statsd/MetricToBytesEncoder.java +++ b/metrics-statsd/src/main/java/com/flozano/metrics/client/statsd/MetricToBytesEncoder.java @@ -57,7 +57,7 @@ public static void toStringParts(MetricValue msg, Consumer parts) { Tags tags = msg.getTags(); if (!tags.isEmpty()) { parts.accept("|#"); - parts.accept(tags + parts.accept(tags .stream() .sorted() .map(tag -> String.valueOf(tag.name) + ':' + tag.value)