Skip to content

Commit 5affc93

Browse files
committed
Return Set from config
1 parent 89b4ea2 commit 5affc93

11 files changed

Lines changed: 112 additions & 95 deletions

File tree

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ThirdPartyLibraries.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@
77
import java.io.IOException;
88
import java.io.InputStream;
99
import java.io.InputStreamReader;
10-
import java.util.ArrayList;
11-
import java.util.Arrays;
10+
import java.util.HashSet;
1211
import java.util.List;
13-
import java.util.regex.Pattern;
12+
import java.util.Set;
1413
import java.util.stream.Collectors;
1514
import org.slf4j.Logger;
1615
import org.slf4j.LoggerFactory;
@@ -22,18 +21,17 @@ public class ThirdPartyLibraries {
2221
private static final Logger LOGGER = LoggerFactory.getLogger(ThirdPartyLibraries.class);
2322
private static final JsonAdapter<InternalConfig> ADAPTER =
2423
new Moshi.Builder().build().adapter(InternalConfig.class);
25-
private static final Pattern COMMA_PATTERN = Pattern.compile(",");
2624
private static final String FILE_NAME = "/third_party_libraries.json";
2725

2826
private ThirdPartyLibraries() {}
2927

30-
public List<String> getExcludes(Config config) {
28+
public Set<String> getExcludes(Config config) {
3129
try (InputStream inputStream = this.getClass().getResourceAsStream(FILE_NAME)) {
3230
InternalConfig defaults = readConfig(inputStream);
33-
List<String> excludes =
34-
Arrays.stream(COMMA_PATTERN.split(config.getThirdPartyExcludes()))
31+
Set<String> excludes =
32+
config.getThirdPartyExcludes().stream()
3533
.filter(s -> !s.isEmpty())
36-
.collect(Collectors.toList());
34+
.collect(Collectors.toSet());
3735
excludes.addAll(defaults.getPrefixes());
3836
return excludes;
3937
} catch (Exception e) {
@@ -42,16 +40,16 @@ public List<String> getExcludes(Config config) {
4240
}
4341
}
4442

45-
public List<String> getIncludes(Config config) {
46-
return Arrays.stream(COMMA_PATTERN.split(config.getThirdPartyIncludes()))
43+
public Set<String> getIncludes(Config config) {
44+
return config.getThirdPartyIncludes().stream()
4745
.filter(s -> !s.isEmpty())
48-
.collect(Collectors.toList());
46+
.collect(Collectors.toSet());
4947
}
5048

5149
// Add a*, b*, c*, ..., z* to the exclude trie in ClassNameFiltering. Simply adding * does not
5250
// work.
53-
private static List<String> getExcludeAll() {
54-
List<String> excludeAllPrefixes = new ArrayList<>();
51+
private static Set<String> getExcludeAll() {
52+
Set<String> excludeAllPrefixes = new HashSet<>();
5553
for (char c : ALPHABET) {
5654
excludeAllPrefixes.add(String.valueOf(c));
5755
}

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/ClassNameFiltering.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import datadog.trace.api.Config;
55
import datadog.trace.util.ClassNameTrie;
66
import java.util.Collections;
7-
import java.util.List;
7+
import java.util.Set;
88

99
/** A class to filter out classes based on their package name. */
1010
public class ClassNameFiltering {
@@ -18,11 +18,11 @@ public ClassNameFiltering(Config config) {
1818
ThirdPartyLibraries.INSTANCE.getIncludes(config));
1919
}
2020

21-
public ClassNameFiltering(List<String> excludes) {
22-
this(excludes, Collections.emptyList());
21+
public ClassNameFiltering(Set<String> excludes) {
22+
this(excludes, Collections.emptySet());
2323
}
2424

25-
public ClassNameFiltering(List<String> excludes, List<String> includes) {
25+
public ClassNameFiltering(Set<String> excludes, Set<String> includes) {
2626
ClassNameTrie.Builder excludeBuilder = new ClassNameTrie.Builder();
2727
excludes.forEach(s -> excludeBuilder.put(s + "*", 1));
2828
this.excludeTrie = excludeBuilder.buildTrie();
@@ -36,6 +36,6 @@ public boolean isExcluded(String className) {
3636
}
3737

3838
public static ClassNameFiltering allowAll() {
39-
return new ClassNameFiltering(Collections.emptyList(), Collections.emptyList());
39+
return new ClassNameFiltering(Collections.emptySet(), Collections.emptySet());
4040
}
4141
}

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ThirdPartyLibrariesTest.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import static org.mockito.Mockito.when;
88

99
import datadog.trace.api.Config;
10+
import java.util.Collections;
1011
import org.junit.jupiter.api.BeforeEach;
1112
import org.junit.jupiter.api.Test;
1213

@@ -16,8 +17,8 @@ class ThirdPartyLibrariesTest {
1617

1718
@BeforeEach
1819
void setUp() {
19-
when(mockConfig.getThirdPartyIncludes()).thenReturn("");
20-
when(mockConfig.getThirdPartyExcludes()).thenReturn("");
20+
when(mockConfig.getThirdPartyIncludes()).thenReturn(Collections.emptySet());
21+
when(mockConfig.getThirdPartyExcludes()).thenReturn(Collections.emptySet());
2122
}
2223

2324
@Test
@@ -27,15 +28,19 @@ void testGetExcludesContainsDefaultExclude() {
2728

2829
@Test
2930
void testGetExcludesWithExplicitExclude() {
30-
when(mockConfig.getThirdPartyExcludes()).thenReturn("com.datadog.debugger");
31+
32+
when(mockConfig.getThirdPartyExcludes())
33+
.thenReturn(Collections.singleton("com.datadog.debugger"));
3134
assertTrue(
3235
ThirdPartyLibraries.INSTANCE.getExcludes(mockConfig).contains("com.datadog.debugger"));
3336
}
3437

3538
@Test
3639
void testGetExcludesWithExplicitExcludeAndExplicitInclude() {
37-
when(mockConfig.getThirdPartyExcludes()).thenReturn("com.datadog.debugger");
38-
when(mockConfig.getThirdPartyIncludes()).thenReturn("com.datadog.debugger");
40+
when(mockConfig.getThirdPartyExcludes())
41+
.thenReturn(Collections.singleton("com.datadog.debugger"));
42+
when(mockConfig.getThirdPartyIncludes())
43+
.thenReturn(Collections.singleton("com.datadog.debugger"));
3944
assertTrue(
4045
ThirdPartyLibraries.INSTANCE.getExcludes(mockConfig).contains("com.datadog.debugger"));
4146
assertTrue(
@@ -50,7 +55,7 @@ void testGetExcludesWithoutExplicitConfig() {
5055

5156
@Test
5257
void testGetExcludesWithIncludeOverridingDefaultExclude() {
53-
when(mockConfig.getThirdPartyIncludes()).thenReturn("java.");
58+
when(mockConfig.getThirdPartyIncludes()).thenReturn(Collections.singleton("java."));
5459
assertTrue(ThirdPartyLibraries.INSTANCE.getExcludes(mockConfig).contains("java."));
5560
assertTrue(ThirdPartyLibraries.INSTANCE.getIncludes(mockConfig).contains("java."));
5661
}

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/DefaultExceptionDebuggerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static com.datadog.debugger.exception.DefaultExceptionDebugger.SNAPSHOT_ID_TAG_FMT;
44
import static com.datadog.debugger.util.TestHelper.assertWithTimeout;
55
import static java.util.Collections.emptyList;
6+
import static java.util.Collections.emptySet;
67
import static java.util.stream.Collectors.toList;
78
import static java.util.stream.Collectors.toMap;
89
import static org.junit.jupiter.api.Assertions.*;
@@ -56,7 +57,7 @@ class DefaultExceptionDebuggerTest {
5657
@BeforeEach
5758
public void setUp() {
5859
configurationUpdater = mock(ConfigurationUpdater.class);
59-
classNameFiltering = new ClassNameFiltering(emptyList());
60+
classNameFiltering = new ClassNameFiltering(emptySet());
6061
exceptionDebugger = new DefaultExceptionDebugger(configurationUpdater, classNameFiltering);
6162
listener = new TestSnapshotListener(createConfig(), mock(ProbeStatusSink.class));
6263
DebuggerAgentHelper.injectSink(listener);

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeInstrumentationTest.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@
3434
import java.lang.instrument.ClassFileTransformer;
3535
import java.lang.instrument.Instrumentation;
3636
import java.time.Duration;
37-
import java.util.Arrays;
3837
import java.util.Map;
3938
import java.util.Set;
4039
import java.util.stream.Collectors;
40+
import java.util.stream.Stream;
4141
import net.bytebuddy.agent.ByteBuddyAgent;
4242
import org.joor.Reflect;
4343
import org.junit.jupiter.api.AfterEach;
@@ -52,16 +52,17 @@ public class ExceptionProbeInstrumentationTest {
5252
private ClassFileTransformer currentTransformer;
5353
private final ClassNameFiltering classNameFiltering =
5454
new ClassNameFiltering(
55-
Arrays.asList(
56-
"java.",
57-
"jdk.",
58-
"com.sun.",
59-
"sun.",
60-
"org.gradle.",
61-
"worker.org.gradle.",
62-
"org.junit.",
63-
"org.joor.",
64-
"com.datadog.debugger.exception."));
55+
Stream.of(
56+
"java.",
57+
"jdk.",
58+
"com.sun.",
59+
"sun.",
60+
"org.gradle.",
61+
"worker.org.gradle.",
62+
"org.junit.",
63+
"org.joor.",
64+
"com.datadog.debugger.exception.")
65+
.collect(Collectors.toSet()));
6566

6667
@BeforeEach
6768
public void before() {

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeManagerTest.java

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import com.datadog.debugger.probe.ExceptionProbe;
88
import com.datadog.debugger.util.ClassNameFiltering;
99
import datadog.trace.api.Config;
10-
import java.util.Arrays;
10+
import java.util.Collections;
11+
import java.util.stream.Collectors;
12+
import java.util.stream.Stream;
1113
import org.junit.jupiter.api.Test;
1214

1315
class ExceptionProbeManagerTest {
@@ -27,18 +29,19 @@ public void instrumentStackTrace() {
2729
void instrumentSingleFrame() {
2830
ClassNameFiltering classNameFiltering =
2931
new ClassNameFiltering(
30-
Arrays.asList(
31-
"java.",
32-
"jdk.",
33-
"sun.",
34-
"com.sun.",
35-
"org.gradle.",
36-
"worker.org.gradle.",
37-
"org.junit."));
32+
Stream.of(
33+
"java.",
34+
"jdk.",
35+
"sun.",
36+
"com.sun.",
37+
"org.gradle.",
38+
"worker.org.gradle.",
39+
"org.junit.")
40+
.collect(Collectors.toSet()));
3841
ExceptionProbeManager exceptionProbeManager = new ExceptionProbeManager(classNameFiltering);
3942

4043
String fingerprint = Fingerprinter.fingerprint(exception, classNameFiltering);
41-
assertEquals("66b67fc7b62efa883bfd4b22910e2e27f35d09fbc5cf52e9bf65aa535ac9022", fingerprint);
44+
assertEquals("d2e9d63e304d95f6435d77bf4d0d387521591e550be21d432339a14ee1cb40", fingerprint);
4245
exceptionProbeManager.createProbesForException(fingerprint, exception.getStackTrace());
4346
assertEquals(1, exceptionProbeManager.getProbes().size());
4447
ExceptionProbe exceptionProbe = exceptionProbeManager.getProbes().iterator().next();
@@ -50,15 +53,16 @@ void instrumentSingleFrame() {
5053
@Test
5154
void filterAllFrames() {
5255
Config config = mock(Config.class);
53-
when(config.getThirdPartyIncludes()).thenReturn("");
56+
when(config.getThirdPartyIncludes()).thenReturn(Collections.emptySet());
5457
when(config.getThirdPartyExcludes())
5558
.thenReturn(
56-
String.join(
57-
",",
58-
"org.gradle.",
59-
"worker.org.gradle.",
60-
"org.junit.",
61-
"com.datadog.debugger.exception.ExceptionProbeManagerTest"));
59+
Stream.of(
60+
",",
61+
"org.gradle.",
62+
"worker.org.gradle.",
63+
"org.junit.",
64+
"com.datadog.debugger.exception.ExceptionProbeManagerTest")
65+
.collect(Collectors.toSet()));
6266
ClassNameFiltering classNameFiltering = new ClassNameFiltering(config);
6367
ExceptionProbeManager exceptionProbeManager = new ExceptionProbeManager(classNameFiltering);
6468
String fingerprint = Fingerprinter.fingerprint(exception, classNameFiltering);

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FingerprinterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.datadog.debugger.exception;
22

3-
import static java.util.Collections.emptyList;
3+
import static java.util.Collections.emptySet;
44
import static org.junit.jupiter.api.Assertions.*;
55

66
import com.datadog.debugger.util.ClassNameFiltering;
@@ -38,7 +38,7 @@ class FingerprinterTest {
3838
}
3939

4040
final String TEST_FINGERPRINT = "2ec0db28f254ffa383cbb26a32269bf739ba937b9dd8f111d22294e6a494855";
41-
final ClassNameFiltering classNameFiltering = new ClassNameFiltering(emptyList());
41+
final ClassNameFiltering classNameFiltering = new ClassNameFiltering(emptySet());
4242

4343
@Test
4444
void basic() {

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymDBEnablementTest.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import java.util.Collections;
2727
import java.util.jar.JarEntry;
2828
import java.util.jar.JarFile;
29+
import java.util.stream.Collectors;
30+
import java.util.stream.Stream;
2931
import org.junit.jupiter.api.BeforeEach;
3032
import org.junit.jupiter.api.Test;
3133
import org.mockito.ArgumentCaptor;
@@ -44,7 +46,7 @@ public void before() {
4446
when(instr.getAllLoadedClasses()).thenReturn(new Class[0]);
4547
when(instr.isModifiableClass(any())).thenReturn(true);
4648
config = mock(Config.class);
47-
when(config.getThirdPartyIncludes()).thenReturn("com.datadog.debugger");
49+
when(config.getThirdPartyIncludes()).thenReturn(Collections.singleton("com.datadog.debugger"));
4850
when(config.isDebuggerSymbolEnabled()).thenReturn(true);
4951
symbolSink = mock(SymbolSink.class);
5052
}
@@ -74,8 +76,8 @@ public void removeSymDBConfig() throws Exception {
7476

7577
@Test
7678
public void noIncludesFilterOutDatadogClass() {
77-
when(config.getThirdPartyIncludes()).thenReturn("");
78-
when(config.getThirdPartyExcludes()).thenReturn("com.datadog.debugger.");
79+
when(config.getThirdPartyIncludes()).thenReturn(Collections.emptySet());
80+
when(config.getThirdPartyExcludes()).thenReturn(Collections.singleton("com.datadog.debugger."));
7981
SymDBEnablement symDBEnablement =
8082
new SymDBEnablement(
8183
instr, config, new SymbolAggregator(symbolSink, 1), new ClassNameFiltering(config));
@@ -98,7 +100,9 @@ public void parseLoadedClass() throws ClassNotFoundException, IOException, URISy
98100
Class<?> testClass = urlClassLoader.loadClass(CLASS_NAME);
99101
when(instr.getAllLoadedClasses()).thenReturn(new Class[] {testClass});
100102
when(config.getThirdPartyIncludes())
101-
.thenReturn("com.datadog.debugger.,org.springframework.samples.");
103+
.thenReturn(
104+
Stream.of("com.datadog.debugger.", "org.springframework.samples.")
105+
.collect(Collectors.toSet()));
102106
SymbolAggregator symbolAggregator = mock(SymbolAggregator.class);
103107
SymDBEnablement symDBEnablement =
104108
new SymDBEnablement(instr, config, symbolAggregator, ClassNameFiltering.allowAll());
@@ -121,8 +125,8 @@ public void noDuplicateSymbolExtraction() {
121125
SymbolAggregator symbolAggregator = new SymbolAggregator(mockSymbolSink, 1);
122126
ClassNameFiltering classNameFiltering =
123127
new ClassNameFiltering(
124-
Collections.singletonList("org.springframework."),
125-
Collections.singletonList("com.datadog.debugger."));
128+
Collections.singleton("org.springframework."),
129+
Collections.singleton("com.datadog.debugger."));
126130
SymDBEnablement symDBEnablement =
127131
new SymDBEnablement(instr, config, symbolAggregator, classNameFiltering);
128132
doAnswer(

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolExtractionTransformerTest.java

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.datadog.debugger.symbol;
22

33
import static java.util.Arrays.asList;
4-
import static java.util.Collections.singletonList;
54
import static org.junit.jupiter.api.Assertions.assertEquals;
65
import static org.junit.jupiter.api.Assertions.assertFalse;
76
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -15,9 +14,12 @@
1514
import java.lang.instrument.Instrumentation;
1615
import java.net.URISyntaxException;
1716
import java.util.ArrayList;
18-
import java.util.Arrays;
17+
import java.util.Collections;
1918
import java.util.List;
19+
import java.util.Set;
2020
import java.util.function.Supplier;
21+
import java.util.stream.Collectors;
22+
import java.util.stream.Stream;
2123
import net.bytebuddy.agent.ByteBuddyAgent;
2224
import org.joor.Reflect;
2325
import org.junit.jupiter.api.BeforeEach;
@@ -31,17 +33,18 @@ class SymbolExtractionTransformerTest {
3133
private static final String SYMBOL_PACKAGE = "com.datadog.debugger.symboltest.";
3234
private static final String EXCLUDED_PACKAGE = "akka.actor.";
3335
private static final String SYMBOL_PACKAGE_DIR = SYMBOL_PACKAGE.replace('.', '/');
34-
private static final List<String> TRANSFORMER_EXCLUDES =
35-
Arrays.asList(
36-
"java.",
37-
"jdk.",
38-
"sun.",
39-
"com.sun.",
40-
"utils.",
41-
"javax.",
42-
"javaslang.",
43-
"org.omg.",
44-
"com.datadog.debugger.");
36+
private static final Set<String> TRANSFORMER_EXCLUDES =
37+
Stream.of(
38+
"java.",
39+
"jdk.",
40+
"sun.",
41+
"com.sun.",
42+
"utils.",
43+
"javax.",
44+
"javaslang.",
45+
"org.omg.",
46+
"com.datadog.debugger.")
47+
.collect(Collectors.toSet());
4548

4649
private Instrumentation instr = ByteBuddyAgent.install();
4750
private Config config;
@@ -883,7 +886,7 @@ public void filterOutClassesFromExcludedPackages() throws IOException, URISyntax
883886
SymbolExtractionTransformer transformer =
884887
new SymbolExtractionTransformer(
885888
new SymbolAggregator(symbolSinkMock, 1),
886-
new ClassNameFiltering(singletonList(EXCLUDED_PACKAGE)));
889+
new ClassNameFiltering(Collections.singleton(EXCLUDED_PACKAGE)));
887890
instr.addTransformer(transformer);
888891
Class<?> testClass = compileAndLoadClass(CLASS_NAME);
889892
Reflect.on(testClass).call("main", "1").get();
@@ -962,7 +965,7 @@ private SymbolExtractionTransformer createTransformer(
962965
return createTransformer(
963966
symbolSink,
964967
symbolFlushThreshold,
965-
new ClassNameFiltering(TRANSFORMER_EXCLUDES, Arrays.asList(SYMBOL_PACKAGE)));
968+
new ClassNameFiltering(TRANSFORMER_EXCLUDES, Collections.singleton(SYMBOL_PACKAGE)));
966969
}
967970

968971
private SymbolExtractionTransformer createTransformer(

0 commit comments

Comments
 (0)