Use static Patterns in MetricsFilter
Update MetricsFilter to use static `Pattern` instances for regex replacements rather than compiling them each time. Fixes gh-3996
This commit is contained in:
		
							parent
							
								
									57a698f388
								
							
						
					
					
						commit
						a168670a8d
					
				| 
						 | 
				
			
			@ -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<PatternReplacer> STATUS_REPLACERS;
 | 
			
		||||
	static {
 | 
			
		||||
		Set<PatternReplacer> replacements = new LinkedHashSet<PatternReplacer>();
 | 
			
		||||
		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<PatternReplacer> KEY_REPLACERS;
 | 
			
		||||
	static {
 | 
			
		||||
		Set<PatternReplacer> replacements = new LinkedHashSet<PatternReplacer>();
 | 
			
		||||
		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));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue