From a168670a8d00b4141bc9beac6f423f39f36b434c Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Fri, 25 Sep 2015 23:59:15 -0700 Subject: [PATCH] Use static Patterns in MetricsFilter Update MetricsFilter to use static `Pattern` instances for regex replacements rather than compiling them each time. Fixes gh-3996 --- .../actuate/autoconfigure/MetricsFilter.java | 67 +++++++++++++++---- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricsFilter.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricsFilter.java index df971d26fea..d9cd686a4a4 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricsFilter.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricsFilter.java @@ -17,6 +17,11 @@ package org.springframework.boot.actuate.autoconfigure; import java.io.IOException; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.servlet.FilterChain; import javax.servlet.ServletException; @@ -52,6 +57,25 @@ final class MetricsFilter extends OncePerRequestFilter { private final GaugeService gaugeService; + private static final Set STATUS_REPLACERS; + static { + Set replacements = new LinkedHashSet(); + replacements.add(new PatternReplacer("[{}]", 0, "-")); + replacements.add(new PatternReplacer("**", Pattern.LITERAL, "-star-star-")); + replacements.add(new PatternReplacer("*", Pattern.LITERAL, "-star-")); + replacements.add(new PatternReplacer("/-", Pattern.LITERAL, "/")); + replacements.add(new PatternReplacer("-/", Pattern.LITERAL, "/")); + STATUS_REPLACERS = Collections.unmodifiableSet(replacements); + } + + private static final Set KEY_REPLACERS; + static { + Set replacements = new LinkedHashSet(); + replacements.add(new PatternReplacer("/", Pattern.LITERAL, ".")); + replacements.add(new PatternReplacer("..", Pattern.LITERAL, ".")); + KEY_REPLACERS = Collections.unmodifiableSet(replacements); + } + MetricsFilter(CounterService counterService, GaugeService gaugeService) { this.counterService = counterService; this.gaugeService = gaugeService; @@ -105,11 +129,10 @@ final class MetricsFilter extends OncePerRequestFilter { } private String fixSpecialCharacters(String value) { - String result = value.replaceAll("[{}]", "-"); - result = result.replace("**", "-star-star-"); - result = result.replace("*", "-star-"); - result = result.replace("/-", "/"); - result = result.replace("-/", "/"); + String result = value; + for (PatternReplacer replacer : STATUS_REPLACERS) { + result = replacer.apply(result); + } if (result.endsWith("-")) { result = result.substring(0, result.length() - 1); } @@ -131,15 +154,17 @@ final class MetricsFilter extends OncePerRequestFilter { private String getKey(String string) { // graphite compatible metric names - String value = string.replace("/", "."); - value = value.replace("..", "."); - if (value.endsWith(".")) { - value = value + "root"; + String key = string; + for (PatternReplacer replacer : KEY_REPLACERS) { + key = replacer.apply(key); } - if (value.startsWith("_")) { - value = value.substring(1); + if (key.endsWith(".")) { + key = key + "root"; } - return value; + if (key.startsWith("_")) { + key = key.substring(1); + } + return key; } private void submitToGauge(String metricName, double value) { @@ -160,4 +185,22 @@ final class MetricsFilter extends OncePerRequestFilter { } } + private static class PatternReplacer { + + private final Pattern pattern; + + private final String replacement; + + PatternReplacer(String regex, int flags, String replacement) { + this.pattern = Pattern.compile(regex, flags); + this.replacement = replacement; + } + + public String apply(String input) { + return this.pattern.matcher(input).replaceAll( + Matcher.quoteReplacement(this.replacement)); + } + + } + }