From 9e705c83c8ebdc7618615ca27bf82e21581d224b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Od=C3=ADn=20del=20R=C3=ADo?= Date: Sun, 16 Apr 2017 11:56:20 +0200 Subject: [PATCH 1/3] Fix statsd metrics collection for names with ":" Statsd server is ignoring malformed metrics. This change introduces a basic sanitizing to metric names for avoid losing those metrics. See gh-8906 --- .../metrics/statsd/StatsdMetricWriter.java | 15 +++++++++++++-- .../metrics/statsd/StatsdMetricWriterTests.java | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriter.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriter.java index a92dd2eae4..1719383611 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriter.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriter.java @@ -39,6 +39,7 @@ import org.springframework.util.StringUtils; * a gauge. * * @author Dave Syer + * @author Odín del Río * @since 1.3.0 */ public class StatsdMetricWriter implements MetricWriter, Closeable { @@ -87,12 +88,12 @@ public class StatsdMetricWriter implements MetricWriter, Closeable { @Override public void increment(Delta delta) { - this.client.count(delta.getName(), delta.getValue().longValue()); + this.client.count(sanitizeMetricName(delta.getName()), delta.getValue().longValue()); } @Override public void set(Metric value) { - String name = value.getName(); + String name = sanitizeMetricName(value.getName()); if (name.contains("timer.") && !name.contains("gauge.") && !name.contains("counter.")) { this.client.recordExecutionTime(name, value.getValue().longValue()); @@ -117,6 +118,16 @@ public class StatsdMetricWriter implements MetricWriter, Closeable { this.client.stop(); } + /** + * The statsd server does not allow ":" in metric names. Since the the statsd client + * is not dealing with this, we have to sanitize the metric name. + * @param name The metric name + * @return The sanitized metric name + */ + private String sanitizeMetricName(String name) { + return name.replace(":", ""); + } + private static final class LoggingStatsdErrorHandler implements StatsDClientErrorHandler { diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriterTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriterTests.java index 33494ecffb..6e1043caea 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriterTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriterTests.java @@ -36,6 +36,7 @@ import static org.assertj.core.api.Assertions.assertThat; * Tests for {@link StatsdMetricWriter}. * * @author Dave Syer + * @author Odín del Río */ public class StatsdMetricWriterTests { @@ -97,6 +98,20 @@ public class StatsdMetricWriterTests { assertThat(this.server.messagesReceived().get(0)).isEqualTo("my.gauge.foo:3|g"); } + @Test + public void incrementMetricWithInvalidCharsInName() throws Exception { + this.writer.increment(new Delta<>("counter.fo:o", 3L)); + this.server.waitForMessage(); + assertThat(this.server.messagesReceived().get(0)).isEqualTo("me.counter.foo:3|c"); + } + + @Test + public void setMetricWithInvalidCharsInName() throws Exception { + this.writer.set(new Metric<>("gauge.f:o:o", 3L)); + this.server.waitForMessage(); + assertThat(this.server.messagesReceived().get(0)).isEqualTo("me.gauge.foo:3|g"); + } + private static final class DummyStatsDServer implements Runnable { private final List messagesReceived = new ArrayList(); From 9a5346f29c80067776b8c22556f0e9eb60bdb97b Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 18 Apr 2017 10:39:54 +0200 Subject: [PATCH 2/3] Polish "Fix statsd metrics collection for names with ":"" Closes gh-8906 --- .../actuate/metrics/statsd/StatsdMetricWriter.java | 8 ++++---- .../metrics/statsd/StatsdMetricWriterTests.java | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriter.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriter.java index 1719383611..ee8bfaec9e 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriter.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriter.java @@ -88,7 +88,8 @@ public class StatsdMetricWriter implements MetricWriter, Closeable { @Override public void increment(Delta delta) { - this.client.count(sanitizeMetricName(delta.getName()), delta.getValue().longValue()); + this.client.count(sanitizeMetricName(delta.getName()), + delta.getValue().longValue()); } @Override @@ -119,13 +120,12 @@ public class StatsdMetricWriter implements MetricWriter, Closeable { } /** - * The statsd server does not allow ":" in metric names. Since the the statsd client - * is not dealing with this, we have to sanitize the metric name. + * Sanitize the metric name if necessary. * @param name The metric name * @return The sanitized metric name */ private String sanitizeMetricName(String name) { - return name.replace(":", ""); + return name.replace(":", "-"); } private static final class LoggingStatsdErrorHandler diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriterTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriterTests.java index 6e1043caea..4bb0965243 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriterTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/statsd/StatsdMetricWriterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -100,16 +100,16 @@ public class StatsdMetricWriterTests { @Test public void incrementMetricWithInvalidCharsInName() throws Exception { - this.writer.increment(new Delta<>("counter.fo:o", 3L)); + this.writer.increment(new Delta("counter.fo:o", 3L)); this.server.waitForMessage(); - assertThat(this.server.messagesReceived().get(0)).isEqualTo("me.counter.foo:3|c"); + assertThat(this.server.messagesReceived().get(0)).isEqualTo("me.counter.fo-o:3|c"); } @Test public void setMetricWithInvalidCharsInName() throws Exception { - this.writer.set(new Metric<>("gauge.f:o:o", 3L)); + this.writer.set(new Metric("gauge.f:o:o", 3L)); this.server.waitForMessage(); - assertThat(this.server.messagesReceived().get(0)).isEqualTo("me.gauge.foo:3|g"); + assertThat(this.server.messagesReceived().get(0)).isEqualTo("me.gauge.f-o-o:3|g"); } private static final class DummyStatsDServer implements Runnable { From 63cfad855cd8e59d03769fde24d46bfc772cf9a2 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 18 Apr 2017 10:41:53 +0200 Subject: [PATCH 3/3] Fix continuation indent Closes gh-8497 --- .editorconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.editorconfig b/.editorconfig index 176815b357..26c1be0945 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,7 +3,9 @@ root=true [*.java] indent_style = tab indent_size = 4 +continuation_indent_size = 8 [*.xml] indent_style = tab indent_size = 4 +continuation_indent_size = 8