From 7e31bad576aa4c554e35e8b14d26696add65f812 Mon Sep 17 00:00:00 2001 From: hughsimpson Date: Wed, 13 Mar 2024 13:30:02 +0000 Subject: [PATCH] Bump packaged libs (#1329) * bump packaged oshi, newrelic, zipkin, nanojson, guava and slf4j-api dependencies; also bump scala 2.12 and scala 2.13 dependencies (was hitting a compilation error with 2.12.12 and it seemed prudent...) * bump opentelemetry dependency * revert slf4j bump. Make scala 2.13 default scalaVersion (fixes project load in intellIJ) * Ah. Scalafmt only applies to files included under the default scala version unless otherwise specified * apply scalafmt to a few more files and ensure lint is against all language versions --- .github/workflows/ci.yml | 2 +- build.sbt | 17 +++---- .../http/AkkaHttpServerInstrumentation.scala | 49 +++++++++++-------- .../http/AkkaHttpServerInstrumentation.scala | 36 ++++++++------ .../kamon/instrumentation/package.scala | 2 +- .../kamon/instrumentation/package.scala | 2 +- .../kamon/instrumentation/package.scala | 2 +- .../scala-2.11/scala/annotation/static.scala | 2 +- .../scala-2.13/scala/annotation/static.scala | 2 +- .../scala/FutureChainingInstrumentation.scala | 4 +- .../scala/FutureChainingInstrumentation.scala | 4 +- project/Build.scala | 8 +-- 12 files changed, 72 insertions(+), 58 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 921a8f4f4..4befb051e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,5 +24,5 @@ jobs: - uses: actions/checkout@v1 - uses: coursier/cache-action@v6 - name: Test - run: sbt -v "scalafmtCheckAll" + run: sbt -v "+scalafmtCheckAll" diff --git a/build.sbt b/build.sbt index 47770bb85..a35db90e4 100644 --- a/build.sbt +++ b/build.sbt @@ -58,7 +58,7 @@ lazy val `kamon-core` = (project in file("core/kamon-core")) ).inAll ), libraryDependencies ++= Seq( - "com.typesafe" % "config" % "1.4.1", + "com.typesafe" % "config" % "1.4.3", "org.slf4j" % "slf4j-api" % "1.7.36", "org.hdrhistogram" % "HdrHistogram" % "2.1.9" % "provided,shaded", "org.jctools" % "jctools-core" % "3.3.0" % "provided,shaded", @@ -189,7 +189,7 @@ lazy val `kamon-executors-bench` = (project in file("instrumentation/kamon-execu .settings(noPublishing: _*) .settings( libraryDependencies ++= Seq( - "com.google.guava" % "guava" % "24.1-jre", + "com.google.guava" % "guava" % "33.0.0-jre", kanelaAgent % "provided", ) ).dependsOn(`kamon-core`, `kamon-instrumentation-common`) @@ -876,7 +876,7 @@ lazy val `kamon-datadog` = (project in file("reporters/kamon-datadog")) ), libraryDependencies ++= Seq( okHttp % "shaded,provided", - "com.grack" % "nanojson" % "1.6", + "com.grack" % "nanojson" % "1.8", ("com.typesafe.play" %% "play-json" % "2.7.4" % "test").cross(CrossVersion.for3Use2_13), scalatest % "test", @@ -930,8 +930,8 @@ lazy val `kamon-zipkin` = (project in file("reporters/kamon-zipkin")) .disablePlugins(AssemblyPlugin) .settings( libraryDependencies ++= Seq( - "io.zipkin.reporter2" % "zipkin-reporter" % "2.7.15", - "io.zipkin.reporter2" % "zipkin-sender-okhttp3" % "2.7.15", + "io.zipkin.reporter2" % "zipkin-reporter" % "3.3.0", + "io.zipkin.reporter2" % "zipkin-sender-okhttp3" % "3.3.0", scalatest % "test" ) ).dependsOn(`kamon-core`) @@ -972,8 +972,8 @@ lazy val `kamon-newrelic` = (project in file("reporters/kamon-newrelic")) .disablePlugins(AssemblyPlugin) .settings( libraryDependencies ++= Seq( - "com.newrelic.telemetry" % "telemetry-core" % "0.15.0", - "com.newrelic.telemetry" % "telemetry-http-okhttp" % "0.15.0", + "com.newrelic.telemetry" % "telemetry-core" % "0.16.0", + "com.newrelic.telemetry" % "telemetry-http-okhttp" % "0.16.0", scalatest % "test", "org.mockito" % "mockito-core" % "3.12.4" % "test" ) @@ -983,8 +983,7 @@ lazy val `kamon-opentelemetry` = (project in file("reporters/kamon-opentelemetry .disablePlugins(AssemblyPlugin) .settings( libraryDependencies ++= Seq( - "io.opentelemetry" % "opentelemetry-exporter-otlp-http-trace" % "1.13.0", - "io.opentelemetry" % "opentelemetry-exporter-otlp-trace" % "1.13.0", + "io.opentelemetry" % "opentelemetry-exporter-otlp" % "1.35.0", // Compile-time dependency required in scala 3 "com.google.auto.value" % "auto-value-annotations" % "1.9" % "compile", diff --git a/instrumentation/kamon-akka-http/src/main/scala-2.11/kamon/instrumentation/akka/http/AkkaHttpServerInstrumentation.scala b/instrumentation/kamon-akka-http/src/main/scala-2.11/kamon/instrumentation/akka/http/AkkaHttpServerInstrumentation.scala index ce8fffb17..eec9f91b4 100644 --- a/instrumentation/kamon-akka-http/src/main/scala-2.11/kamon/instrumentation/akka/http/AkkaHttpServerInstrumentation.scala +++ b/instrumentation/kamon-akka-http/src/main/scala-2.11/kamon/instrumentation/akka/http/AkkaHttpServerInstrumentation.scala @@ -29,7 +29,6 @@ import kanela.agent.libs.net.bytebuddy.matcher.ElementMatchers.isPublic import scala.collection.immutable - class AkkaHttpServerInstrumentation extends InstrumentationBuilder { /** @@ -69,7 +68,10 @@ class AkkaHttpServerInstrumentation extends InstrumentationBuilder { onType("akka.http.scaladsl.server.directives.FutureDirectives$class") .intercept(method("onComplete"), classOf[ResolveOperationNameOnRouteInterceptor]) - onTypes("akka.http.scaladsl.server.directives.OnSuccessMagnet$", "akka.http.scaladsl.server.directives.CompleteOrRecoverWithMagnet$") + onTypes( + "akka.http.scaladsl.server.directives.OnSuccessMagnet$", + "akka.http.scaladsl.server.directives.CompleteOrRecoverWithMagnet$" + ) .intercept(method("apply"), classOf[ResolveOperationNameOnRouteInterceptor]) onType("akka.http.scaladsl.server.directives.RouteDirectives$class") @@ -97,12 +99,13 @@ trait HasMatchingContext { object HasMatchingContext { - case class PathMatchingContext ( + case class PathMatchingContext( fullPath: String, matched: Matched[_] ) - class Mixin(var matchingContext: Seq[PathMatchingContext], var defaultOperationName: String) extends HasMatchingContext { + class Mixin(var matchingContext: Seq[PathMatchingContext], var defaultOperationName: String) + extends HasMatchingContext { override def setMatchingContext(matchingContext: Seq[PathMatchingContext]): Unit = this.matchingContext = matchingContext @@ -136,7 +139,9 @@ object ResolveOperationNameOnRouteInterceptor { def complete[T](status: StatusCode, v: => T)(implicit m: ToEntityMarshaller[T]): StandardRoute = StandardRoute(resolveOperationName(_).complete((status, v))) - def complete[T](status: StatusCode, headers: immutable.Seq[HttpHeader], v: => T)(implicit m: ToEntityMarshaller[T]): StandardRoute = + def complete[T](status: StatusCode, headers: immutable.Seq[HttpHeader], v: => T)(implicit + m: ToEntityMarshaller[T] + ): StandardRoute = complete((status, headers, v)) def redirect(@Argument(1) uri: Uri, @Argument(2) redirectionType: Redirection): StandardRoute = @@ -185,18 +190,18 @@ object ResolveOperationNameOnRouteInterceptor { Kamon.currentContext().get(LastAutomaticOperationNameEdit.Key).foreach(lastEdit => { val currentSpan = Kamon.currentSpan() - if(lastEdit.allowAutomaticChanges) { - if(currentSpan.operationName() == lastEdit.operationName) { - val allMatches = requestContext.asInstanceOf[HasMatchingContext].matchingContext.reverse.map(singleMatch) - val operationName = allMatches.mkString("") + if (lastEdit.allowAutomaticChanges) { + if (currentSpan.operationName() == lastEdit.operationName) { + val allMatches = requestContext.asInstanceOf[HasMatchingContext].matchingContext.reverse.map(singleMatch) + val operationName = allMatches.mkString("") - if(operationName.nonEmpty) { + if (operationName.nonEmpty) { currentSpan - .name(operationName) - .takeSamplingDecision() + .name(operationName) + .takeSamplingDecision() - lastEdit.operationName = operationName - } + lastEdit.operationName = operationName + } } else { lastEdit.allowAutomaticChanges = false } @@ -214,7 +219,7 @@ object ResolveOperationNameOnRouteInterceptor { val consumedSegment = matching.fullPath.substring(0, consumedCount) matching.matched.extractions match { - case () => //string segment matched + case () => // string segment matched consumedSegment case tuple: Product => val values = tuple.productIterator.toList map { @@ -260,7 +265,9 @@ object RequestContextCopyInterceptor { @RuntimeType def copy(@This context: RequestContext, @SuperCall copyCall: Callable[RequestContext]): RequestContext = { val copiedRequestContext = copyCall.call() - copiedRequestContext.asInstanceOf[HasMatchingContext].setMatchingContext(context.asInstanceOf[HasMatchingContext].matchingContext) + copiedRequestContext.asInstanceOf[HasMatchingContext].setMatchingContext( + context.asInstanceOf[HasMatchingContext].matchingContext + ) copiedRequestContext } } @@ -288,8 +295,7 @@ object PathDirectivesRawPathPrefixInterceptor { } flatMap { case (ctx, Matched(rest, values)) => tprovide(values) & mapRequestContext(_ withUnmatchedPath rest) & mapRouteResult { routeResult => - - if(routeResult.isInstanceOf[Rejected]) + if (routeResult.isInstanceOf[Rejected]) ctx.asInstanceOf[HasMatchingContext].popOneMatchingContext() routeResult @@ -300,7 +306,6 @@ object PathDirectivesRawPathPrefixInterceptor { } } - object Http2BlueprintInterceptor { case class HandlerWithEndpoint(interface: String, port: Int, handler: HttpRequest => Future[HttpResponse]) @@ -310,8 +315,10 @@ object Http2BlueprintInterceptor { } @RuntimeType - def handleWithStreamIdHeader(@Argument(1) handler: HttpRequest => Future[HttpResponse], - @SuperCall zuper: Callable[Flow[HttpRequest, HttpResponse, NotUsed]]): Flow[HttpRequest, HttpResponse, NotUsed] = { + def handleWithStreamIdHeader( + @Argument(1) handler: HttpRequest => Future[HttpResponse], + @SuperCall zuper: Callable[Flow[HttpRequest, HttpResponse, NotUsed]] + ): Flow[HttpRequest, HttpResponse, NotUsed] = { handler match { case HandlerWithEndpoint(interface, port, _) => diff --git a/instrumentation/kamon-akka-http/src/main/scala-2.13+/kamon/instrumentation/akka/http/AkkaHttpServerInstrumentation.scala b/instrumentation/kamon-akka-http/src/main/scala-2.13+/kamon/instrumentation/akka/http/AkkaHttpServerInstrumentation.scala index 3249bb74b..320d8dda1 100644 --- a/instrumentation/kamon-akka-http/src/main/scala-2.13+/kamon/instrumentation/akka/http/AkkaHttpServerInstrumentation.scala +++ b/instrumentation/kamon-akka-http/src/main/scala-2.13+/kamon/instrumentation/akka/http/AkkaHttpServerInstrumentation.scala @@ -30,8 +30,8 @@ import kanela.agent.libs.net.bytebuddy.matcher.ElementMatchers.isPublic import scala.annotation.static import scala.collection.immutable - class AkkaHttpServerInstrumentation extends InstrumentationBuilder { + /** * When instrumenting bindAndHandle what we do is wrap the Flow[HttpRequest, HttpResponse, NotUsed] provided by * the user and add all the processing there. This is the part of the instrumentation that performs Context @@ -70,7 +70,10 @@ class AkkaHttpServerInstrumentation extends InstrumentationBuilder { onType("akka.http.scaladsl.server.directives.FutureDirectives") .intercept(method("onComplete"), classOf[ResolveOperationNameOnRouteInterceptor]) - onTypes("akka.http.scaladsl.server.directives.OnSuccessMagnet$", "akka.http.scaladsl.server.directives.CompleteOrRecoverWithMagnet$") + onTypes( + "akka.http.scaladsl.server.directives.OnSuccessMagnet$", + "akka.http.scaladsl.server.directives.CompleteOrRecoverWithMagnet$" + ) .intercept(method("apply"), classOf[ResolveOperationNameOnRouteInterceptor]) onType("akka.http.scaladsl.server.directives.RouteDirectives") @@ -78,7 +81,6 @@ class AkkaHttpServerInstrumentation extends InstrumentationBuilder { .intercept(method("redirect"), classOf[ResolveOperationNameOnRouteInterceptor]) .intercept(method("failWith"), classOf[ResolveOperationNameOnRouteInterceptor]) - /** * Akka-http 10.1.x compatibility. */ @@ -106,12 +108,13 @@ trait HasMatchingContext { object HasMatchingContext { - case class PathMatchingContext ( + case class PathMatchingContext( fullPath: String, matched: Matched[_] ) - class Mixin(var matchingContext: Seq[PathMatchingContext], var defaultOperationName: String) extends HasMatchingContext { + class Mixin(var matchingContext: Seq[PathMatchingContext], var defaultOperationName: String) + extends HasMatchingContext { override def setMatchingContext(matchingContext: Seq[PathMatchingContext]): Unit = this.matchingContext = matchingContext @@ -145,7 +148,9 @@ object ResolveOperationNameOnRouteInterceptor { def complete[T](status: StatusCode, v: => T)(implicit m: ToEntityMarshaller[T]): StandardRoute = StandardRoute(resolveOperationName(_).complete((status, v))) - def complete[T](status: StatusCode, headers: immutable.Seq[HttpHeader], v: => T)(implicit m: ToEntityMarshaller[T]): StandardRoute = + def complete[T](status: StatusCode, headers: immutable.Seq[HttpHeader], v: => T)(implicit + m: ToEntityMarshaller[T] + ): StandardRoute = complete((status, headers, v)) def redirect(uri: Uri, redirectionType: Redirection): StandardRoute = @@ -194,8 +199,8 @@ object ResolveOperationNameOnRouteInterceptor { Kamon.currentContext().get(LastAutomaticOperationNameEdit.Key).foreach(lastEdit => { val currentSpan = Kamon.currentSpan() - if(lastEdit.allowAutomaticChanges) { - if(currentSpan.operationName() == lastEdit.operationName) { + if (lastEdit.allowAutomaticChanges) { + if (currentSpan.operationName() == lastEdit.operationName) { val allMatches = requestContext.asInstanceOf[HasMatchingContext].matchingContext.reverse.map(singleMatch) val operationName = allMatches.mkString("") @@ -223,7 +228,7 @@ object ResolveOperationNameOnRouteInterceptor { val consumedSegment = matching.fullPath.substring(0, consumedCount) matching.matched.extractions match { - case () => //string segment matched + case () => // string segment matched consumedSegment case tuple: Product => val values = tuple.productIterator.toList map { @@ -270,7 +275,9 @@ object RequestContextCopyInterceptor { @RuntimeType @static def copy(@This context: RequestContext, @SuperCall copyCall: Callable[RequestContext]): RequestContext = { val copiedRequestContext = copyCall.call() - copiedRequestContext.asInstanceOf[HasMatchingContext].setMatchingContext(context.asInstanceOf[HasMatchingContext].matchingContext) + copiedRequestContext.asInstanceOf[HasMatchingContext].setMatchingContext( + context.asInstanceOf[HasMatchingContext].matchingContext + ) copiedRequestContext } } @@ -297,8 +304,7 @@ object PathDirectivesRawPathPrefixInterceptor { } flatMap { case (ctx, Matched(rest, values)) => tprovide[T](values) & mapRequestContext(_ withUnmatchedPath rest) & mapRouteResult { routeResult => - - if(routeResult.isInstanceOf[Rejected]) + if (routeResult.isInstanceOf[Rejected]) ctx.asInstanceOf[HasMatchingContext].popOneMatchingContext() routeResult @@ -319,8 +325,10 @@ object Http2BlueprintInterceptor { } @RuntimeType - @static def handleWithStreamIdHeader(@Argument(1) handler: HttpRequest => Future[HttpResponse], - @SuperCall zuper: Callable[Flow[HttpRequest, HttpResponse, NotUsed]]): Flow[HttpRequest, HttpResponse, NotUsed] = { + @static def handleWithStreamIdHeader( + @Argument(1) handler: HttpRequest => Future[HttpResponse], + @SuperCall zuper: Callable[Flow[HttpRequest, HttpResponse, NotUsed]] + ): Flow[HttpRequest, HttpResponse, NotUsed] = { handler match { case HandlerWithEndpoint(interface, port, _) => diff --git a/instrumentation/kamon-executors/src/main/scala-2.11/kamon/instrumentation/package.scala b/instrumentation/kamon-executors/src/main/scala-2.11/kamon/instrumentation/package.scala index 3a71df10c..71468873f 100644 --- a/instrumentation/kamon-executors/src/main/scala-2.11/kamon/instrumentation/package.scala +++ b/instrumentation/kamon-executors/src/main/scala-2.11/kamon/instrumentation/package.scala @@ -1,4 +1,4 @@ package kamon.instrumentation package object executor { - type ScalaForkJoinPool = scala.concurrent.forkjoin.ForkJoinPool + type ScalaForkJoinPool = scala.concurrent.forkjoin.ForkJoinPool } diff --git a/instrumentation/kamon-executors/src/main/scala-2.13/kamon/instrumentation/package.scala b/instrumentation/kamon-executors/src/main/scala-2.13/kamon/instrumentation/package.scala index 08849bb57..a63825c5f 100644 --- a/instrumentation/kamon-executors/src/main/scala-2.13/kamon/instrumentation/package.scala +++ b/instrumentation/kamon-executors/src/main/scala-2.13/kamon/instrumentation/package.scala @@ -1,4 +1,4 @@ package kamon.instrumentation package object executor { - type ScalaForkJoinPool = java.util.concurrent.ForkJoinPool + type ScalaForkJoinPool = java.util.concurrent.ForkJoinPool } diff --git a/instrumentation/kamon-executors/src/main/scala-3/kamon/instrumentation/package.scala b/instrumentation/kamon-executors/src/main/scala-3/kamon/instrumentation/package.scala index 08849bb57..a63825c5f 100644 --- a/instrumentation/kamon-executors/src/main/scala-3/kamon/instrumentation/package.scala +++ b/instrumentation/kamon-executors/src/main/scala-3/kamon/instrumentation/package.scala @@ -1,4 +1,4 @@ package kamon.instrumentation package object executor { - type ScalaForkJoinPool = java.util.concurrent.ForkJoinPool + type ScalaForkJoinPool = java.util.concurrent.ForkJoinPool } diff --git a/instrumentation/kamon-instrumentation-common/src/main/scala-2.11/scala/annotation/static.scala b/instrumentation/kamon-instrumentation-common/src/main/scala-2.11/scala/annotation/static.scala index 0ebf81c1d..2d336e2e3 100644 --- a/instrumentation/kamon-instrumentation-common/src/main/scala-2.11/scala/annotation/static.scala +++ b/instrumentation/kamon-instrumentation-common/src/main/scala-2.11/scala/annotation/static.scala @@ -1,4 +1,4 @@ package scala.annotation import scala.annotation.meta._ -final class static extends StaticAnnotation \ No newline at end of file +final class static extends StaticAnnotation diff --git a/instrumentation/kamon-instrumentation-common/src/main/scala-2.13/scala/annotation/static.scala b/instrumentation/kamon-instrumentation-common/src/main/scala-2.13/scala/annotation/static.scala index 0ebf81c1d..2d336e2e3 100644 --- a/instrumentation/kamon-instrumentation-common/src/main/scala-2.13/scala/annotation/static.scala +++ b/instrumentation/kamon-instrumentation-common/src/main/scala-2.13/scala/annotation/static.scala @@ -1,4 +1,4 @@ package scala.annotation import scala.annotation.meta._ -final class static extends StaticAnnotation \ No newline at end of file +final class static extends StaticAnnotation diff --git a/instrumentation/kamon-scala-future/src/main/scala-2.11/kamon/instrumentation/futures/scala/FutureChainingInstrumentation.scala b/instrumentation/kamon-scala-future/src/main/scala-2.11/kamon/instrumentation/futures/scala/FutureChainingInstrumentation.scala index 745b76280..0ae9ee53d 100644 --- a/instrumentation/kamon-scala-future/src/main/scala-2.11/kamon/instrumentation/futures/scala/FutureChainingInstrumentation.scala +++ b/instrumentation/kamon-scala-future/src/main/scala-2.11/kamon/instrumentation/futures/scala/FutureChainingInstrumentation.scala @@ -71,7 +71,7 @@ object CallbackRunnableRunInstrumentation { def enter(@Advice.This runnable: HasContext with HasTimestamp with InternalState): Scope = { val timestamp = runnable.timestamp val valueContext = runnable.valueBridge().asInstanceOf[HasContext].context - val context = if(valueContext.nonEmpty()) valueContext else runnable.context + val context = if (valueContext.nonEmpty()) valueContext else runnable.context storeCurrentRunnableTimestamp(timestamp) Kamon.storeContext(context) @@ -127,4 +127,4 @@ object CopyCurrentContextToArgument { @Advice.OnMethodEnter(suppress = classOf[Throwable]) def enter(@Advice.Argument(0) arg: Any): Unit = arg.asInstanceOf[HasContext].setContext(Kamon.currentContext()) -} \ No newline at end of file +} diff --git a/instrumentation/kamon-scala-future/src/main/scala-2.13/kamon/instrumentation/futures/scala/FutureChainingInstrumentation.scala b/instrumentation/kamon-scala-future/src/main/scala-2.13/kamon/instrumentation/futures/scala/FutureChainingInstrumentation.scala index 519ecfa41..f08ea3913 100644 --- a/instrumentation/kamon-scala-future/src/main/scala-2.13/kamon/instrumentation/futures/scala/FutureChainingInstrumentation.scala +++ b/instrumentation/kamon-scala-future/src/main/scala-2.13/kamon/instrumentation/futures/scala/FutureChainingInstrumentation.scala @@ -74,7 +74,7 @@ object CallbackRunnableRunInstrumentation { def enter(@Advice.This runnable: HasContext with HasTimestamp with InternalState): Scope = { val timestamp = runnable.timestamp val valueContext = runnable.valueBridge().asInstanceOf[HasContext].context - val context = if(valueContext.nonEmpty()) valueContext else runnable.context + val context = if (valueContext.nonEmpty()) valueContext else runnable.context storeCurrentRunnableTimestamp(timestamp) Kamon.storeContext(context) @@ -138,4 +138,4 @@ object CleanContextFromSeedFuture { } } -} \ No newline at end of file +} diff --git a/project/Build.scala b/project/Build.scala index a2b6bb105..693d261d2 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -35,7 +35,7 @@ object BaseProject extends AutoPlugin { val okHttp = "com.squareup.okhttp3" % "okhttp" % "4.12.0" val okHttpMockServer = "com.squareup.okhttp3" % "mockwebserver" % "4.10.0" val jsqlparser = "com.github.jsqlparser" % "jsqlparser" % "4.1" - val oshiCore = "com.github.oshi" % "oshi-core" % "5.7.5" + val oshiCore = "com.github.oshi" % "oshi-core" % "6.4.13" val kanelaAgentVersion = settingKey[String]("Kanela Agent version") @@ -57,8 +57,8 @@ object BaseProject extends AutoPlugin { ) val `scala_2.11_version` = "2.11.12" - val `scala_2.12_version` = "2.12.15" - val `scala_2.13_version` = "2.13.8" + val `scala_2.12_version` = "2.12.19" + val `scala_2.13_version` = "2.13.13" val scala_3_version = "3.3.1" // This installs the GPG signing key from the @@ -134,7 +134,7 @@ object BaseProject extends AutoPlugin { private lazy val compilationSettings = Seq( crossPaths := true, - scalaVersion := autoImport.`scala_2.12_version`, + scalaVersion := autoImport.`scala_2.13_version`, crossScalaVersions := Seq( autoImport.`scala_2.11_version`, autoImport.`scala_2.12_version`,