From 3225c8fd031b2324566f80f267aa5cadd60a4ddf Mon Sep 17 00:00:00 2001 From: Nikolay Martynov Date: Thu, 6 Dec 2018 17:14:41 -0500 Subject: [PATCH] Fix wildfly startup by injecting context classes into bootstrap package --- .../agent/tooling/context/FieldBackedProvider.java | 14 ++++++++++++-- .../groovy/context/FieldBackedProviderTest.groovy | 4 ++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedProvider.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedProvider.java index 45e3099d21..f1174df7e6 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedProvider.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedProvider.java @@ -70,6 +70,14 @@ import net.bytebuddy.utility.JavaModule; @Slf4j public class FieldBackedProvider implements InstrumentationContextProvider { + /* + Note: the value here has to be inside on of the prefixes in + datadog.trace.agent.tooling.Utils#BOOTSTRAP_PACKAGE_PREFIXES. This ensures that 'isolating' (or 'module') + classloaders like jboss and osgi see injected classes. This works because we instrument those classloaders + to load everything inside bootstrap packages. + */ + private static final String DYNAMIC_CLASSES_PACKAGE = + "datadog.trace.bootstrap.instrumentation.context."; private static final String INJECTED_FIELDS_MARKER_CLASS_NAME = Utils.getInternalName(FieldBackedContextStoreAppliedMarker.class.getName()); @@ -903,7 +911,8 @@ public class FieldBackedProvider implements InstrumentationContextProvider { private String getContextStoreImplementationClassName( final String keyClassName, final String contextClassName) { - return getClass().getName() + return DYNAMIC_CLASSES_PACKAGE + + getClass().getSimpleName() + "$ContextStore$" + Utils.converToInnerClassName(keyClassName) + "$" @@ -912,7 +921,8 @@ public class FieldBackedProvider implements InstrumentationContextProvider { private String getContextAccessorInterfaceName( final String keyClassName, final String contextClassName) { - return getClass().getName() + return DYNAMIC_CLASSES_PACKAGE + + getClass().getSimpleName() + "$ContextAccessor$" + Utils.converToInnerClassName(keyClassName) + "$" diff --git a/dd-java-agent/testing/src/test/groovy/context/FieldBackedProviderTest.groovy b/dd-java-agent/testing/src/test/groovy/context/FieldBackedProviderTest.groovy index a29948a1ca..4adf146891 100644 --- a/dd-java-agent/testing/src/test/groovy/context/FieldBackedProviderTest.groovy +++ b/dd-java-agent/testing/src/test/groovy/context/FieldBackedProviderTest.groovy @@ -52,7 +52,7 @@ class FieldBackedProviderTest extends AgentTestRunner { if (inter.getName() == 'datadog.trace.bootstrap.FieldBackedContextStoreAppliedMarker') { hasMarkerInterface = true } - if (inter.getName().startsWith('datadog.trace.agent.tooling.context.FieldBackedProvider$ContextAccessor')) { + if (inter.getName().startsWith('datadog.trace.bootstrap.instrumentation.context.FieldBackedProvider$ContextAccessor')) { hasAccessorInterface = true } } @@ -178,7 +178,7 @@ class FieldBackedProviderFieldInjectionDisabledTest extends AgentTestRunner { if (inter.getName() == 'datadog.trace.bootstrap.FieldBackedContextStoreAppliedMarker') { hasMarkerInterface = true } - if (inter.getName().startsWith('datadog.trace.agent.tooling.context.FieldBackedProvider$ContextAccessor')) { + if (inter.getName().startsWith('datadog.trace.bootstrap.instrumentation.context.FieldBackedProvider$ContextAccessor')) { hasAccessorInterface = true } }