From faccb0d48364641b7ca99076e17cda17d30ce87d Mon Sep 17 00:00:00 2001 From: Tyler Benson Date: Fri, 21 Feb 2020 09:51:04 -0800 Subject: [PATCH] Set ByteBuddy raw setting at startup This reduces the complexity of TypeDefinitions. ``` Benchmark Mode Cnt Score Error Units ClassRetransformingBenchmark.WithAgent.testTracedRetransform avgt 22.450 ms/op ClassRetransformingBenchmark.WithAgent.testUntracedRetransform avgt 6.842 ms/op ClassRetransformingBenchmark.WithAgentMaster.testTracedRetransform avgt 23.188 ms/op ClassRetransformingBenchmark.WithAgentMaster.testUntracedRetransform avgt 7.009 ms/op ``` It also improved startup time by about 1 sec. --- .../trace/agent/tooling/AgentInstaller.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java index 99bb4e2d53..63405cad6a 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java @@ -18,6 +18,7 @@ import java.util.ServiceLoader; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.agent.builder.ResettableClassFileTransformer; +import net.bytebuddy.description.type.TypeDefinition; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.matcher.ElementMatcher; @@ -50,6 +51,8 @@ public class AgentInstaller { final Instrumentation inst, final AgentBuilder.Listener... listeners) { INSTRUMENTATION = inst; + addByteBuddyRawSetting(); + AgentBuilder agentBuilder = new AgentBuilder.Default() .disableClassFormatChanges() @@ -93,6 +96,23 @@ public class AgentInstaller { return agentBuilder.installOn(inst); } + private static void addByteBuddyRawSetting() { + final String savedPropertyValue = System.getProperty(TypeDefinition.RAW_TYPES_PROPERTY); + try { + System.setProperty(TypeDefinition.RAW_TYPES_PROPERTY, "true"); + final boolean rawTypes = TypeDescription.AbstractBase.RAW_TYPES; + if (!rawTypes) { + log.debug("Too late to enable {}", TypeDefinition.RAW_TYPES_PROPERTY); + } + } finally { + if (savedPropertyValue == null) { + System.clearProperty(TypeDefinition.RAW_TYPES_PROPERTY); + } else { + System.setProperty(TypeDefinition.RAW_TYPES_PROPERTY, savedPropertyValue); + } + } + } + private static ElementMatcher.Junction matchesConfiguredExcludes() { final List excludedClasses = Config.get().getExcludedClasses(); ElementMatcher.Junction matcher = none();