Skip to content

Commit d2c8a74

Browse files
authored
Instrument Mulesoft 4.5.0+ (#7981)
* Instrument mulesoft 4.5.0+ * add muzzle checks * fix helper classes * Enable grizzly when mule is enabled * Test interactions with otel exporter * Limit 4.5.0 tests to <=11 * add lockfile * test with latest 4 * codenarc * enforce logback-core * Separate domain dir per mule version * Clean up build * exclude old pull parser lib * clean latestDep * Get doc name to enrich resource name * change parent-child propagatoin * fix span ordering in tests * Refactor * fix thread propagation on late scheduled stuff * fix comparator * cleanup * review
1 parent 310d00c commit d2c8a74

34 files changed

+1290
-454
lines changed

dd-java-agent/instrumentation/grizzly-client-1.9/src/main/java/datadog/trace/instrumentation/grizzly/client/AsyncHttpClientInstrumentation.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
import com.ning.http.client.Request;
1616
import datadog.trace.agent.tooling.Instrumenter;
1717
import datadog.trace.agent.tooling.InstrumenterModule;
18+
import datadog.trace.api.InstrumenterConfig;
1819
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
1920
import datadog.trace.bootstrap.instrumentation.decorator.HttpClientDecorator;
21+
import java.util.Collections;
2022
import net.bytebuddy.asm.Advice;
2123

2224
@AutoService(InstrumenterModule.class)
@@ -29,7 +31,7 @@ public AsyncHttpClientInstrumentation() {
2931

3032
@Override
3133
protected boolean defaultEnabled() {
32-
return false;
34+
return InstrumenterConfig.get().isIntegrationEnabled(Collections.singleton("mule"), false);
3335
}
3436

3537
@Override

dd-java-agent/instrumentation/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/DefaultFilterChainInstrumentation.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.google.auto.service.AutoService;
99
import datadog.trace.agent.tooling.Instrumenter;
1010
import datadog.trace.agent.tooling.InstrumenterModule;
11+
import datadog.trace.api.InstrumenterConfig;
12+
import java.util.Collections;
1113

1214
@AutoService(InstrumenterModule.class)
1315
public class DefaultFilterChainInstrumentation extends InstrumenterModule.Tracing
@@ -37,7 +39,7 @@ public String[] helperClassNames() {
3739

3840
@Override
3941
protected boolean defaultEnabled() {
40-
return false;
42+
return InstrumenterConfig.get().isIntegrationEnabled(Collections.singleton("mule"), false);
4143
}
4244

4345
@Override

dd-java-agent/instrumentation/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/HttpCodecFilterInstrumentation.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.google.auto.service.AutoService;
88
import datadog.trace.agent.tooling.Instrumenter;
99
import datadog.trace.agent.tooling.InstrumenterModule;
10+
import datadog.trace.api.InstrumenterConfig;
11+
import java.util.Collections;
1012

1113
@AutoService(InstrumenterModule.class)
1214
public final class HttpCodecFilterInstrumentation extends InstrumenterModule.Tracing
@@ -23,7 +25,7 @@ public String instrumentedType() {
2325

2426
@Override
2527
protected boolean defaultEnabled() {
26-
return false;
28+
return InstrumenterConfig.get().isIntegrationEnabled(Collections.singleton("mule"), false);
2729
}
2830

2931
@Override

dd-java-agent/instrumentation/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/HttpServerFilterInstrumentation.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.google.auto.service.AutoService;
88
import datadog.trace.agent.tooling.Instrumenter;
99
import datadog.trace.agent.tooling.InstrumenterModule;
10+
import datadog.trace.api.InstrumenterConfig;
11+
import java.util.Collections;
1012

1113
@AutoService(InstrumenterModule.class)
1214
public class HttpServerFilterInstrumentation extends InstrumenterModule.Tracing
@@ -23,7 +25,7 @@ public String instrumentedType() {
2325

2426
@Override
2527
protected boolean defaultEnabled() {
26-
return false;
28+
return InstrumenterConfig.get().isIntegrationEnabled(Collections.singleton("mule"), false);
2729
}
2830

2931
@Override

dd-java-agent/instrumentation/mule-4/application/pom.xml

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<properties>
77
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
88
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
9-
<app.runtime>4.2.2-20210129</app.runtime>
10-
<mule.maven.plugin.version>3.4.2</mule.maven.plugin.version>
9+
<app.runtime>4.5.0</app.runtime>
10+
<mule.maven.plugin.version>3.8.6</mule.maven.plugin.version>
1111
<datadog.builddir>${project.basedir}</datadog.builddir>
1212
<datadog.name>mule-test-application</datadog.name>
1313
<datadog.version>1.0.0-SNAPSHOT</datadog.version>
@@ -57,19 +57,19 @@
5757
<dependency>
5858
<groupId>org.mule.connectors</groupId>
5959
<artifactId>mule-http-connector</artifactId>
60-
<version>1.5.23</version>
60+
<version>1.9.2</version>
6161
<classifier>mule-plugin</classifier>
6262
</dependency>
6363
<dependency>
6464
<groupId>org.mule.connectors</groupId>
6565
<artifactId>mule-sockets-connector</artifactId>
66-
<version>1.2.0</version>
66+
<version>1.2.4</version>
6767
<classifier>mule-plugin</classifier>
6868
</dependency>
6969
<dependency>
7070
<groupId>org.mule.module</groupId>
7171
<artifactId>mule-java-module</artifactId>
72-
<version>1.2.7</version>
72+
<version>1.2.13</version>
7373
<classifier>mule-plugin</classifier>
7474
</dependency>
7575
</dependencies>

dd-java-agent/instrumentation/mule-4/build.gradle

+143-49
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,199 @@
11
ext {
2-
// TODO Java 17: Mule 4 doesn't support Java 17
3-
maxJavaVersionForTests = JavaVersion.VERSION_15
2+
forkedTestMaxJavaVersionForTests = JavaVersion.VERSION_11
3+
mule46ForkedTestMaxJavaVersionForTests = JavaVersion.VERSION_11
4+
latestDepForkedTestMinJavaVersionForTests = JavaVersion.VERSION_17
5+
latestDepForkedTestMaxJavaVersionForTests = JavaVersion.VERSION_17
46
}
7+
def muleVersion = '4.5.0'
8+
def appDir = "$projectDir/application"
59

610
muzzle {
7-
extraRepository('anypoint-releases', 'https://maven.anypoint.mulesoft.com/api/v2/maven')
811
extraRepository('mulesoft-releases', 'https://repository.mulesoft.org/releases')
912
extraRepository('mulesoft-public', 'https://repository.mulesoft.org/nexus/content/repositories/public')
1013

1114
pass {
1215
group = 'org.mule.runtime'
1316
module = 'mule-core'
14-
versions = '[,]'
15-
assertInverse = true
16-
17-
excludeDependency 'com.google.code.findbugs:jsr305' // avoid dependency issue with mule-4.5.0
17+
versions = "[$muleVersion,)"
18+
javaVersion = "17"
19+
excludeDependency 'om.google.guava:guava'
20+
excludeDependency 'com.google.code.findbugs:jsr305'
21+
additionalDependencies +="org.mule.runtime:mule-tracer-customization-impl:$muleVersion"
1822
}
19-
20-
fail {
21-
group = 'org.mule'
23+
pass {
24+
group = 'org.mule.runtime'
25+
module = 'mule-tracer-customization-impl'
26+
versions = "[$muleVersion,)"
27+
javaVersion = "17"
28+
excludeDependency 'om.google.guava:guava'
29+
excludeDependency 'com.google.code.findbugs:jsr305'
30+
additionalDependencies +="org.mule.runtime:mule-core:$muleVersion"
31+
}
32+
pass {
33+
name = 'before-4.5.0'
34+
group = 'org.mule.runtime'
2235
module = 'mule-core'
23-
versions = '[3.2.0,)' // First version where muzzle can resolve all dependencies
24-
skipVersions += "3.9.5" // bad release
36+
versions = "[$muleVersion,)"
37+
javaVersion = "17"
38+
assertInverse true
39+
excludeDependency 'om.google.guava:guava'
40+
excludeDependency 'com.google.code.findbugs:jsr305'
41+
additionalDependencies +="org.mule.runtime:mule-tracer-customization-impl:$muleVersion"
2542
}
2643
}
2744

2845
apply from: "$rootDir/gradle/java.gradle"
2946

30-
def muleVersion = '4.2.2'
31-
def muleBaseDir = "$buildDir/mule"
32-
def appDir = "$projectDir/application"
33-
def generatedResourcesDir = "$buildDir/generated-resources/test"
34-
35-
clean.doFirst {
36-
delete muleBaseDir
37-
}
47+
addTestSuiteForDir('mule46ForkedTest', 'test')
48+
addTestSuiteForDir('latestDepForkedTest', 'test')
3849

3950
repositories {
40-
maven {
41-
name "anypoint-releases"
42-
url "https://maven.anypoint.mulesoft.com/api/v2/maven"
43-
}
4451
maven {
4552
name "mulesoft-releases"
4653
url "https://repository.mulesoft.org/releases"
54+
mavenContent {
55+
releasesOnly()
56+
}
4757
}
4858
maven {
4959
name "mulesoft-public"
5060
url "https://repository.mulesoft.org/nexus/content/repositories/public"
61+
mavenContent {
62+
releasesOnly()
63+
}
5164
}
5265
}
5366

5467
configurations {
5568
muleServices
69+
mule46Services
70+
latestMuleServices
5671
}
5772

5873
configurations.all {
59-
// don't allow mule to do slf4j over log4j
60-
exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl'
74+
exclude group: 'pull-parser', module: 'pull-parser'
75+
76+
resolutionStrategy {
77+
// avoid bringing in logback based on java 11
78+
force libs.logback.classic
79+
force libs.logback.core
80+
}
6181
}
6282

6383
sourceSets {
6484
test {
65-
output.dir(generatedResourcesDir, builtBy: 'generateAppResources')
85+
output.dir("$buildDir/generated-resources/test", builtBy: 'generateAppResources')
86+
}
87+
mule46ForkedTest {
88+
output.dir("$buildDir/generated-resources/mule46ForkedTest", builtBy: 'generateAppResources46')
89+
}
90+
latestDepForkedTest {
91+
output.dir("$buildDir/generated-resources/latestDepForkedTest", builtBy: 'generateAppResourcesLatest')
6692
}
6793
}
6894

6995
tasks.named("compileTestGroovy").configure {
7096
dependsOn 'mvnPackage', 'extractMuleServices'
7197
}
7298

99+
tasks.named("compileMule46ForkedTestGroovy").configure {
100+
dependsOn 'mvnPackage', 'extractMule46Services'
101+
}
102+
103+
tasks.named("compileLatestDepForkedTestGroovy").configure {
104+
dependsOn 'mvnPackage', 'extractLatestMuleServices'
105+
setJavaVersion(it, 17)
106+
}
107+
108+
tasks.named("compileLatestDepForkedTestJava").configure {
109+
setJavaVersion(it, 17)
110+
}
111+
73112
dependencies {
74113
compileOnly group: 'org.mule.runtime', name: 'mule-core', version: muleVersion
75-
testImplementation project(':dd-java-agent:instrumentation:aws-common')
114+
compileOnly group: 'org.mule.runtime', name: 'mule-tracer-customization-impl', version: muleVersion
76115

116+
testImplementation project(':dd-java-agent:instrumentation:aws-common')
77117
testImplementation project(':dd-java-agent:instrumentation:reactor-core-3.1')
78118
testImplementation project(':dd-java-agent:instrumentation:reactive-streams')
119+
testImplementation project(':dd-java-agent:instrumentation:grizzly-2')
79120
testImplementation project(':dd-java-agent:instrumentation:grizzly-http-2.3.20')
80121
testImplementation project(':dd-java-agent:instrumentation:grizzly-client-1.9')
81122
testImplementation project(':dd-java-agent:instrumentation:caffeine')
123+
testImplementation project(':dd-java-agent:instrumentation:quartz-2')
124+
82125

83126
testImplementation group: 'org.mule.runtime', name: 'mule-module-launcher', version: muleVersion
84127
testImplementation group: 'org.mule.runtime', name: 'mule-core', version: muleVersion
85-
testImplementation group: 'org.mule.runtime', name: 'mule-module-extensions-spring-support', version: muleVersion
128+
//testImplementation group: 'org.mule.runtime', name: 'mule-module-extensions-spring-support', version: muleVersion
86129
testImplementation group: 'org.mule.runtime', name: 'mule-module-service', version: muleVersion
87130
// this is needed for mule to find removed javax.* APIs on Java 11+
88131
testImplementation group: 'org.mule.runtime', name: 'mule-module-javaee', version: muleVersion
89-
90-
muleServices group: 'org.mule.services', name: 'mule-service-http', version: '1.4.7', classifier: 'mule-service'
91-
muleServices group: 'org.mule.services', name: 'mule-service-scheduler', version: '1.2.4', classifier: 'mule-service'
92-
muleServices group: 'org.mule.services', name: 'mule-service-weave', version: '2.2.2', classifier: 'mule-service'
132+
testImplementation group: 'org.mule.runtime', name: 'mule-dwb-api', version: '2.5.0'
133+
// testImplementation group: 'xml-apis', name: 'xml-apis', version: '1.4.01'
134+
muleServices group: 'org.mule.services', name: 'mule-service-http', version: '1.5.21', classifier: 'mule-service'
135+
muleServices group: 'org.mule.services', name: 'mule-service-scheduler', version: '1.5.0', classifier: 'mule-service'
136+
muleServices group: 'org.mule.services', name: 'mule-service-weave', version: '2.5.0', classifier: 'mule-service'
137+
138+
mule46ForkedTestImplementation group: 'org.mule.runtime', name: 'mule-module-launcher', version: '4.6.0'
139+
mule46ForkedTestImplementation group: 'org.mule.runtime', name: 'mule-core', version: '4.6.0'
140+
mule46ForkedTestImplementation group: 'org.mule.runtime', name: 'mule-module-extensions-spring-support', version: '4.6.0'
141+
mule46ForkedTestImplementation group: 'org.mule.runtime', name: 'mule-module-service', version: '4.6.0'
142+
// this is needed for mule to find removed javax.* APIs on Java 11+
143+
mule46ForkedTestImplementation group: 'org.mule.runtime', name: 'mule-module-javaee', version: '4.6.0'
144+
mule46Services group: 'org.mule.services', name: 'mule-service-http', version: '1.5.21', classifier: 'mule-service'
145+
mule46Services group: 'org.mule.services', name: 'mule-service-scheduler', version: '1.5.0', classifier: 'mule-service'
146+
mule46Services group: 'org.mule.services', name: 'mule-service-weave', version: '2.5.0', classifier: 'mule-service'
147+
148+
latestDepForkedTestImplementation group: 'org.mule.runtime', name: 'mule-module-launcher', version: '4.8.+'
149+
latestDepForkedTestImplementation group: 'org.mule.runtime', name: 'mule-core', version: '4.8.+'
150+
latestDepForkedTestImplementation group: 'org.mule.runtime', name: 'mule-module-extensions-spring-support', version: '4.8.+'
151+
latestDepForkedTestImplementation group: 'org.mule.runtime', name: 'mule-module-service', version: '4.8.+'
152+
latestDepForkedTestImplementation group: 'org.mule.runtime', name: 'mule-module-javaee', version: '4.8.+'
153+
154+
155+
//TODO: 4.9.0 is not yet out but it looks like using 4.+ instead of above 4.8.+ brings in 4.9.0-SNAPSHOT artifacts.
156+
/*
157+
When testing with them, the mule container does not bootstrap because of:
158+
None of [protected void java.lang.Object.finalize() throws java.lang.Throwable, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public java.lang.String java.lang.Object.toString(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException, public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll(), public abstract java.lang.Object java.lang.reflect.InvocationHandler.invoke(java.lang.Object,java.lang.reflect.Method,java.lang.Object[]) throws java.lang.Throwable] allows for delegation from public boolean org.springframework.beans.factory.SmartFactoryBean.isEagerInit()
159+
*/
160+
latestDepForkedTestImplementation group: 'org.mule.runtime', name: 'mule-extensions-soap-api', version: '1.8.+'
161+
162+
latestDepForkedTestImplementation group: 'jakarta.xml.ws', name: 'jakarta.xml.ws-api', version: '4.0.2'
163+
// back to the future
164+
latestDepForkedTestImplementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
165+
latestDepForkedTestImplementation group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.0'
166+
latestDepForkedTestImplementation group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0'
167+
168+
latestMuleServices group: 'org.mule.services', name: 'mule-service-http', version: '1.+', classifier: 'mule-service'
169+
latestMuleServices group: 'org.mule.services', name: 'mule-service-scheduler', version: '1.+', classifier: 'mule-service'
170+
latestMuleServices group: 'org.mule.services', name: 'mule-service-weave', version: '2.8.1', classifier: 'mule-service'
93171
}
94172

95-
// extract the enabled services into the mule base directory
96-
tasks.register('extractMuleServices', Sync) {
97-
dependsOn configurations.muleServices
98-
99-
configurations.muleServices.resolvedConfiguration.resolvedArtifacts.findAll {
173+
def copyMuleArtifacts(String configName, String muleBaseDir, Sync sync) {
174+
configurations[configName].resolvedConfiguration.resolvedArtifacts.findAll {
100175
it.classifier == "mule-service"
101176
} collect { artifact ->
102177
def id = artifact.moduleVersion.id
103-
from(zipTree(artifact.file)) {
178+
sync.from(zipTree(artifact.file)) {
104179
into("${id.name}-${id.version}")
105180
}
106181
}
182+
sync.into "$muleBaseDir/services"
183+
}
107184

108-
into "$muleBaseDir/services"
185+
// extract the enabled services into the mule base directory
186+
tasks.register('extractMuleServices', Sync) {
187+
dependsOn configurations.muleServices
188+
copyMuleArtifacts("muleServices", "$buildDir/mule/test", it)
189+
}
190+
tasks.register('extractMule46Services', Sync) {
191+
dependsOn configurations.mule46Services
192+
copyMuleArtifacts("mule46Services", "$buildDir/mule/mule46ForkedTest", it)
193+
}
194+
tasks.register('extractLatestMuleServices', Sync) {
195+
dependsOn configurations.latestMuleServices
196+
copyMuleArtifacts("latestMuleServices", "$buildDir/mule/latestDepForkedTest", it)
109197
}
110198

111199
// build the mule application via maven
@@ -118,23 +206,29 @@ tasks.register('mvnPackage', Exec) {
118206
inputs.file("$appDir/mule-artifact.json")
119207
}
120208

209+
121210
// generate a properties file so the test knows where to run mule, and what jar to deploy
122211
tasks.register('generateAppResources') {
123-
outputs.dir generatedResourcesDir
124-
doLast {
212+
createAppResourceTask(it, "test")
213+
}
214+
tasks.register('generateAppResources46') {
215+
createAppResourceTask(it, "mule46ForkedTest")
216+
}
217+
tasks.register('generateAppResourcesLatest') {
218+
createAppResourceTask(it, "latestDepForkedTest")
219+
}
220+
221+
def createAppResourceTask(Task task, String name) {
222+
def generatedResourcesDir = "$buildDir/generated-resources/$name"
223+
task.outputs.dir generatedResourcesDir
224+
task.doLast {
125225
def generated = new File(generatedResourcesDir, "test-build.properties")
126-
generated.text = """|mule.base=$muleBaseDir
226+
generated.text = """|mule.base=$buildDir/mule/$name
127227
|MuleTestApplicationConstants.jar=$buildDir/target/mule-test-application-$version-mule-application.jar
128228
|MuleTestApplicationConstants.name=mule-test-application-$version-mule-application""".stripMargin()
129229
}
130230
}
131231

132-
tasks.named("test").configure {
133-
outputs.upToDateWhen {
134-
!mvnPackage.didWork && !extractMuleServices.didWork
135-
}
136-
}
137-
138232
spotless {
139233
java {
140234
target "**/*.java"

0 commit comments

Comments
 (0)