Skip to content

Commit 774fd16

Browse files
Tests: implemented switch from logback to slf4j-simple when needed. (#9435)
1 parent 5ddf547 commit 774fd16

File tree

4 files changed

+47
-17
lines changed

4 files changed

+47
-17
lines changed

dd-java-agent/instrumentation/java-concurrent/java-concurrent-21/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ ext {
66
}
77

88
apply from: "$rootDir/gradle/java.gradle"
9+
// Use slf4j-simple as default; logback has a high chance of getting stuck in a deadlock on CI.
10+
apply from: "$rootDir/gradle/slf4j-simple.gradle"
911
apply plugin: 'idea'
1012

1113
muzzle {

dd-java-agent/instrumentation/java-concurrent/java-concurrent-21/src/test/groovy/VirtualThreadTest.groovy

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,15 @@ class VirtualThreadTest extends AgentTestRunner {
5959
}
6060

6161
where:
62-
// spotless:off
63-
name | method | poolImpl
64-
"execute Runnable" | executeRunnable | Executors.newVirtualThreadPerTaskExecutor()
65-
"submit Runnable" | submitRunnable | Executors.newVirtualThreadPerTaskExecutor()
66-
"submit Callable" | submitCallable | Executors.newVirtualThreadPerTaskExecutor()
62+
name | method | poolImpl
63+
"execute Runnable" | executeRunnable | Executors.newVirtualThreadPerTaskExecutor()
64+
"submit Runnable" | submitRunnable | Executors.newVirtualThreadPerTaskExecutor()
65+
"submit Callable" | submitCallable | Executors.newVirtualThreadPerTaskExecutor()
6766
"submit Runnable ECS" | submitRunnableExecutorCompletionService | new ExecutorCompletionService<>(Executors.newVirtualThreadPerTaskExecutor())
68-
"submit Callable ECS" | submitCallable | new ExecutorCompletionService<>(Executors.newVirtualThreadPerTaskExecutor())
69-
"invokeAll" | invokeAll | Executors.newVirtualThreadPerTaskExecutor()
70-
"invokeAll with timeout" | invokeAllTimeout | Executors.newVirtualThreadPerTaskExecutor()
71-
"invokeAny" | invokeAny | Executors.newVirtualThreadPerTaskExecutor()
72-
"invokeAny with timeout" | invokeAnyTimeout | Executors.newVirtualThreadPerTaskExecutor()
73-
// spotless:on
67+
"submit Callable ECS" | submitCallable | new ExecutorCompletionService<>(Executors.newVirtualThreadPerTaskExecutor())
68+
"invokeAll" | invokeAll | Executors.newVirtualThreadPerTaskExecutor()
69+
"invokeAll with timeout" | invokeAllTimeout | Executors.newVirtualThreadPerTaskExecutor()
70+
"invokeAny" | invokeAny | Executors.newVirtualThreadPerTaskExecutor()
71+
"invokeAny with timeout" | invokeAnyTimeout | Executors.newVirtualThreadPerTaskExecutor()
7472
}
7573
}

dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/AgentTestRunner.groovy

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package datadog.trace.agent.test
22

33
import ch.qos.logback.classic.Level
4-
import ch.qos.logback.classic.Logger
54
import ch.qos.logback.classic.util.ContextInitializer
65
import com.datadog.debugger.agent.ClassesToRetransformFinder
76
import com.datadog.debugger.agent.Configuration
@@ -68,6 +67,7 @@ import net.bytebuddy.utility.JavaModule
6867
import okhttp3.HttpUrl
6968
import okhttp3.OkHttpClient
7069
import org.junit.runner.RunWith
70+
import org.slf4j.Logger
7171
import org.slf4j.LoggerFactory
7272
import org.spockframework.mock.MockUtil
7373
import org.spockframework.mock.runtime.MockInvocation
@@ -289,12 +289,16 @@ abstract class AgentTestRunner extends DDSpecification implements AgentBuilder.L
289289
true
290290
}
291291

292+
@SuppressForbidden
292293
private static void configureLoggingLevels() {
293294
def logger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)
294-
if (!(logger instanceof Logger)) {
295+
296+
// Check logger class by name to avoid NoClassDefFoundError at runtime for tests without Logback.
297+
if (logger.class.name != "ch.qos.logback.classic.Logger") {
295298
return
296299
}
297-
final Logger rootLogger = logger
300+
301+
final ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger)logger
298302
if (!rootLogger.iteratorForAppenders().hasNext()) {
299303
try {
300304
// previous test wiped out the logging config bring it back for the next test
@@ -305,11 +309,10 @@ abstract class AgentTestRunner extends DDSpecification implements AgentBuilder.L
305309
}
306310

307311
rootLogger.setLevel(Level.WARN)
308-
((Logger) LoggerFactory.getLogger("datadog")).setLevel(Level.DEBUG)
309-
((Logger) LoggerFactory.getLogger("org.testcontainers")).setLevel(Level.DEBUG)
312+
((ch.qos.logback.classic.Logger) LoggerFactory.getLogger("datadog")).setLevel(Level.DEBUG)
313+
((ch.qos.logback.classic.Logger) LoggerFactory.getLogger("org.testcontainers")).setLevel(Level.DEBUG)
310314
}
311315

312-
313316
def codeOriginSetup() {
314317
injectSysConfig(CODE_ORIGIN_FOR_SPANS_ENABLED, "true", true)
315318
injectSysConfig(DYNAMIC_INSTRUMENTATION_VERIFY_BYTECODE, "false", true)

gradle/slf4j-simple.gradle

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Apply this script when `slf4j-simple` should be used instead of `logback`.
2+
3+
configurations.configureEach { cfg ->
4+
def name = cfg.name
5+
6+
if (name.containsIgnoreCase("test")) {
7+
// Exclude Logback from all test-like runtimeClasspath configurations.
8+
if (name.endsWithIgnoreCase("runtimeClasspath")) {
9+
cfg.exclude group: "ch.qos.logback"
10+
}
11+
12+
// Add slf4j-simple to all test-like runtimeOnly configurations.
13+
if (name.endsWithIgnoreCase("runtimeOnly")) {
14+
project.dependencies.add(name, "org.slf4j:slf4j-simple:${libs.versions.slf4j.get()}")
15+
}
16+
}
17+
}
18+
19+
// Configure `slf4j-simple` logger.
20+
tasks.withType(Test).configureEach {
21+
jvmArgs += [
22+
"-Dorg.slf4j.simpleLogger.defaultLogLevel=debug",
23+
"-Dorg.slf4j.simpleLogger.showThreadName=true",
24+
"-Dorg.slf4j.simpleLogger.showDateTime=true",
25+
"-Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss.SSS"
26+
]
27+
}

0 commit comments

Comments
 (0)