Skip to content

Commit 0c52ba5

Browse files
committed
Move glassfish 4 compatibility layer to instrumentation module
1 parent fcbe7c9 commit 0c52ba5

4 files changed

Lines changed: 112 additions & 61 deletions

File tree

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/compatibility/GlassfishClassloaderBlacklistCompatibility.java

Lines changed: 0 additions & 61 deletions
This file was deleted.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
apply from: "${rootDir}/gradle/java.gradle"
2+
apply plugin: 'idea'
3+
apply plugin: 'org.unbroken-dome.test-sets'
4+
5+
muzzle {
6+
pass {
7+
group = 'org.glassfish.main.extras'
8+
module = 'glassfish-embedded-all'
9+
versions = "[4.1,5("
10+
}
11+
}
12+
13+
testSets {
14+
latestDepTest {
15+
dirName = 'test'
16+
}
17+
}
18+
19+
dependencies {
20+
21+
compile project(':dd-trace-ot')
22+
compile project(':dd-java-agent:agent-tooling')
23+
24+
compile deps.bytebuddy
25+
compile deps.opentracing
26+
compile deps.autoservice
27+
annotationProcessor deps.autoservice
28+
implementation deps.autoservice
29+
30+
testCompile project(':dd-java-agent:testing')
31+
testCompile group: 'org.glassfish.main.extras', name: 'glassfish-embedded-all', version: '4.1.2'
32+
33+
latestDepTestCompile sourceSets.test.output
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package datadog.trace.instrumentation.glassfish4;
2+
3+
import static java.util.Collections.singletonMap;
4+
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
5+
import static net.bytebuddy.matcher.ElementMatchers.isPrivate;
6+
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
7+
import static net.bytebuddy.matcher.ElementMatchers.named;
8+
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
9+
10+
import com.google.auto.service.AutoService;
11+
import datadog.trace.agent.tooling.Constants;
12+
import datadog.trace.agent.tooling.ExceptionHandlers;
13+
import datadog.trace.agent.tooling.Instrumenter;
14+
import datadog.trace.agent.tooling.Utils;
15+
import lombok.extern.slf4j.Slf4j;
16+
import net.bytebuddy.agent.builder.AgentBuilder;
17+
import net.bytebuddy.asm.Advice;
18+
import net.bytebuddy.description.method.MethodDescription;
19+
import net.bytebuddy.description.type.TypeDescription;
20+
import net.bytebuddy.matcher.ElementMatcher;
21+
import net.bytebuddy.matcher.ElementMatchers;
22+
23+
import java.util.Map;
24+
25+
/**
26+
* This instrumenter prevents a mechanism from GlassFish classloader to produces a class not found
27+
* exception in our tracer. Link to the GH issue:
28+
* https://github.com/eclipse-ee4j/glassfish/issues/22566 If a class loading is attempted, as an
29+
* example, as a resource and is it not found, then it is blacklisted. Successive attempts to load a
30+
* class as a class (not a resource) will fail because the class is not even tried. We hook into the
31+
* blacklisting method to avoid specific namespaces to be blacklisted.
32+
*/
33+
@Slf4j
34+
@AutoService(Instrumenter.class)
35+
public final class GlassfishInstrumentation extends Instrumenter.Default {
36+
37+
public GlassfishInstrumentation() {
38+
super("cassandra");
39+
}
40+
41+
@Override
42+
public String[] helperClassNames() {
43+
return new String[] {Constants.class.getName()};
44+
}
45+
46+
@Override
47+
public ElementMatcher<? super TypeDescription> typeMatcher() {
48+
return ElementMatchers.named("com.sun.enterprise.v3.server.APIClassLoaderServiceImpl$APIClassLoader");
49+
}
50+
51+
@Override
52+
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
53+
return singletonMap(
54+
isMethod().and(named("addToBlackList")).and(takesArguments(0)),
55+
AvoidGlassFishBlacklistAdvice.class.getName());
56+
}
57+
58+
public static class AvoidGlassFishBlacklistAdvice {
59+
60+
@Advice.OnMethodEnter(suppress = Throwable.class)
61+
public static void preventBlacklistingOfTracerClasses(
62+
@Advice.Argument(value = 0, readOnly = false) String name) {
63+
for (String prefix : Constants.BOOTSTRAP_PACKAGE_PREFIXES) {
64+
if (name.startsWith(prefix)) {
65+
if (log.isDebugEnabled()) {
66+
log.debug(
67+
"Prevented blacklisting of class {}. Stack trace is: \n{}",
68+
name,
69+
Utils.getStackTraceAsString());
70+
}
71+
name = "__datadog_no_blacklist." + name;
72+
break;
73+
}
74+
}
75+
}
76+
}
77+
}

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ include ':dd-java-agent:instrumentation:elasticsearch:transport-2'
4040
include ':dd-java-agent:instrumentation:elasticsearch:transport-5'
4141
include ':dd-java-agent:instrumentation:elasticsearch:transport-5.3'
4242
include ':dd-java-agent:instrumentation:elasticsearch:transport-6'
43+
include ':dd-java-agent:instrumentation:glassfish-4.1'
4344
include ':dd-java-agent:instrumentation:grpc-1.5'
4445
include ':dd-java-agent:instrumentation:hibernate'
4546
include ':dd-java-agent:instrumentation:hibernate:core-3.3'

0 commit comments

Comments
 (0)