diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/build.gradle b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/build.gradle index a90ff8163e2..ac9aef4d0b9 100644 --- a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/build.gradle +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/build.gradle @@ -67,8 +67,8 @@ dependencies { spring6TestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '3.0.0' latestDepTestImplementation group: 'com.h2database', name: 'h2', version: '+' - latestDepTestImplementation group: 'org.springframework', name: 'spring-context', version: '6.+' - latestDepTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '3.+' + latestDepTestImplementation group: 'org.springframework', name: 'spring-context', version: '7.+' + latestDepTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '4.+' } tasks.named("latestDepForkedTest", Test) { diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/gradle.lockfile b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/gradle.lockfile index 04929d63460..ea4c08da12e 100644 --- a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/gradle.lockfile +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/gradle.lockfile @@ -2,6 +2,7 @@ # Manual edits can break the build and are not advised. # This file is expected to be part of source control. antlr:antlr:2.7.7=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +biz.aQute.bnd:biz.aQute.bnd.annotation:7.1.0=latestDepForkedTestCompileClasspath,latestDepTestCompileClasspath cafe.cryptography:curve25519-elisabeth:0.1.0=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath cafe.cryptography:ed25519-elisabeth:0.1.0=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath ch.qos.logback:logback-classic:1.2.13=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath @@ -13,7 +14,7 @@ ch.qos.logback:logback-core:1.5.32=latestDepForkedTestCompileClasspath,latestDep com.blogspot.mydailyjava:weak-lock-free:0.17=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,muzzleTooling,runtimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath com.datadoghq.okhttp3:okhttp:3.12.15=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath com.datadoghq.okio:okio:1.17.6=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -com.datadoghq:dd-instrument-java:0.0.3=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:dd-instrument-java:0.0.4=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath com.datadoghq:dd-javac-plugin-client:0.2.2=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath com.datadoghq:java-dogstatsd-client:4.4.5=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath com.datadoghq:sketches-java:0.8.3=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath @@ -21,7 +22,8 @@ com.fasterxml.jackson.core:jackson-annotations:2.11.3=latestDepForkedTestRuntime com.fasterxml.jackson.core:jackson-core:2.11.3=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath com.fasterxml.jackson.core:jackson-databind:2.11.3=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.3=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath -com.fasterxml:classmate:1.5.1=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml:classmate:1.5.1=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml:classmate:1.7.1=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath com.github.javaparser:javaparser-core:3.25.6=codenarc com.github.jnr:jffi:1.3.14=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath com.github.jnr:jnr-a64asm:1.0.0=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath @@ -40,6 +42,7 @@ com.google.auto:auto-common:1.2.1=annotationProcessor,latestDepForkedTestAnnotat com.google.code.findbugs:jsr305:3.0.2=annotationProcessor,compileClasspath,latestDepForkedTestAnnotationProcessor,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestAnnotationProcessor,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestAnnotationProcessor,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spotbugs,spring6TestAnnotationProcessor,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath com.google.code.gson:gson:2.13.2=spotbugs com.google.errorprone:error_prone_annotations:2.18.0=annotationProcessor,latestDepForkedTestAnnotationProcessor,latestDepTestAnnotationProcessor,latestSpring5TestAnnotationProcessor,spring6TestAnnotationProcessor,testAnnotationProcessor +com.google.errorprone:error_prone_annotations:2.38.0=latestDepForkedTestCompileClasspath,latestDepTestCompileClasspath com.google.errorprone:error_prone_annotations:2.41.0=spotbugs com.google.guava:failureaccess:1.0.1=annotationProcessor,latestDepForkedTestAnnotationProcessor,latestDepTestAnnotationProcessor,latestSpring5TestAnnotationProcessor,spring6TestAnnotationProcessor,testAnnotationProcessor com.google.guava:guava:20.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath @@ -57,41 +60,42 @@ com.squareup.okio:okio:1.17.5=latestDepForkedTestCompileClasspath,latestDepForke com.sun.activation:jakarta.activation:2.0.1=spring6TestRuntimeClasspath com.sun.istack:istack-commons-runtime:3.0.7=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath com.sun.istack:istack-commons-runtime:4.0.1=spring6TestRuntimeClasspath -com.sun.istack:istack-commons-runtime:4.1.1=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath +com.sun.istack:istack-commons-runtime:4.1.2=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath com.sun.xml.fastinfoset:FastInfoset:1.2.15=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath com.thoughtworks.qdox:qdox:1.12.1=codenarc com.zaxxer:HikariCP:3.4.5=testCompileClasspath,testRuntimeClasspath com.zaxxer:HikariCP:4.0.3=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath com.zaxxer:HikariCP:5.0.1=spring6TestCompileClasspath,spring6TestRuntimeClasspath -com.zaxxer:HikariCP:6.3.3=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +com.zaxxer:HikariCP:7.0.2=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath commons-fileupload:commons-fileupload:1.5=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath commons-io:commons-io:2.11.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath commons-io:commons-io:2.20.0=spotbugs +commons-logging:commons-logging:1.3.5=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath de.thetaphi:forbiddenapis:3.10=compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath io.leangen.geantyref:geantyref:1.3.16=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath -io.micrometer:micrometer-commons:1.15.11=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +io.micrometer:micrometer-commons:1.16.5=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath io.micrometer:micrometer-core:1.6.1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -io.micrometer:micrometer-observation:1.15.11=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath -io.smallrye:jandex:3.2.0=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath +io.micrometer:micrometer-observation:1.16.5=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath io.sqreen:libsqreen:17.3.0=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath -jakarta.activation:jakarta.activation-api:2.1.1=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath +jakarta.activation:jakarta.activation-api:2.1.4=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath jakarta.annotation:jakarta.annotation-api:1.3.5=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -jakarta.annotation:jakarta.annotation-api:2.1.1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath +jakarta.annotation:jakarta.annotation-api:2.1.1=spring6TestCompileClasspath,spring6TestRuntimeClasspath +jakarta.annotation:jakarta.annotation-api:3.0.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath jakarta.inject:jakarta.inject-api:2.0.0=spring6TestRuntimeClasspath jakarta.inject:jakarta.inject-api:2.0.1=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath jakarta.persistence:jakarta.persistence-api:2.2.3=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath jakarta.persistence:jakarta.persistence-api:3.0.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -jakarta.persistence:jakarta.persistence-api:3.1.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +jakarta.persistence:jakarta.persistence-api:3.2.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath jakarta.transaction:jakarta.transaction-api:1.3.3=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath jakarta.transaction:jakarta.transaction-api:2.0.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath jakarta.transaction:jakarta.transaction-api:2.0.1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath jakarta.xml.bind:jakarta.xml.bind-api:3.0.1=spring6TestRuntimeClasspath -jakarta.xml.bind:jakarta.xml.bind-api:4.0.0=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath +jakarta.xml.bind:jakarta.xml.bind-api:4.0.4=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath javax.servlet:javax.servlet-api:3.1.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath jaxen:jaxen:2.0.0=spotbugs junit:junit:4.13.2=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath -net.bytebuddy:byte-buddy-agent:1.18.8=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,muzzleTooling,runtimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -net.bytebuddy:byte-buddy:1.18.8=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,muzzleTooling,runtimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy-agent:1.18.10=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,muzzleTooling,runtimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.18.10=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,muzzleTooling,runtimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath net.java.dev.jna:jna-platform:5.8.0=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath net.java.dev.jna:jna:5.8.0=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath net.javacrumbs.shedlock:shedlock-core:4.21.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath @@ -102,7 +106,7 @@ net.javacrumbs.shedlock:shedlock-spring:4.21.0=latestDepForkedTestCompileClasspa net.javacrumbs.shedlock:shedlock-spring:4.48.0=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath net.sf.saxon:Saxon-HE:12.9=spotbugs org.antlr:antlr4-runtime:4.10.1=spring6TestRuntimeClasspath -org.antlr:antlr4-runtime:4.13.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.antlr:antlr4-runtime:4.13.2=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.apache.ant:ant-antlr:1.10.14=codenarc org.apache.ant:ant-junit:1.10.14=codenarc org.apache.bcel:bcel:6.11.0=spotbugs @@ -111,15 +115,15 @@ org.apache.commons:commons-text:1.14.0=spotbugs org.apache.logging.log4j:log4j-api:2.13.3=testCompileClasspath,testRuntimeClasspath org.apache.logging.log4j:log4j-api:2.17.2=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.apache.logging.log4j:log4j-api:2.19.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.apache.logging.log4j:log4j-api:2.24.3=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.apache.logging.log4j:log4j-api:2.25.2=spotbugs +org.apache.logging.log4j:log4j-api:2.25.4=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.apache.logging.log4j:log4j-core:2.25.2=spotbugs org.apache.logging.log4j:log4j-to-slf4j:2.13.3=testCompileClasspath,testRuntimeClasspath org.apache.logging.log4j:log4j-to-slf4j:2.17.2=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.apache.logging.log4j:log4j-to-slf4j:2.19.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.apache.logging.log4j:log4j-to-slf4j:2.24.3=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.apache.logging.log4j:log4j-to-slf4j:2.25.4=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.apiguardian:apiguardian-api:1.1.2=latestDepForkedTestCompileClasspath,latestDepTestCompileClasspath,latestSpring5TestCompileClasspath,spring6TestCompileClasspath,testCompileClasspath -org.aspectj:aspectjweaver:1.9.22.1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.aspectj:aspectjweaver:1.9.25=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.aspectj:aspectjweaver:1.9.6=testCompileClasspath,testRuntimeClasspath org.aspectj:aspectjweaver:1.9.7=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.aspectj:aspectjweaver:1.9.9.1=spring6TestCompileClasspath,spring6TestRuntimeClasspath @@ -136,34 +140,35 @@ org.codehaus.groovy:groovy:3.0.25=latestDepForkedTestCompileClasspath,latestDepF org.codenarc:CodeNarc:3.7.0=codenarc org.dom4j:dom4j:2.1.3=testCompileClasspath,testRuntimeClasspath org.dom4j:dom4j:2.2.0=spotbugs -org.eclipse.angus:angus-activation:2.0.0=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath +org.eclipse.angus:angus-activation:2.0.3=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath org.glassfish.jaxb:jaxb-core:3.0.2=spring6TestRuntimeClasspath -org.glassfish.jaxb:jaxb-core:4.0.2=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath +org.glassfish.jaxb:jaxb-core:4.0.6=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath org.glassfish.jaxb:jaxb-runtime:2.3.1=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.glassfish.jaxb:jaxb-runtime:3.0.2=spring6TestRuntimeClasspath -org.glassfish.jaxb:jaxb-runtime:4.0.2=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath +org.glassfish.jaxb:jaxb-runtime:4.0.6=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath org.glassfish.jaxb:txw2:2.3.1=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.glassfish.jaxb:txw2:3.0.2=spring6TestRuntimeClasspath -org.glassfish.jaxb:txw2:4.0.2=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath +org.glassfish.jaxb:txw2:4.0.6=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath org.gmetrics:GMetrics:2.1.0=codenarc org.hamcrest:hamcrest-core:1.3=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath org.hamcrest:hamcrest:3.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.hdrhistogram:HdrHistogram:2.1.12=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.hibernate.common:hibernate-commons-annotations:5.1.2.Final=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.hibernate.common:hibernate-commons-annotations:6.0.2.Final=spring6TestRuntimeClasspath -org.hibernate.common:hibernate-commons-annotations:7.0.3.Final=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath +org.hibernate.models:hibernate-models:1.0.1=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath org.hibernate.orm:hibernate-core:6.1.5.Final=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.hibernate.orm:hibernate-core:6.6.49.Final=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.hibernate.orm:hibernate-core:7.2.12.Final=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.hibernate:hibernate-core:5.4.23.Final=testCompileClasspath,testRuntimeClasspath org.hibernate:hibernate-core:5.6.15.Final=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.javassist:javassist:3.24.0-GA=testCompileClasspath,testRuntimeClasspath org.jboss.logging:jboss-logging:3.4.1.Final=testCompileClasspath,testRuntimeClasspath org.jboss.logging:jboss-logging:3.4.3.Final=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath -org.jboss.logging:jboss-logging:3.5.0.Final=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath +org.jboss.logging:jboss-logging:3.6.1.Final=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath org.jboss:jandex:2.1.3.Final=testCompileClasspath,testRuntimeClasspath org.jboss:jandex:2.4.2.Final=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath org.jctools:jctools-core-jdk11:4.0.6=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath org.jctools:jctools-core:4.0.6=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath +org.jspecify:jspecify:1.0.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.junit.jupiter:junit-jupiter-api:5.14.1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.junit.jupiter:junit-jupiter-engine:5.14.1=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath org.junit.jupiter:junit-jupiter-params:5.14.1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath @@ -181,6 +186,10 @@ org.latencyutils:LatencyUtils:2.0.3=latestDepForkedTestRuntimeClasspath,latestDe org.mockito:mockito-core:4.4.0=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath org.objenesis:objenesis:3.3=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.opentest4j:opentest4j:1.3.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.osgi:org.osgi.annotation.bundle:2.0.0=latestDepForkedTestCompileClasspath,latestDepTestCompileClasspath +org.osgi:org.osgi.annotation.versioning:1.1.2=latestDepForkedTestCompileClasspath,latestDepTestCompileClasspath +org.osgi:org.osgi.resource:1.0.0=latestDepForkedTestCompileClasspath,latestDepTestCompileClasspath +org.osgi:org.osgi.service.serviceloader:1.0.0=latestDepForkedTestCompileClasspath,latestDepTestCompileClasspath org.ow2.asm:asm-analysis:9.7.1=latestDepForkedTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestSpring5TestRuntimeClasspath,spring6TestRuntimeClasspath,testRuntimeClasspath org.ow2.asm:asm-analysis:9.9=spotbugs org.ow2.asm:asm-commons:9.9=spotbugs @@ -211,7 +220,14 @@ org.springframework.boot:spring-boot-actuator:2.4.0=latestDepForkedTestCompileCl org.springframework.boot:spring-boot-autoconfigure:2.4.0=testCompileClasspath,testRuntimeClasspath org.springframework.boot:spring-boot-autoconfigure:2.7.18=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework.boot:spring-boot-autoconfigure:3.0.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework.boot:spring-boot-autoconfigure:3.5.14=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-autoconfigure:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-data-commons:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-data-jpa:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-hibernate:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-jdbc:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-jpa:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-persistence:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-sql:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework.boot:spring-boot-starter-actuator:2.4.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.springframework.boot:spring-boot-starter-aop:2.4.0=testCompileClasspath,testRuntimeClasspath org.springframework.boot:spring-boot-starter-aop:2.7.18=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath @@ -219,82 +235,82 @@ org.springframework.boot:spring-boot-starter-aop:3.0.0=spring6TestCompileClasspa org.springframework.boot:spring-boot-starter-data-jpa:2.4.0=testCompileClasspath,testRuntimeClasspath org.springframework.boot:spring-boot-starter-data-jpa:2.7.18=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework.boot:spring-boot-starter-data-jpa:3.0.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework.boot:spring-boot-starter-data-jpa:3.5.14=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-starter-data-jpa:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework.boot:spring-boot-starter-jdbc:2.4.0=testCompileClasspath,testRuntimeClasspath org.springframework.boot:spring-boot-starter-jdbc:2.7.18=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework.boot:spring-boot-starter-jdbc:3.0.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework.boot:spring-boot-starter-jdbc:3.5.14=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-starter-jdbc:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework.boot:spring-boot-starter-logging:2.4.0=testCompileClasspath,testRuntimeClasspath org.springframework.boot:spring-boot-starter-logging:2.7.18=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework.boot:spring-boot-starter-logging:3.0.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework.boot:spring-boot-starter-logging:3.5.14=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-starter-logging:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework.boot:spring-boot-starter:2.4.0=testCompileClasspath,testRuntimeClasspath org.springframework.boot:spring-boot-starter:2.7.18=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework.boot:spring-boot-starter:3.0.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework.boot:spring-boot-starter:3.5.14=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-starter:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot-transaction:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework.boot:spring-boot:2.4.0=testCompileClasspath,testRuntimeClasspath org.springframework.boot:spring-boot:2.7.18=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework.boot:spring-boot:3.0.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework.boot:spring-boot:3.5.14=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.boot:spring-boot:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework.data:spring-data-commons:2.4.1=testCompileClasspath,testRuntimeClasspath org.springframework.data:spring-data-commons:2.7.18=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework.data:spring-data-commons:3.0.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework.data:spring-data-commons:3.5.11=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.data:spring-data-commons:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework.data:spring-data-jpa:2.4.1=testCompileClasspath,testRuntimeClasspath org.springframework.data:spring-data-jpa:2.7.18=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework.data:spring-data-jpa:3.0.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework.data:spring-data-jpa:3.5.11=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework.data:spring-data-jpa:4.1.0-RC1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework:spring-aop:5.0.0.RELEASE=compileClasspath org.springframework:spring-aop:5.3.39=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework:spring-aop:5.3.4=testCompileClasspath,testRuntimeClasspath org.springframework:spring-aop:6.0.2=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework:spring-aop:6.2.18=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework:spring-aop:7.0.7=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework:spring-aspects:5.3.1=testCompileClasspath,testRuntimeClasspath org.springframework:spring-aspects:5.3.31=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework:spring-aspects:6.0.2=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework:spring-aspects:6.2.18=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework:spring-aspects:7.0.7=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework:spring-beans:5.0.0.RELEASE=compileClasspath org.springframework:spring-beans:5.3.39=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework:spring-beans:5.3.4=testCompileClasspath,testRuntimeClasspath org.springframework:spring-beans:6.0.2=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework:spring-beans:6.2.18=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework:spring-beans:7.0.7=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework:spring-context:5.0.0.RELEASE=compileClasspath org.springframework:spring-context:5.3.39=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework:spring-context:5.3.4=testCompileClasspath,testRuntimeClasspath org.springframework:spring-context:6.0.2=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework:spring-context:6.2.18=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework:spring-context:7.0.7=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework:spring-core:5.0.0.RELEASE=compileClasspath org.springframework:spring-core:5.3.39=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework:spring-core:5.3.4=testCompileClasspath,testRuntimeClasspath org.springframework:spring-core:6.0.2=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework:spring-core:6.2.18=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework:spring-core:7.0.7=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework:spring-expression:5.0.0.RELEASE=compileClasspath org.springframework:spring-expression:5.3.39=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework:spring-expression:5.3.4=testCompileClasspath,testRuntimeClasspath org.springframework:spring-expression:6.0.2=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework:spring-expression:6.2.18=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework:spring-expression:7.0.7=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework:spring-jcl:5.0.0.RELEASE=compileClasspath org.springframework:spring-jcl:5.3.39=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework:spring-jcl:5.3.4=testCompileClasspath,testRuntimeClasspath org.springframework:spring-jcl:6.0.2=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework:spring-jcl:6.2.18=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework:spring-jdbc:5.3.31=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework:spring-jdbc:5.3.4=testCompileClasspath,testRuntimeClasspath org.springframework:spring-jdbc:6.0.2=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework:spring-jdbc:6.2.18=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework:spring-jdbc:7.0.7=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework:spring-orm:5.3.1=testCompileClasspath,testRuntimeClasspath org.springframework:spring-orm:5.3.31=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework:spring-orm:6.0.0=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework:spring-orm:6.2.18=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework:spring-orm:7.0.7=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.springframework:spring-tx:5.3.31=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.springframework:spring-tx:5.3.4=testCompileClasspath,testRuntimeClasspath org.springframework:spring-tx:6.0.2=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.springframework:spring-tx:6.2.18=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.springframework:spring-tx:7.0.7=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.tabletest:tabletest-junit:1.2.1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.tabletest:tabletest-parser:1.2.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath,spring6TestCompileClasspath,spring6TestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.xmlresolver:xmlresolver:5.3.3=spotbugs org.yaml:snakeyaml:1.27=testCompileClasspath,testRuntimeClasspath org.yaml:snakeyaml:1.30=latestSpring5TestCompileClasspath,latestSpring5TestRuntimeClasspath org.yaml:snakeyaml:1.33=spring6TestCompileClasspath,spring6TestRuntimeClasspath -org.yaml:snakeyaml:2.4=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.yaml:snakeyaml:2.6=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath empty=spotbugsPlugins diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpannedMethodInvocation.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpannedMethodInvocation.java index 7e5fbea27c7..0397e0f71e8 100644 --- a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpannedMethodInvocation.java +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpannedMethodInvocation.java @@ -51,6 +51,9 @@ private Object invokeWithSpan(CharSequence spanName) throws Throwable { AgentSpan span = startSpan("spring-scheduling", spanName); try (AgentScope scope = activateSpan(span)) { return delegate.proceed(); + } catch (Throwable throwable) { + DECORATE.onError(span, throwable); + throw throwable; } finally { span.finish(); } diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/groovy/ShedlockTest.groovy b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/groovy/ShedlockTest.groovy deleted file mode 100644 index 0c09ca82aa0..00000000000 --- a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/groovy/ShedlockTest.groovy +++ /dev/null @@ -1,27 +0,0 @@ -import datadog.trace.agent.test.InstrumentationSpecification -import datadog.trace.test.util.Flaky -import org.springframework.context.annotation.AnnotationConfigApplicationContext -import org.springframework.jdbc.core.JdbcTemplate - -import javax.sql.DataSource -import java.util.concurrent.TimeUnit - -class ShedlockTest extends InstrumentationSpecification { - - @Flaky("task.invocationCount() == 0") - def "should not disable shedlock"() { - setup: - def context = new AnnotationConfigApplicationContext(ShedlockConfig) - JdbcTemplate jdbcTemplate = new JdbcTemplate(context.getBean(DataSource)) - jdbcTemplate.execute("CREATE TABLE shedlock(name VARCHAR(64) NOT NULL PRIMARY KEY, lock_until TIMESTAMP NOT NULL,\n" + - " locked_at TIMESTAMP NOT NULL, locked_by VARCHAR(255) NOT NULL);") - def task = context.getBean(ShedLockedTask) - - expect: "lock is held for more than one second" - !task.awaitInvocation(1000, TimeUnit.MILLISECONDS) - task.invocationCount() == 1 - - cleanup: - context.close() - } -} diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/groovy/SpringAsyncTest.groovy b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/groovy/SpringAsyncTest.groovy deleted file mode 100644 index a73623ba3c1..00000000000 --- a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/groovy/SpringAsyncTest.groovy +++ /dev/null @@ -1,56 +0,0 @@ -import datadog.trace.agent.test.InstrumentationSpecification -import org.springframework.context.annotation.AnnotationConfigApplicationContext - -import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace - -class SpringAsyncTest extends InstrumentationSpecification { - - def "context propagated through @async annotation"() { - setup: - def context = new AnnotationConfigApplicationContext(AsyncTaskConfig) - AsyncTask asyncTask = context.getBean(AsyncTask) - when: - if (hasParent) { - runUnderTrace("root") { - asyncTask.async().join() - } - } else { - asyncTask.async().join() - } - then: - assertTraces(1) { - if (hasParent) { - trace(3) { - span { - resourceName "root" - } - span { - resourceName "AsyncTask.async" - threadNameStartsWith "SimpleAsyncTaskExecutor" - childOf span(0) - } - span { - resourceName "AsyncTask.getInt" - threadNameStartsWith "SimpleAsyncTaskExecutor" - childOf span(1) - } - } - } else { - trace(2) { - span { - resourceName "AsyncTask.async" - threadNameStartsWith "SimpleAsyncTaskExecutor" - } - span { - resourceName "AsyncTask.getInt" - threadNameStartsWith "SimpleAsyncTaskExecutor" - childOf span(0) - } - } - } - } - - where: - hasParent << [true, false] - } -} diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/groovy/SpringSchedulingTest.groovy b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/groovy/SpringSchedulingTest.groovy deleted file mode 100644 index f604744aa39..00000000000 --- a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/groovy/SpringSchedulingTest.groovy +++ /dev/null @@ -1,149 +0,0 @@ -import static datadog.trace.agent.test.utils.TraceUtils.basicSpan - -import datadog.trace.agent.test.InstrumentationSpecification -import datadog.trace.bootstrap.instrumentation.api.Tags -import org.springframework.boot.actuate.scheduling.ScheduledTasksEndpoint -import org.springframework.context.annotation.AnnotationConfigApplicationContext - -import java.util.concurrent.TimeUnit - -class SpringSchedulingTest extends InstrumentationSpecification { - - def legacyTracing() { - false - } - - @Override - protected void configurePreAgent() { - super.configurePreAgent() - if (legacyTracing()) { - injectSysConfig("spring-scheduling.legacy.tracing.enabled", "true") - } - } - - def "schedule trigger test according to cron expression"() { - setup: - def context = new AnnotationConfigApplicationContext(TriggerTaskConfig, SchedulingConfig) - def task = context.getBean(TriggerTask) - def scheduledTaskEndpoint = context.getBean(ScheduledTasksEndpoint) - - task.blockUntilExecute() - // Capture cron tasks before closing the context (endpoint is unavailable after close). - def cronTasks = scheduledTaskEndpoint.scheduledTasks().getCron() - // Close the context immediately after the first execution to prevent a second cron - // firing before assertions complete, which would produce extra traces and cause flakiness. - context.close() - - expect: - assert task != null - def hasParent = legacyTracing() - assertTraces(hasParent ? 1 : 2) { - if (!hasParent) { - trace(1) { - basicSpan(it, "parent") - } - } - trace(hasParent ? 2 : 1) { - if (hasParent) { - basicSpan(it, "parent") - } - span { - resourceName "TriggerTask.run" - operationName "scheduled.call" - hasParent ? childOfPrevious() : parent() - errored false - tags { - "$Tags.COMPONENT" "spring-scheduling" - defaultTags() - } - } - } - } - and: - assert scheduledTaskEndpoint != null - cronTasks.each { - it.getRunnable().getTarget() == TriggerTask.getName() - } - } - - def "schedule interval test"() { - setup: - def context = new AnnotationConfigApplicationContext(IntervalTaskConfig, SchedulingConfig) - def task = context.getBean(IntervalTask) - - task.blockUntilExecute() - - expect: - assert task != null - def hasParent = legacyTracing() - - assertTraces(hasParent ? 1 : 2) { - if (!hasParent) { - trace(1) { - basicSpan(it, "parent") - } - } - trace(hasParent ? 2 : 1) { - if (hasParent) { - basicSpan(it, "parent") - } - span { - resourceName "IntervalTask.run" - operationName "scheduled.call" - hasParent ? childOfPrevious() : parent() - errored false - tags { - "$Tags.COMPONENT" "spring-scheduling" - defaultTags() - } - } - } - } - cleanup: - context.close() - } - - def "schedule lambda test"() { - setup: - def context = new AnnotationConfigApplicationContext(LambdaTaskConfig, SchedulingConfig) - def configurer = context.getBean(LambdaTaskConfigurer) - - configurer.singleUseLatch.await(2000, TimeUnit.MILLISECONDS) - - expect: - def hasParent = legacyTracing() - assertTraces(hasParent ? 1 : 2) { - if (!hasParent) { - trace(1) { - basicSpan(it, "parent") - } - } - trace(hasParent ? 2 : 1) { - if (hasParent) { - basicSpan(it, "parent") - } - span { - resourceNameContains("LambdaTaskConfigurer\$\$Lambda") - operationName "scheduled.call" - hasParent ? childOfPrevious() : parent() - errored false - tags { - "$Tags.COMPONENT" "spring-scheduling" - defaultTags() - } - } - } - } - - cleanup: - context.close() - } -} - -class SpringSchedulingLegacyTracingForkedTest extends SpringSchedulingTest { - @Override - def legacyTracing() { - true - } -} - diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/AsyncErrorTask.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/AsyncErrorTask.java new file mode 100644 index 00000000000..4186081db0e --- /dev/null +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/AsyncErrorTask.java @@ -0,0 +1,12 @@ +import java.util.concurrent.CompletableFuture; +import org.springframework.scheduling.annotation.Async; + +public class AsyncErrorTask { + + public static final String ERROR_MESSAGE = "async boom"; + + @Async + public CompletableFuture asyncThrow() { + throw new IllegalStateException(ERROR_MESSAGE); + } +} diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/AsyncErrorTaskConfig.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/AsyncErrorTaskConfig.java new file mode 100644 index 00000000000..c33ed53a0e5 --- /dev/null +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/AsyncErrorTaskConfig.java @@ -0,0 +1,13 @@ +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; + +@Configuration +@EnableAsync +public class AsyncErrorTaskConfig { + + @Bean + AsyncErrorTask asyncErrorTask() { + return new AsyncErrorTask(); + } +} diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ScheduledErrorTask.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ScheduledErrorTask.java new file mode 100644 index 00000000000..51cf5f2fc17 --- /dev/null +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ScheduledErrorTask.java @@ -0,0 +1,24 @@ +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import org.springframework.scheduling.annotation.Scheduled; + +public class ScheduledErrorTask implements Runnable { + + public static final String ERROR_MESSAGE = "scheduled boom"; + + private final CountDownLatch latch = new CountDownLatch(1); + + @Scheduled(fixedRate = 5000) + @Override + public void run() { + try { + throw new IllegalStateException(ERROR_MESSAGE); + } finally { + latch.countDown(); + } + } + + public boolean blockUntilExecute() throws InterruptedException { + return latch.await(10, TimeUnit.SECONDS); + } +} diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ScheduledErrorTaskConfig.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ScheduledErrorTaskConfig.java new file mode 100644 index 00000000000..b9c8a2244db --- /dev/null +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ScheduledErrorTaskConfig.java @@ -0,0 +1,13 @@ +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; + +@Configuration +@EnableScheduling +public class ScheduledErrorTaskConfig { + + @Bean + public ScheduledErrorTask scheduledErrorTask() { + return new ScheduledErrorTask(); + } +} diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ShedlockTest.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ShedlockTest.java new file mode 100644 index 00000000000..f50c22d3a49 --- /dev/null +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ShedlockTest.java @@ -0,0 +1,32 @@ +import static org.junit.jupiter.api.Assertions.assertEquals; + +import datadog.trace.agent.test.AbstractInstrumentationTest; +import datadog.trace.test.util.Flaky; +import java.util.concurrent.TimeUnit; +import javax.sql.DataSource; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.jdbc.core.JdbcTemplate; + +class ShedlockTest extends AbstractInstrumentationTest { + + @Flaky("task.invocationCount() == 0") + @Test + void shouldNotDisableShedlock() throws InterruptedException { + AnnotationConfigApplicationContext context = + new AnnotationConfigApplicationContext(ShedlockConfig.class); + try { + JdbcTemplate jdbcTemplate = new JdbcTemplate(context.getBean(DataSource.class)); + jdbcTemplate.execute( + "CREATE TABLE shedlock(name VARCHAR(64) NOT NULL PRIMARY KEY, lock_until TIMESTAMP NOT NULL,\n" + + " locked_at TIMESTAMP NOT NULL, locked_by VARCHAR(255) NOT NULL);"); + ShedLockedTask task = context.getBean(ShedLockedTask.class); + + // lock is held for more than one second: wait, then verify the task ran exactly once + task.awaitInvocation(1000, TimeUnit.MILLISECONDS); + assertEquals(1, task.invocationCount()); + } finally { + context.close(); + } + } +} diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringAsyncErrorTest.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringAsyncErrorTest.java new file mode 100644 index 00000000000..01ef3b39c57 --- /dev/null +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringAsyncErrorTest.java @@ -0,0 +1,39 @@ +import static datadog.trace.agent.test.assertions.SpanMatcher.span; +import static datadog.trace.agent.test.assertions.TagsMatcher.defaultTags; +import static datadog.trace.agent.test.assertions.TagsMatcher.error; +import static datadog.trace.agent.test.assertions.TraceMatcher.trace; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import datadog.trace.agent.test.AbstractInstrumentationTest; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +/** + * Verifies that when an {@code @Async} method throws an exception, the span produced by the + * spring-scheduling instrumentation captures the error and the associated error tags. + */ +class SpringAsyncErrorTest extends AbstractInstrumentationTest { + + @Test + void asyncMethodErrorIsCaptured() { + AnnotationConfigApplicationContext context = + new AnnotationConfigApplicationContext(AsyncErrorTaskConfig.class); + try { + AsyncErrorTask asyncErrorTask = context.getBean(AsyncErrorTask.class); + + // The exception thrown inside the @Async method propagates back through the returned future. + assertThrows(Throwable.class, () -> asyncErrorTask.asyncThrow().join()); + + assertTraces( + trace( + span() + .resourceName(name -> "AsyncErrorTask.asyncThrow".contentEquals(name)) + .error(true) + .tags( + defaultTags(), + error(IllegalStateException.class, AsyncErrorTask.ERROR_MESSAGE)))); + } finally { + context.close(); + } + } +} diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringAsyncTest.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringAsyncTest.java new file mode 100644 index 00000000000..bb711f53ea3 --- /dev/null +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringAsyncTest.java @@ -0,0 +1,75 @@ +import static datadog.trace.agent.test.assertions.Matchers.validates; +import static datadog.trace.agent.test.assertions.SpanMatcher.span; +import static datadog.trace.agent.test.assertions.TagsMatcher.defaultTags; +import static datadog.trace.agent.test.assertions.TagsMatcher.tag; +import static datadog.trace.agent.test.assertions.TraceMatcher.SORT_BY_START_TIME; +import static datadog.trace.agent.test.assertions.TraceMatcher.trace; +import static datadog.trace.api.DDTags.THREAD_NAME; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; + +import datadog.trace.agent.test.AbstractInstrumentationTest; +import datadog.trace.agent.test.assertions.SpanMatcher; +import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.Tags; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +class SpringAsyncTest extends AbstractInstrumentationTest { + + @ParameterizedTest(name = "context propagated through @async annotation, hasParent={0}") + @ValueSource(booleans = {true, false}) + void contextPropagatedThroughAsyncAnnotation(boolean hasParent) { + AnnotationConfigApplicationContext context = + new AnnotationConfigApplicationContext(AsyncTaskConfig.class); + try { + AsyncTask asyncTask = context.getBean(AsyncTask.class); + if (hasParent) { + AgentSpan root = startSpan("test", "root"); + try (AgentScope scope = activateSpan(root)) { + asyncTask.async().join(); + } finally { + root.finish(); + } + assertTraces( + trace( + SORT_BY_START_TIME, + span().resourceName(name -> "root".contentEquals(name)).root(), + asyncSpan("AsyncTask.async").childOfPrevious(), + getIntSpan().childOfPrevious())); + } else { + asyncTask.async().join(); + assertTraces( + trace( + SORT_BY_START_TIME, + asyncSpan("AsyncTask.async").root(), + getIntSpan().childOfPrevious())); + } + } finally { + context.close(); + } + } + + private static SpanMatcher asyncSpan(String resourceName) { + return span() + .resourceName(name -> resourceName.contentEquals(name)) + .tags(defaultTags(), tag(THREAD_NAME, validates(SpringAsyncTest::isAsyncThread))); + } + + private static SpanMatcher getIntSpan() { + return span() + .resourceName(name -> "AsyncTask.getInt".contentEquals(name)) + .tags( + defaultTags(), + tag( + Tags.COMPONENT, + validates(component -> "trace".contentEquals((CharSequence) component))), + tag(THREAD_NAME, validates(SpringAsyncTest::isAsyncThread))); + } + + private static boolean isAsyncThread(Object threadName) { + return threadName != null && threadName.toString().startsWith("SimpleAsyncTaskExecutor"); + } +} diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringSchedulingErrorTest.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringSchedulingErrorTest.java new file mode 100644 index 00000000000..1118d5396d5 --- /dev/null +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringSchedulingErrorTest.java @@ -0,0 +1,43 @@ +import static datadog.trace.agent.test.assertions.Matchers.is; +import static datadog.trace.agent.test.assertions.SpanMatcher.span; +import static datadog.trace.agent.test.assertions.TagsMatcher.defaultTags; +import static datadog.trace.agent.test.assertions.TagsMatcher.error; +import static datadog.trace.agent.test.assertions.TagsMatcher.tag; +import static datadog.trace.agent.test.assertions.TraceMatcher.trace; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import datadog.trace.agent.test.AbstractInstrumentationTest; +import datadog.trace.bootstrap.instrumentation.api.Tags; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +/** + * Verifies that when a {@code @Scheduled} task throws an exception, the span produced by the + * spring-scheduling instrumentation captures the error and the associated error tags. + */ +class SpringSchedulingErrorTest extends AbstractInstrumentationTest { + + @Test + void scheduledTaskErrorIsCaptured() throws InterruptedException { + AnnotationConfigApplicationContext context = + new AnnotationConfigApplicationContext(ScheduledErrorTaskConfig.class); + try { + ScheduledErrorTask task = context.getBean(ScheduledErrorTask.class); + assertTrue(task.blockUntilExecute(), "scheduled task did not execute"); + // Stop the scheduler so the periodic task cannot fire a second time and produce extra traces. + context.close(); + + assertTraces( + trace( + span() + .resourceName(name -> "ScheduledErrorTask.run".contentEquals(name)) + .error(true) + .tags( + defaultTags(), + tag(Tags.COMPONENT, is("spring-scheduling")), + error(IllegalStateException.class, ScheduledErrorTask.ERROR_MESSAGE)))); + } finally { + context.close(); + } + } +} diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringSchedulingTest.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringSchedulingTest.java new file mode 100644 index 00000000000..4c97054df5b --- /dev/null +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/SpringSchedulingTest.java @@ -0,0 +1,109 @@ +import static datadog.trace.agent.test.assertions.Matchers.is; +import static datadog.trace.agent.test.assertions.SpanMatcher.span; +import static datadog.trace.agent.test.assertions.TagsMatcher.defaultTags; +import static datadog.trace.agent.test.assertions.TagsMatcher.tag; +import static datadog.trace.agent.test.assertions.TraceMatcher.SORT_BY_START_TIME; +import static datadog.trace.agent.test.assertions.TraceMatcher.trace; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import datadog.trace.agent.test.AbstractInstrumentationTest; +import datadog.trace.agent.test.assertions.SpanMatcher; +import datadog.trace.bootstrap.instrumentation.api.Tags; +import datadog.trace.junit.utils.config.WithConfig; +import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; +import java.util.regex.Pattern; +import org.junit.jupiter.api.Test; +import org.springframework.boot.actuate.scheduling.ScheduledTasksEndpoint; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +class SpringSchedulingTest extends AbstractInstrumentationTest { + + protected boolean legacyTracing() { + return false; + } + + @Test + void scheduleTriggerTestAccordingToCronExpression() throws InterruptedException { + AnnotationConfigApplicationContext context = + new AnnotationConfigApplicationContext(TriggerTaskConfig.class, SchedulingConfig.class); + TriggerTask task = context.getBean(TriggerTask.class); + ScheduledTasksEndpoint scheduledTaskEndpoint = context.getBean(ScheduledTasksEndpoint.class); + + task.blockUntilExecute(); + // Capture cron tasks before closing the context (endpoint is unavailable after close). + Object cronTasks = scheduledTaskEndpoint.scheduledTasks().getCron(); + // Close the context immediately after the first execution to prevent a second cron + // firing before assertions complete, which would produce extra traces and cause flakiness. + context.close(); + + assertNotNull(task); + assertScheduledTraces("TriggerTask.run"); + assertNotNull(scheduledTaskEndpoint); + assertNotNull(cronTasks); + } + + @Test + void scheduleIntervalTest() throws InterruptedException { + AnnotationConfigApplicationContext context = + new AnnotationConfigApplicationContext(IntervalTaskConfig.class, SchedulingConfig.class); + try { + IntervalTask task = context.getBean(IntervalTask.class); + task.blockUntilExecute(); + + assertNotNull(task); + assertScheduledTraces("IntervalTask.run"); + } finally { + context.close(); + } + } + + @Test + void scheduleLambdaTest() throws InterruptedException { + AnnotationConfigApplicationContext context = + new AnnotationConfigApplicationContext(LambdaTaskConfig.class, SchedulingConfig.class); + try { + LambdaTaskConfigurer configurer = context.getBean(LambdaTaskConfigurer.class); + configurer.singleUseLatch.await(2000, TimeUnit.MILLISECONDS); + + assertScheduledTraces(name -> name.toString().contains("LambdaTaskConfigurer$$Lambda")); + } finally { + context.close(); + } + } + + private void assertScheduledTraces(String resourceName) { + assertScheduledTraces(name -> resourceName.contentEquals(name)); + } + + private void assertScheduledTraces(Predicate resourceMatcher) { + boolean hasParent = legacyTracing(); + if (hasParent) { + assertTraces( + trace( + SORT_BY_START_TIME, parentSpan(), scheduledSpan(resourceMatcher).childOfPrevious())); + } else { + assertTraces(trace(parentSpan()), trace(scheduledSpan(resourceMatcher).root())); + } + } + + private static SpanMatcher parentSpan() { + return span().resourceName(name -> "parent".contentEquals(name)).tags(defaultTags()); + } + + private static SpanMatcher scheduledSpan(Predicate resourceMatcher) { + return span() + .resourceName(resourceMatcher) + .operationName(Pattern.compile(Pattern.quote("scheduled.call"))) + .error(false) + .tags(defaultTags(), tag(Tags.COMPONENT, is("spring-scheduling"))); + } +} + +@WithConfig(key = "spring-scheduling.legacy.tracing.enabled", value = "true") +class SpringSchedulingLegacyTracingForkedTest extends SpringSchedulingTest { + @Override + protected boolean legacyTracing() { + return true; + } +}