From 3e93dc8f298a0694d3303d7b93cd062bc7319b8e Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Wed, 6 Oct 2021 01:07:33 +0200 Subject: [PATCH] Move Trie back to javaagent-tooling (#4300) * Move Trie back to javaagent-tooling * Code review comments --- .../api/internal/InstrumentedTaskClasses.java | 14 +++++++------- .../javaagent/tooling/AgentInstaller.java | 4 +++- .../tooling/ignore/IgnoredClassLoadersMatcher.java | 2 +- .../tooling/ignore/IgnoredTypesBuilderImpl.java | 2 +- .../tooling/ignore/IgnoredTypesMatcher.java | 2 +- .../javaagent/tooling}/util/Trie.java | 7 ++++++- .../javaagent/tooling}/util/TrieImpl.java | 2 +- .../javaagent/tooling}/util/TrieTest.java | 6 +++++- .../testing/bytebuddy/TestAgentListener.java | 2 +- 9 files changed, 26 insertions(+), 15 deletions(-) rename {javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api => javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling}/util/Trie.java (84%) rename {javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api => javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling}/util/TrieImpl.java (97%) rename {javaagent-instrumentation-api/src/test/java/io/opentelemetry/javaagent/instrumentation/api => javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling}/util/TrieTest.java (84%) diff --git a/javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/internal/InstrumentedTaskClasses.java b/javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/internal/InstrumentedTaskClasses.java index 08a4883617..a31bb09fda 100644 --- a/javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/internal/InstrumentedTaskClasses.java +++ b/javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/internal/InstrumentedTaskClasses.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.api.internal; 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.LoggerFactory; @@ -22,7 +22,7 @@ public final class InstrumentedTaskClasses { @Override protected Boolean computeValue(Class taskClass) { // do not instrument ignored task classes - if (ignoredTaskClasses.getOrDefault(taskClass.getName(), false)) { + if (ignoredTaskClassesPredicate.test(taskClass.getName())) { return false; } // Don't trace runnables from libraries that are packaged inside the agent. @@ -38,18 +38,18 @@ public final class InstrumentedTaskClasses { } }; - private static volatile Trie ignoredTaskClasses; + private static volatile Predicate 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. */ - public static void setIgnoredTaskClasses(Trie ignoredTasksTrie) { - if (InstrumentedTaskClasses.ignoredTaskClasses != null) { + public static void setIgnoredTaskClassesPredicate(Predicate ignoredTasksTriePredicate) { + if (InstrumentedTaskClasses.ignoredTaskClassesPredicate != null) { logger.warn("Ignored task classes were already set earlier; returning."); return; } - InstrumentedTaskClasses.ignoredTaskClasses = ignoredTasksTrie; + InstrumentedTaskClasses.ignoredTaskClassesPredicate = ignoredTasksTriePredicate; } /** diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java index 04a4538c5f..55c3581f77 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java @@ -31,6 +31,7 @@ import io.opentelemetry.javaagent.tooling.ignore.IgnoredClassLoadersMatcher; import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesBuilderImpl; import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesMatcher; import io.opentelemetry.javaagent.tooling.muzzle.AgentTooling; +import io.opentelemetry.javaagent.tooling.util.Trie; import java.lang.instrument.Instrumentation; import java.lang.reflect.Proxy; import java.util.ArrayList; @@ -209,7 +210,8 @@ public class AgentInstaller { configurer.configure(config, builder); } - InstrumentedTaskClasses.setIgnoredTaskClasses(builder.buildIgnoredTasksTrie()); + Trie ignoredTasksTrie = builder.buildIgnoredTasksTrie(); + InstrumentedTaskClasses.setIgnoredTaskClassesPredicate(ignoredTasksTrie::contains); return agentBuilder .ignore(any(), new IgnoredClassLoadersMatcher(builder.buildIgnoredClassLoadersTrie())) diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredClassLoadersMatcher.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredClassLoadersMatcher.java index cb175c26a8..5112162ede 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredClassLoadersMatcher.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredClassLoadersMatcher.java @@ -7,7 +7,7 @@ package io.opentelemetry.javaagent.tooling.ignore; import io.opentelemetry.instrumentation.api.caching.Cache; 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.matcher.ElementMatcher; import org.slf4j.Logger; diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesBuilderImpl.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesBuilderImpl.java index a58efaf8fa..f0baf5478d 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesBuilderImpl.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesBuilderImpl.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.tooling.ignore; 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 { private final Trie.Builder ignoredTypesTrie = Trie.newBuilder(); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesMatcher.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesMatcher.java index 37353f6b19..9fdf09356d 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesMatcher.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/IgnoredTypesMatcher.java @@ -5,7 +5,7 @@ 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.matcher.ElementMatcher; diff --git a/javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/util/Trie.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/util/Trie.java similarity index 84% rename from javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/util/Trie.java rename to javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/util/Trie.java index b66ac87246..9b32e0be29 100644 --- a/javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/util/Trie.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/util/Trie.java @@ -3,7 +3,7 @@ * 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; @@ -32,6 +32,11 @@ public interface Trie { */ 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 { /** Associate {@code value} with the string {@code str}. */ diff --git a/javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/util/TrieImpl.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/util/TrieImpl.java similarity index 97% rename from javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/util/TrieImpl.java rename to javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/util/TrieImpl.java index 853d07c708..18d72525a2 100644 --- a/javaagent-instrumentation-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/util/TrieImpl.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/util/TrieImpl.java @@ -3,7 +3,7 @@ * 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.HashMap; diff --git a/javaagent-instrumentation-api/src/test/java/io/opentelemetry/javaagent/instrumentation/api/util/TrieTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/util/TrieTest.java similarity index 84% rename from javaagent-instrumentation-api/src/test/java/io/opentelemetry/javaagent/instrumentation/api/util/TrieTest.java rename to javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/util/TrieTest.java index 742b4ec16e..0ed96aedc7 100644 --- a/javaagent-instrumentation-api/src/test/java/io/opentelemetry/javaagent/instrumentation/api/util/TrieTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/util/TrieTest.java @@ -3,10 +3,12 @@ * 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.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; @@ -17,9 +19,11 @@ class TrieTest { Trie.newBuilder().put("abc", 0).put("abcd", 10).put("abcde", 20).build(); assertNull(trie.getOrNull("ab")); + assertFalse(trie.contains("ab")); assertEquals(0, trie.getOrNull("abc")); assertEquals(10, trie.getOrNull("abcd")); assertEquals(20, trie.getOrNull("abcde")); + assertTrue(trie.contains("abcde")); } @Test diff --git a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentListener.java b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentListener.java index ee4634f14f..dd27496943 100644 --- a/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentListener.java +++ b/testing/agent-exporter/src/main/java/io/opentelemetry/javaagent/testing/bytebuddy/TestAgentListener.java @@ -7,12 +7,12 @@ package io.opentelemetry.javaagent.testing.bytebuddy; import io.opentelemetry.instrumentation.api.config.Config; 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.ignore.AdditionalLibraryIgnoredTypesConfigurer; import io.opentelemetry.javaagent.tooling.ignore.GlobalIgnoredTypesConfigurer; import io.opentelemetry.javaagent.tooling.ignore.IgnoreAllow; import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesBuilderImpl; +import io.opentelemetry.javaagent.tooling.util.Trie; import java.util.ArrayList; import java.util.Collections; import java.util.List;