From 1e8ce7308c2aaf48322261535f6db2b15b3b4ef4 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Tue, 7 Oct 2025 22:24:18 +0200 Subject: [PATCH 1/5] fix: Kotlin plugin warning Build scripts use the `buildscript` way to configure the project's plugins, which is not recommended anymore since quite a few versions in gradle. ``` The Kotlin Gradle plugin was loaded multiple times in different subprojects, which is not supported and may break the build. This might happen in subprojects that apply the Kotlin plugins with the Gradle 'plugins { ... }' DSL if they specify explicit versions, even if the versions are equal. Please add the Kotlin plugin to the common parent project or the root project, then remove the versions in the subprojects. If the parent project does not need the plugin, add 'apply false' to the plugin line. See: https://docs.gradle.org/current/userguide/plugins.html#sec:subprojects_plugins_dsl The Kotlin plugin was loaded in the following projects: ':dd-java-agent:agent-ci-visibility', ':dd-java-agent:agent-llmobs' ``` --- .../agent-ci-visibility/build.gradle | 25 +------ dd-java-agent/agent-llmobs/build.gradle | 11 +-- dd-java-agent/instrumentation/build.gradle | 25 ------- .../junit/junit-4.10/build.gradle | 4 ++ .../kotlin-coroutines/build.gradle | 1 + gradle/spotless.gradle | 22 ++++-- gradle/spotless/spotless-kotlin.gradle | 12 ---- gradle/test-with-kotlin.gradle | 72 +++++++++---------- 8 files changed, 58 insertions(+), 114 deletions(-) delete mode 100644 gradle/spotless/spotless-kotlin.gradle diff --git a/dd-java-agent/agent-ci-visibility/build.gradle b/dd-java-agent/agent-ci-visibility/build.gradle index 15e0aa69845..9727bdd4bc6 100644 --- a/dd-java-agent/agent-ci-visibility/build.gradle +++ b/dd-java-agent/agent-ci-visibility/build.gradle @@ -1,31 +1,8 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -buildscript { - repositories { - mavenLocal() - if (project.rootProject.hasProperty("gradlePluginProxy")) { - maven { - url project.rootProject.property("gradlePluginProxy") - allowInsecureProtocol = true - } - } - if (project.rootProject.hasProperty("mavenRepositoryProxy")) { - maven { - url project.rootProject.property("mavenRepositoryProxy") - allowInsecureProtocol = true - } - } - gradlePluginPortal() - mavenCentral() - } - - dependencies { - classpath group: 'org.jetbrains.kotlin', name: 'kotlin-gradle-plugin', version: libs.versions.kotlin.get() - } -} - plugins { id 'com.gradleup.shadow' + id 'org.jetbrains.kotlin.jvm' version libs.versions.kotlin } apply from: "$rootDir/gradle/java.gradle" diff --git a/dd-java-agent/agent-llmobs/build.gradle b/dd-java-agent/agent-llmobs/build.gradle index 12faf86f135..d2ee0de7a73 100644 --- a/dd-java-agent/agent-llmobs/build.gradle +++ b/dd-java-agent/agent-llmobs/build.gradle @@ -1,17 +1,8 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -buildscript { - repositories { - mavenCentral() - } - - dependencies { - classpath group: 'org.jetbrains.kotlin', name: 'kotlin-gradle-plugin', version: libs.versions.kotlin.get() - } -} - plugins { id 'com.gradleup.shadow' + id 'org.jetbrains.kotlin.jvm' version libs.versions.kotlin } apply from: "$rootDir/gradle/java.gradle" diff --git a/dd-java-agent/instrumentation/build.gradle b/dd-java-agent/instrumentation/build.gradle index f9cba65eb2b..2c9bfa2cd87 100644 --- a/dd-java-agent/instrumentation/build.gradle +++ b/dd-java-agent/instrumentation/build.gradle @@ -1,30 +1,5 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -// this project will run in isolation under the agent's classloader -buildscript { - - repositories { - mavenLocal() - if (project.rootProject.hasProperty("gradlePluginProxy")) { - maven { - url project.rootProject.property("gradlePluginProxy") - allowInsecureProtocol = true - } - } - if (project.rootProject.hasProperty("mavenRepositoryProxy")) { - maven { - url project.rootProject.property("mavenRepositoryProxy") - allowInsecureProtocol = true - } - } - gradlePluginPortal() - mavenCentral() - } - - dependencies { - classpath group: 'org.jetbrains.kotlin', name: 'kotlin-gradle-plugin', version: libs.versions.kotlin.get() - } -} plugins { id 'com.gradleup.shadow' } diff --git a/dd-java-agent/instrumentation/junit/junit-4.10/build.gradle b/dd-java-agent/instrumentation/junit/junit-4.10/build.gradle index 53ca08ce9d4..0b44b8acb70 100644 --- a/dd-java-agent/instrumentation/junit/junit-4.10/build.gradle +++ b/dd-java-agent/instrumentation/junit/junit-4.10/build.gradle @@ -1,3 +1,7 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' version libs.versions.kotlin +} + apply from: "$rootDir/gradle/java.gradle" apply from: "$rootDir/gradle/test-with-kotlin.gradle" diff --git a/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle b/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle index 1a8fbbb2e1f..f65f20f5c62 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle +++ b/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java-test-fixtures' + id 'org.jetbrains.kotlin.jvm' version libs.versions.kotlin } muzzle { diff --git a/gradle/spotless.gradle b/gradle/spotless.gradle index 7dfc7126cc2..afaf6ff9283 100644 --- a/gradle/spotless.gradle +++ b/gradle/spotless.gradle @@ -6,14 +6,13 @@ def configPath = rootProject.hasProperty('sharedConfigDirectory') ? sharedConfig boolean groovySkipJavaExclude = project.hasProperty('groovySkipJavaExclude') ? groovySkipJavaExclude : false spotless { - if (rootProject.hasProperty('skipSpotless')) { // Spotless in JDK 8 uses an older eclipse formatter, and it has a (flaky) bug crashing check_profiling. // We disable it in CI, since we have a job dedicated to spotless anyway. enforceCheck false } - if (project.plugins.hasPlugin('java')) { + project.pluginManager.withPlugin('java') { java { toggleOffOn() // set explicit target to workaround https://github.com/diffplug/spotless/issues/1163 @@ -25,10 +24,11 @@ spotless { } } + def isRootProject = project == project.rootProject groovyGradle { toggleOffOn() // same as groovy, but for .gradle (defaults to '*.gradle') - if (project == project.rootProject) { + if (isRootProject) { // only do this for the root project since the instrumentation project has a subproject and directory named gradle // that will confuse task dependencies target '*.gradle', 'gradle/**/*.gradle' @@ -47,7 +47,7 @@ spotless { ktlint('0.41.0').userData(['indent_size': '2', 'continuation_indent_size': '2']) } - if (project.plugins.hasPlugin('groovy')) { + project.pluginManager.withPlugin('groovy') { groovy { toggleOffOn() if (!groovySkipJavaExclude) { @@ -59,7 +59,7 @@ spotless { } } - if (project.plugins.hasPlugin('scala')) { + project.pluginManager.withPlugin('scala') { scala { toggleOffOn() scalafmt('2.7.5').configFile(configPath + '/enforcement/spotless-scalafmt.conf') @@ -80,13 +80,21 @@ spotless { trimTrailingWhitespace() endWithNewline() } + + project.pluginManager.withPlugin('kotlin') { + kotlin { + toggleOffOn() + // ktfmt('0.40').kotlinlangStyle() // needs Java 11+ + // Newer versions do not work well with the older version of kotlin in this build + ktlint('0.41.0').userData(['indent_size': '2', 'continuation_indent_size': '2']) + } + } } -apply from: "$configPath/spotless/spotless-kotlin.gradle" tasks.register('formatCode') { dependsOn 'spotlessApply' } -check.configure { +tasks.named("check") { dependsOn 'spotlessCheck' } diff --git a/gradle/spotless/spotless-kotlin.gradle b/gradle/spotless/spotless-kotlin.gradle deleted file mode 100644 index 4a7715b6d09..00000000000 --- a/gradle/spotless/spotless-kotlin.gradle +++ /dev/null @@ -1,12 +0,0 @@ -apply plugin: 'com.diffplug.spotless' - -spotless { - if (project.plugins.hasPlugin('kotlin')) { - kotlin { - toggleOffOn() - // ktfmt('0.40').kotlinlangStyle() // needs Java 11+ - // Newer versions do not work well with the older version of kotlin in this build - ktlint('0.41.0').userData(['indent_size': '2', 'continuation_indent_size': '2']) - } - } -} diff --git a/gradle/test-with-kotlin.gradle b/gradle/test-with-kotlin.gradle index 133a9bd46a3..59fac492a3e 100644 --- a/gradle/test-with-kotlin.gradle +++ b/gradle/test-with-kotlin.gradle @@ -1,47 +1,47 @@ // Enable testing kotlin code in groovy spock tests. -apply plugin: 'kotlin' -apply from: "$rootDir/gradle/spotless/spotless-kotlin.gradle" - -tasks.named("compileTestGroovy", GroovyCompile) { - //Note: look like it should be `classpath += files(sourceSets.test.kotlin.classesDirectory)` - //instead, but kotlin plugin doesn't support it (yet?) - classpath += files(compileTestKotlin.destinationDirectory) -} +project.pluginManager.withPlugin('kotlin') { + tasks.named("compileTestGroovy", GroovyCompile) { + //Note: look like it should be `classpath += files(sourceSets.test.kotlin.classesDirectory)` + //instead, but kotlin plugin doesn't support it (yet?) + classpath += files(compileTestKotlin.destinationDirectory) + } -// Having Groovy, Kotlin and Java in the same project is a bit problematic -// this removes Kotlin from main source set to avoid compilation issues -sourceSets { - main { - kotlin { - srcDirs = [] - } - java { - srcDirs = ["src/main/java"] + // Having Groovy, Kotlin and Java in the same project is a bit problematic + // this removes Kotlin from main source set to avoid compilation issues + sourceSets { + main { + kotlin { + srcDirs = [] + } + java { + srcDirs = ["src/main/java"] + } } } -} -// this creates Kotlin dirs to make JavaCompile tasks work -def createKotlinDirs = tasks.register("createKotlinDirs") { - def dirsToCreate = ["classes/kotlin/main"] - doFirst { - dirsToCreate.forEach { - new File(project.buildDir, it).mkdirs() + // this creates Kotlin dirs to make JavaCompile tasks work + def createKotlinDirs = tasks.register("createKotlinDirs") { + def dirsToCreate = ["classes/kotlin/main"] + doFirst { + dirsToCreate.forEach { + new File(project.buildDir, it).mkdirs() + } } + + outputs.dirs( + dirsToCreate.collect { + project.layout.buildDirectory.dir(it) + } + ) } - outputs.dirs( - dirsToCreate.collect { - project.layout.buildDirectory.dir(it) - } - ) -} + tasks.withType(JavaCompile).configureEach { + inputs.files(createKotlinDirs) + } -tasks.withType(JavaCompile).configureEach { - inputs.files(createKotlinDirs) + dependencies { + // prevents Kotlin libs from being included into the tracer JAR + compileOnly libs.kotlin + } } -dependencies { - // prevents Kotlin libs from being included into the tracer JAR - compileOnly libs.kotlin -} From 4caa486be44366ca0d4dc24ff20ae053f393f678 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Wed, 8 Oct 2025 00:25:33 +0200 Subject: [PATCH 2/5] style: make scalafmt happy --- .../app/controllers/HomeController.scala | 8 +- .../src/akka23Test/scala/AkkaActors.scala | 29 +-- .../scala/AkkaHttpTestWebServer.scala | 216 +++++++++--------- .../scala/AkkaHttp102TestWebServer.scala | 16 +- .../test/scala/AkkaHttp102TestWebServer.scala | 16 +- .../test/scala/AkkaHttpTestWebServer.scala | 216 +++++++++--------- .../scala/FinatraController.scala | 77 ++++--- .../ResponseSettingExceptionMapper.scala | 2 +- .../src/test/scala/FinatraController.scala | 77 ++++--- .../ResponseSettingExceptionMapper.scala | 2 +- .../src/test/scala/PekkoActors.scala | 23 +- .../scala/PekkoHttpTestWebServer.scala | 49 ++-- .../PekkoHttpLatestDepTestWebServer.scala | 16 +- .../play23/test/server/AsyncServer.scala | 11 +- .../server/ControllerClosureAdapter.scala | 7 +- .../play23/test/server/SyncServer.scala | 20 +- .../scala/generator/CompileRoutes.scala | 10 +- .../play25/PlayController.scala | 28 ++- .../play25/PlayRoutersScala.scala | 73 +++--- .../trace/instrumentation/play25/Util.scala | 9 +- .../latestdep/ImplicitConversions.scala | 5 +- .../server/latestdep/PlayController.scala | 33 ++- .../server/latestdep/PlayRoutersScala.scala | 84 ++++--- .../scala/generator/CompileRoutes.scala | 10 +- .../scala/ScalaConcurrentTests.scala | 52 +++-- .../src/test/scala/ScalaConcurrentTests.scala | 52 +++-- .../foo/bar/TestScalaStringBuilderSuite.scala | 7 +- .../test/scala/foo/bar/TestSourceSuite.scala | 6 +- .../org/example/TestIgnoredPending.scala | 2 +- .../org/example/TestSucceedFlatSpec.scala | 2 +- .../slick/src/test/scala/SlickUtils.scala | 5 +- .../weaver/WeaverIntegrationTestRunner.scala | 14 +- .../example/TestSucceedGlobalResource.scala | 11 +- .../src/test/scala/ZioTestFixtures.scala | 18 +- 34 files changed, 677 insertions(+), 529 deletions(-) diff --git a/dd-java-agent/benchmark-integration/play-perftest/app/controllers/HomeController.scala b/dd-java-agent/benchmark-integration/play-perftest/app/controllers/HomeController.scala index 07bff5b1e2d..7359ce48ec3 100644 --- a/dd-java-agent/benchmark-integration/play-perftest/app/controllers/HomeController.scala +++ b/dd-java-agent/benchmark-integration/play-perftest/app/controllers/HomeController.scala @@ -7,14 +7,12 @@ import javax.inject.Inject import play.api.mvc._ -/** - * This controller creates an `Action` to handle HTTP requests to the +/** This controller creates an `Action` to handle HTTP requests to the * application's work page which does busy wait to simulate some work */ -class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc) { +class HomeController @Inject() (cc: ControllerComponents) extends AbstractController(cc) { - /** - * Create an Action to perform busy wait + /** Create an Action to perform busy wait */ def doGet(workTimeMS: Option[Long], error: Option[String]) = Action { implicit request: Request[AnyContent] => diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/akka23Test/scala/AkkaActors.scala b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/akka23Test/scala/AkkaActors.scala index 5ca469ec5ad..c34972a1663 100644 --- a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/akka23Test/scala/AkkaActors.scala +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/akka23Test/scala/AkkaActors.scala @@ -78,24 +78,27 @@ class AkkaActors extends AutoCloseable { object AkkaActors { // If we can't load the Version class, then assume 2.3 - val isAkka23: Boolean = try { - Class.forName("akka.Version") - false - } catch { - case _: Throwable => true - } + val isAkka23: Boolean = + try { + Class.forName("akka.Version") + false + } catch { + case _: Throwable => true + } // The way to terminate an actor system has changed between versions val terminate: (ActorSystem) => Unit = { - val t = try { - ActorSystem.getClass.getMethod("terminate") - } catch { - case _: Throwable => try { - ActorSystem.getClass.getMethod("awaitTermination") + val t = + try { + ActorSystem.getClass.getMethod("terminate") } catch { - case _: Throwable => null + case _: Throwable => + try { + ActorSystem.getClass.getMethod("awaitTermination") + } catch { + case _: Throwable => null + } } - } if (t ne null) { { system: ActorSystem => t.invoke(system) diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/baseTest/scala/AkkaHttpTestWebServer.scala b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/baseTest/scala/AkkaHttpTestWebServer.scala index af0bc91b428..c69197df2a3 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/baseTest/scala/AkkaHttpTestWebServer.scala +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/baseTest/scala/AkkaHttpTestWebServer.scala @@ -14,7 +14,12 @@ import akka.http.scaladsl.server._ import akka.http.scaladsl.settings.ServerSettings import akka.http.scaladsl.unmarshalling.PredefinedFromEntityUnmarshallers.defaultUrlEncodedFormDataUnmarshaller import akka.http.scaladsl.unmarshalling.Unmarshaller.messageUnmarshallerFromEntityUnmarshaller -import akka.http.scaladsl.unmarshalling.{FromEntityUnmarshaller, MultipartUnmarshallers, Unmarshal, Unmarshaller} +import akka.http.scaladsl.unmarshalling.{ + FromEntityUnmarshaller, + MultipartUnmarshallers, + Unmarshal, + Unmarshaller +} import akka.http.scaladsl.util.FastFuture.EnhancedFuture import akka.http.scaladsl.{Http, model} import akka.stream.{ActorMaterializer, Materializer} @@ -42,7 +47,7 @@ class AkkaHttpTestWebServer(binder: Binder) extends HttpServer { case Some(config) => ActorSystem(name, config) } } - implicit val materializer: ActorMaterializer = ActorMaterializer() + implicit val materializer: ActorMaterializer = ActorMaterializer() private var port: Int = 0 private var portBinding: Future[ServerBinding] = _ @@ -70,18 +75,18 @@ object AkkaHttpTestWebServer { def config: Option[Config] = None - def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] } val BindAndHandle: Binder = new Binder { override def name: String = "bind-and-handle" - override def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + override def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext Http().bindAndHandle(route, "localhost", port) @@ -92,14 +97,15 @@ object AkkaHttpTestWebServer { override def name: String = "bind-and-handle-async-with-route-async-handler" override def config: Option[Config] = Some( - ConfigFactory.load() + ConfigFactory + .load() .withValue("akka.http.server.request-timeout", ConfigValueFactory.fromAnyRef("300 s")) .withValue("akka.http.server.idle-timeout", ConfigValueFactory.fromAnyRef("300 s")) ) - override def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + override def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext Http().bindAndHandleAsync(Route.asyncHandler(route), "localhost", port) @@ -109,9 +115,9 @@ object AkkaHttpTestWebServer { val BindAndHandleSync: Binder = new Binder { override def name: String = "bind-and-handle-sync" - override def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + override def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] = { Http().bindAndHandleSync(syncHandler, "localhost", port) } @@ -120,9 +126,9 @@ object AkkaHttpTestWebServer { val BindAndHandleAsync: Binder = new Binder { override def name: String = "bind-and-handle-async" - override def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + override def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext Http().bindAndHandleAsync(asyncHandler, "localhost", port) @@ -132,9 +138,9 @@ object AkkaHttpTestWebServer { val BindAndHandleAsyncHttp2: Binder = new Binder { override def name: String = "bind-and-handle-async-http2" - override def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + override def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext val serverSettings = enableHttp2(ServerSettings(system)) @@ -150,7 +156,7 @@ object AkkaHttpTestWebServer { // This part defines the routes using the Scala routing DSL // ---------------------------------------------------------------------- // private val exceptionHandler = ExceptionHandler { - case e : Exception if !e.isInstanceOf[BlockingException] => + case e: Exception if !e.isInstanceOf[BlockingException] => val span = activeSpan() TraceUtils.handleException(span, e) complete( @@ -188,11 +194,12 @@ object AkkaHttpTestWebServer { // force a rejection due to BlockingException to throw so that the error // can be recorded in the span - private val blockingRejectionHandler: RejectionHandler = RejectionHandler.newBuilder() - .handle({ - case MalformedRequestContentRejection(_, cause: BlockingException) => - throw cause - }).result() + private val blockingRejectionHandler: RejectionHandler = RejectionHandler + .newBuilder() + .handle({ case MalformedRequestContentRejection(_, cause: BlockingException) => + throw cause + }) + .result() def route(implicit ec: ExecutionContext): Route = withController { handleRejections(blockingRejectionHandler) { @@ -272,7 +279,9 @@ object AkkaHttpTestWebServer { path(BODY_JSON.relativePath()) { parameter(Symbol("variant") ?) { case Some("spray") => - entity(Unmarshaller.messageUnmarshallerFromEntityUnmarshaller(sprayMapUnmarshaller)) { m => + entity( + Unmarshaller.messageUnmarshallerFromEntityUnmarshaller(sprayMapUnmarshaller) + ) { m => complete( HttpResponse( status = BODY_JSON.getStatus, @@ -281,7 +290,9 @@ object AkkaHttpTestWebServer { ) } case _ => // jackson - entity(Unmarshaller.messageUnmarshallerFromEntityUnmarshaller(jacksonMapUnmarshaller)) { m => + entity( + Unmarshaller.messageUnmarshallerFromEntityUnmarshaller(jacksonMapUnmarshaller) + ) { m => complete( HttpResponse( status = BODY_JSON.getStatus, @@ -298,9 +309,7 @@ object AkkaHttpTestWebServer { val m = formData.strictParts .groupBy(_.name) .mapValues( - _.map((bp: BodyPart.Strict) => - bp.entity.data.utf8String - ).toList + _.map((bp: BodyPart.Strict) => bp.entity.data.utf8String).toList ) complete( HttpResponse( @@ -328,60 +337,59 @@ object AkkaHttpTestWebServer { // This part defines the sync and async handler functions // ---------------------------------------------------------------------- // - val syncHandler: HttpRequest => HttpResponse = { - case HttpRequest(GET, uri: Uri, _, _, _) => - val path = uri.path.toString() - val endpoint = HttpServerTest.ServerEndpoint.forPath(path) - HttpServerTest - .controller( - endpoint, - new Closure[HttpResponse](()) { - def doCall(): HttpResponse = { - val resp = HttpResponse(status = endpoint.getStatus) - endpoint match { - case SUCCESS => resp.withEntity(endpoint.getBody) - case FORWARDED => resp.withEntity(endpoint.getBody) // cheating - case QUERY_PARAM | QUERY_ENCODED_BOTH | QUERY_ENCODED_QUERY => - resp.withEntity(uri.queryString().orNull) - case REDIRECT => - resp.withHeaders(headers.Location(endpoint.getBody)) - case ERROR => resp.withEntity(endpoint.getBody) - case EXCEPTION => throw new Exception(endpoint.getBody) - case USER_BLOCK => { - Blocking.forUser("user-to-block").blockIfMatch() - // should never be output: - resp.withEntity("should never be reached") - } - case _ => - if (path.startsWith("/injected-id/")) { - val groups = path.split('/') - if (groups.length == 4) { // The path starts with a / and has 3 segments - val traceId = AgentTracer.activeSpan().getTraceId - val id = groups(3).toInt - groups(2) match { - case "ping" => - return HttpResponse(entity = s"pong $id -> $traceId") - case "fing" => - return HttpResponse(entity = s"fong $id -> $traceId") - case _ => - } + val syncHandler: HttpRequest => HttpResponse = { case HttpRequest(GET, uri: Uri, _, _, _) => + val path = uri.path.toString() + val endpoint = HttpServerTest.ServerEndpoint.forPath(path) + HttpServerTest + .controller( + endpoint, + new Closure[HttpResponse](()) { + def doCall(): HttpResponse = { + val resp = HttpResponse(status = endpoint.getStatus) + endpoint match { + case SUCCESS => resp.withEntity(endpoint.getBody) + case FORWARDED => resp.withEntity(endpoint.getBody) // cheating + case QUERY_PARAM | QUERY_ENCODED_BOTH | QUERY_ENCODED_QUERY => + resp.withEntity(uri.queryString().orNull) + case REDIRECT => + resp.withHeaders(headers.Location(endpoint.getBody)) + case ERROR => resp.withEntity(endpoint.getBody) + case EXCEPTION => throw new Exception(endpoint.getBody) + case USER_BLOCK => { + Blocking.forUser("user-to-block").blockIfMatch() + // should never be output: + resp.withEntity("should never be reached") + } + case _ => + if (path.startsWith("/injected-id/")) { + val groups = path.split('/') + if (groups.length == 4) { // The path starts with a / and has 3 segments + val traceId = AgentTracer.activeSpan().getTraceId + val id = groups(3).toInt + groups(2) match { + case "ping" => + return HttpResponse(entity = s"pong $id -> $traceId") + case "fing" => + return HttpResponse(entity = s"fong $id -> $traceId") + case _ => } } - HttpResponse(status = NOT_FOUND.getStatus) - .withEntity(NOT_FOUND.getBody) - } + } + HttpResponse(status = NOT_FOUND.getStatus) + .withEntity(NOT_FOUND.getBody) } } - ) - .withDefaultHeaders(defaultHeader) + } + ) + .withDefaultHeaders(defaultHeader) } - def asyncHandler( - implicit ec: ExecutionContext, + def asyncHandler(implicit + ec: ExecutionContext, mat: Materializer ): HttpRequest => Future[HttpResponse] = { - case request@HttpRequest(POST, uri, _, entity, _) => - val path = request.uri.path.toString + case request @ HttpRequest(POST, uri, _, entity, _) => + val path = request.uri.path.toString val endpoint = HttpServerTest.ServerEndpoint.forPath(path) endpoint match { @@ -399,7 +407,7 @@ object AkkaHttpTestWebServer { .withEntity(s.toStringAsGroovy) } case _ => - val fd = Unmarshal(entity).to[Multipart.FormData] + val fd = Unmarshal(entity).to[Multipart.FormData] val eventualStrict = fd.flatMap(_.toStrict(500 millis)) eventualStrict.map { s => HttpResponse(status = BODY_MULTIPART.getStatus) @@ -415,7 +423,7 @@ object AkkaHttpTestWebServer { case BODY_JSON => val unmarshaller = uri.query().get("variant") match { case Some("spray") => sprayMapUnmarshaller - case _ => jacksonMapUnmarshaller + case _ => jacksonMapUnmarshaller } val eventualData = Unmarshal(entity).to[Map[String, String]](unmarshaller, ec, mat) eventualData.map { d => @@ -424,9 +432,10 @@ object AkkaHttpTestWebServer { } case _ => Future.successful(HttpResponse(404)) } - case request => Future { - syncHandler(request) - } + case request => + Future { + syncHandler(request) + } } def enableHttp2(serverSettings: ServerSettings): ServerSettings = { @@ -437,8 +446,9 @@ object AkkaHttpTestWebServer { implicit class MapExtensions[A](m: Iterable[(String, A)]) { def toStringAsGroovy: String = { - def valueToString(value: Object) : String = value match { - case seq: Seq[_] => seq.map(x => valueToString(x.asInstanceOf[Object])).mkString("[", ",", "]") + def valueToString(value: Object): String = value match { + case seq: Seq[_] => + seq.map(x => valueToString(x.asInstanceOf[Object])).mkString("[", ",", "]") case other => other.toString } @@ -452,48 +462,48 @@ object AkkaHttpTestWebServer { strict.strictParts .groupBy(_.name) .mapValues( - _.map((bp: BodyPart.Strict) => - bp.entity.data.utf8String - ).toList - ).toStringAsGroovy + _.map((bp: BodyPart.Strict) => bp.entity.data.utf8String).toList + ) + .toStringAsGroovy } implicit class FormDataExtensions(formData: model.FormData) { def toStringAsGroovy: String = formData.fields.toMultiMap.toStringAsGroovy } - implicit def strictMultipartFormDataUnmarshaller: FromEntityUnmarshaller[Multipart.FormData.Strict] = { + implicit def strictMultipartFormDataUnmarshaller + : FromEntityUnmarshaller[Multipart.FormData.Strict] = { val toStrictUnmarshaller = Unmarshaller.withMaterializer[HttpEntity, HttpEntity.Strict] { - implicit ec => - implicit mat => - entity => - entity.toStrict(1000.millis) + implicit ec => implicit mat => entity => + entity.toStrict(1000.millis) } val toFormDataUnmarshaller = MultipartUnmarshallers.multipartFormDataUnmarshaller val downcastUnmarshaller = Unmarshaller.strict[Multipart.FormData, Multipart.FormData.Strict] { case strict: Multipart.FormData.Strict => strict - case _ => throw new RuntimeException("Expected Strict form data at this point") + case _ => throw new RuntimeException("Expected Strict form data at this point") } toStrictUnmarshaller.andThen(toFormDataUnmarshaller).andThen(downcastUnmarshaller) } - val jacksonMapUnmarshaller: FromEntityUnmarshaller[Map[String,String]] = { - Jackson.unmarshaller(classOf[java.util.Map[String, String]]).asScala.map( - javaMap => { + val jacksonMapUnmarshaller: FromEntityUnmarshaller[Map[String, String]] = { + Jackson + .unmarshaller(classOf[java.util.Map[String, String]]) + .asScala + .map(javaMap => { import scala.collection.JavaConverters._ javaMap.asScala.toMap - } - ) + }) } object SprayMapFormat extends RootJsonFormat[Map[String, String]] { def write(map: Map[String, String]): JsObject = JsObject(map.mapValues(JsString(_)).toMap) def read(value: JsValue): Map[String, String] = value match { - case JsObject(fields) => fields.collect { - case (k, JsString(v)) => k -> v - } + case JsObject(fields) => + fields.collect { case (k, JsString(v)) => + k -> v + } case _ => deserializationError("Expected a JSON object") } } diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/latestDepTest/scala/AkkaHttp102TestWebServer.scala b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/latestDepTest/scala/AkkaHttp102TestWebServer.scala index da4f15e839d..1e912e7b293 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/latestDepTest/scala/AkkaHttp102TestWebServer.scala +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/latestDepTest/scala/AkkaHttp102TestWebServer.scala @@ -10,8 +10,8 @@ import scala.concurrent.Future object AkkaHttp102TestWebServer { val ServerBuilderBindFlow: Binder = new Binder { override def name: String = "server-builder-bind-flow" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -24,8 +24,8 @@ object AkkaHttp102TestWebServer { val ServerBuilderBind: Binder = new Binder { override def name: String = "server-builder-bind" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -38,8 +38,8 @@ object AkkaHttp102TestWebServer { val ServerBuilderBindSync: Binder = new Binder { override def name: String = "server-builder-bind-sync" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -52,8 +52,8 @@ object AkkaHttp102TestWebServer { val ServerBuilderBindHttp2: Binder = new Binder { override def name: String = "server-builder-bind-http2" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.6/src/test/scala/AkkaHttp102TestWebServer.scala b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.6/src/test/scala/AkkaHttp102TestWebServer.scala index da4f15e839d..1e912e7b293 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.6/src/test/scala/AkkaHttp102TestWebServer.scala +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.6/src/test/scala/AkkaHttp102TestWebServer.scala @@ -10,8 +10,8 @@ import scala.concurrent.Future object AkkaHttp102TestWebServer { val ServerBuilderBindFlow: Binder = new Binder { override def name: String = "server-builder-bind-flow" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -24,8 +24,8 @@ object AkkaHttp102TestWebServer { val ServerBuilderBind: Binder = new Binder { override def name: String = "server-builder-bind" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -38,8 +38,8 @@ object AkkaHttp102TestWebServer { val ServerBuilderBindSync: Binder = new Binder { override def name: String = "server-builder-bind-sync" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -52,8 +52,8 @@ object AkkaHttp102TestWebServer { val ServerBuilderBindHttp2: Binder = new Binder { override def name: String = "server-builder-bind-http2" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.6/src/test/scala/AkkaHttpTestWebServer.scala b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.6/src/test/scala/AkkaHttpTestWebServer.scala index af0bc91b428..c69197df2a3 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.6/src/test/scala/AkkaHttpTestWebServer.scala +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.6/src/test/scala/AkkaHttpTestWebServer.scala @@ -14,7 +14,12 @@ import akka.http.scaladsl.server._ import akka.http.scaladsl.settings.ServerSettings import akka.http.scaladsl.unmarshalling.PredefinedFromEntityUnmarshallers.defaultUrlEncodedFormDataUnmarshaller import akka.http.scaladsl.unmarshalling.Unmarshaller.messageUnmarshallerFromEntityUnmarshaller -import akka.http.scaladsl.unmarshalling.{FromEntityUnmarshaller, MultipartUnmarshallers, Unmarshal, Unmarshaller} +import akka.http.scaladsl.unmarshalling.{ + FromEntityUnmarshaller, + MultipartUnmarshallers, + Unmarshal, + Unmarshaller +} import akka.http.scaladsl.util.FastFuture.EnhancedFuture import akka.http.scaladsl.{Http, model} import akka.stream.{ActorMaterializer, Materializer} @@ -42,7 +47,7 @@ class AkkaHttpTestWebServer(binder: Binder) extends HttpServer { case Some(config) => ActorSystem(name, config) } } - implicit val materializer: ActorMaterializer = ActorMaterializer() + implicit val materializer: ActorMaterializer = ActorMaterializer() private var port: Int = 0 private var portBinding: Future[ServerBinding] = _ @@ -70,18 +75,18 @@ object AkkaHttpTestWebServer { def config: Option[Config] = None - def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] } val BindAndHandle: Binder = new Binder { override def name: String = "bind-and-handle" - override def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + override def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext Http().bindAndHandle(route, "localhost", port) @@ -92,14 +97,15 @@ object AkkaHttpTestWebServer { override def name: String = "bind-and-handle-async-with-route-async-handler" override def config: Option[Config] = Some( - ConfigFactory.load() + ConfigFactory + .load() .withValue("akka.http.server.request-timeout", ConfigValueFactory.fromAnyRef("300 s")) .withValue("akka.http.server.idle-timeout", ConfigValueFactory.fromAnyRef("300 s")) ) - override def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + override def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext Http().bindAndHandleAsync(Route.asyncHandler(route), "localhost", port) @@ -109,9 +115,9 @@ object AkkaHttpTestWebServer { val BindAndHandleSync: Binder = new Binder { override def name: String = "bind-and-handle-sync" - override def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + override def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] = { Http().bindAndHandleSync(syncHandler, "localhost", port) } @@ -120,9 +126,9 @@ object AkkaHttpTestWebServer { val BindAndHandleAsync: Binder = new Binder { override def name: String = "bind-and-handle-async" - override def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + override def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext Http().bindAndHandleAsync(asyncHandler, "localhost", port) @@ -132,9 +138,9 @@ object AkkaHttpTestWebServer { val BindAndHandleAsyncHttp2: Binder = new Binder { override def name: String = "bind-and-handle-async-http2" - override def bind(port: Int)( - implicit system: ActorSystem, - materializer: Materializer + override def bind(port: Int)(implicit + system: ActorSystem, + materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext val serverSettings = enableHttp2(ServerSettings(system)) @@ -150,7 +156,7 @@ object AkkaHttpTestWebServer { // This part defines the routes using the Scala routing DSL // ---------------------------------------------------------------------- // private val exceptionHandler = ExceptionHandler { - case e : Exception if !e.isInstanceOf[BlockingException] => + case e: Exception if !e.isInstanceOf[BlockingException] => val span = activeSpan() TraceUtils.handleException(span, e) complete( @@ -188,11 +194,12 @@ object AkkaHttpTestWebServer { // force a rejection due to BlockingException to throw so that the error // can be recorded in the span - private val blockingRejectionHandler: RejectionHandler = RejectionHandler.newBuilder() - .handle({ - case MalformedRequestContentRejection(_, cause: BlockingException) => - throw cause - }).result() + private val blockingRejectionHandler: RejectionHandler = RejectionHandler + .newBuilder() + .handle({ case MalformedRequestContentRejection(_, cause: BlockingException) => + throw cause + }) + .result() def route(implicit ec: ExecutionContext): Route = withController { handleRejections(blockingRejectionHandler) { @@ -272,7 +279,9 @@ object AkkaHttpTestWebServer { path(BODY_JSON.relativePath()) { parameter(Symbol("variant") ?) { case Some("spray") => - entity(Unmarshaller.messageUnmarshallerFromEntityUnmarshaller(sprayMapUnmarshaller)) { m => + entity( + Unmarshaller.messageUnmarshallerFromEntityUnmarshaller(sprayMapUnmarshaller) + ) { m => complete( HttpResponse( status = BODY_JSON.getStatus, @@ -281,7 +290,9 @@ object AkkaHttpTestWebServer { ) } case _ => // jackson - entity(Unmarshaller.messageUnmarshallerFromEntityUnmarshaller(jacksonMapUnmarshaller)) { m => + entity( + Unmarshaller.messageUnmarshallerFromEntityUnmarshaller(jacksonMapUnmarshaller) + ) { m => complete( HttpResponse( status = BODY_JSON.getStatus, @@ -298,9 +309,7 @@ object AkkaHttpTestWebServer { val m = formData.strictParts .groupBy(_.name) .mapValues( - _.map((bp: BodyPart.Strict) => - bp.entity.data.utf8String - ).toList + _.map((bp: BodyPart.Strict) => bp.entity.data.utf8String).toList ) complete( HttpResponse( @@ -328,60 +337,59 @@ object AkkaHttpTestWebServer { // This part defines the sync and async handler functions // ---------------------------------------------------------------------- // - val syncHandler: HttpRequest => HttpResponse = { - case HttpRequest(GET, uri: Uri, _, _, _) => - val path = uri.path.toString() - val endpoint = HttpServerTest.ServerEndpoint.forPath(path) - HttpServerTest - .controller( - endpoint, - new Closure[HttpResponse](()) { - def doCall(): HttpResponse = { - val resp = HttpResponse(status = endpoint.getStatus) - endpoint match { - case SUCCESS => resp.withEntity(endpoint.getBody) - case FORWARDED => resp.withEntity(endpoint.getBody) // cheating - case QUERY_PARAM | QUERY_ENCODED_BOTH | QUERY_ENCODED_QUERY => - resp.withEntity(uri.queryString().orNull) - case REDIRECT => - resp.withHeaders(headers.Location(endpoint.getBody)) - case ERROR => resp.withEntity(endpoint.getBody) - case EXCEPTION => throw new Exception(endpoint.getBody) - case USER_BLOCK => { - Blocking.forUser("user-to-block").blockIfMatch() - // should never be output: - resp.withEntity("should never be reached") - } - case _ => - if (path.startsWith("/injected-id/")) { - val groups = path.split('/') - if (groups.length == 4) { // The path starts with a / and has 3 segments - val traceId = AgentTracer.activeSpan().getTraceId - val id = groups(3).toInt - groups(2) match { - case "ping" => - return HttpResponse(entity = s"pong $id -> $traceId") - case "fing" => - return HttpResponse(entity = s"fong $id -> $traceId") - case _ => - } + val syncHandler: HttpRequest => HttpResponse = { case HttpRequest(GET, uri: Uri, _, _, _) => + val path = uri.path.toString() + val endpoint = HttpServerTest.ServerEndpoint.forPath(path) + HttpServerTest + .controller( + endpoint, + new Closure[HttpResponse](()) { + def doCall(): HttpResponse = { + val resp = HttpResponse(status = endpoint.getStatus) + endpoint match { + case SUCCESS => resp.withEntity(endpoint.getBody) + case FORWARDED => resp.withEntity(endpoint.getBody) // cheating + case QUERY_PARAM | QUERY_ENCODED_BOTH | QUERY_ENCODED_QUERY => + resp.withEntity(uri.queryString().orNull) + case REDIRECT => + resp.withHeaders(headers.Location(endpoint.getBody)) + case ERROR => resp.withEntity(endpoint.getBody) + case EXCEPTION => throw new Exception(endpoint.getBody) + case USER_BLOCK => { + Blocking.forUser("user-to-block").blockIfMatch() + // should never be output: + resp.withEntity("should never be reached") + } + case _ => + if (path.startsWith("/injected-id/")) { + val groups = path.split('/') + if (groups.length == 4) { // The path starts with a / and has 3 segments + val traceId = AgentTracer.activeSpan().getTraceId + val id = groups(3).toInt + groups(2) match { + case "ping" => + return HttpResponse(entity = s"pong $id -> $traceId") + case "fing" => + return HttpResponse(entity = s"fong $id -> $traceId") + case _ => } } - HttpResponse(status = NOT_FOUND.getStatus) - .withEntity(NOT_FOUND.getBody) - } + } + HttpResponse(status = NOT_FOUND.getStatus) + .withEntity(NOT_FOUND.getBody) } } - ) - .withDefaultHeaders(defaultHeader) + } + ) + .withDefaultHeaders(defaultHeader) } - def asyncHandler( - implicit ec: ExecutionContext, + def asyncHandler(implicit + ec: ExecutionContext, mat: Materializer ): HttpRequest => Future[HttpResponse] = { - case request@HttpRequest(POST, uri, _, entity, _) => - val path = request.uri.path.toString + case request @ HttpRequest(POST, uri, _, entity, _) => + val path = request.uri.path.toString val endpoint = HttpServerTest.ServerEndpoint.forPath(path) endpoint match { @@ -399,7 +407,7 @@ object AkkaHttpTestWebServer { .withEntity(s.toStringAsGroovy) } case _ => - val fd = Unmarshal(entity).to[Multipart.FormData] + val fd = Unmarshal(entity).to[Multipart.FormData] val eventualStrict = fd.flatMap(_.toStrict(500 millis)) eventualStrict.map { s => HttpResponse(status = BODY_MULTIPART.getStatus) @@ -415,7 +423,7 @@ object AkkaHttpTestWebServer { case BODY_JSON => val unmarshaller = uri.query().get("variant") match { case Some("spray") => sprayMapUnmarshaller - case _ => jacksonMapUnmarshaller + case _ => jacksonMapUnmarshaller } val eventualData = Unmarshal(entity).to[Map[String, String]](unmarshaller, ec, mat) eventualData.map { d => @@ -424,9 +432,10 @@ object AkkaHttpTestWebServer { } case _ => Future.successful(HttpResponse(404)) } - case request => Future { - syncHandler(request) - } + case request => + Future { + syncHandler(request) + } } def enableHttp2(serverSettings: ServerSettings): ServerSettings = { @@ -437,8 +446,9 @@ object AkkaHttpTestWebServer { implicit class MapExtensions[A](m: Iterable[(String, A)]) { def toStringAsGroovy: String = { - def valueToString(value: Object) : String = value match { - case seq: Seq[_] => seq.map(x => valueToString(x.asInstanceOf[Object])).mkString("[", ",", "]") + def valueToString(value: Object): String = value match { + case seq: Seq[_] => + seq.map(x => valueToString(x.asInstanceOf[Object])).mkString("[", ",", "]") case other => other.toString } @@ -452,48 +462,48 @@ object AkkaHttpTestWebServer { strict.strictParts .groupBy(_.name) .mapValues( - _.map((bp: BodyPart.Strict) => - bp.entity.data.utf8String - ).toList - ).toStringAsGroovy + _.map((bp: BodyPart.Strict) => bp.entity.data.utf8String).toList + ) + .toStringAsGroovy } implicit class FormDataExtensions(formData: model.FormData) { def toStringAsGroovy: String = formData.fields.toMultiMap.toStringAsGroovy } - implicit def strictMultipartFormDataUnmarshaller: FromEntityUnmarshaller[Multipart.FormData.Strict] = { + implicit def strictMultipartFormDataUnmarshaller + : FromEntityUnmarshaller[Multipart.FormData.Strict] = { val toStrictUnmarshaller = Unmarshaller.withMaterializer[HttpEntity, HttpEntity.Strict] { - implicit ec => - implicit mat => - entity => - entity.toStrict(1000.millis) + implicit ec => implicit mat => entity => + entity.toStrict(1000.millis) } val toFormDataUnmarshaller = MultipartUnmarshallers.multipartFormDataUnmarshaller val downcastUnmarshaller = Unmarshaller.strict[Multipart.FormData, Multipart.FormData.Strict] { case strict: Multipart.FormData.Strict => strict - case _ => throw new RuntimeException("Expected Strict form data at this point") + case _ => throw new RuntimeException("Expected Strict form data at this point") } toStrictUnmarshaller.andThen(toFormDataUnmarshaller).andThen(downcastUnmarshaller) } - val jacksonMapUnmarshaller: FromEntityUnmarshaller[Map[String,String]] = { - Jackson.unmarshaller(classOf[java.util.Map[String, String]]).asScala.map( - javaMap => { + val jacksonMapUnmarshaller: FromEntityUnmarshaller[Map[String, String]] = { + Jackson + .unmarshaller(classOf[java.util.Map[String, String]]) + .asScala + .map(javaMap => { import scala.collection.JavaConverters._ javaMap.asScala.toMap - } - ) + }) } object SprayMapFormat extends RootJsonFormat[Map[String, String]] { def write(map: Map[String, String]): JsObject = JsObject(map.mapValues(JsString(_)).toMap) def read(value: JsValue): Map[String, String] = value match { - case JsObject(fields) => fields.collect { - case (k, JsString(v)) => k -> v - } + case JsObject(fields) => + fields.collect { case (k, JsString(v)) => + k -> v + } case _ => deserializationError("Expected a JSON object") } } diff --git a/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/scala/FinatraController.scala b/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/scala/FinatraController.scala index 7dc39908e77..4fc399d005c 100644 --- a/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/scala/FinatraController.scala +++ b/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/scala/FinatraController.scala @@ -8,43 +8,58 @@ import groovy.lang.Closure class FinatraController extends Controller { any(SUCCESS.getPath) { request: Request => - controller(SUCCESS, new Closure[Response](null) { - override def call(): Response = { - response.ok(SUCCESS.getBody) + controller( + SUCCESS, + new Closure[Response](null) { + override def call(): Response = { + response.ok(SUCCESS.getBody) + } } - }) + ) } any(FORWARDED.getPath) { request: Request => - controller(FORWARDED, new Closure[Response](null) { - override def call(): Response = { - response.ok(request.headerMap.get("x-forwarded-for").get) + controller( + FORWARDED, + new Closure[Response](null) { + override def call(): Response = { + response.ok(request.headerMap.get("x-forwarded-for").get) + } } - }) + ) } any(ERROR.getPath) { request: Request => - controller(ERROR, new Closure[Response](null) { - override def call(): Response = { - response.internalServerError(ERROR.getBody) + controller( + ERROR, + new Closure[Response](null) { + override def call(): Response = { + response.internalServerError(ERROR.getBody) + } } - }) + ) } any(QUERY_PARAM.getPath) { request: Request => - controller(QUERY_PARAM, new Closure[Response](null) { - override def call(): Response = { - response.ok(QUERY_PARAM.getBody) + controller( + QUERY_PARAM, + new Closure[Response](null) { + override def call(): Response = { + response.ok(QUERY_PARAM.getBody) + } } - }) + ) } any(QUERY_ENCODED_QUERY.getPath) { request: Request => - controller(QUERY_ENCODED_QUERY, new Closure[Response](null) { - override def call(): Response = { - response.ok(QUERY_ENCODED_QUERY.getBody) + controller( + QUERY_ENCODED_QUERY, + new Closure[Response](null) { + override def call(): Response = { + response.ok(QUERY_ENCODED_QUERY.getBody) + } } - }) + ) } any(QUERY_ENCODED_BOTH.getRawPath) { request: Request => @@ -64,18 +79,24 @@ class FinatraController extends Controller { } any(EXCEPTION.getPath) { request: Request => - controller(EXCEPTION, new Closure[Future[Response]](null) { - override def call(): Future[Response] = { - throw new Exception(EXCEPTION.getBody) + controller( + EXCEPTION, + new Closure[Future[Response]](null) { + override def call(): Future[Response] = { + throw new Exception(EXCEPTION.getBody) + } } - }) + ) } any(REDIRECT.getPath) { request: Request => - controller(REDIRECT, new Closure[Response](null) { - override def call(): Response = { - response.found.location(REDIRECT.getBody) + controller( + REDIRECT, + new Closure[Response](null) { + override def call(): Response = { + response.found.location(REDIRECT.getBody) + } } - }) + ) } } diff --git a/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/scala/ResponseSettingExceptionMapper.scala b/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/scala/ResponseSettingExceptionMapper.scala index 29eaa7ef6fe..800678b94fc 100644 --- a/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/scala/ResponseSettingExceptionMapper.scala +++ b/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/scala/ResponseSettingExceptionMapper.scala @@ -4,7 +4,7 @@ import com.twitter.finatra.http.response.ResponseBuilder import javax.inject.{Inject, Singleton} @Singleton -class ResponseSettingExceptionMapper @Inject()(response: ResponseBuilder) +class ResponseSettingExceptionMapper @Inject() (response: ResponseBuilder) extends ExceptionMapper[Exception] { override def toResponse(request: Request, exception: Exception): Response = { diff --git a/dd-java-agent/instrumentation/finatra-2.9/src/test/scala/FinatraController.scala b/dd-java-agent/instrumentation/finatra-2.9/src/test/scala/FinatraController.scala index 7dc39908e77..4fc399d005c 100644 --- a/dd-java-agent/instrumentation/finatra-2.9/src/test/scala/FinatraController.scala +++ b/dd-java-agent/instrumentation/finatra-2.9/src/test/scala/FinatraController.scala @@ -8,43 +8,58 @@ import groovy.lang.Closure class FinatraController extends Controller { any(SUCCESS.getPath) { request: Request => - controller(SUCCESS, new Closure[Response](null) { - override def call(): Response = { - response.ok(SUCCESS.getBody) + controller( + SUCCESS, + new Closure[Response](null) { + override def call(): Response = { + response.ok(SUCCESS.getBody) + } } - }) + ) } any(FORWARDED.getPath) { request: Request => - controller(FORWARDED, new Closure[Response](null) { - override def call(): Response = { - response.ok(request.headerMap.get("x-forwarded-for").get) + controller( + FORWARDED, + new Closure[Response](null) { + override def call(): Response = { + response.ok(request.headerMap.get("x-forwarded-for").get) + } } - }) + ) } any(ERROR.getPath) { request: Request => - controller(ERROR, new Closure[Response](null) { - override def call(): Response = { - response.internalServerError(ERROR.getBody) + controller( + ERROR, + new Closure[Response](null) { + override def call(): Response = { + response.internalServerError(ERROR.getBody) + } } - }) + ) } any(QUERY_PARAM.getPath) { request: Request => - controller(QUERY_PARAM, new Closure[Response](null) { - override def call(): Response = { - response.ok(QUERY_PARAM.getBody) + controller( + QUERY_PARAM, + new Closure[Response](null) { + override def call(): Response = { + response.ok(QUERY_PARAM.getBody) + } } - }) + ) } any(QUERY_ENCODED_QUERY.getPath) { request: Request => - controller(QUERY_ENCODED_QUERY, new Closure[Response](null) { - override def call(): Response = { - response.ok(QUERY_ENCODED_QUERY.getBody) + controller( + QUERY_ENCODED_QUERY, + new Closure[Response](null) { + override def call(): Response = { + response.ok(QUERY_ENCODED_QUERY.getBody) + } } - }) + ) } any(QUERY_ENCODED_BOTH.getRawPath) { request: Request => @@ -64,18 +79,24 @@ class FinatraController extends Controller { } any(EXCEPTION.getPath) { request: Request => - controller(EXCEPTION, new Closure[Future[Response]](null) { - override def call(): Future[Response] = { - throw new Exception(EXCEPTION.getBody) + controller( + EXCEPTION, + new Closure[Future[Response]](null) { + override def call(): Future[Response] = { + throw new Exception(EXCEPTION.getBody) + } } - }) + ) } any(REDIRECT.getPath) { request: Request => - controller(REDIRECT, new Closure[Response](null) { - override def call(): Response = { - response.found.location(REDIRECT.getBody) + controller( + REDIRECT, + new Closure[Response](null) { + override def call(): Response = { + response.found.location(REDIRECT.getBody) + } } - }) + ) } } diff --git a/dd-java-agent/instrumentation/finatra-2.9/src/test/scala/ResponseSettingExceptionMapper.scala b/dd-java-agent/instrumentation/finatra-2.9/src/test/scala/ResponseSettingExceptionMapper.scala index 29eaa7ef6fe..800678b94fc 100644 --- a/dd-java-agent/instrumentation/finatra-2.9/src/test/scala/ResponseSettingExceptionMapper.scala +++ b/dd-java-agent/instrumentation/finatra-2.9/src/test/scala/ResponseSettingExceptionMapper.scala @@ -4,7 +4,7 @@ import com.twitter.finatra.http.response.ResponseBuilder import javax.inject.{Inject, Singleton} @Singleton -class ResponseSettingExceptionMapper @Inject()(response: ResponseBuilder) +class ResponseSettingExceptionMapper @Inject() (response: ResponseBuilder) extends ExceptionMapper[Exception] { override def toResponse(request: Request, exception: Exception): Response = { diff --git a/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/test/scala/PekkoActors.scala b/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/test/scala/PekkoActors.scala index f86729a3813..2fb3089ad55 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/test/scala/PekkoActors.scala +++ b/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/test/scala/PekkoActors.scala @@ -6,7 +6,12 @@ import org.apache.pekko.pattern.ask import org.apache.pekko.routing.RoundRobinPool import org.apache.pekko.util.Timeout import datadog.trace.api.Trace -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.{activateSpan, activeSpan, setAsyncPropagationEnabled, startSpan} +import datadog.trace.bootstrap.instrumentation.api.AgentTracer.{ + activateSpan, + activeSpan, + setAsyncPropagationEnabled, + startSpan +} import scala.concurrent.duration._ @@ -87,15 +92,17 @@ object PekkoActors { // The way to terminate an actor system has changed between versions val terminate: (ActorSystem) => Unit = { - val t = try { - ActorSystem.getClass.getMethod("terminate") - } catch { - case _: Throwable => try { - ActorSystem.getClass.getMethod("awaitTermination") + val t = + try { + ActorSystem.getClass.getMethod("terminate") } catch { - case _: Throwable => null + case _: Throwable => + try { + ActorSystem.getClass.getMethod("awaitTermination") + } catch { + case _: Throwable => null + } } - } if (t ne null) { { system: ActorSystem => t.invoke(system) diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/baseTest/scala/PekkoHttpTestWebServer.scala b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/baseTest/scala/PekkoHttpTestWebServer.scala index b7b0c30460b..9145991bca5 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/baseTest/scala/PekkoHttpTestWebServer.scala +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/baseTest/scala/PekkoHttpTestWebServer.scala @@ -60,8 +60,8 @@ object PekkoHttpTestWebServer { def config: Option[Config] = None - def bind(port: Int)( - implicit system: ActorSystem, + def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] } @@ -69,8 +69,8 @@ object PekkoHttpTestWebServer { val BindAndHandle: Binder = new Binder { override def name: String = "bind-and-handle" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -81,8 +81,8 @@ object PekkoHttpTestWebServer { val BindAndHandleAsyncWithRouteAsyncHandler: Binder = new Binder { override def name: String = "bind-and-handle-async-with-route-async-handler" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -93,8 +93,8 @@ object PekkoHttpTestWebServer { val BindAndHandleSync: Binder = new Binder { override def name: String = "bind-and-handle-sync" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { Http().bindAndHandleSync(syncHandler, "localhost", port) @@ -104,8 +104,8 @@ object PekkoHttpTestWebServer { val BindAndHandleAsync: Binder = new Binder { override def name: String = "bind-and-handle-async" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -116,8 +116,8 @@ object PekkoHttpTestWebServer { val BindAndHandleAsyncHttp2: Binder = new Binder { override def name: String = "bind-and-handle-async-http2" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -133,17 +133,16 @@ object PekkoHttpTestWebServer { // This part defines the routes using the Scala routing DSL // ---------------------------------------------------------------------- // - private val exceptionHandler = ExceptionHandler { - case e: Exception => - val span = activeSpan() - if (span != null) { - // The exception handler is bypassing the normal instrumentation flow, so we need to handle things here - TraceUtils.handleException(span, e) - span.finish() - } - complete( - HttpResponse(status = EXCEPTION.getStatus, entity = e.getMessage) - ) + private val exceptionHandler = ExceptionHandler { case e: Exception => + val span = activeSpan() + if (span != null) { + // The exception handler is bypassing the normal instrumentation flow, so we need to handle things here + TraceUtils.handleException(span, e) + span.finish() + } + complete( + HttpResponse(status = EXCEPTION.getStatus, entity = e.getMessage) + ) } // Since the pekko-http route DSL produces a Route that is evaluated for every @@ -270,8 +269,8 @@ object PekkoHttpTestWebServer { } } - def asyncHandler( - implicit ec: ExecutionContext + def asyncHandler(implicit + ec: ExecutionContext ): HttpRequest => Future[HttpResponse] = { request => Future { syncHandler(request) diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/latestDepTest/scala/PekkoHttpLatestDepTestWebServer.scala b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/latestDepTest/scala/PekkoHttpLatestDepTestWebServer.scala index 8f61ca7e011..98329d1b252 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/latestDepTest/scala/PekkoHttpLatestDepTestWebServer.scala +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/latestDepTest/scala/PekkoHttpLatestDepTestWebServer.scala @@ -10,8 +10,8 @@ import scala.concurrent.Future object PekkoHttpLatestDepTestWebServer { val ServerBuilderBindFlow: Binder = new Binder { override def name: String = "server-builder-bind-flow" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -24,8 +24,8 @@ object PekkoHttpLatestDepTestWebServer { val ServerBuilderBind: Binder = new Binder { override def name: String = "server-builder-bind" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -38,8 +38,8 @@ object PekkoHttpLatestDepTestWebServer { val ServerBuilderBindSync: Binder = new Binder { override def name: String = "server-builder-bind-sync" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext @@ -52,8 +52,8 @@ object PekkoHttpLatestDepTestWebServer { val ServerBuilderBindHttp2: Binder = new Binder { override def name: String = "server-builder-bind-http2" - override def bind(port: Int)( - implicit system: ActorSystem, + override def bind(port: Int)(implicit + system: ActorSystem, materializer: Materializer ): Future[ServerBinding] = { import materializer.executionContext diff --git a/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/AsyncServer.scala b/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/AsyncServer.scala index 4f4a0f29cee..df802bb9121 100644 --- a/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/AsyncServer.scala +++ b/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/AsyncServer.scala @@ -104,10 +104,13 @@ class AsyncServer extends HttpServer { case ("GET", "/user-block") => Action.async { - HttpServerTest.controller(USER_BLOCK, AsyncBlockClosureAdapter { - Blocking.forUser("user-to-block").blockIfMatch() - Future.successful(Results.Ok("should never be reached")) - }) + HttpServerTest.controller( + USER_BLOCK, + AsyncBlockClosureAdapter { + Blocking.forUser("user-to-block").blockIfMatch() + Future.successful(Results.Ok("should never be reached")) + } + ) } } diff --git a/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/ControllerClosureAdapter.scala b/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/ControllerClosureAdapter.scala index 476694d5b9d..3133838f4e1 100644 --- a/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/ControllerClosureAdapter.scala +++ b/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/ControllerClosureAdapter.scala @@ -33,8 +33,7 @@ class AsyncControllerClosureAdapter(response: Future[Result]) ) } -class AsyncBlockClosureAdapter(block: => Future[Result]) - extends Closure[Future[Result]]((): Unit) { +class AsyncBlockClosureAdapter(block: => Future[Result]) extends Closure[Future[Result]]((): Unit) { import scala.concurrent.ExecutionContext.Implicits.global override def call(): Future[Result] = block.map( @@ -45,5 +44,7 @@ class AsyncBlockClosureAdapter(block: => Future[Result]) } object AsyncBlockClosureAdapter { - def apply(block: => Future[Result]): AsyncBlockClosureAdapter = new AsyncBlockClosureAdapter(block) + def apply(block: => Future[Result]): AsyncBlockClosureAdapter = new AsyncBlockClosureAdapter( + block + ) } diff --git a/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/SyncServer.scala b/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/SyncServer.scala index 5808f952734..7a82df3e643 100644 --- a/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/SyncServer.scala +++ b/dd-java-agent/instrumentation/play/play-2.3/src/test/scala/datadog/trace/instrumentation/play23/test/server/SyncServer.scala @@ -80,17 +80,23 @@ class SyncServer extends HttpServer { } case ("GET", "/exception") => Action { - HttpServerTest.controller(EXCEPTION, BlockClosureAdapter { - throw new Exception(EXCEPTION.getBody) - }) + HttpServerTest.controller( + EXCEPTION, + BlockClosureAdapter { + throw new Exception(EXCEPTION.getBody) + } + ) } case ("GET", "/user-block") => Action { - HttpServerTest.controller(USER_BLOCK, BlockClosureAdapter { - Blocking.forUser("user-to-block").blockIfMatch() - Results.Ok("should never be reached") - }) + HttpServerTest.controller( + USER_BLOCK, + BlockClosureAdapter { + Blocking.forUser("user-to-block").blockIfMatch() + Results.Ok("should never be reached") + } + ) } } diff --git a/dd-java-agent/instrumentation/play/play-2.4/src/routeGenerator/scala/generator/CompileRoutes.scala b/dd-java-agent/instrumentation/play/play-2.4/src/routeGenerator/scala/generator/CompileRoutes.scala index 505135029a3..bcbeeb91113 100644 --- a/dd-java-agent/instrumentation/play/play-2.4/src/routeGenerator/scala/generator/CompileRoutes.scala +++ b/dd-java-agent/instrumentation/play/play-2.4/src/routeGenerator/scala/generator/CompileRoutes.scala @@ -6,12 +6,10 @@ import java.io.File import scala.collection.immutable object CompileRoutes extends App { - val routesFile = args(0) + val routesFile = args(0) val destinationDir = args(1) - val routesCompilerTask = RoutesCompiler.RoutesCompilerTask( - new File(routesFile), immutable.Seq.empty, - true, true, false) - RoutesCompiler.compile( - routesCompilerTask, InjectedRoutesGenerator, new File(destinationDir)) + val routesCompilerTask = + RoutesCompiler.RoutesCompilerTask(new File(routesFile), immutable.Seq.empty, true, true, false) + RoutesCompiler.compile(routesCompilerTask, InjectedRoutesGenerator, new File(destinationDir)) } diff --git a/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/PlayController.scala b/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/PlayController.scala index 1dfe30392be..331d862fda7 100644 --- a/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/PlayController.scala +++ b/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/PlayController.scala @@ -2,7 +2,11 @@ package datadog.trace.instrumentation.play25 import datadog.appsec.api.blocking.Blocking import datadog.trace.agent.test.base.HttpServerTest -import datadog.trace.agent.test.base.HttpServerTest.{ServerEndpoint, getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE} +import datadog.trace.agent.test.base.HttpServerTest.{ + ServerEndpoint, + getIG_RESPONSE_HEADER, + getIG_RESPONSE_HEADER_VALUE +} import datadog.trace.instrumentation.play25.Util.MapExtensions import groovy.lang.Closure import play.api.libs.json.{JsNull, JsValue, Json} @@ -20,7 +24,9 @@ class PlayController(implicit ec: ExecutionContext) extends Controller { } def forwarded = controller(ServerEndpoint.FORWARDED) { request => - Results.Status(ServerEndpoint.FORWARDED.getStatus)(request.headers.get("X-Forwarded-For").getOrElse("(no header)")) + Results.Status(ServerEndpoint.FORWARDED.getStatus)( + request.headers.get("X-Forwarded-For").getOrElse("(no header)") + ) } def errorStatus = controller(ServerEndpoint.ERROR) { _ => @@ -71,7 +77,8 @@ class PlayController(implicit ec: ExecutionContext) extends Controller { } def bodyMultipart = controller(ServerEndpoint.BODY_MULTIPART) { request => - val body: Map[String, Seq[String]] = request.body.asMultipartFormData.map(_.asFormUrlEncoded).getOrElse(Map.empty) + val body: Map[String, Seq[String]] = + request.body.asMultipartFormData.map(_.asFormUrlEncoded).getOrElse(Map.empty) Results.Ok(body.toStringAsGroovy) } @@ -80,13 +87,18 @@ class PlayController(implicit ec: ExecutionContext) extends Controller { Results.Ok(body) } - private def controller(endpoint: ServerEndpoint)(block: Request[AnyContent] => Result) : Action[AnyContent] = { + private def controller( + endpoint: ServerEndpoint + )(block: Request[AnyContent] => Result): Action[AnyContent] = { Action.async { request => Future { - HttpServerTest.controller(endpoint, new Closure[Result](this) { - def doCall() = block(request).withHeaders( - (getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE)) - }) + HttpServerTest.controller( + endpoint, + new Closure[Result](this) { + def doCall() = + block(request).withHeaders((getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE)) + } + ) } } } diff --git a/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/PlayRoutersScala.scala b/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/PlayRoutersScala.scala index b0c6542d196..a4ca996caee 100644 --- a/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/PlayRoutersScala.scala +++ b/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/PlayRoutersScala.scala @@ -3,7 +3,11 @@ package datadog.trace.instrumentation.play25 import datadog.appsec.api.blocking.Blocking import datadog.trace.agent.test.base.HttpServerTest import datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint._ -import datadog.trace.agent.test.base.HttpServerTest.{ServerEndpoint, getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE} +import datadog.trace.agent.test.base.HttpServerTest.{ + ServerEndpoint, + getIG_RESPONSE_HEADER, + getIG_RESPONSE_HEADER_VALUE +} import datadog.trace.instrumentation.play25.Util.MapExtensions import groovy.lang.Closure import play.api.BuiltInComponents @@ -19,14 +23,17 @@ object PlayRoutersScala { def async(executor: Executor): Router = { val ec: ExecutionContext = ExecutionContext.fromExecutor(executor) - val parser = BodyParsers.parse.default + val parser = BodyParsers.parse.default def controller(endpoint: ServerEndpoint)(block: => Result): Future[Result] = { Future { - HttpServerTest.controller(endpoint, new Closure[Result](this) { - def doCall(): Result = block.withHeaders( - (getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE)) - }) + HttpServerTest.controller( + endpoint, + new Closure[Result](this) { + def doCall(): Result = + block.withHeaders((getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE)) + } + ) }(ec) } @@ -48,7 +55,9 @@ object PlayRoutersScala { case GET(p"/forwarded") => Action.async { request => controller(FORWARDED) { - Results.Status(FORWARDED.getStatus)(request.headers.get("X-Forwarded-For").getOrElse("(no header)")) + Results.Status(FORWARDED.getStatus)( + request.headers.get("X-Forwarded-For").getOrElse("(no header)") + ) } } @@ -117,35 +126,41 @@ object PlayRoutersScala { } } - case POST(p"/created") => Action.async(parser) { request => - controller(CREATED) { - val body: String = request.body.asText.getOrElse("") - Results.Created(s"created: $body") + case POST(p"/created") => + Action.async(parser) { request => + controller(CREATED) { + val body: String = request.body.asText.getOrElse("") + Results.Created(s"created: $body") + } } - } - case POST(p"/body-urlencoded") => Action.async(parser) { request => - controller(BODY_URLENCODED) { - val body: Map[String, Seq[String]] = request.body.asFormUrlEncoded.getOrElse(Map.empty) - Results.Ok(body.toStringAsGroovy) + case POST(p"/body-urlencoded") => + Action.async(parser) { request => + controller(BODY_URLENCODED) { + val body: Map[String, Seq[String]] = request.body.asFormUrlEncoded.getOrElse(Map.empty) + Results.Ok(body.toStringAsGroovy) + } } - } - case POST(p"/body-multipart") => Action.async(parser) { request => - controller(BODY_MULTIPART) { - val body: Map[String, scala.Seq[String]] = request.body.asMultipartFormData.getOrElse( - MultipartFormData(Map.empty, scala.Seq.empty, scala.Seq.empty) - ).asFormUrlEncoded - Results.Ok(body.toStringAsGroovy) + case POST(p"/body-multipart") => + Action.async(parser) { request => + controller(BODY_MULTIPART) { + val body: Map[String, scala.Seq[String]] = request.body.asMultipartFormData + .getOrElse( + MultipartFormData(Map.empty, scala.Seq.empty, scala.Seq.empty) + ) + .asFormUrlEncoded + Results.Ok(body.toStringAsGroovy) + } } - } - case POST(p"/body-json") => Action.async(parser) { request => - controller(BODY_JSON) { - val body: JsValue = request.body.asJson.getOrElse(JsNull) - Results.Ok(body) + case POST(p"/body-json") => + Action.async(parser) { request => + controller(BODY_JSON) { + val body: JsValue = request.body.asJson.getOrElse(JsNull) + Results.Ok(body) + } } - } } } } diff --git a/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/Util.scala b/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/Util.scala index 076d6efca13..6c34a89c4fd 100644 --- a/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/Util.scala +++ b/dd-java-agent/instrumentation/play/play-2.4/src/test/scala/datadog/trace/instrumentation/play25/Util.scala @@ -3,8 +3,9 @@ package datadog.trace.instrumentation.play25 object Util { implicit class MapExtensions[A](m: Iterable[(String, A)]) { def toStringAsGroovy: String = { - def valueToString(value: Object) : String = value match { - case seq: Seq[_] => seq.map(x => valueToString(x.asInstanceOf[Object])).mkString("[", ",", "]") + def valueToString(value: Object): String = value match { + case seq: Seq[_] => + seq.map(x => valueToString(x.asInstanceOf[Object])).mkString("[", ",", "]") case other => other.toString } @@ -14,7 +15,9 @@ object Util { } def createCustomException(msg: String): Exception = { - val clazz = Class.forName("datadog.trace.instrumentation.play25.server.TestHttpErrorHandler$CustomRuntimeException") + val clazz = Class.forName( + "datadog.trace.instrumentation.play25.server.TestHttpErrorHandler$CustomRuntimeException" + ) val constructor = clazz.getConstructor(classOf[String]) constructor.newInstance(msg).asInstanceOf[Exception] } diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/ImplicitConversions.scala b/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/ImplicitConversions.scala index 7896e2836ae..19a290847f7 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/ImplicitConversions.scala +++ b/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/ImplicitConversions.scala @@ -3,8 +3,9 @@ package datadog.trace.instrumentation.play26.server.latestdep object ImplicitConversions { implicit class MapExtensions[A](m: Iterable[(String, A)]) { def toStringAsGroovy: String = { - def valueToString(value: Object) : String = value match { - case seq: Seq[_] => seq.map(x => valueToString(x.asInstanceOf[Object])).mkString("[", ",", "]") + def valueToString(value: Object): String = value match { + case seq: Seq[_] => + seq.map(x => valueToString(x.asInstanceOf[Object])).mkString("[", ",", "]") case other => other.toString } diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayController.scala b/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayController.scala index fb6bed4a7de..06d1950421c 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayController.scala +++ b/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayController.scala @@ -1,7 +1,11 @@ package datadog.trace.instrumentation.play26.server.latestdep import datadog.trace.agent.test.base.HttpServerTest -import datadog.trace.agent.test.base.HttpServerTest.{ServerEndpoint, getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE} +import datadog.trace.agent.test.base.HttpServerTest.{ + ServerEndpoint, + getIG_RESPONSE_HEADER, + getIG_RESPONSE_HEADER_VALUE +} import datadog.appsec.api.blocking.Blocking import datadog.trace.instrumentation.play26.server.TestHttpErrorHandler import datadog.trace.instrumentation.play26.server.latestdep.ImplicitConversions.MapExtensions @@ -12,7 +16,8 @@ import play.api.mvc._ import scala.concurrent.{ExecutionContext, Future} import scala.xml.NodeSeq -class PlayController(cc: ControllerComponents)(implicit ec: ExecutionContext) extends AbstractController(cc) { +class PlayController(cc: ControllerComponents)(implicit ec: ExecutionContext) + extends AbstractController(cc) { def success() = controller(ServerEndpoint.SUCCESS) { _ => Results.Ok(ServerEndpoint.SUCCESS.getBody) } @@ -22,7 +27,9 @@ class PlayController(cc: ControllerComponents)(implicit ec: ExecutionContext) ex } def forwarded = controller(ServerEndpoint.FORWARDED) { request => - Results.Status(ServerEndpoint.FORWARDED.getStatus)(request.headers.get("X-Forwarded-For").getOrElse("(no header)")) + Results.Status(ServerEndpoint.FORWARDED.getStatus)( + request.headers.get("X-Forwarded-For").getOrElse("(no header)") + ) } def errorStatus = controller(ServerEndpoint.ERROR) { _ => @@ -73,7 +80,8 @@ class PlayController(cc: ControllerComponents)(implicit ec: ExecutionContext) ex } def bodyMultipart = controller(ServerEndpoint.BODY_MULTIPART) { request => - val body: Map[String, Seq[String]] = request.body.asMultipartFormData.map(_.asFormUrlEncoded).getOrElse(Map.empty) + val body: Map[String, Seq[String]] = + request.body.asMultipartFormData.map(_.asFormUrlEncoded).getOrElse(Map.empty) Results.Ok(body.toStringAsGroovy) } @@ -83,17 +91,22 @@ class PlayController(cc: ControllerComponents)(implicit ec: ExecutionContext) ex } def bodyXml = controller(ServerEndpoint.BODY_XML) { request => - val body : NodeSeq = request.body.asXml.getOrElse(NodeSeq.Empty) + val body: NodeSeq = request.body.asXml.getOrElse(NodeSeq.Empty) Results.Ok(body.toString()) } - private def controller(endpoint: ServerEndpoint)(block: Request[AnyContent] => Result) : Action[AnyContent] = { + private def controller( + endpoint: ServerEndpoint + )(block: Request[AnyContent] => Result): Action[AnyContent] = { Action.async { request => Future { - HttpServerTest.controller(endpoint, new Closure[Result](this) { - def doCall() = block(request).withHeaders( - (getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE)) - }) + HttpServerTest.controller( + endpoint, + new Closure[Result](this) { + def doCall() = + block(request).withHeaders((getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE)) + } + ) } } } diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayRoutersScala.scala b/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayRoutersScala.scala index 7a1898c4ce2..aa145a4377e 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayRoutersScala.scala +++ b/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayRoutersScala.scala @@ -2,7 +2,11 @@ package datadog.trace.instrumentation.play26.server.latestdep import datadog.appsec.api.blocking.Blocking import datadog.trace.agent.test.base.HttpServerTest -import datadog.trace.agent.test.base.HttpServerTest.{ServerEndpoint, getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE} +import datadog.trace.agent.test.base.HttpServerTest.{ + ServerEndpoint, + getIG_RESPONSE_HEADER, + getIG_RESPONSE_HEADER_VALUE +} import datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint._ import datadog.trace.instrumentation.play26.server.TestHttpErrorHandler.CustomRuntimeException import datadog.trace.instrumentation.play26.server.latestdep.ImplicitConversions.MapExtensions @@ -21,16 +25,19 @@ object PlayRoutersScala { def async(executor: ExecutorService)(components: BuiltInComponents): Router = { val ec: ExecutionContext = ExecutionContext.fromExecutor(executor) - val parser = components.defaultBodyParser + val parser = components.defaultBodyParser import components._ def controller(endpoint: ServerEndpoint)(block: => Result): Future[Result] = { Future { - HttpServerTest.controller(endpoint, new Closure[Result](this) { - def doCall(): Result = block.withHeaders( - (getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE)) - }) + HttpServerTest.controller( + endpoint, + new Closure[Result](this) { + def doCall(): Result = + block.withHeaders((getIG_RESPONSE_HEADER, getIG_RESPONSE_HEADER_VALUE)) + } + ) }(ec) } @@ -52,7 +59,9 @@ object PlayRoutersScala { case GET(p"/forwarded") => defaultActionBuilder.async { request => controller(FORWARDED) { - Results.Status(FORWARDED.getStatus)(request.headers.get("X-Forwarded-For").getOrElse("(no header)")) + Results.Status(FORWARDED.getStatus)( + request.headers.get("X-Forwarded-For").getOrElse("(no header)") + ) } } @@ -121,42 +130,49 @@ object PlayRoutersScala { } } - case POST(p"/created") => defaultActionBuilder.async(parser) { request => - controller(CREATED) { - val body: String = request.body.asText.getOrElse("") - Results.Created(s"created: $body") + case POST(p"/created") => + defaultActionBuilder.async(parser) { request => + controller(CREATED) { + val body: String = request.body.asText.getOrElse("") + Results.Created(s"created: $body") + } } - } - case POST(p"/body-urlencoded") => defaultActionBuilder.async(parser) { request => - controller(BODY_URLENCODED) { - val body: Map[String, Seq[String]] = request.body.asFormUrlEncoded.getOrElse(Map.empty) - Results.Ok(body.toStringAsGroovy) + case POST(p"/body-urlencoded") => + defaultActionBuilder.async(parser) { request => + controller(BODY_URLENCODED) { + val body: Map[String, Seq[String]] = request.body.asFormUrlEncoded.getOrElse(Map.empty) + Results.Ok(body.toStringAsGroovy) + } } - } - case POST(p"/body-multipart") => defaultActionBuilder.async(parser) { request => - controller(BODY_MULTIPART) { - val body: Map[String, scala.Seq[String]] = request.body.asMultipartFormData.getOrElse( - MultipartFormData(Map.empty, scala.Seq.empty, scala.Seq.empty) - ).asFormUrlEncoded - Results.Ok(body.toStringAsGroovy) + case POST(p"/body-multipart") => + defaultActionBuilder.async(parser) { request => + controller(BODY_MULTIPART) { + val body: Map[String, scala.Seq[String]] = request.body.asMultipartFormData + .getOrElse( + MultipartFormData(Map.empty, scala.Seq.empty, scala.Seq.empty) + ) + .asFormUrlEncoded + Results.Ok(body.toStringAsGroovy) + } } - } - case POST(p"/body-json") => defaultActionBuilder.async(parser) { request => - controller(BODY_JSON) { - val body: JsValue = request.body.asJson.getOrElse(JsNull) - Results.Ok(body) + case POST(p"/body-json") => + defaultActionBuilder.async(parser) { request => + controller(BODY_JSON) { + val body: JsValue = request.body.asJson.getOrElse(JsNull) + Results.Ok(body) + } } - } - case POST(p"/body-xml") => defaultActionBuilder.async(parser) { request => - controller(BODY_XML) { - val body: NodeSeq = request.body.asXml.getOrElse(NodeSeq.Empty) - Results.Ok(body.toString()) + case POST(p"/body-xml") => + defaultActionBuilder.async(parser) { request => + controller(BODY_XML) { + val body: NodeSeq = request.body.asXml.getOrElse(NodeSeq.Empty) + Results.Ok(body.toString()) + } } - } } } diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/routeGenerator/scala/generator/CompileRoutes.scala b/dd-java-agent/instrumentation/play/play-2.6/src/routeGenerator/scala/generator/CompileRoutes.scala index 1b8ff7667ba..a1f9e690854 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/routeGenerator/scala/generator/CompileRoutes.scala +++ b/dd-java-agent/instrumentation/play/play-2.6/src/routeGenerator/scala/generator/CompileRoutes.scala @@ -6,12 +6,10 @@ import java.io.File import scala.collection.immutable object CompileRoutes extends App { - val routesFile = args(0) + val routesFile = args(0) val destinationDir = args(1) - val routesCompilerTask = RoutesCompiler.RoutesCompilerTask( - new File(routesFile), immutable.Seq.empty, - true, false, false) - RoutesCompiler.compile( - routesCompilerTask, InjectedRoutesGenerator, new File(destinationDir)) + val routesCompilerTask = + RoutesCompiler.RoutesCompilerTask(new File(routesFile), immutable.Seq.empty, true, false, false) + RoutesCompiler.compile(routesCompilerTask, InjectedRoutesGenerator, new File(destinationDir)) } diff --git a/dd-java-agent/instrumentation/scala-concurrent/src/latestDepTest/scala/ScalaConcurrentTests.scala b/dd-java-agent/instrumentation/scala-concurrent/src/latestDepTest/scala/ScalaConcurrentTests.scala index 6c7abbacff9..369d15e5342 100644 --- a/dd-java-agent/instrumentation/scala-concurrent/src/latestDepTest/scala/ScalaConcurrentTests.scala +++ b/dd-java-agent/instrumentation/scala-concurrent/src/latestDepTest/scala/ScalaConcurrentTests.scala @@ -1,6 +1,9 @@ import datadog.trace.agent.test.InstrumentationSpecification.blockUntilChildSpansFinished import datadog.trace.api.Trace -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.{setAsyncPropagationEnabled, activeSpan} +import datadog.trace.bootstrap.instrumentation.api.AgentTracer.{ + setAsyncPropagationEnabled, + activeSpan +} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ @@ -8,8 +11,7 @@ import scala.concurrent.{Await, Future, Promise} class ScalaConcurrentTests { - /** - * @return Number of expected spans in the trace + /** @return Number of expected spans in the trace */ @Trace def traceWithFutureAndCallbacks(): Integer = { @@ -35,19 +37,17 @@ class ScalaConcurrentTests { val goodFuture: Future[Integer] = Future { 1 } - goodFuture.onComplete( - _ => - Future { - 2 - }.onComplete(_ => tracedChild("callback")) + goodFuture.onComplete(_ => + Future { + 2 + }.onComplete(_ => tracedChild("callback")) ) blockUntilChildSpansFinished(activeSpan(), 1) return 2 } - /** - * @return Number of expected spans in the trace + /** @return Number of expected spans in the trace */ @Trace def traceWithPromises(): Integer = { @@ -73,30 +73,34 @@ class ScalaConcurrentTests { return 5 } - /** - * @return Number of expected spans in the trace + /** @return Number of expected spans in the trace */ @Trace def tracedWithFutureFirstCompletions(): Integer = { setAsyncPropagationEnabled(true) - val completedVal = Future.firstCompletedOf(List(Future { - tracedChild("timeout1") - false - }, Future { - tracedChild("timeout2") - false - }, Future { - tracedChild("timeout3") - true - })) + val completedVal = Future.firstCompletedOf( + List( + Future { + tracedChild("timeout1") + false + }, + Future { + tracedChild("timeout2") + false + }, + Future { + tracedChild("timeout3") + true + } + ) + ) Await.result(completedVal, 30.seconds) blockUntilChildSpansFinished(activeSpan(), 3) return 4 } - /** - * @return Number of expected spans in the trace + /** @return Number of expected spans in the trace */ @Trace def tracedTimeout(): Integer = { diff --git a/dd-java-agent/instrumentation/scala-concurrent/src/test/scala/ScalaConcurrentTests.scala b/dd-java-agent/instrumentation/scala-concurrent/src/test/scala/ScalaConcurrentTests.scala index 6c7abbacff9..369d15e5342 100644 --- a/dd-java-agent/instrumentation/scala-concurrent/src/test/scala/ScalaConcurrentTests.scala +++ b/dd-java-agent/instrumentation/scala-concurrent/src/test/scala/ScalaConcurrentTests.scala @@ -1,6 +1,9 @@ import datadog.trace.agent.test.InstrumentationSpecification.blockUntilChildSpansFinished import datadog.trace.api.Trace -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.{setAsyncPropagationEnabled, activeSpan} +import datadog.trace.bootstrap.instrumentation.api.AgentTracer.{ + setAsyncPropagationEnabled, + activeSpan +} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ @@ -8,8 +11,7 @@ import scala.concurrent.{Await, Future, Promise} class ScalaConcurrentTests { - /** - * @return Number of expected spans in the trace + /** @return Number of expected spans in the trace */ @Trace def traceWithFutureAndCallbacks(): Integer = { @@ -35,19 +37,17 @@ class ScalaConcurrentTests { val goodFuture: Future[Integer] = Future { 1 } - goodFuture.onComplete( - _ => - Future { - 2 - }.onComplete(_ => tracedChild("callback")) + goodFuture.onComplete(_ => + Future { + 2 + }.onComplete(_ => tracedChild("callback")) ) blockUntilChildSpansFinished(activeSpan(), 1) return 2 } - /** - * @return Number of expected spans in the trace + /** @return Number of expected spans in the trace */ @Trace def traceWithPromises(): Integer = { @@ -73,30 +73,34 @@ class ScalaConcurrentTests { return 5 } - /** - * @return Number of expected spans in the trace + /** @return Number of expected spans in the trace */ @Trace def tracedWithFutureFirstCompletions(): Integer = { setAsyncPropagationEnabled(true) - val completedVal = Future.firstCompletedOf(List(Future { - tracedChild("timeout1") - false - }, Future { - tracedChild("timeout2") - false - }, Future { - tracedChild("timeout3") - true - })) + val completedVal = Future.firstCompletedOf( + List( + Future { + tracedChild("timeout1") + false + }, + Future { + tracedChild("timeout2") + false + }, + Future { + tracedChild("timeout3") + true + } + ) + ) Await.result(completedVal, 30.seconds) blockUntilChildSpansFinished(activeSpan(), 3) return 4 } - /** - * @return Number of expected spans in the trace + /** @return Number of expected spans in the trace */ @Trace def tracedTimeout(): Integer = { diff --git a/dd-java-agent/instrumentation/scala/src/test/scala/foo/bar/TestScalaStringBuilderSuite.scala b/dd-java-agent/instrumentation/scala/src/test/scala/foo/bar/TestScalaStringBuilderSuite.scala index b40ea4c3c73..2df0f3785d4 100644 --- a/dd-java-agent/instrumentation/scala/src/test/scala/foo/bar/TestScalaStringBuilderSuite.scala +++ b/dd-java-agent/instrumentation/scala/src/test/scala/foo/bar/TestScalaStringBuilderSuite.scala @@ -2,7 +2,6 @@ package foo.bar import org.slf4j.LoggerFactory - class TestScalaStringBuilderSuite { private val LOGGER = LoggerFactory.getLogger("TestStringBuilderSuite") @@ -54,21 +53,21 @@ class TestScalaStringBuilderSuite { } def plus(left: String, right: String): String = { - LOGGER.debug("Before string plus {} {}", Array(left, right):_*) + LOGGER.debug("Before string plus {} {}", Array(left, right): _*) val result: String = left + right LOGGER.debug("After string plus {}", result) result } def plus(left: String, right: AnyRef): String = { - LOGGER.debug("Before string plus object {} {}", Array(left, right):_*) + LOGGER.debug("Before string plus object {} {}", Array(left, right): _*) val result: String = left + right LOGGER.debug("After string plus object {}", result) result } def plus(items: Array[AnyRef]): String = { - LOGGER.debug("Before string plus array {}", items:_*) + LOGGER.debug("Before string plus array {}", items: _*) var result: String = "" for (item <- items) { result += item diff --git a/dd-java-agent/instrumentation/scala/src/test/scala/foo/bar/TestSourceSuite.scala b/dd-java-agent/instrumentation/scala/src/test/scala/foo/bar/TestSourceSuite.scala index 8f188fbecc4..d669d3fba0c 100644 --- a/dd-java-agent/instrumentation/scala/src/test/scala/foo/bar/TestSourceSuite.scala +++ b/dd-java-agent/instrumentation/scala/src/test/scala/foo/bar/TestSourceSuite.scala @@ -17,7 +17,7 @@ class TestSourceSuite { } def fromFile(name: String, enc: String): BufferedSource = { - LOGGER.debug("Before fromFile {} {}", Array(name, enc):_*) + LOGGER.debug("Before fromFile {} {}", Array(name, enc): _*) val result = Source.fromFile(name, enc) LOGGER.debug("After fromFile {}", result) result @@ -31,7 +31,7 @@ class TestSourceSuite { } def fromFile(uri: URI, enc: String): BufferedSource = { - LOGGER.debug("Before fromFile {} {}", Array(uri, enc):_*) + LOGGER.debug("Before fromFile {} {}", Array(uri, enc): _*) val result = Source.fromFile(uri, enc) LOGGER.debug("After fromFile {}", result) result @@ -45,7 +45,7 @@ class TestSourceSuite { } def fromURL(name: String, enc: String): BufferedSource = { - LOGGER.debug("Before fromURL {} {}", Array(name, enc):_*) + LOGGER.debug("Before fromURL {} {}", Array(name, enc): _*) val result = Source.fromURL(name, enc) LOGGER.debug("After fromURL {}", result) result diff --git a/dd-java-agent/instrumentation/scalatest/src/test/scala/org/example/TestIgnoredPending.scala b/dd-java-agent/instrumentation/scalatest/src/test/scala/org/example/TestIgnoredPending.scala index dfffd50744a..c07c0e739ba 100644 --- a/dd-java-agent/instrumentation/scalatest/src/test/scala/org/example/TestIgnoredPending.scala +++ b/dd-java-agent/instrumentation/scalatest/src/test/scala/org/example/TestIgnoredPending.scala @@ -3,5 +3,5 @@ package org.example import org.scalatest.funsuite.AnyFunSuite class TestIgnoredPending extends AnyFunSuite { - test("Example.add adds two numbers") (pending) + test("Example.add adds two numbers")(pending) } diff --git a/dd-java-agent/instrumentation/scalatest/src/test/scala/org/example/TestSucceedFlatSpec.scala b/dd-java-agent/instrumentation/scalatest/src/test/scala/org/example/TestSucceedFlatSpec.scala index 2650fb31181..55fbc75efb4 100644 --- a/dd-java-agent/instrumentation/scalatest/src/test/scala/org/example/TestSucceedFlatSpec.scala +++ b/dd-java-agent/instrumentation/scalatest/src/test/scala/org/example/TestSucceedFlatSpec.scala @@ -3,7 +3,7 @@ package org.example import org.scalatest.Tag import org.scalatest.flatspec.AnyFlatSpec -object MyTag extends Tag("a-custom-tag") +object MyTag extends Tag("a-custom-tag") object MyOtherTag extends Tag("another-custom-tag") class TestSucceedFlatSpec extends AnyFlatSpec { diff --git a/dd-java-agent/instrumentation/slick/src/test/scala/SlickUtils.scala b/dd-java-agent/instrumentation/slick/src/test/scala/SlickUtils.scala index ad224c40fc4..c1f05aeef57 100644 --- a/dd-java-agent/instrumentation/slick/src/test/scala/SlickUtils.scala +++ b/dd-java-agent/instrumentation/slick/src/test/scala/SlickUtils.scala @@ -1,6 +1,9 @@ import datadog.trace.agent.test.InstrumentationSpecification.blockUntilChildSpansFinished import datadog.trace.api.Trace -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.{setAsyncPropagationEnabled, activeSpan} +import datadog.trace.bootstrap.instrumentation.api.AgentTracer.{ + setAsyncPropagationEnabled, + activeSpan +} import datadog.trace.common.writer.ListWriter import datadog.trace.core.DDSpan import slick.jdbc.H2Profile.api._ diff --git a/dd-java-agent/instrumentation/weaver/src/main/scala/datadog/trace/instrumentation/weaver/WeaverIntegrationTestRunner.scala b/dd-java-agent/instrumentation/weaver/src/main/scala/datadog/trace/instrumentation/weaver/WeaverIntegrationTestRunner.scala index 98c10ffeae5..edcc0eff03c 100644 --- a/dd-java-agent/instrumentation/weaver/src/main/scala/datadog/trace/instrumentation/weaver/WeaverIntegrationTestRunner.scala +++ b/dd-java-agent/instrumentation/weaver/src/main/scala/datadog/trace/instrumentation/weaver/WeaverIntegrationTestRunner.scala @@ -43,22 +43,22 @@ object WeaverIntegrationTestRunner { add(LoggedEvent.Trace(t)) } - val framework = new CatsEffect(new PrintStream(System.out)) - val runner = framework.runner(Array.empty, Array.empty, getClass.getClassLoader) + val framework = new CatsEffect(new PrintStream(System.out)) + val runner = framework.runner(Array.empty, Array.empty, getClass.getClassLoader) val scalaTestNames: List[String] = testNames.asScala.toList val taskDefs: Array[TaskDef] = scalaTestNames.map { name => new TaskDef(name, SuiteFingerprint, false, Array(new SuiteSelector())) }.toArray - val tasks = runner.tasks(taskDefs) + val tasks = runner.tasks(taskDefs) val eventHandler = new WeaverTestEventHandler() - val logger = new WeaverTestLogger() + val logger = new WeaverTestLogger() tasks.foreach(_.execute(eventHandler, Array(logger))) logger.logs.foreach { case LoggedEvent.Error(msg) => println(s"$msg") - case LoggedEvent.Warn(msg) => println(s"$msg") - case LoggedEvent.Info(msg) => println(s"$msg") + case LoggedEvent.Warn(msg) => println(s"$msg") + case LoggedEvent.Info(msg) => println(s"$msg") case LoggedEvent.Debug(msg) => println(s"$msg") - case LoggedEvent.Trace(t) => t.printStackTrace() + case LoggedEvent.Trace(t) => t.printStackTrace() } } } diff --git a/dd-java-agent/instrumentation/weaver/src/test/scala/org/example/TestSucceedGlobalResource.scala b/dd-java-agent/instrumentation/weaver/src/test/scala/org/example/TestSucceedGlobalResource.scala index e09ba4833f4..720fc08d59a 100644 --- a/dd-java-agent/instrumentation/weaver/src/test/scala/org/example/TestSucceedGlobalResource.scala +++ b/dd-java-agent/instrumentation/weaver/src/test/scala/org/example/TestSucceedGlobalResource.scala @@ -4,14 +4,15 @@ import cats.effect.* import weaver.* object MyResource extends GlobalResource { - override def sharedResources(global: GlobalWrite): Resource[IO, Unit] = baseResources.flatMap(global.putR(_)) + override def sharedResources(global: GlobalWrite): Resource[IO, Unit] = + baseResources.flatMap(global.putR(_)) def baseResources: Resource[IO, String] = Resource.pure[IO, String]("hello world!") def sharedResourceOrFallback(read: GlobalRead): Resource[IO, String] = read.getR[String]().flatMap { case Some(value) => Resource.eval(IO(value)) - case None => baseResources + case None => baseResources } } @@ -28,5 +29,7 @@ class TestSucceedGlobalResourceClass(global: GlobalRead) extends IOSuite { } } -object TestSucceedGlobalResource extends TestSucceedGlobalResourceClass(global = GlobalResourceF.Read.empty[IO](IO.asyncForIO)) { -} +object TestSucceedGlobalResource + extends TestSucceedGlobalResourceClass( + global = GlobalResourceF.Read.empty[IO](IO.asyncForIO) + ) {} diff --git a/dd-java-agent/instrumentation/zio/zio-2.0/src/test/scala/ZioTestFixtures.scala b/dd-java-agent/instrumentation/zio/zio-2.0/src/test/scala/ZioTestFixtures.scala index 053074ded3d..eff669dc97c 100644 --- a/dd-java-agent/instrumentation/zio/zio-2.0/src/test/scala/ZioTestFixtures.scala +++ b/dd-java-agent/instrumentation/zio/zio-2.0/src/test/scala/ZioTestFixtures.scala @@ -10,7 +10,7 @@ object ZioTestFixtures { childSpan("fiber_1_span_1") { for { child <- childSpan("fiber_2_span_1")(ZIO.unit).fork - _ <- child.join + _ <- child.join } yield () } } @@ -48,7 +48,7 @@ object ZioTestFixtures { run { for { fiber1Started <- Promise.make[Nothing, Unit] - fiber2Done <- Promise.make[Nothing, Unit] + fiber2Done <- Promise.make[Nothing, Unit] fiber1 <- runFiber( fiberNumber = 1, @@ -83,12 +83,12 @@ object ZioTestFixtures { run { for { - start <- Promise.make[Nothing, Unit] + start <- Promise.make[Nothing, Unit] fiber1 <- runFiber(1, start).fork fiber2 <- runFiber(2, start).fork fiber3 <- runFiber(3, start).fork - _ <- start.succeed(()) - _ <- Fiber.joinAll(List(fiber1, fiber2, fiber3)) + _ <- start.succeed(()) + _ <- Fiber.joinAll(List(fiber1, fiber2, fiber3)) } yield () } } @@ -105,11 +105,11 @@ object ZioTestFixtures { run { for { fiber1 <- runFiber(1).fork - _ <- fiber1.join + _ <- fiber1.join fiber2 <- runFiber(2).fork - _ <- fiber2.join + _ <- fiber2.join fiber3 <- runFiber(3).fork - _ <- fiber3.join + _ <- fiber3.join } yield () } } @@ -135,7 +135,7 @@ object ZioTestFixtures { } private def run[A](zio: ZIO[Any, Nothing, A]): Unit = { - val executor = Executors.newSingleThreadExecutor() + val executor = Executors.newSingleThreadExecutor() val zioExecutor = Executor.fromJavaExecutor(executor) val layer = Runtime.setExecutor(zioExecutor) >>> From 796f1aa872c6f1f23dceb50f067693734470abca Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Wed, 8 Oct 2025 12:40:01 +0200 Subject: [PATCH 3/5] style: make google-java-format happy --- .../java/test/published/dependencies/App.java | 2 +- .../src/test/java/StartWithAgentTest.java | 38 +++++++++++++------ .../java/test/published/dependencies/App.java | 3 +- .../java/test/published/dependencies/App.java | 3 +- .../src/test/java/CreateTracerTest.java | 2 +- 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/test-published-dependencies/agent-logs-on-java-7/src/main/java/test/published/dependencies/App.java b/test-published-dependencies/agent-logs-on-java-7/src/main/java/test/published/dependencies/App.java index b0e1954c841..b0db71e7a9c 100644 --- a/test-published-dependencies/agent-logs-on-java-7/src/main/java/test/published/dependencies/App.java +++ b/test-published-dependencies/agent-logs-on-java-7/src/main/java/test/published/dependencies/App.java @@ -3,7 +3,7 @@ public class App { public static void main(String[] args) { System.out.println("Hello World!"); - for (String s: args) { + for (String s : args) { System.out.println(s); } } diff --git a/test-published-dependencies/agent-logs-on-java-7/src/test/java/StartWithAgentTest.java b/test-published-dependencies/agent-logs-on-java-7/src/test/java/StartWithAgentTest.java index b354b5e30e0..6ad3d393392 100644 --- a/test-published-dependencies/agent-logs-on-java-7/src/test/java/StartWithAgentTest.java +++ b/test-published-dependencies/agent-logs-on-java-7/src/test/java/StartWithAgentTest.java @@ -14,7 +14,9 @@ public class StartWithAgentTest { - private static final Pattern WARNING_PATTERN = Pattern.compile("^Warning: Version [^ ]+ of dd-java-agent is not compatible with Java [^ ]+ found at [^ ]+ and is effectively disabled\\.$"); + private static final Pattern WARNING_PATTERN = + Pattern.compile( + "^Warning: Version [^ ]+ of dd-java-agent is not compatible with Java [^ ]+ found at [^ ]+ and is effectively disabled\\.$"); private static final String UPGRADE_MESSAGE = "Please upgrade your Java version to 8+"; @Test @@ -26,9 +28,13 @@ void ensureThatApplicationStartsWithAgentOnJava7() throws InterruptedException, List errors = getLines(process.getErrorStream()); logProcessOutput(output, errors); assertEquals(0, exitCode, "Command failed with unexpected exit code"); - assertTrue(output.contains(expectedMessage), "Output does not contain '" + expectedMessage + "'"); - assertTrue(errors.stream().anyMatch(WARNING_PATTERN.asPredicate()), "Output does not contain line matching '" + WARNING_PATTERN + "'"); - assertTrue(errors.contains(UPGRADE_MESSAGE), "Output does not contain '" + UPGRADE_MESSAGE + "'"); + assertTrue( + output.contains(expectedMessage), "Output does not contain '" + expectedMessage + "'"); + assertTrue( + errors.stream().anyMatch(WARNING_PATTERN.asPredicate()), + "Output does not contain line matching '" + WARNING_PATTERN + "'"); + assertTrue( + errors.contains(UPGRADE_MESSAGE), "Output does not contain '" + UPGRADE_MESSAGE + "'"); } @Test @@ -41,20 +47,28 @@ void ensureThatApplicationStartsWithAgentOnJava11() throws InterruptedException, ensureThatApplicationStartsWithoutWarning("11"); } - private static void ensureThatApplicationStartsWithoutWarning(String version) throws InterruptedException, IOException { + private static void ensureThatApplicationStartsWithoutWarning(String version) + throws InterruptedException, IOException { String expectedMessage = "Woho! Started on Java " + version; - Process process = startAndWaitForJvmWithAgentForJava("JAVA_" + version + "_HOME", expectedMessage); + Process process = + startAndWaitForJvmWithAgentForJava("JAVA_" + version + "_HOME", expectedMessage); int exitCode = process.waitFor(); List output = getLines(process.getInputStream()); List errors = getLines(process.getErrorStream()); logProcessOutput(output, errors); assertEquals(0, exitCode, "Command failed with unexpected exit code"); - assertTrue(output.contains(expectedMessage), "Output does not contain '" + expectedMessage + "'"); - assertFalse(errors.stream().anyMatch(WARNING_PATTERN.asPredicate()), "Output contains unexpected line matching '" + WARNING_PATTERN + "'"); - assertFalse(errors.contains(UPGRADE_MESSAGE), "Output contains unexpected line '" + UPGRADE_MESSAGE + "'"); + assertTrue( + output.contains(expectedMessage), "Output does not contain '" + expectedMessage + "'"); + assertFalse( + errors.stream().anyMatch(WARNING_PATTERN.asPredicate()), + "Output contains unexpected line matching '" + WARNING_PATTERN + "'"); + assertFalse( + errors.contains(UPGRADE_MESSAGE), + "Output contains unexpected line '" + UPGRADE_MESSAGE + "'"); } - private static Process startAndWaitForJvmWithAgentForJava(String javaHomeEnv, String message) throws IOException { + private static Process startAndWaitForJvmWithAgentForJava(String javaHomeEnv, String message) + throws IOException { String javaHome = System.getenv(javaHomeEnv); checkFile(javaHome, javaHomeEnv); String javaAgent = System.getProperty("test.published.dependencies.agent"); @@ -82,7 +96,9 @@ private static void checkFile(String file, String name) { } private static List getLines(InputStream inputStream) { - return new BufferedReader(new InputStreamReader(inputStream)).lines().collect(Collectors.toList()); + return new BufferedReader(new InputStreamReader(inputStream)) + .lines() + .collect(Collectors.toList()); } private static void logProcessOutput(List output, List errors) { diff --git a/test-published-dependencies/all-deps-exist/src/main/java/test/published/dependencies/App.java b/test-published-dependencies/all-deps-exist/src/main/java/test/published/dependencies/App.java index 071a32fb496..341942ce9ca 100644 --- a/test-published-dependencies/all-deps-exist/src/main/java/test/published/dependencies/App.java +++ b/test-published-dependencies/all-deps-exist/src/main/java/test/published/dependencies/App.java @@ -13,6 +13,5 @@ public static void main(String[] args) { } @Trace - void tracedMethod() { - } + void tracedMethod() {} } diff --git a/test-published-dependencies/ot-pulls-in-api/src/main/java/test/published/dependencies/App.java b/test-published-dependencies/ot-pulls-in-api/src/main/java/test/published/dependencies/App.java index 071a32fb496..341942ce9ca 100644 --- a/test-published-dependencies/ot-pulls-in-api/src/main/java/test/published/dependencies/App.java +++ b/test-published-dependencies/ot-pulls-in-api/src/main/java/test/published/dependencies/App.java @@ -13,6 +13,5 @@ public static void main(String[] args) { } @Trace - void tracedMethod() { - } + void tracedMethod() {} } diff --git a/test-published-dependencies/ot-pulls-in-api/src/test/java/CreateTracerTest.java b/test-published-dependencies/ot-pulls-in-api/src/test/java/CreateTracerTest.java index 6a16f229493..a6f1224ec73 100644 --- a/test-published-dependencies/ot-pulls-in-api/src/test/java/CreateTracerTest.java +++ b/test-published-dependencies/ot-pulls-in-api/src/test/java/CreateTracerTest.java @@ -1,8 +1,8 @@ import datadog.opentracing.DDTracer; import io.opentracing.util.GlobalTracer; -import org.junit.jupiter.api.Test; import java.nio.file.Files; import java.nio.file.Path; +import org.junit.jupiter.api.Test; public class CreateTracerTest { From ca06f36f9b6aa1ffbc1887c19a7a5bf533738cc7 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Wed, 8 Oct 2025 14:45:35 +0200 Subject: [PATCH 4/5] fix: Exclude generated files and more generally anything in the build directory --- gradle/spotless.gradle | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gradle/spotless.gradle b/gradle/spotless.gradle index afaf6ff9283..3c64ef5c0a0 100644 --- a/gradle/spotless.gradle +++ b/gradle/spotless.gradle @@ -5,6 +5,8 @@ def configPath = rootProject.hasProperty('sharedConfigDirectory') ? sharedConfig // This is necessary for some projects that set a special groovy target which can't coexist with excludeJava boolean groovySkipJavaExclude = project.hasProperty('groovySkipJavaExclude') ? groovySkipJavaExclude : false +def buildDirectoryFiles = project.layout.buildDirectory.asFileTree + spotless { if (rootProject.hasProperty('skipSpotless')) { // Spotless in JDK 8 uses an older eclipse formatter, and it has a (flaky) bug crashing check_profiling. @@ -17,8 +19,8 @@ spotless { toggleOffOn() // set explicit target to workaround https://github.com/diffplug/spotless/issues/1163 target 'src/**/*.java' - // ignore embedded test projects - targetExclude 'src/test/resources/**' + // ignore embedded test projects and everything in build dir, e.g. generated sources + targetExclude('src/test/resources/**', buildDirectoryFiles) // This is the last Google Java Format version that supports Java 8 googleJavaFormat('1.7') } @@ -55,6 +57,7 @@ spotless { // the Groovy Eclipse formatter extends the Java Eclipse formatter, // so it formats Java files by default (unless `excludeJava` is used). } + targetExclude(buildDirectoryFiles) greclipse().configFile(configPath + '/enforcement/spotless-groovy.properties') } } @@ -62,6 +65,7 @@ spotless { project.pluginManager.withPlugin('scala') { scala { toggleOffOn() + targetExclude(buildDirectoryFiles) scalafmt('2.7.5').configFile(configPath + '/enforcement/spotless-scalafmt.conf') } } @@ -85,6 +89,7 @@ spotless { kotlin { toggleOffOn() // ktfmt('0.40').kotlinlangStyle() // needs Java 11+ + targetExclude(buildDirectoryFiles) // Newer versions do not work well with the older version of kotlin in this build ktlint('0.41.0').userData(['indent_size': '2', 'continuation_indent_size': '2']) } From 16aecb0648ee3b74ff8f4134d9f07cef97f91d5d Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Wed, 8 Oct 2025 17:41:47 +0200 Subject: [PATCH 5/5] fix: Single kotlin plugin version but configure each projects --- build.gradle.kts | 1 + buildSrc/src/main/groovy/InstrumentPlugin.groovy | 2 +- dd-java-agent/agent-ci-visibility/build.gradle | 2 +- dd-java-agent/agent-llmobs/build.gradle | 12 +++++++++++- .../junit/junit-4.10/build.gradle | 13 ++++++++++++- .../kotlin-coroutines/build.gradle | 13 ++++++++++++- dd-smoke-tests/iast-propagation/build.gradle | 16 ++++++++++------ gradle/libs.versions.toml | 1 + 8 files changed, 49 insertions(+), 11 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f76a199988a..eb7d87b4c43 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,6 +13,7 @@ plugins { id("com.gradleup.shadow") version "8.3.6" apply false id("me.champeau.jmh") version "0.7.3" apply false id("org.gradle.playframework") version "0.13" apply false + kotlin("jvm") version libs.versions.kotlin.plugin apply false } description = "dd-trace-java" diff --git a/buildSrc/src/main/groovy/InstrumentPlugin.groovy b/buildSrc/src/main/groovy/InstrumentPlugin.groovy index aba81035237..781e059d765 100644 --- a/buildSrc/src/main/groovy/InstrumentPlugin.groovy +++ b/buildSrc/src/main/groovy/InstrumentPlugin.groovy @@ -35,7 +35,7 @@ class InstrumentPlugin implements Plugin { InstrumentExtension extension = project.extensions.create('instrument', InstrumentExtension) project.tasks.matching { - it.name in ['compileJava', 'compileScala', 'compileKotlin', 'compileGroovy'] || + it.name in ['compileJava', 'compileScala', 'compileGroovy'] || it.name =~ /compileMain_.+Java/ }.all { AbstractCompile compileTask = it as AbstractCompile diff --git a/dd-java-agent/agent-ci-visibility/build.gradle b/dd-java-agent/agent-ci-visibility/build.gradle index 9727bdd4bc6..d0329234de8 100644 --- a/dd-java-agent/agent-ci-visibility/build.gradle +++ b/dd-java-agent/agent-ci-visibility/build.gradle @@ -2,7 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { id 'com.gradleup.shadow' - id 'org.jetbrains.kotlin.jvm' version libs.versions.kotlin + id 'org.jetbrains.kotlin.jvm' version libs.versions.kotlin.plugin } apply from: "$rootDir/gradle/java.gradle" diff --git a/dd-java-agent/agent-llmobs/build.gradle b/dd-java-agent/agent-llmobs/build.gradle index d2ee0de7a73..b0a327bbcff 100644 --- a/dd-java-agent/agent-llmobs/build.gradle +++ b/dd-java-agent/agent-llmobs/build.gradle @@ -1,14 +1,24 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion plugins { id 'com.gradleup.shadow' - id 'org.jetbrains.kotlin.jvm' version libs.versions.kotlin + id 'org.jetbrains.kotlin.jvm' } apply from: "$rootDir/gradle/java.gradle" apply from: "$rootDir/gradle/version.gradle" apply from: "$rootDir/gradle/test-with-kotlin.gradle" +kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + apiVersion = KotlinVersion.KOTLIN_1_6 + languageVersion = KotlinVersion.KOTLIN_1_6 + } +} + minimumBranchCoverage = 0.0 minimumInstructionCoverage = 0.0 diff --git a/dd-java-agent/instrumentation/junit/junit-4.10/build.gradle b/dd-java-agent/instrumentation/junit/junit-4.10/build.gradle index 0b44b8acb70..9a997af6f88 100644 --- a/dd-java-agent/instrumentation/junit/junit-4.10/build.gradle +++ b/dd-java-agent/instrumentation/junit/junit-4.10/build.gradle @@ -1,5 +1,8 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion + plugins { - id 'org.jetbrains.kotlin.jvm' version libs.versions.kotlin + id 'org.jetbrains.kotlin.jvm' } apply from: "$rootDir/gradle/java.gradle" @@ -14,6 +17,14 @@ muzzle { } } +kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + apiVersion = KotlinVersion.KOTLIN_1_6 + languageVersion = KotlinVersion.KOTLIN_1_6 + } +} + addTestSuiteForDir('latestDepTest', 'test') tasks.named("compileLatestDepTestGroovy", GroovyCompile) { diff --git a/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle b/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle index f65f20f5c62..6394f77249c 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle +++ b/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle @@ -1,6 +1,9 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion + plugins { id 'java-test-fixtures' - id 'org.jetbrains.kotlin.jvm' version libs.versions.kotlin + id 'org.jetbrains.kotlin.jvm' version libs.versions.kotlin.plugin } muzzle { @@ -25,6 +28,14 @@ muzzle { apply from: "$rootDir/gradle/java.gradle" apply from: "$rootDir/gradle/test-with-kotlin.gradle" +kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + apiVersion = KotlinVersion.KOTLIN_1_6 + languageVersion = KotlinVersion.KOTLIN_1_6 + } +} + addTestSuite('latestDepTest') tasks.named("compileTestFixturesGroovy", GroovyCompile) { diff --git a/dd-smoke-tests/iast-propagation/build.gradle b/dd-smoke-tests/iast-propagation/build.gradle index 821e49f2599..3055ff472c6 100644 --- a/dd-smoke-tests/iast-propagation/build.gradle +++ b/dd-smoke-tests/iast-propagation/build.gradle @@ -1,11 +1,11 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion plugins { id 'com.gradleup.shadow' id 'java' - id 'org.jetbrains.kotlin.jvm' version '1.9.24' + id 'org.jetbrains.kotlin.jvm' version libs.versions.kotlin.plugin id 'scala' id 'groovy' } @@ -13,6 +13,14 @@ plugins { apply from: "$rootDir/gradle/java.gradle" description = 'IAST propagation Smoke Tests.' +kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + apiVersion = KotlinVersion.KOTLIN_1_9 + languageVersion = KotlinVersion.KOTLIN_1_9 + } +} + // The standard spring-boot plugin doesn't play nice with our project // so we'll build a fat jar instead tasks.named("jar", Jar) { @@ -48,7 +56,3 @@ tasks.withType(ScalaCompile).configureEach { // * https://github.com/gradle/gradle/issues/19456 configureCompiler(it, 8) } - -tasks.withType(KotlinCompile).configureEach { - compilerOptions.jvmTarget = JvmTarget.JVM_1_8 -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3d6506ffbae..594faac9666 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,6 +18,7 @@ scala212 = "2.12.18" scala213 = "2.13.11" scala33 = "3.3.0" kotlin = "1.6.21" +kotlin-plugin = "1.9.24" coroutines = "1.3.0" dogstatsd = "4.4.3" jnr-unixsocket = "0.38.22"