All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.prometheus.client.dropwizard.samplebuilder.GraphiteNamePattern Maven / Gradle / Ivy

package io.prometheus.client.dropwizard.samplebuilder;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static io.prometheus.client.dropwizard.samplebuilder.MapperConfig.METRIC_GLOB_REGEX;

/**
 * GraphiteNamePattern is initialised with a simplified glob pattern that only allows '*' as special character.
 * Examples of valid patterns:
 * 
    *
  • org.test.controller.gather.status.400
  • *
  • org.test.controller.gather.status.*
  • *
  • org.test.controller.*.status.*
  • *
  • *.test.controller.*.status.*
  • *
*

* It contains logic to match a metric name and to extract named parameters from it. */ class GraphiteNamePattern { private static final Pattern VALIDATION_PATTERN = Pattern.compile(METRIC_GLOB_REGEX); private Pattern pattern; private String patternStr; /** * Creates a new GraphiteNamePattern from the given simplified glob pattern. * * @param pattern The glob style pattern to be used. */ GraphiteNamePattern(final String pattern) throws IllegalArgumentException { if (!VALIDATION_PATTERN.matcher(pattern).matches()) { throw new IllegalArgumentException(String.format("Provided pattern [%s] does not matches [%s]", pattern, METRIC_GLOB_REGEX)); } initializePattern(pattern); } /** * Matches the metric name against the pattern. * * @param metricName The metric name to be tested. * @return {@code true} if the name is matched, {@code false} otherwise. */ boolean matches(final String metricName) { return metricName != null && pattern.matcher(metricName).matches(); } /** * Extracts parameters from the given metric name based on the pattern. * The resulting map has keys named as '${n}' where n is the 0 based position in the pattern. * E.g.: * pattern: org.test.controller.*.status.* * extractParameters("org.test.controller.gather.status.400") -> * {${0} -> "gather", ${1} -> "400"} * * @param metricName The metric name to extract parameters from. * @return A parameter map where keys are named '${n}' where n is 0 based parameter position in the pattern. */ Map extractParameters(final String metricName) { final Matcher matcher = this.pattern.matcher(metricName); final Map params = new HashMap(); if (matcher.find()) { for (int i = 1; i <= matcher.groupCount(); i++) { params.put(String.format("${%d}", i - 1), matcher.group(i)); } } return params; } /** * Turns the GLOB pattern into a REGEX. * * @param pattern The pattern to use */ private void initializePattern(final String pattern) { final String[] split = pattern.split(Pattern.quote("*"), -1); final StringBuilder escapedPattern = new StringBuilder(Pattern.quote(split[0])); for (int i = 1; i < split.length; i++) { String quoted = Pattern.quote(split[i]); escapedPattern.append("([^.]*)").append(quoted); } final String regex = "^" + escapedPattern.toString() + "$"; this.patternStr = regex; this.pattern = Pattern.compile(regex); } String getPatternString() { return this.patternStr; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy