-
Notifications
You must be signed in to change notification settings - Fork 713
/
PatternBasedSpanNameFilterImpl.java
62 lines (51 loc) · 2.08 KB
/
PatternBasedSpanNameFilterImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.github.kristofa.brave.client.spanfilter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
/**
* Given a list of span name patterns like "/api/{client}/{operation}" or "/api/{version}/{client}/save",
* this filter will only allow these span names to be set as the client span name (else "[span name not defined]").
*/
public class PatternBasedSpanNameFilterImpl implements SpanNameFilter {
static final String DEFAULT_SPAN_NAME = "[span name not defined]";
private final Iterable<SpanNamePattern> spanNamePatterns;
private final String defaultSpanName;
public PatternBasedSpanNameFilterImpl(Iterable<String> spanNamePatterns) {
this(spanNamePatterns, DEFAULT_SPAN_NAME);
}
public PatternBasedSpanNameFilterImpl(Iterable<String> spanNamePatterns, String defaultSpanName) {
final List<SpanNamePattern> patternNamePairs = new ArrayList<>();
if (spanNamePatterns != null) {
for (String spanNamePattern : spanNamePatterns) {
if (spanNamePattern != null) {
patternNamePairs.add(new SpanNamePattern(spanNamePattern));
}
}
}
this.spanNamePatterns = patternNamePairs;
this.defaultSpanName = defaultSpanName;
}
@Override
public String filterSpanName(String unfilteredSpanName) {
for (SpanNamePattern spanNamePattern : spanNamePatterns) {
if (spanNamePattern.matches(unfilteredSpanName)) {
return spanNamePattern.getName();
}
}
return defaultSpanName;
}
private static class SpanNamePattern {
private final String name;
private final Pattern pattern;
private SpanNamePattern(String name) {
this.name = name;
this.pattern = Pattern.compile(name.replaceAll("\\{.+?\\}", ".+?"), Pattern.CASE_INSENSITIVE);
}
public String getName() {
return name;
}
public boolean matches(String input) {
return pattern.matcher(input).matches();
}
}
}