{"record":{"id":"24530258a6df9cd9","repo":"apache/hadoop","slug":"illegal-tag-pattern","errorCode":null,"errorMessage":"Illegal tag pattern: {}","messagePattern":"Illegal tag pattern: (.+?)","errorType":"exception","errorClass":"MetricsException","httpStatus":null,"severity":"error","filePath":"hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/filter/AbstractPatternFilter.java","lineNumber":69,"sourceCode":"    excludeTagPatterns = Maps.newHashMap();\n  }\n\n  @Override\n  public void init(SubsetConfiguration conf) {\n    String patternString = conf.getString(INCLUDE_KEY);\n    if (patternString != null && !patternString.isEmpty()) {\n      setIncludePattern(compile(patternString));\n    }\n    patternString = conf.getString(EXCLUDE_KEY);\n    if (patternString != null && !patternString.isEmpty()) {\n      setExcludePattern(compile(patternString));\n    }\n    String[] patternStrings = conf.getStringArray(INCLUDE_TAGS_KEY);\n    if (patternStrings != null && patternStrings.length != 0) {\n      for (String pstr : patternStrings) {\n        Matcher matcher = tagPattern.matcher(pstr);\n        if (!matcher.matches()) {\n          throw new MetricsException(\"Illegal tag pattern: \"+ pstr);\n        }\n        setIncludeTagPattern(matcher.group(1), compile(matcher.group(2)));\n      }\n    }\n    patternStrings = conf.getStringArray(EXCLUDE_TAGS_KEY);\n    if (patternStrings != null && patternStrings.length != 0) {\n      for (String pstr : patternStrings) {\n        Matcher matcher = tagPattern.matcher(pstr);\n        if (!matcher.matches()) {\n          throw new MetricsException(\"Illegal tag pattern: \"+ pstr);\n        }\n        setExcludeTagPattern(matcher.group(1), compile(matcher.group(2)));\n      }\n    }\n  }\n\n  void setIncludePattern(Pattern includePattern) {\n    this.includePattern = includePattern;","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/filter/AbstractPatternFilter.java#L51-L87","documentation":"AbstractPatternFilter (base of RegexFilter and GlobFilter in metrics2) parses each include.tags entry as 'tagname:pattern' against the RE2J regex ^(\\w+):(.*) during init(). Entries for included tags that lack the colon separator, or whose tag name is not a bare word ([A-Za-z0-9_]+), throw MetricsException('Illegal tag pattern: ...') and abort metrics system startup. The same format rule applies to exclude.tags.","triggerScenarios":"hadoop-metrics2.properties sets *.filter.<name>.include.tags=MyTag (no colon); tag name containing dots/dashes (context.name:pattern); a bare regex like '.*' pasted where a tag entry belongs.","commonSituations":"Writing metrics filter configs by hand from the Hadoop metrics2 docs; migrating a filter block and forgetting the tag prefix; using metric-name patterns where tag patterns are expected.","solutions":["Format each entry as tagname:pattern, e.g. include.tags=recordType:.* or context:dfs.","Restrict the tag name to word characters; put any punctuation into the pattern half after the colon.","Validate every entry compiles under RE2J semantics (no backreferences/lookaround) — compile() failures are a separate but adjacent trap."],"exampleFix":"# before\n*.filter.foo.include.tags=MyTag\n\n# after\n*.filter.foo.include.tags=MyTag:.*","handlingStrategy":"validation","validationCode":"// Pre-flight check for include.tags entries before daemon restart\nprivate static final java.util.regex.Pattern TAG = java.util.regex.Pattern.compile(\"^(\\\\w+):(.*)\");\nfor (String e : conf.getStringArray(\"include.tags\")) {\n  if (!TAG.matcher(e).matches()) {\n    throw new IllegalArgumentException(\"Bad include.tags entry (need tag:pattern): \" + e);\n  }\n  com.google.re2j.Pattern.compile(TAG.matcher(e).group(2)); // RE2J compileability\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Author every include.tags/exclude.tags entry as 'tagname:pattern' with a word-character tag name.","Test metrics2 config changes on a single daemon (or via a small MetricsSystem harness) before fleet rollout.","Remember patterns compile with RE2J — no backreferences or lookarounds."],"tags":["hadoop","metrics2","configuration","filter","regex"],"backgroundTag":"invalid-regex-pattern","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}