Move Trie back to javaagent-tooling (#4300)

* Move Trie back to javaagent-tooling

* Code review comments
This commit is contained in:
Mateusz Rzeszutek 2021-10-06 01:07:33 +02:00 committed by GitHub
parent 4be3583c20
commit 3e93dc8f29
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 26 additions and 15 deletions

View File

@ -6,7 +6,7 @@
package io.opentelemetry.javaagent.instrumentation.api.internal; package io.opentelemetry.javaagent.instrumentation.api.internal;
import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.javaagent.instrumentation.api.util.Trie; import java.util.function.Predicate;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -22,7 +22,7 @@ public final class InstrumentedTaskClasses {
@Override @Override
protected Boolean computeValue(Class<?> taskClass) { protected Boolean computeValue(Class<?> taskClass) {
// do not instrument ignored task classes // do not instrument ignored task classes
if (ignoredTaskClasses.getOrDefault(taskClass.getName(), false)) { if (ignoredTaskClassesPredicate.test(taskClass.getName())) {
return false; return false;
} }
// Don't trace runnables from libraries that are packaged inside the agent. // Don't trace runnables from libraries that are packaged inside the agent.
@ -38,18 +38,18 @@ public final class InstrumentedTaskClasses {
} }
}; };
private static volatile Trie<Boolean> ignoredTaskClasses; private static volatile Predicate<String> ignoredTaskClassesPredicate;
/** /**
* Sets the configured ignored tasks trie. This method is called internally from the agent * Sets the configured ignored tasks predicate. This method is called internally from the agent
* classloader. * classloader.
*/ */
public static void setIgnoredTaskClasses(Trie<Boolean> ignoredTasksTrie) { public static void setIgnoredTaskClassesPredicate(Predicate<String> ignoredTasksTriePredicate) {
if (InstrumentedTaskClasses.ignoredTaskClasses != null) { if (InstrumentedTaskClasses.ignoredTaskClassesPredicate != null) {
logger.warn("Ignored task classes were already set earlier; returning."); logger.warn("Ignored task classes were already set earlier; returning.");
return; return;
} }
InstrumentedTaskClasses.ignoredTaskClasses = ignoredTasksTrie; InstrumentedTaskClasses.ignoredTaskClassesPredicate = ignoredTasksTriePredicate;
} }
/** /**

View File

@ -31,6 +31,7 @@ import io.opentelemetry.javaagent.tooling.ignore.IgnoredClassLoadersMatcher;
import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesBuilderImpl; import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesBuilderImpl;
import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesMatcher; import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesMatcher;
import io.opentelemetry.javaagent.tooling.muzzle.AgentTooling; import io.opentelemetry.javaagent.tooling.muzzle.AgentTooling;
import io.opentelemetry.javaagent.tooling.util.Trie;
import java.lang.instrument.Instrumentation; import java.lang.instrument.Instrumentation;
import java.lang.reflect.Proxy; import java.lang.reflect.Proxy;
import java.util.ArrayList; import java.util.ArrayList;
@ -209,7 +210,8 @@ public class AgentInstaller {
configurer.configure(config, builder); configurer.configure(config, builder);
} }
InstrumentedTaskClasses.setIgnoredTaskClasses(builder.buildIgnoredTasksTrie()); Trie<Boolean> ignoredTasksTrie = builder.buildIgnoredTasksTrie();
InstrumentedTaskClasses.setIgnoredTaskClassesPredicate(ignoredTasksTrie::contains);
return agentBuilder return agentBuilder
.ignore(any(), new IgnoredClassLoadersMatcher(builder.buildIgnoredClassLoadersTrie())) .ignore(any(), new IgnoredClassLoadersMatcher(builder.buildIgnoredClassLoadersTrie()))

View File

@ -7,7 +7,7 @@ package io.opentelemetry.javaagent.tooling.ignore;
import io.opentelemetry.instrumentation.api.caching.Cache; import io.opentelemetry.instrumentation.api.caching.Cache;
import io.opentelemetry.javaagent.bootstrap.PatchLogger; import io.opentelemetry.javaagent.bootstrap.PatchLogger;
import io.opentelemetry.javaagent.instrumentation.api.util.Trie; import io.opentelemetry.javaagent.tooling.util.Trie;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.matcher.ElementMatcher;
import org.slf4j.Logger; import org.slf4j.Logger;

View File

@ -6,7 +6,7 @@
package io.opentelemetry.javaagent.tooling.ignore; package io.opentelemetry.javaagent.tooling.ignore;
import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder;
import io.opentelemetry.javaagent.instrumentation.api.util.Trie; import io.opentelemetry.javaagent.tooling.util.Trie;
public class IgnoredTypesBuilderImpl implements IgnoredTypesBuilder { public class IgnoredTypesBuilderImpl implements IgnoredTypesBuilder {
private final Trie.Builder<IgnoreAllow> ignoredTypesTrie = Trie.newBuilder(); private final Trie.Builder<IgnoreAllow> ignoredTypesTrie = Trie.newBuilder();

View File

@ -5,7 +5,7 @@
package io.opentelemetry.javaagent.tooling.ignore; package io.opentelemetry.javaagent.tooling.ignore;
import io.opentelemetry.javaagent.instrumentation.api.util.Trie; import io.opentelemetry.javaagent.tooling.util.Trie;
import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.matcher.ElementMatcher;

View File

@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package io.opentelemetry.javaagent.instrumentation.api.util; package io.opentelemetry.javaagent.tooling.util;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -32,6 +32,11 @@ public interface Trie<V> {
*/ */
V getOrDefault(CharSequence str, V defaultValue); V getOrDefault(CharSequence str, V defaultValue);
/** Returns {@code true} if this trie contains the prefix {@code str}. */
default boolean contains(CharSequence str) {
return getOrNull(str) != null;
}
interface Builder<V> { interface Builder<V> {
/** Associate {@code value} with the string {@code str}. */ /** Associate {@code value} with the string {@code str}. */

View File

@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package io.opentelemetry.javaagent.instrumentation.api.util; package io.opentelemetry.javaagent.tooling.util;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;

View File

@ -3,10 +3,12 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
package io.opentelemetry.javaagent.instrumentation.api.util; package io.opentelemetry.javaagent.tooling.util;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -17,9 +19,11 @@ class TrieTest {
Trie.<Integer>newBuilder().put("abc", 0).put("abcd", 10).put("abcde", 20).build(); Trie.<Integer>newBuilder().put("abc", 0).put("abcd", 10).put("abcde", 20).build();
assertNull(trie.getOrNull("ab")); assertNull(trie.getOrNull("ab"));
assertFalse(trie.contains("ab"));
assertEquals(0, trie.getOrNull("abc")); assertEquals(0, trie.getOrNull("abc"));
assertEquals(10, trie.getOrNull("abcd")); assertEquals(10, trie.getOrNull("abcd"));
assertEquals(20, trie.getOrNull("abcde")); assertEquals(20, trie.getOrNull("abcde"));
assertTrue(trie.contains("abcde"));
} }
@Test @Test

View File

@ -7,12 +7,12 @@ package io.opentelemetry.javaagent.testing.bytebuddy;
import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer;
import io.opentelemetry.javaagent.instrumentation.api.util.Trie;
import io.opentelemetry.javaagent.tooling.SafeServiceLoader; import io.opentelemetry.javaagent.tooling.SafeServiceLoader;
import io.opentelemetry.javaagent.tooling.ignore.AdditionalLibraryIgnoredTypesConfigurer; import io.opentelemetry.javaagent.tooling.ignore.AdditionalLibraryIgnoredTypesConfigurer;
import io.opentelemetry.javaagent.tooling.ignore.GlobalIgnoredTypesConfigurer; import io.opentelemetry.javaagent.tooling.ignore.GlobalIgnoredTypesConfigurer;
import io.opentelemetry.javaagent.tooling.ignore.IgnoreAllow; import io.opentelemetry.javaagent.tooling.ignore.IgnoreAllow;
import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesBuilderImpl; import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesBuilderImpl;
import io.opentelemetry.javaagent.tooling.util.Trie;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;