From deef784403419ed57cb733089c0326d8b0781dd2 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Sat, 13 Sep 2014 07:08:06 -0500 Subject: [PATCH] Blitz some more special characters from the metric names When MVC path matchers are used as metric keys, they can still contain invalid characters and patterns (like asterisks). This change removes some more special characters and also tidies up the names a bit so no key part starts or ends with "-" (which is ugly). Fixes gh-1528 --- .../MetricFilterAutoConfiguration.java | 16 +++++++++++++++- .../MetricFilterAutoConfigurationTests.java | 8 ++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfiguration.java index 720a25e910e..d4751ed24cb 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfiguration.java @@ -101,7 +101,7 @@ public class MetricFilterAutoConfiguration { // not convertible } if (bestMatchingPattern != null) { - suffix = bestMatchingPattern.toString().replaceAll("[{}]", "-"); + suffix = fixSpecialCharacters(bestMatchingPattern.toString()); } else if (httpStatus.is4xxClientError()) { suffix = UNKNOWN_PATH_SUFFIX; @@ -114,6 +114,20 @@ public class MetricFilterAutoConfiguration { } } + private String fixSpecialCharacters(String value) { + String result = value.replaceAll("[{}]", "-"); + result = result.replace("**", "-star-star-"); + result = result.replace("*", "-star-"); + result = result.replace("/-", "/"); + if (result.endsWith("-")) { + result = result.substring(0, result.length() - 1); + } + if (result.startsWith("-")) { + result = result.substring(1); + } + return result; + } + private int getStatus(HttpServletResponse response) { try { return response.getStatus(); diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfigurationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfigurationTests.java index 919a5bbed59..f1c17785bc9 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfigurationTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfigurationTests.java @@ -89,9 +89,9 @@ public class MetricFilterAutoConfigurationTests { mvc.perform(get("/templateVarTest/foo")).andExpect(status().isOk()); verify(context.getBean(CounterService.class)).increment( - "status.200.templateVarTest.-someVariable-"); + "status.200.templateVarTest.someVariable"); verify(context.getBean(GaugeService.class)).submit( - eq("response.templateVarTest.-someVariable-"), anyDouble()); + eq("response.templateVarTest.someVariable"), anyDouble()); context.close(); } @@ -106,9 +106,9 @@ public class MetricFilterAutoConfigurationTests { mvc.perform(get("/knownPath/foo")).andExpect(status().isNotFound()); verify(context.getBean(CounterService.class)).increment( - "status.404.knownPath.-someVariable-"); + "status.404.knownPath.someVariable"); verify(context.getBean(GaugeService.class)).submit( - eq("response.knownPath.-someVariable-"), anyDouble()); + eq("response.knownPath.someVariable"), anyDouble()); context.close(); }