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 15e0aa69845..d0329234de8 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.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 12faf86f135..b0a327bbcff 100644 --- a/dd-java-agent/agent-llmobs/build.gradle +++ b/dd-java-agent/agent-llmobs/build.gradle @@ -1,23 +1,24 @@ 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() - } -} +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion plugins { id 'com.gradleup.shadow' + 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/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/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/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/junit/junit-4.10/build.gradle b/dd-java-agent/instrumentation/junit/junit-4.10/build.gradle index 53ca08ce9d4..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,3 +1,10 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion + +plugins { + id 'org.jetbrains.kotlin.jvm' +} + apply from: "$rootDir/gradle/java.gradle" apply from: "$rootDir/gradle/test-with-kotlin.gradle" @@ -10,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 1a8fbbb2e1f..6394f77249c 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle +++ b/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle @@ -1,5 +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.plugin } muzzle { @@ -24,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-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) >>> 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" diff --git a/gradle/spotless.gradle b/gradle/spotless.gradle index 7dfc7126cc2..3c64ef5c0a0 100644 --- a/gradle/spotless.gradle +++ b/gradle/spotless.gradle @@ -5,30 +5,32 @@ 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 -spotless { +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. // 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 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') } } + 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 +49,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) { @@ -55,13 +57,15 @@ 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') } } - if (project.plugins.hasPlugin('scala')) { + project.pluginManager.withPlugin('scala') { scala { toggleOffOn() + targetExclude(buildDirectoryFiles) scalafmt('2.7.5').configFile(configPath + '/enforcement/spotless-scalafmt.conf') } } @@ -80,13 +84,22 @@ spotless { trimTrailingWhitespace() endWithNewline() } + + project.pluginManager.withPlugin('kotlin') { + 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']) + } + } } -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 -} 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 {