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 a92dd2eae4e..ee8bfaec9e1 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,13 @@ 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 +119,15 @@ public class StatsdMetricWriter implements MetricWriter, Closeable { this.client.stop(); } + /** + * Sanitize the metric name if necessary. + * @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 33494ecffb3..4bb09652435 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. @@ -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.fo-o: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.f-o-o:3|g"); + } + private static final class DummyStatsDServer implements Runnable { private final List messagesReceived = new ArrayList();