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();