diff --git a/implementations/micrometer-registry-dynatrace/src/main/java/io/micrometer/dynatrace/DynatraceNamingConvention.java b/implementations/micrometer-registry-dynatrace/src/main/java/io/micrometer/dynatrace/DynatraceNamingConvention.java index ea3a04c907..b6b71d1bb1 100644 --- a/implementations/micrometer-registry-dynatrace/src/main/java/io/micrometer/dynatrace/DynatraceNamingConvention.java +++ b/implementations/micrometer-registry-dynatrace/src/main/java/io/micrometer/dynatrace/DynatraceNamingConvention.java @@ -21,8 +21,17 @@ import java.util.regex.Pattern; +/** + * {@link NamingConvention} for Dynatrace. + * + * @author Oriol Barcelona Palau + * @author Jon Schneider + * @author Johnny Lim + * @since 1.1.0 + */ public class DynatraceNamingConvention implements NamingConvention { + private static final Pattern NAME_CLEANUP_PATTERN = Pattern.compile("[^\\w._-]"); private static final Pattern KEY_CLEANUP_PATTERN = Pattern.compile("[^\\w.-]"); private final NamingConvention delegate; @@ -37,7 +46,14 @@ public DynatraceNamingConvention() { @Override public String name(String name, Meter.Type type, @Nullable String baseUnit) { - return "custom:" + delegate.name(name, type, baseUnit); + return "custom:" + sanitizeName(delegate.name(name, type, baseUnit)); + } + + private String sanitizeName(String name) { + if (name.equals("system.load.average.1m")) { + return "system.load.average.oneminute"; + } + return NAME_CLEANUP_PATTERN.matcher(name).replaceAll("_"); } @Override diff --git a/implementations/micrometer-registry-dynatrace/src/test/java/io/micrometer/dynatrace/DynatraceNamingConventionTest.java b/implementations/micrometer-registry-dynatrace/src/test/java/io/micrometer/dynatrace/DynatraceNamingConventionTest.java index 4fb1c9eb60..48be6223c5 100644 --- a/implementations/micrometer-registry-dynatrace/src/test/java/io/micrometer/dynatrace/DynatraceNamingConventionTest.java +++ b/implementations/micrometer-registry-dynatrace/src/test/java/io/micrometer/dynatrace/DynatraceNamingConventionTest.java @@ -20,7 +20,13 @@ import static org.assertj.core.api.Assertions.assertThat; - +/** + * Tests for {@link DynatraceNamingConvention}. + * + * @author Oriol Barcelona Palau + * @author Jon Schneider + * @author Johnny Lim + */ class DynatraceNamingConventionTest { private final DynatraceNamingConvention convention = new DynatraceNamingConvention(); @@ -30,8 +36,26 @@ void nameStartsWithCustomAndColon() { assertThat(convention.name("mymetric", Meter.Type.COUNTER, null)).isEqualTo("custom:mymetric"); } + @Test + void nameShouldAllowAlphanumericUnderscoreAndDash() { + assertThat(convention.name("my.name1", Meter.Type.COUNTER, null)).isEqualTo("custom:my.name1"); + assertThat(convention.name("my_name1", Meter.Type.COUNTER, null)).isEqualTo("custom:my_name1"); + assertThat(convention.name("my-name1", Meter.Type.COUNTER, null)).isEqualTo("custom:my-name1"); + } + + @Test + void nameShouldSanitize() { + assertThat(convention.name("my,name1", Meter.Type.COUNTER, null)).isEqualTo("custom:my_name1"); + } + + @Test + void nameWithSystemLoadAverageOneMintueShouldSanitize() { + assertThat(convention.name("system.load.average.1m", Meter.Type.COUNTER, null)) + .isEqualTo("custom:system.load.average.oneminute"); + } + @Test void tagKeysAreSanitized() { assertThat(convention.tagKey("{tagTag0}.-")).isEqualTo("_tagTag0_.-"); } -} \ No newline at end of file +}