From a80fd97201db4fea9f9e893686be996a715b6a31 Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Mon, 7 Oct 2019 17:37:41 +0200 Subject: [PATCH 01/13] feat: Add Monix and ZIO bundles, Micrometer and PureConfig interop --- build.sbt | 73 ++++++++++++++++--- .../com/avast/sst/bundle/MonixServerApp.scala | 31 ++++++++ .../com/avast/sst/bundle/ZioServerApp.scala | 34 +++++++++ example/src/main/resources/reference.conf | 8 ++ .../scala/com/avast/sst/example/Main.scala | 37 +++++----- .../sst/example/config/Configuration.scala | 6 +- .../example/module/Http4sRoutingModule.scala | 26 +++++++ .../micrometer/jmx/MicrometerJmxConfig.scala | 3 + .../micrometer/jmx/MicrometerJmxModule.scala | 50 +++++++++++++ .../jmx/TypeScopeNameObjectNameFactory.scala | 50 +++++++++++++ .../sst/micrometer/HttpStatusMetrics.scala | 22 ++++++ .../sst/micrometer/MicrometerJvmModule.scala | 20 +++++ .../interop/Http4sRouteMetrics.scala | 41 +++++++++++ .../interop/Http4sServerMetrics.scala | 45 ++++++++++++ .../MicrometerHttp4sServerMetricsModule.scala | 21 ++++++ project/Dependencies.scala | 5 ++ .../implicits/Http4sBlazeClient.scala | 29 ++++++++ .../implicits/Http4sBlazeServer.scala | 14 ++++ .../pureconfig/implicits/JvmExecution.scala | 21 ++++++ .../sst/pureconfig/implicits/JvmSsl.scala | 28 +++++++ .../pureconfig/implicits/MicrometerJmx.scala | 11 +++ 21 files changed, 548 insertions(+), 27 deletions(-) create mode 100644 bundle-monix-http4s-blaze/src/main/scala/com/avast/sst/bundle/MonixServerApp.scala create mode 100644 bundle-zio-http4s-blaze/src/main/scala/com/avast/sst/bundle/ZioServerApp.scala create mode 100644 example/src/main/scala/com/avast/sst/example/module/Http4sRoutingModule.scala create mode 100644 micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxConfig.scala create mode 100644 micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala create mode 100644 micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala create mode 100644 micrometer/src/main/scala/com/avast/sst/micrometer/HttpStatusMetrics.scala create mode 100644 micrometer/src/main/scala/com/avast/sst/micrometer/MicrometerJvmModule.scala create mode 100644 micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sRouteMetrics.scala create mode 100644 micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sServerMetrics.scala create mode 100644 micrometer/src/main/scala/com/avast/sst/micrometer/interop/MicrometerHttp4sServerMetricsModule.scala create mode 100644 pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala create mode 100644 pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala create mode 100644 pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala create mode 100644 pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala create mode 100644 pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala diff --git a/build.sbt b/build.sbt index 596552519..dcca86db4 100644 --- a/build.sbt +++ b/build.sbt @@ -17,14 +17,47 @@ lazy val commonSettings = BuildSettings.common ++ Seq( lazy val root = project .in(file(".")) - .aggregate(example, http4sBlazeClient, http4sBlazeServer, jvmExecution, jvmSsl, jvmSystem, pureconfig) + .aggregate( + bundleMonixHttp4sBlaze, + bundleZioHttp4sBlaze, + example, + http4sBlazeClient, + http4sBlazeServer, + jvmExecution, + jvmSsl, + jvmSystem, + micrometer, + micrometerJmx, + pureconfig + ) .settings( name := "scala-server-toolkit", publish / skip := true ) +lazy val bundleMonixHttp4sBlaze = project + .in(file("bundle-monix-http4s-blaze")) + .dependsOn(http4sBlazeClient, http4sBlazeServer, micrometer, micrometerJmx, pureconfig) + .settings(commonSettings) + .settings( + name := "sst-bundle-monix-http4s-blaze", + libraryDependencies += Dependencies.monixEval + ) + +lazy val bundleZioHttp4sBlaze = project + .in(file("bundle-zio-http4s-blaze")) + .dependsOn(http4sBlazeClient, http4sBlazeServer, micrometer, micrometerJmx, pureconfig) + .settings(commonSettings) + .settings( + name := "sst-bundle-zio-http4s-blaze", + libraryDependencies ++= Seq( + Dependencies.zio, + Dependencies.zioInteropCats + ) + ) + lazy val example = project - .dependsOn(jvmExecution, http4sBlazeClient, http4sBlazeServer, jvmSsl, jvmSystem, pureconfig) + .dependsOn(bundleZioHttp4sBlaze, jvmExecution, jvmSystem) .enablePlugins(MdocPlugin) .settings(commonSettings) .settings( @@ -34,10 +67,7 @@ lazy val example = project Global / cancelable := true, mdocIn := baseDirectory.value / "src" / "main" / "mdoc", mdocOut := baseDirectory.value / ".." / "docs", - libraryDependencies ++= Seq( - Dependencies.zio, - Dependencies.zioInteropCats - ) + libraryDependencies += Dependencies.logbackClassic ) lazy val http4sBlazeClient = project @@ -64,27 +94,52 @@ lazy val http4sBlazeServer = project lazy val jvmExecution = project .in(file("jvm-execution")) + .settings(commonSettings) .settings( - commonSettings, name := "sst-jvm-execution", libraryDependencies += Dependencies.slf4jApi ) lazy val jvmSsl = project .in(file("jvm-ssl")) + .settings(commonSettings) .settings( - commonSettings, name := "sst-jvm-ssl" ) lazy val jvmSystem = project .in(file("jvm-system")) + .settings(commonSettings) .settings( - commonSettings, name := "sst-jvm-system" ) +lazy val micrometer = project + .in(file("micrometer")) + .dependsOn(http4sBlazeServer % Optional) + .settings(commonSettings) + .settings( + name := "sst-micrometer", + libraryDependencies ++= Seq(Dependencies.micrometerCore, Dependencies.jsr305) + ) + +lazy val micrometerJmx = project + .in(file("micrometer-jmx")) + .settings(commonSettings) + .settings( + name := "sst-micrometer-jmx", + libraryDependencies ++= Seq( + Dependencies.micrometerJmx, + Dependencies.jsr305 + ) + ) + lazy val pureconfig = project + .dependsOn(http4sBlazeClient % Optional, + http4sBlazeServer % Optional, + jvmExecution % Optional, + jvmSsl % Optional, + micrometerJmx % Optional) .settings(commonSettings) .settings( name := "sst-pureconfig", diff --git a/bundle-monix-http4s-blaze/src/main/scala/com/avast/sst/bundle/MonixServerApp.scala b/bundle-monix-http4s-blaze/src/main/scala/com/avast/sst/bundle/MonixServerApp.scala new file mode 100644 index 000000000..616857afe --- /dev/null +++ b/bundle-monix-http4s-blaze/src/main/scala/com/avast/sst/bundle/MonixServerApp.scala @@ -0,0 +1,31 @@ +package com.avast.sst.bundle + +import cats.effect.{ExitCode, Resource} +import monix.eval.{Task, TaskApp} +import org.http4s.server.Server +import org.slf4j.LoggerFactory + +trait MonixServerApp extends TaskApp { + + private val logger = LoggerFactory.getLogger(this.getClass) + + def program: Resource[Task, Server[Task]] + + override def run(args: List[String]): Task[ExitCode] = { + program + .use { server => + for { + _ <- Task.delay(logger.info(s"Server started @ ${server.address.getHostString}:${server.address.getPort}")) + _ <- Task.never[Unit] + } yield server + } + .redeem( + ex => { + logger.error("Server initialization failed!", ex) + ExitCode.Error + }, + _ => ExitCode.Success + ) + } + +} diff --git a/bundle-zio-http4s-blaze/src/main/scala/com/avast/sst/bundle/ZioServerApp.scala b/bundle-zio-http4s-blaze/src/main/scala/com/avast/sst/bundle/ZioServerApp.scala new file mode 100644 index 000000000..9fb61cc87 --- /dev/null +++ b/bundle-zio-http4s-blaze/src/main/scala/com/avast/sst/bundle/ZioServerApp.scala @@ -0,0 +1,34 @@ +package com.avast.sst.bundle + +import cats.effect.Resource +import com.github.ghik.silencer.silent +import org.http4s.server.Server +import org.slf4j.LoggerFactory +import zio.interop.catz._ +import zio.{Task, UIO, ZIO} + +trait ZioServerApp extends CatsApp { + + private val logger = LoggerFactory.getLogger(this.getClass) + + def program: Resource[Task, Server[Task]] + + @silent("dead code") + override def run(args: List[String]): ZIO[Environment, Nothing, Int] = { + program + .use { server => + for { + _ <- UIO.effectTotal(logger.info(s"Server started @ ${server.address.getHostString}:${server.address.getPort}")) + _ <- Task.never + } yield server + } + .fold( + ex => { + logger.error("Server initialization failed!", ex) + 1 + }, + _ => 0 + ) + } + +} diff --git a/example/src/main/resources/reference.conf b/example/src/main/resources/reference.conf index e69de29bb..6b1a6172f 100644 --- a/example/src/main/resources/reference.conf +++ b/example/src/main/resources/reference.conf @@ -0,0 +1,8 @@ +server { + listen-address = "0.0.0.0" + listen-port = 8080 +} + +jmx { + domain = "com.avast.sst.example" +} \ No newline at end of file diff --git a/example/src/main/scala/com/avast/sst/example/Main.scala b/example/src/main/scala/com/avast/sst/example/Main.scala index 9cc4704d4..a332efd9e 100644 --- a/example/src/main/scala/com/avast/sst/example/Main.scala +++ b/example/src/main/scala/com/avast/sst/example/Main.scala @@ -3,20 +3,26 @@ package com.avast.sst.example import java.util.concurrent.TimeUnit import cats.effect.{Clock, Resource} +import com.avast.sst.bundle.ZioServerApp import com.avast.sst.example.config.Configuration +import com.avast.sst.example.module.Http4sRoutingModule import com.avast.sst.execution.ExecutorModule +import com.avast.sst.http4s.Http4sBlazeServerModule +import com.avast.sst.micrometer.MicrometerJvmModule +import com.avast.sst.micrometer.interop.MicrometerHttp4sServerMetricsModule +import com.avast.sst.micrometer.jmx.MicrometerJmxModule import com.avast.sst.pureconfig.PureConfigModule import com.avast.sst.system.console.{Console, ConsoleModule} -import com.github.ghik.silencer.silent +import org.http4s.server.Server +import zio.Task import zio.interop.catz._ -import zio.{Task, ZIO} +import zio.interop.catz.implicits._ -object Main extends CatsApp { - - def program: Resource[Task, Unit] = { +object Main extends ZioServerApp { + def program: Resource[Task, Server[Task]] = { for { - _ <- Resource.liftF(PureConfigModule.makeOrRaise[Task, Configuration]) + configuration <- Resource.liftF(PureConfigModule.makeOrRaise[Task, Configuration]) executorModule <- ExecutorModule.makeFromExecutionContext[Task](runtime.Platform.executor.asEC) clock = Clock.create[Task] currentTime <- Resource.liftF(clock.realTime(TimeUnit.MILLISECONDS)) @@ -24,17 +30,14 @@ object Main extends CatsApp { _ <- Resource.liftF( console.printLine(s"The current Unix epoch time is $currentTime. This system has ${executorModule.numOfCpus} CPUs.") ) - } yield () - } - - @silent("dead code") // false positive - override def run(args: List[String]): ZIO[Environment, Nothing, Int] = { - program - .use(_ => Task.never) - .fold( - _ => 1, - _ => 0 - ) + meterRegistry <- MicrometerJmxModule.make[Task](configuration.jmx) + _ <- Resource.liftF(MicrometerJvmModule.make[Task](meterRegistry)) + serverMetricsModule <- Resource.pure[Task, MicrometerHttp4sServerMetricsModule[Task]]( + MicrometerHttp4sServerMetricsModule(meterRegistry, clock) + ) + routingModule = new Http4sRoutingModule(serverMetricsModule) + server <- Http4sBlazeServerModule.make[Task](configuration.server, routingModule.router, executorModule.executionContext) + } yield server } } diff --git a/example/src/main/scala/com/avast/sst/example/config/Configuration.scala b/example/src/main/scala/com/avast/sst/example/config/Configuration.scala index 9cb62fed3..d361f7437 100644 --- a/example/src/main/scala/com/avast/sst/example/config/Configuration.scala +++ b/example/src/main/scala/com/avast/sst/example/config/Configuration.scala @@ -1,9 +1,13 @@ package com.avast.sst.example.config +import com.avast.sst.http4s.Http4sBlazeServerConfig +import com.avast.sst.micrometer.jmx.MicrometerJmxConfig +import com.avast.sst.pureconfig.implicits.Http4sBlazeServer._ +import com.avast.sst.pureconfig.implicits.MicrometerJmx.jmxConfigReader import pureconfig.ConfigReader import pureconfig.generic.semiauto._ -final case class Configuration() +final case class Configuration(server: Http4sBlazeServerConfig, jmx: MicrometerJmxConfig) object Configuration { diff --git a/example/src/main/scala/com/avast/sst/example/module/Http4sRoutingModule.scala b/example/src/main/scala/com/avast/sst/example/module/Http4sRoutingModule.scala new file mode 100644 index 000000000..05721ac43 --- /dev/null +++ b/example/src/main/scala/com/avast/sst/example/module/Http4sRoutingModule.scala @@ -0,0 +1,26 @@ +package com.avast.sst.example.module + +import com.avast.sst.http4s.Http4sRouting +import com.avast.sst.micrometer.interop.MicrometerHttp4sServerMetricsModule +import org.http4s.dsl.Http4sDsl +import org.http4s.{HttpApp, HttpRoutes} +import zio.Task +import zio.interop.catz._ + +class Http4sRoutingModule(serverMetricsModule: MicrometerHttp4sServerMetricsModule[Task]) extends Http4sDsl[Task] { + + import serverMetricsModule._ + + private val helloWorldRoute = routeMetrics.wrap("hello")(Ok("Hello World!")) + + private val routes = HttpRoutes.of[Task] { + case GET -> Root / "hello" => helloWorldRoute + } + + val router: HttpApp[Task] = Http4sRouting.make { + globalMetrics { + routes + } + } + +} diff --git a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxConfig.scala b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxConfig.scala new file mode 100644 index 000000000..cfcccb0bc --- /dev/null +++ b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxConfig.scala @@ -0,0 +1,3 @@ +package com.avast.sst.micrometer.jmx + +final case class MicrometerJmxConfig(domain: String, enableTypeScopeNameHierarchy: Boolean = false) diff --git a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala new file mode 100644 index 000000000..f07d2d025 --- /dev/null +++ b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala @@ -0,0 +1,50 @@ +package com.avast.sst.micrometer.jmx + +import cats.effect.{Resource, Sync} +import com.codahale.metrics.MetricRegistry +import com.codahale.metrics.jmx.JmxReporter +import io.micrometer.core.instrument.Clock +import io.micrometer.core.instrument.config.NamingConvention +import io.micrometer.core.instrument.util.HierarchicalNameMapper +import io.micrometer.jmx.{JmxConfig, JmxMeterRegistry} + +import scala.language.higherKinds + +object MicrometerJmxModule { + + def make[F[_]: Sync](config: MicrometerJmxConfig): Resource[F, JmxMeterRegistry] = { + Resource + .make { + Sync[F].delay { + if (config.enableTypeScopeNameHierarchy) { + val dropwizardRegistry = new MetricRegistry + val registry = new JmxMeterRegistry( + new DomainJmxConfig(config.domain), + Clock.SYSTEM, + HierarchicalNameMapper.DEFAULT, + dropwizardRegistry, + makeJmxReporter(dropwizardRegistry, config.domain) + ) + registry.config().namingConvention(NamingConvention.dot) + registry + } else { + new JmxMeterRegistry(new DomainJmxConfig(config.domain), Clock.SYSTEM) + } + } + }(registry => Sync[F].delay(registry.close())) + } + + private def makeJmxReporter(metricRegistry: MetricRegistry, domain: String) = { + JmxReporter + .forRegistry(metricRegistry) + .inDomain(domain) + .createsObjectNamesWith(new TypeScopeNameObjectNameFactory()) + .build + } + + private class DomainJmxConfig(domain: String) extends JmxConfig { + override def get(key: String): String = null + override def domain(): String = domain + } + +} diff --git a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala new file mode 100644 index 000000000..f34ebbeee --- /dev/null +++ b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala @@ -0,0 +1,50 @@ +package com.avast.sst.micrometer.jmx + +import java.util +import java.util.regex.Pattern + +import com.codahale.metrics.jmx.{DefaultObjectNameFactory, ObjectNameFactory} +import javax.management.ObjectName + +import scala.util.Try; + +/** This is custom [[com.codahale.metrics.jmx.ObjectNameFactory]] which uses "type-scope-name" hierarchy of resulting + * [[javax.management.ObjectName]] (levels 3-N are glued together). + */ +class TypeScopeNameObjectNameFactory(separator: String = ".") extends ObjectNameFactory { + + private val quotedSeparator = Pattern.quote(separator) + + private val defaultFactory = new DefaultObjectNameFactory() + + private val partNames = Vector("type", "scope", "name") + + override def createName(`type`: String, domain: String, name: String): ObjectName = { + val parsedName = parseName(domain, name) + parsedName.getOrElse(defaultFactory.createName(`type`, domain, name)) + } + + private def parseName(domain: String, name: String): Try[ObjectName] = Try { + val parts = name.split(quotedSeparator, partNames.length) + + /* The following block of code is a little hack. The problem is that ObjectName requires HashTable as parameter but HashTable + is unsorted and thus unusable for us. We hack it by raping the HashTable and in-fact using LinkedHashMap which is + much more suitable for our needs. */ + val map = new java.util.LinkedHashMap[String, String](parts.length) + val properties = new java.util.Hashtable[String, String](parts.length) { + override def entrySet(): util.Set[util.Map.Entry[String, String]] = map.entrySet() + } + + parts.zip(partNames).foreach { + case (part, partName) => + val quoted = quote(part) + properties.put(partName, quoted) + map.put(partName, quoted) + } + + new ObjectName(domain, properties) + } + + private def quote(objectName: String) = objectName.replaceAll("[\\Q.?*\"\\E]", "_") + +} diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/HttpStatusMetrics.scala b/micrometer/src/main/scala/com/avast/sst/micrometer/HttpStatusMetrics.scala new file mode 100644 index 000000000..d17087ce3 --- /dev/null +++ b/micrometer/src/main/scala/com/avast/sst/micrometer/HttpStatusMetrics.scala @@ -0,0 +1,22 @@ +package com.avast.sst.micrometer + +import io.micrometer.core.instrument.{Counter, MeterRegistry} + +import scala.collection.concurrent.TrieMap + +private[micrometer] class HttpStatusMetrics(prefix: String, meterRegistry: MeterRegistry) { + + private val meters = TrieMap[Int, Counter]( + 1 -> meterRegistry.counter(s"$prefix.status.1xx"), + 2 -> meterRegistry.counter(s"$prefix.status.2xx"), + 3 -> meterRegistry.counter(s"$prefix.status.3xx"), + 4 -> meterRegistry.counter(s"$prefix.status.4xx"), + 5 -> meterRegistry.counter(s"$prefix.status.5xx") + ) + + def recordHttpStatus(status: Int): Unit = { + meters(status / 100).increment() + meters.getOrElseUpdate(status, meterRegistry.counter(s"$prefix.status.$status")).increment() + } + +} diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/MicrometerJvmModule.scala b/micrometer/src/main/scala/com/avast/sst/micrometer/MicrometerJvmModule.scala new file mode 100644 index 000000000..aca50038e --- /dev/null +++ b/micrometer/src/main/scala/com/avast/sst/micrometer/MicrometerJvmModule.scala @@ -0,0 +1,20 @@ +package com.avast.sst.micrometer + +import cats.effect.Sync +import io.micrometer.core.instrument.MeterRegistry +import io.micrometer.core.instrument.binder.jvm.{ClassLoaderMetrics, JvmGcMetrics, JvmMemoryMetrics, JvmThreadMetrics} +import io.micrometer.core.instrument.binder.system.ProcessorMetrics + +object MicrometerJvmModule { + + def make[F[_]: Sync](registry: MeterRegistry): F[Unit] = { + Sync[F].delay { + new ClassLoaderMetrics().bindTo(registry) + new JvmMemoryMetrics().bindTo(registry) + new JvmGcMetrics().bindTo(registry) + new ProcessorMetrics().bindTo(registry) + new JvmThreadMetrics().bindTo(registry) + } + } + +} diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sRouteMetrics.scala b/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sRouteMetrics.scala new file mode 100644 index 000000000..9f70e9b81 --- /dev/null +++ b/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sRouteMetrics.scala @@ -0,0 +1,41 @@ +package com.avast.sst.micrometer.interop + +import java.util.concurrent.TimeUnit + +import cats.effect.syntax.bracket._ +import cats.effect.{Clock, Sync} +import cats.syntax.flatMap._ +import cats.syntax.functor._ +import com.avast.sst.micrometer.HttpStatusMetrics +import io.micrometer.core.instrument.MeterRegistry +import org.http4s.Response + +import scala.language.higherKinds + +class Http4sRouteMetrics[F[_]: Sync](meterRegistry: MeterRegistry, clock: Clock[F]) { + + private val F = Sync[F] + + def wrap(name: String)(route: => F[Response[F]]): F[Response[F]] = { + val prefix = s"http.$name" + val activeRequests = meterRegistry.counter(s"$prefix.active-requests") + val timer = meterRegistry.timer(s"$prefix.total-time") + val httpStatusCodes = new HttpStatusMetrics(prefix, meterRegistry) + for { + start <- clock.monotonic(TimeUnit.NANOSECONDS) + response <- F.delay(activeRequests.increment()) + .bracket { _ => + route.flatTap(response => F.delay(httpStatusCodes.recordHttpStatus(response.status.code))) + } { _ => + for { + time <- computeTime(start) + _ <- F.delay(activeRequests.increment(-1)) + _ <- F.delay(timer.record(time, TimeUnit.NANOSECONDS)) + } yield () + } + } yield response + } + + private def computeTime(start: Long): F[Long] = clock.monotonic(TimeUnit.NANOSECONDS).map(_ - start) + +} diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sServerMetrics.scala b/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sServerMetrics.scala new file mode 100644 index 000000000..9dca2c64f --- /dev/null +++ b/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sServerMetrics.scala @@ -0,0 +1,45 @@ +package com.avast.sst.micrometer.interop + +import java.util.concurrent.TimeUnit + +import cats.effect.Sync +import cats.syntax.flatMap._ +import cats.syntax.functor._ +import com.avast.sst.micrometer.HttpStatusMetrics +import io.micrometer.core.instrument.MeterRegistry +import org.http4s.metrics.{MetricsOps, TerminationType} +import org.http4s.{Method, Status} + +import scala.language.higherKinds + +class Http4sServerMetrics[F[_]: Sync](meterRegistry: MeterRegistry) extends MetricsOps[F] { + + private val F = Sync[F] + + private val prefix = "http.global" + private val activeRequests = meterRegistry.counter(s"$prefix.active-requests") + private val headersTime = meterRegistry.timer(s"$prefix.headers-time") + private val totalTime = meterRegistry.timer(s"$prefix.total-time") + private val failureTime = meterRegistry.timer(s"$prefix.failure-time") + private val httpStatusCodes = new HttpStatusMetrics(prefix, meterRegistry) + + override def increaseActiveRequests(classifier: Option[String]): F[Unit] = F.delay(activeRequests.increment()) + + override def decreaseActiveRequests(classifier: Option[String]): F[Unit] = F.delay(activeRequests.increment(-1)) + + override def recordHeadersTime(method: Method, elapsed: Long, classifier: Option[String]): F[Unit] = { + F.delay(headersTime.record(elapsed, TimeUnit.NANOSECONDS)) + } + + override def recordTotalTime(method: Method, status: Status, elapsed: Long, classifier: Option[String]): F[Unit] = { + for { + _ <- F.delay(totalTime.record(elapsed, TimeUnit.NANOSECONDS)) + _ <- F.delay(httpStatusCodes.recordHttpStatus(status.code)) + } yield () + } + + override def recordAbnormalTermination(elapsed: Long, terminationType: TerminationType, classifier: Option[String]): F[Unit] = { + F.delay(failureTime.record(elapsed, TimeUnit.NANOSECONDS)) + } + +} diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/MicrometerHttp4sServerMetricsModule.scala b/micrometer/src/main/scala/com/avast/sst/micrometer/interop/MicrometerHttp4sServerMetricsModule.scala new file mode 100644 index 000000000..6f24ac6ff --- /dev/null +++ b/micrometer/src/main/scala/com/avast/sst/micrometer/interop/MicrometerHttp4sServerMetricsModule.scala @@ -0,0 +1,21 @@ +package com.avast.sst.micrometer.interop + +import cats.effect.{Clock, Effect, Sync} +import io.micrometer.core.instrument.MeterRegistry +import org.http4s.HttpRoutes +import org.http4s.server.middleware.Metrics + +import scala.language.higherKinds + +class MicrometerHttp4sServerMetricsModule[F[_]: Sync](val globalMetrics: HttpRoutes[F] => HttpRoutes[F], + val routeMetrics: Http4sRouteMetrics[F]) + +object MicrometerHttp4sServerMetricsModule { + + def apply[F[_]: Effect](meterRegistry: MeterRegistry, clock: Clock[F]): MicrometerHttp4sServerMetricsModule[F] = { + implicit val c: Clock[F] = clock + new MicrometerHttp4sServerMetricsModule[F](Metrics(new Http4sServerMetrics[F](meterRegistry)), + new Http4sRouteMetrics[F](meterRegistry, clock)) + } + +} diff --git a/project/Dependencies.scala b/project/Dependencies.scala index c85ea0c49..09cc130ee 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -6,8 +6,12 @@ object Dependencies { val http4sBlazeClient = "org.http4s" %% "http4s-blaze-client" % Versions.http4s val http4sBlazeServer = "org.http4s" %% "http4s-blaze-server" % Versions.http4s val http4sDsl = "org.http4s" %% "http4s-dsl" % Versions.http4s + val jsr305 = "com.google.code.findbugs" % "jsr305" % "3.0.2" // required because of Scala compiler val kindProjector = "org.typelevel" %% "kind-projector" % "0.10.3" val logbackClassic = "ch.qos.logback" % "logback-classic" % "1.2.3" + val micrometerCore = "io.micrometer" % "micrometer-core" % Versions.micrometer + val micrometerJmx = "io.micrometer" % "micrometer-registry-jmx" % Versions.micrometer + val monixEval = "io.monix" %% "monix-eval" % "3.0.0" val pureConfig = "com.github.pureconfig" %% "pureconfig" % "0.12.1" val scalaTest = "org.scalatest" %% "scalatest" % "3.0.8" val scalazzi = "com.github.vovapolu" %% "scaluzzi" % "0.1.3" @@ -20,6 +24,7 @@ object Dependencies { object Versions { val http4s = "0.20.11" + val micrometer = "1.3.0" val silencer = "1.4.4" } diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala new file mode 100644 index 000000000..8ca3c0add --- /dev/null +++ b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala @@ -0,0 +1,29 @@ +package com.avast.sst.pureconfig.implicits + +import cats.syntax.either._ +import com.avast.sst.http4s.Http4sBlazeClientConfig +import org.http4s.client.blaze.ParserMode +import org.http4s.headers.`User-Agent` +import pureconfig.ConfigReader +import pureconfig.error.CannotConvert +import pureconfig.generic.semiauto.deriveReader + +object Http4sBlazeClient { + + import JvmSsl._ + + implicit val userAgentReader: ConfigReader[`User-Agent`] = ConfigReader[String].emap { value => + `User-Agent`.parse(value).leftMap { parseFailure => + CannotConvert(value, "User-Agent HTTP header", parseFailure.message) + } + } + + implicit val parserModeReader: ConfigReader[ParserMode] = ConfigReader[String].map(_.toLowerCase).emap { + case "strict" => Right(ParserMode.Strict) + case "lenient" => Right(ParserMode.Lenient) + case badValue => Left(CannotConvert(badValue, "ParserMode", "strict|lenient")) + } + + implicit val http4sClientConfigReader: ConfigReader[Http4sBlazeClientConfig] = deriveReader + +} diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala new file mode 100644 index 000000000..f0fc95a2f --- /dev/null +++ b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala @@ -0,0 +1,14 @@ +package com.avast.sst.pureconfig.implicits + +import com.avast.sst.http4s.Http4sBlazeServerConfig +import com.avast.sst.http4s.Http4sBlazeServerConfig.SocketOptions +import pureconfig.ConfigReader +import pureconfig.generic.semiauto.deriveReader + +object Http4sBlazeServer { + + implicit val socketOptionsReader: ConfigReader[SocketOptions] = deriveReader + + implicit val http4sServerConfigReader: ConfigReader[Http4sBlazeServerConfig] = deriveReader + +} diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala new file mode 100644 index 000000000..7d53528e2 --- /dev/null +++ b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala @@ -0,0 +1,21 @@ +package com.avast.sst.pureconfig.implicits + +import com.avast.sst.execution.ForkJoinPoolConfig.TaskPeekingMode +import com.avast.sst.execution.{ForkJoinPoolConfig, ThreadPoolExecutorConfig} +import pureconfig.ConfigReader +import pureconfig.error.CannotConvert +import pureconfig.generic.semiauto.deriveReader + +object JvmExecution { + + implicit val threadPoolExecutorConfigReader: ConfigReader[ThreadPoolExecutorConfig] = deriveReader + + implicit val taskPeekingModeReader: ConfigReader[TaskPeekingMode] = ConfigReader[String].map(_.toLowerCase).emap { + case "fifo" => Right(TaskPeekingMode.FIFO) + case "lifo" => Right(TaskPeekingMode.LIFO) + case badValue => Left(CannotConvert(badValue, "TaskPeekingMode", "FIFO|LIFO")) + } + + implicit val forkJoinPoolConfigReader: ConfigReader[ForkJoinPoolConfig] = deriveReader + +} diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala new file mode 100644 index 000000000..5a6b1730a --- /dev/null +++ b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala @@ -0,0 +1,28 @@ +package com.avast.sst.pureconfig.implicits + +import com.avast.sst.ssl.KeyStoreType.{JKS, PKCS12} +import com.avast.sst.ssl.Protocol.{SSL, TLS} +import com.avast.sst.ssl.{KeyStoreConfig, KeyStoreType, Protocol, SslContextConfig} +import pureconfig.ConfigReader +import pureconfig.error.CannotConvert +import pureconfig.generic.semiauto.deriveReader + +object JvmSsl { + + implicit val sslProtocolReader: ConfigReader[Protocol] = ConfigReader[String].map(_.toLowerCase).emap { + case "tls" => Right(TLS) + case "ssl" => Right(SSL) + case badValue => Left(CannotConvert(badValue, "SSL Protocol", "TLS|SSL")) + } + + implicit val keyStoreTypeReader: ConfigReader[KeyStoreType] = ConfigReader[String].map(_.toLowerCase).emap { + case "jks" => Right(JKS) + case "pkcs12" => Right(PKCS12) + case badValue => Left(CannotConvert(badValue, "Keystore Type", "JKS|PKCS12")) + } + + implicit val keyStoreConfigReader: ConfigReader[KeyStoreConfig] = deriveReader + + implicit val sslContextConfigReader: ConfigReader[SslContextConfig] = deriveReader + +} diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala new file mode 100644 index 000000000..2758fe117 --- /dev/null +++ b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala @@ -0,0 +1,11 @@ +package com.avast.sst.pureconfig.implicits + +import com.avast.sst.micrometer.jmx.MicrometerJmxConfig +import pureconfig.ConfigReader +import pureconfig.generic.semiauto.deriveReader + +object MicrometerJmx { + + implicit val jmxConfigReader: ConfigReader[MicrometerJmxConfig] = deriveReader + +} From 2635f8124a15bb0a296fb1b1ba0f911a12d18ea4 Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Mon, 7 Oct 2019 21:12:59 +0200 Subject: [PATCH 02/13] fix: Compilation errors --- .../com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala | 2 ++ .../sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala | 1 + 2 files changed, 3 insertions(+) diff --git a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala index f07d2d025..9a2bf1763 100644 --- a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala +++ b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala @@ -12,6 +12,7 @@ import scala.language.higherKinds object MicrometerJmxModule { + @SuppressWarnings(Array("org.wartremover.warts.NonUnitStatements")) def make[F[_]: Sync](config: MicrometerJmxConfig): Resource[F, JmxMeterRegistry] = { Resource .make { @@ -43,6 +44,7 @@ object MicrometerJmxModule { } private class DomainJmxConfig(domain: String) extends JmxConfig { + @SuppressWarnings(Array("org.wartremover.warts.Null")) override def get(key: String): String = null override def domain(): String = domain } diff --git a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala index f34ebbeee..e98486d7d 100644 --- a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala +++ b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala @@ -24,6 +24,7 @@ class TypeScopeNameObjectNameFactory(separator: String = ".") extends ObjectName parsedName.getOrElse(defaultFactory.createName(`type`, domain, name)) } + @SuppressWarnings(Array("org.wartremover.warts.NonUnitStatements")) private def parseName(domain: String, name: String): Try[ObjectName] = Try { val parts = name.split(quotedSeparator, partNames.length) From 8e8852590f2f89fe0c40724e2355b76aa4f1aa05 Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Mon, 7 Oct 2019 23:30:09 +0200 Subject: [PATCH 03/13] refactor: Small PR improvements --- build.sbt | 7 ++- .../com/avast/sst/bundle/MonixServerApp.scala | 5 ++ .../com/avast/sst/bundle/ZioServerApp.scala | 5 ++ .../scala/com/avast/sst/example/Main.scala | 4 +- .../jmx/TypeScopeNameObjectNameFactory.scala | 9 ++-- .../micrometer/interop/Http4sMetricsOps.scala | 52 +++++++++++++++++++ .../interop/Http4sServerMetrics.scala | 45 ---------------- .../MicrometerHttp4sServerMetricsModule.scala | 11 ++-- project/Dependencies.scala | 2 +- .../implicits/Http4sBlazeClient.scala | 12 ++--- .../implicits/Http4sBlazeServer.scala | 4 ++ .../pureconfig/implicits/JvmExecution.scala | 13 +++-- .../sst/pureconfig/implicits/JvmSsl.scala | 21 +++----- .../pureconfig/implicits/MicrometerJmx.scala | 4 ++ 14 files changed, 109 insertions(+), 85 deletions(-) create mode 100644 micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sMetricsOps.scala delete mode 100644 micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sServerMetrics.scala diff --git a/build.sbt b/build.sbt index dcca86db4..7b36d3ee4 100644 --- a/build.sbt +++ b/build.sbt @@ -120,7 +120,10 @@ lazy val micrometer = project .settings(commonSettings) .settings( name := "sst-micrometer", - libraryDependencies ++= Seq(Dependencies.micrometerCore, Dependencies.jsr305) + libraryDependencies ++= Seq( + Dependencies.micrometerCore, + Dependencies.jsr305 // required because of Scala compiler + ) ) lazy val micrometerJmx = project @@ -130,7 +133,7 @@ lazy val micrometerJmx = project name := "sst-micrometer-jmx", libraryDependencies ++= Seq( Dependencies.micrometerJmx, - Dependencies.jsr305 + Dependencies.jsr305 // required because of Scala compiler ) ) diff --git a/bundle-monix-http4s-blaze/src/main/scala/com/avast/sst/bundle/MonixServerApp.scala b/bundle-monix-http4s-blaze/src/main/scala/com/avast/sst/bundle/MonixServerApp.scala index 616857afe..5189db87c 100644 --- a/bundle-monix-http4s-blaze/src/main/scala/com/avast/sst/bundle/MonixServerApp.scala +++ b/bundle-monix-http4s-blaze/src/main/scala/com/avast/sst/bundle/MonixServerApp.scala @@ -5,6 +5,11 @@ import monix.eval.{Task, TaskApp} import org.http4s.server.Server import org.slf4j.LoggerFactory +/** Extend this `trait` if you want to implement server application using [[monix.eval.Task]] effect data type. + * + * Implement method `program` with initialization and business logic of your application. It will be automatically run until JVM is shut + * down in which case all the resources are cleaned up because the whole `program` is a [[cats.effect.Resource]]. + */ trait MonixServerApp extends TaskApp { private val logger = LoggerFactory.getLogger(this.getClass) diff --git a/bundle-zio-http4s-blaze/src/main/scala/com/avast/sst/bundle/ZioServerApp.scala b/bundle-zio-http4s-blaze/src/main/scala/com/avast/sst/bundle/ZioServerApp.scala index 9fb61cc87..f62af619b 100644 --- a/bundle-zio-http4s-blaze/src/main/scala/com/avast/sst/bundle/ZioServerApp.scala +++ b/bundle-zio-http4s-blaze/src/main/scala/com/avast/sst/bundle/ZioServerApp.scala @@ -7,6 +7,11 @@ import org.slf4j.LoggerFactory import zio.interop.catz._ import zio.{Task, UIO, ZIO} +/** Extend this `trait` if you want to implement server application using [[zio.ZIO]] effect data type. + * + * Implement method `program` with initialization and business logic of your application. It will be automatically run until JVM is shut + * down in which case all the resources are cleaned up because the whole `program` is a [[cats.effect.Resource]]. + */ trait ZioServerApp extends CatsApp { private val logger = LoggerFactory.getLogger(this.getClass) diff --git a/example/src/main/scala/com/avast/sst/example/Main.scala b/example/src/main/scala/com/avast/sst/example/Main.scala index a332efd9e..884b96332 100644 --- a/example/src/main/scala/com/avast/sst/example/Main.scala +++ b/example/src/main/scala/com/avast/sst/example/Main.scala @@ -32,8 +32,8 @@ object Main extends ZioServerApp { ) meterRegistry <- MicrometerJmxModule.make[Task](configuration.jmx) _ <- Resource.liftF(MicrometerJvmModule.make[Task](meterRegistry)) - serverMetricsModule <- Resource.pure[Task, MicrometerHttp4sServerMetricsModule[Task]]( - MicrometerHttp4sServerMetricsModule(meterRegistry, clock) + serverMetricsModule <- Resource.liftF[Task, MicrometerHttp4sServerMetricsModule[Task]]( + MicrometerHttp4sServerMetricsModule.make(meterRegistry, clock) ) routingModule = new Http4sRoutingModule(serverMetricsModule) server <- Http4sBlazeServerModule.make[Task](configuration.server, routingModule.router, executorModule.executionContext) diff --git a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala index e98486d7d..7e7169b18 100644 --- a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala +++ b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/TypeScopeNameObjectNameFactory.scala @@ -3,15 +3,14 @@ package com.avast.sst.micrometer.jmx import java.util import java.util.regex.Pattern +import cats.syntax.either._ import com.codahale.metrics.jmx.{DefaultObjectNameFactory, ObjectNameFactory} -import javax.management.ObjectName - -import scala.util.Try; +import javax.management.ObjectName; /** This is custom [[com.codahale.metrics.jmx.ObjectNameFactory]] which uses "type-scope-name" hierarchy of resulting * [[javax.management.ObjectName]] (levels 3-N are glued together). */ -class TypeScopeNameObjectNameFactory(separator: String = ".") extends ObjectNameFactory { +private[jmx] class TypeScopeNameObjectNameFactory(separator: String = ".") extends ObjectNameFactory { private val quotedSeparator = Pattern.quote(separator) @@ -25,7 +24,7 @@ class TypeScopeNameObjectNameFactory(separator: String = ".") extends ObjectName } @SuppressWarnings(Array("org.wartremover.warts.NonUnitStatements")) - private def parseName(domain: String, name: String): Try[ObjectName] = Try { + private def parseName(domain: String, name: String) = Either.catchNonFatal { val parts = name.split(quotedSeparator, partNames.length) /* The following block of code is a little hack. The problem is that ObjectName requires HashTable as parameter but HashTable diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sMetricsOps.scala b/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sMetricsOps.scala new file mode 100644 index 000000000..ef9d48ba7 --- /dev/null +++ b/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sMetricsOps.scala @@ -0,0 +1,52 @@ +package com.avast.sst.micrometer.interop + +import java.util.concurrent.TimeUnit + +import cats.effect.Sync +import cats.syntax.flatMap._ +import cats.syntax.functor._ +import com.avast.sst.micrometer.HttpStatusMetrics +import io.micrometer.core.instrument.MeterRegistry +import org.http4s.metrics.{MetricsOps, TerminationType} +import org.http4s.{Method, Status} + +import scala.language.higherKinds + +object Http4sMetricsOps { + + def make[F[_]: Sync](meterRegistry: MeterRegistry): F[MetricsOps[F]] = { + val F = Sync[F] + + F.delay { + new MetricsOps[F] { + private val prefix = "http.global" + private val activeRequests = meterRegistry.counter(s"$prefix.active-requests") + private val headersTime = meterRegistry.timer(s"$prefix.headers-time") + private val totalTime = meterRegistry.timer(s"$prefix.total-time") + private val failureTime = meterRegistry.timer(s"$prefix.failure-time") + private val httpStatusCodes = new HttpStatusMetrics(prefix, meterRegistry) + + override def increaseActiveRequests(classifier: Option[String]): F[Unit] = F.delay(activeRequests.increment()) + + override def decreaseActiveRequests(classifier: Option[String]): F[Unit] = F.delay(activeRequests.increment(-1)) + + override def recordHeadersTime(method: Method, elapsed: Long, classifier: Option[String]): F[Unit] = { + F.delay(headersTime.record(elapsed, TimeUnit.NANOSECONDS)) + } + + override def recordTotalTime(method: Method, status: Status, elapsed: Long, classifier: Option[String]): F[Unit] = { + for { + _ <- F.delay(totalTime.record(elapsed, TimeUnit.NANOSECONDS)) + _ <- F.delay(httpStatusCodes.recordHttpStatus(status.code)) + } yield () + } + + override def recordAbnormalTermination(elapsed: Long, terminationType: TerminationType, classifier: Option[String]): F[Unit] = { + F.delay(failureTime.record(elapsed, TimeUnit.NANOSECONDS)) + } + + } + } + } + +} diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sServerMetrics.scala b/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sServerMetrics.scala deleted file mode 100644 index 9dca2c64f..000000000 --- a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sServerMetrics.scala +++ /dev/null @@ -1,45 +0,0 @@ -package com.avast.sst.micrometer.interop - -import java.util.concurrent.TimeUnit - -import cats.effect.Sync -import cats.syntax.flatMap._ -import cats.syntax.functor._ -import com.avast.sst.micrometer.HttpStatusMetrics -import io.micrometer.core.instrument.MeterRegistry -import org.http4s.metrics.{MetricsOps, TerminationType} -import org.http4s.{Method, Status} - -import scala.language.higherKinds - -class Http4sServerMetrics[F[_]: Sync](meterRegistry: MeterRegistry) extends MetricsOps[F] { - - private val F = Sync[F] - - private val prefix = "http.global" - private val activeRequests = meterRegistry.counter(s"$prefix.active-requests") - private val headersTime = meterRegistry.timer(s"$prefix.headers-time") - private val totalTime = meterRegistry.timer(s"$prefix.total-time") - private val failureTime = meterRegistry.timer(s"$prefix.failure-time") - private val httpStatusCodes = new HttpStatusMetrics(prefix, meterRegistry) - - override def increaseActiveRequests(classifier: Option[String]): F[Unit] = F.delay(activeRequests.increment()) - - override def decreaseActiveRequests(classifier: Option[String]): F[Unit] = F.delay(activeRequests.increment(-1)) - - override def recordHeadersTime(method: Method, elapsed: Long, classifier: Option[String]): F[Unit] = { - F.delay(headersTime.record(elapsed, TimeUnit.NANOSECONDS)) - } - - override def recordTotalTime(method: Method, status: Status, elapsed: Long, classifier: Option[String]): F[Unit] = { - for { - _ <- F.delay(totalTime.record(elapsed, TimeUnit.NANOSECONDS)) - _ <- F.delay(httpStatusCodes.recordHttpStatus(status.code)) - } yield () - } - - override def recordAbnormalTermination(elapsed: Long, terminationType: TerminationType, classifier: Option[String]): F[Unit] = { - F.delay(failureTime.record(elapsed, TimeUnit.NANOSECONDS)) - } - -} diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/MicrometerHttp4sServerMetricsModule.scala b/micrometer/src/main/scala/com/avast/sst/micrometer/interop/MicrometerHttp4sServerMetricsModule.scala index 6f24ac6ff..a73c1b151 100644 --- a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/MicrometerHttp4sServerMetricsModule.scala +++ b/micrometer/src/main/scala/com/avast/sst/micrometer/interop/MicrometerHttp4sServerMetricsModule.scala @@ -1,6 +1,8 @@ package com.avast.sst.micrometer.interop import cats.effect.{Clock, Effect, Sync} +import cats.syntax.flatMap._ +import cats.syntax.functor._ import io.micrometer.core.instrument.MeterRegistry import org.http4s.HttpRoutes import org.http4s.server.middleware.Metrics @@ -12,10 +14,13 @@ class MicrometerHttp4sServerMetricsModule[F[_]: Sync](val globalMetrics: HttpRou object MicrometerHttp4sServerMetricsModule { - def apply[F[_]: Effect](meterRegistry: MeterRegistry, clock: Clock[F]): MicrometerHttp4sServerMetricsModule[F] = { + def make[F[_]: Effect](meterRegistry: MeterRegistry, clock: Clock[F]): F[MicrometerHttp4sServerMetricsModule[F]] = { implicit val c: Clock[F] = clock - new MicrometerHttp4sServerMetricsModule[F](Metrics(new Http4sServerMetrics[F](meterRegistry)), - new Http4sRouteMetrics[F](meterRegistry, clock)) + + for { + metricsOps <- Http4sMetricsOps.make[F](meterRegistry) + routeMetrics <- Sync[F].delay(new Http4sRouteMetrics[F](meterRegistry, clock)) + } yield new MicrometerHttp4sServerMetricsModule[F](Metrics(metricsOps), routeMetrics) } } diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 09cc130ee..4aa77e527 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -6,7 +6,7 @@ object Dependencies { val http4sBlazeClient = "org.http4s" %% "http4s-blaze-client" % Versions.http4s val http4sBlazeServer = "org.http4s" %% "http4s-blaze-server" % Versions.http4s val http4sDsl = "org.http4s" %% "http4s-dsl" % Versions.http4s - val jsr305 = "com.google.code.findbugs" % "jsr305" % "3.0.2" // required because of Scala compiler + val jsr305 = "com.google.code.findbugs" % "jsr305" % "3.0.2" val kindProjector = "org.typelevel" %% "kind-projector" % "0.10.3" val logbackClassic = "ch.qos.logback" % "logback-classic" % "1.2.3" val micrometerCore = "io.micrometer" % "micrometer-core" % Versions.micrometer diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala index 8ca3c0add..444fa1ab1 100644 --- a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala +++ b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala @@ -6,8 +6,12 @@ import org.http4s.client.blaze.ParserMode import org.http4s.headers.`User-Agent` import pureconfig.ConfigReader import pureconfig.error.CannotConvert -import pureconfig.generic.semiauto.deriveReader +import pureconfig.generic.semiauto.{deriveEnumerationReader, deriveReader} +/** Implicit [[pureconfig.ConfigReader]] instances for `sst-http4s-blaze-client` module. + * + * ```Do not forget``` to have a dependency on the `sst-http4s-blaze-client` module in your project. + */ object Http4sBlazeClient { import JvmSsl._ @@ -18,11 +22,7 @@ object Http4sBlazeClient { } } - implicit val parserModeReader: ConfigReader[ParserMode] = ConfigReader[String].map(_.toLowerCase).emap { - case "strict" => Right(ParserMode.Strict) - case "lenient" => Right(ParserMode.Lenient) - case badValue => Left(CannotConvert(badValue, "ParserMode", "strict|lenient")) - } + implicit val parserModeReader: ConfigReader[ParserMode] = deriveEnumerationReader implicit val http4sClientConfigReader: ConfigReader[Http4sBlazeClientConfig] = deriveReader diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala index f0fc95a2f..e7ff62c53 100644 --- a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala +++ b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala @@ -5,6 +5,10 @@ import com.avast.sst.http4s.Http4sBlazeServerConfig.SocketOptions import pureconfig.ConfigReader import pureconfig.generic.semiauto.deriveReader +/** Implicit [[pureconfig.ConfigReader]] instances for `sst-http4s-blaze-server` module. + * + * ```Do not forget``` to have a dependency on the `sst-http4s-blaze-server` module in your project. + */ object Http4sBlazeServer { implicit val socketOptionsReader: ConfigReader[SocketOptions] = deriveReader diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala index 7d53528e2..b6a8c24d0 100644 --- a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala +++ b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala @@ -3,18 +3,17 @@ package com.avast.sst.pureconfig.implicits import com.avast.sst.execution.ForkJoinPoolConfig.TaskPeekingMode import com.avast.sst.execution.{ForkJoinPoolConfig, ThreadPoolExecutorConfig} import pureconfig.ConfigReader -import pureconfig.error.CannotConvert -import pureconfig.generic.semiauto.deriveReader +import pureconfig.generic.semiauto.{deriveEnumerationReader, deriveReader} +/** Implicit [[pureconfig.ConfigReader]] instances for `sst-jvm-execution` module. + * + * ```Do not forget``` to have a dependency on the `sst-jvm-execution` module in your project. + */ object JvmExecution { implicit val threadPoolExecutorConfigReader: ConfigReader[ThreadPoolExecutorConfig] = deriveReader - implicit val taskPeekingModeReader: ConfigReader[TaskPeekingMode] = ConfigReader[String].map(_.toLowerCase).emap { - case "fifo" => Right(TaskPeekingMode.FIFO) - case "lifo" => Right(TaskPeekingMode.LIFO) - case badValue => Left(CannotConvert(badValue, "TaskPeekingMode", "FIFO|LIFO")) - } + implicit val taskPeekingModeReader: ConfigReader[TaskPeekingMode] = deriveEnumerationReader implicit val forkJoinPoolConfigReader: ConfigReader[ForkJoinPoolConfig] = deriveReader diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala index 5a6b1730a..62dbfc726 100644 --- a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala +++ b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala @@ -1,25 +1,18 @@ package com.avast.sst.pureconfig.implicits -import com.avast.sst.ssl.KeyStoreType.{JKS, PKCS12} -import com.avast.sst.ssl.Protocol.{SSL, TLS} import com.avast.sst.ssl.{KeyStoreConfig, KeyStoreType, Protocol, SslContextConfig} import pureconfig.ConfigReader -import pureconfig.error.CannotConvert -import pureconfig.generic.semiauto.deriveReader +import pureconfig.generic.semiauto.{deriveEnumerationReader, deriveReader} +/** Implicit [[pureconfig.ConfigReader]] instances for `sst-jvm-ssl` module. + * + * ```Do not forget``` to have a dependency on the `sst-jvm-ssl` module in your project. + */ object JvmSsl { - implicit val sslProtocolReader: ConfigReader[Protocol] = ConfigReader[String].map(_.toLowerCase).emap { - case "tls" => Right(TLS) - case "ssl" => Right(SSL) - case badValue => Left(CannotConvert(badValue, "SSL Protocol", "TLS|SSL")) - } + implicit val sslProtocolReader: ConfigReader[Protocol] = deriveEnumerationReader - implicit val keyStoreTypeReader: ConfigReader[KeyStoreType] = ConfigReader[String].map(_.toLowerCase).emap { - case "jks" => Right(JKS) - case "pkcs12" => Right(PKCS12) - case badValue => Left(CannotConvert(badValue, "Keystore Type", "JKS|PKCS12")) - } + implicit val keyStoreTypeReader: ConfigReader[KeyStoreType] = deriveEnumerationReader implicit val keyStoreConfigReader: ConfigReader[KeyStoreConfig] = deriveReader diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala index 2758fe117..265106ced 100644 --- a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala +++ b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala @@ -4,6 +4,10 @@ import com.avast.sst.micrometer.jmx.MicrometerJmxConfig import pureconfig.ConfigReader import pureconfig.generic.semiauto.deriveReader +/** Implicit [[pureconfig.ConfigReader]] instances for `sst-micrometer-jmx` module. + * + * ```Do not forget``` to have a dependency on the `sst-micrometer-jmx` module in your project. + */ object MicrometerJmx { implicit val jmxConfigReader: ConfigReader[MicrometerJmxConfig] = deriveReader From d99910f63adf68f86e616e367a3d6c15df586edb Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Wed, 9 Oct 2019 15:36:03 +0200 Subject: [PATCH 04/13] refactor: Reorganize the project to get rid of optional deps --- README.md | 4 +- build.sbt | 116 +++++++++++------- docs/http4s.md | 17 +-- docs/index.md | 4 +- docs/jvm.md | 23 ++-- docs/pureconfig.md | 6 +- example/src/main/mdoc/http4s.md | 17 +-- example/src/main/mdoc/index.md | 4 +- example/src/main/mdoc/jvm.md | 17 +-- example/src/main/mdoc/pureconfig.md | 6 +- .../scala/com/avast/sst/example/Main.scala | 14 +-- .../sst/example/config/Configuration.scala | 8 +- .../example/module/Http4sRoutingModule.scala | 6 +- .../client/pureconfig/ConfigReaders.scala | 13 +- .../http4s/client/pureconfig/package.scala | 3 + .../http4s/client}/Http4sBlazeClient.scala | 4 +- .../client}/Http4sBlazeClientConfig.scala | 4 +- .../client}/Http4SBlazeClientTest.scala | 2 +- .../server/pureconfig/ConfigReaders.scala | 14 +++ .../http4s/server/pureconfig/package.scala | 3 + .../server}/Http4sBlazeServerConfig.scala | 4 +- .../server}/Http4sBlazeServerModule.scala | 2 +- .../server/Http4sBlazeServerModuleTest.scala | 5 +- .../micrometer/HttpStatusMetrics.scala | 2 +- .../MicrometerHttp4sMetricsOpsModule.scala | 7 +- .../MicrometerHttp4sServerMetricsModule.scala | 9 +- .../server/micrometer/RouteMetrics.scala | 5 +- .../sst/http4s/server}/Http4sRouting.scala | 3 +- .../middleware/CorrelationIdMiddleware.scala | 4 +- .../CorrelationIdMiddlewareTest.scala | 16 ++- .../jvm}/micrometer/MicrometerJvmModule.scala | 2 +- .../sst/jvm/pureconfig/ConfigReaders.scala | 25 ++++ .../avast/sst/jvm/pureconfig/package.scala | 3 + .../execution/ConfigurableThreadFactory.scala | 6 +- .../sst/jvm}/execution/ExecutorModule.scala | 12 +- .../jvm}/execution/ForkJoinPoolConfig.scala | 6 +- .../LoggingUncaughtExceptionHandler.scala | 2 +- .../execution/ThreadPoolExecutorConfig.scala | 2 +- .../avast/sst/jvm}/ssl/KeyStoreConfig.scala | 2 +- .../com/avast/sst/jvm}/ssl/KeyStoreType.scala | 2 +- .../com/avast/sst/jvm}/ssl/Protocol.scala | 2 +- .../avast/sst/jvm}/ssl/SslContextConfig.scala | 6 +- .../avast/sst/jvm}/ssl/SslContextModule.scala | 2 +- .../sst/jvm}/system/console/Console.scala | 2 +- .../jvm}/system/console/ConsoleModule.scala | 4 +- .../avast/sst/jvm}/system/random/Random.scala | 2 +- .../sst/jvm}/system/random/RandomModule.scala | 10 +- .../src/test/resources/truststore.jks | Bin .../jvm}/execution/ExecutorModuleTest.scala | 2 +- .../sst/jvm}/ssl/SslContextModuleTest.scala | 2 +- .../system/console/ConsoleModuleTest.scala | 2 +- .../jvm}/system/random/RandomModuleTest.scala | 2 +- .../jmx/pureconfig/ConfigReaders.scala | 11 ++ .../micrometer/jmx/pureconfig/package.scala | 3 + project/Dependencies.scala | 1 + .../implicits/Http4sBlazeServer.scala | 18 --- .../pureconfig/implicits/JvmExecution.scala | 20 --- .../sst/pureconfig/implicits/JvmSsl.scala | 21 ---- .../pureconfig/implicits/MicrometerJmx.scala | 15 --- 59 files changed, 273 insertions(+), 256 deletions(-) rename pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala => http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala (66%) create mode 100644 http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/package.scala rename {http4s-blaze-client/src/main/scala/com/avast/sst/http4s => http4s-client-blaze/src/main/scala/com/avast/sst/http4s/client}/Http4sBlazeClient.scala (95%) rename {http4s-blaze-client/src/main/scala/com/avast/sst/http4s => http4s-client-blaze/src/main/scala/com/avast/sst/http4s/client}/Http4sBlazeClientConfig.scala (93%) rename {http4s-blaze-client/src/test/scala/com/avast/sst/http4s => http4s-client-blaze/src/test/scala/com/avast/sst/http4s/client}/Http4SBlazeClientTest.scala (96%) create mode 100644 http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/ConfigReaders.scala create mode 100644 http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/package.scala rename {http4s-blaze-server/src/main/scala/com/avast/sst/http4s => http4s-server-blaze/src/main/scala/com/avast/sst/http4s/server}/Http4sBlazeServerConfig.scala (90%) rename {http4s-blaze-server/src/main/scala/com/avast/sst/http4s => http4s-server-blaze/src/main/scala/com/avast/sst/http4s/server}/Http4sBlazeServerModule.scala (97%) rename http4s-blaze-server/src/test/scala/com/avast/sst/http4s/Http4SBlazeServerModuleTest.scala => http4s-server-blaze/src/test/scala/com/avast/sst/http4s/server/Http4sBlazeServerModuleTest.scala (85%) rename {micrometer/src/main/scala/com/avast/sst => http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server}/micrometer/HttpStatusMetrics.scala (93%) rename micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sMetricsOps.scala => http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModule.scala (92%) rename {micrometer/src/main/scala/com/avast/sst/micrometer/interop => http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer}/MicrometerHttp4sServerMetricsModule.scala (59%) rename micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sRouteMetrics.scala => http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/RouteMetrics.scala (88%) rename {http4s-blaze-server/src/main/scala/com/avast/sst/http4s => http4s-server/src/main/scala/com/avast/sst/http4s/server}/Http4sRouting.scala (92%) rename {http4s-blaze-server/src/main/scala/com/avast/sst/http4s => http4s-server/src/main/scala/com/avast/sst/http4s/server}/middleware/CorrelationIdMiddleware.scala (94%) rename {http4s-blaze-server/src/test/scala/com/avast/sst/http4s => http4s-server/src/test/scala/com/avast/sst/http4s/server}/middleware/CorrelationIdMiddlewareTest.scala (75%) rename {micrometer/src/main/scala/com/avast/sst => jvm-micrometer/src/main/scala/com/avast/sst/jvm}/micrometer/MicrometerJvmModule.scala (94%) create mode 100644 jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/ConfigReaders.scala create mode 100644 jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/package.scala rename {jvm-execution/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/execution/ConfigurableThreadFactory.scala (90%) rename {jvm-execution/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/execution/ExecutorModule.scala (90%) rename {jvm-execution/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/execution/ForkJoinPoolConfig.scala (81%) rename {jvm-execution/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/execution/LoggingUncaughtExceptionHandler.scala (91%) rename {jvm-execution/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/execution/ThreadPoolExecutorConfig.scala (91%) rename {jvm-ssl/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/ssl/KeyStoreConfig.scala (83%) rename {jvm-ssl/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/ssl/KeyStoreType.scala (89%) rename {jvm-ssl/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/ssl/Protocol.scala (88%) rename {jvm-ssl/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/ssl/SslContextConfig.scala (76%) rename {jvm-ssl/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/ssl/SslContextModule.scala (99%) rename {jvm-system/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/system/console/Console.scala (95%) rename {jvm-system/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/system/console/ConsoleModule.scala (66%) rename {jvm-system/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/system/random/Random.scala (96%) rename {jvm-system/src/main/scala/com/avast/sst => jvm/src/main/scala/com/avast/sst/jvm}/system/random/RandomModule.scala (55%) rename {jvm-ssl => jvm}/src/test/resources/truststore.jks (100%) rename {jvm-execution/src/test/scala/com/avast/sst => jvm/src/test/scala/com/avast/sst/jvm}/execution/ExecutorModuleTest.scala (91%) rename {jvm-ssl/src/test/scala/com/avast/sst => jvm/src/test/scala/com/avast/sst/jvm}/ssl/SslContextModuleTest.scala (94%) rename {jvm-system/src/test/scala/com/avast/sst => jvm/src/test/scala/com/avast/sst/jvm}/system/console/ConsoleModuleTest.scala (96%) rename {jvm-system/src/test/scala/com/avast/sst => jvm/src/test/scala/com/avast/sst/jvm}/system/random/RandomModuleTest.scala (89%) create mode 100644 micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/ConfigReaders.scala create mode 100644 micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/package.scala delete mode 100644 pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala delete mode 100644 pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala delete mode 100644 pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala delete mode 100644 pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala diff --git a/README.md b/README.md index ae17be4ce..3f41175f0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Scala Server Toolkit [![Build Status](https://travis-ci.org/avast/scala-server-toolkit.svg?branch=master)](https://travis-ci.org/avast/scala-server-toolkit) -[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-http4s-blaze-server_2.12)](https://repo1.maven.org/maven2/com/avast/sst-http4s-blaze-server_2.12/) +[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-bundle-zio-http4s-blaze_2.12)](https://repo1.maven.org/maven2/com/avast/sst-bundle-zio-http4s-blaze_2.12/) [![Scala Steward badge](https://img.shields.io/badge/Scala_Steward-helping-brightgreen.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAMAAAARSr4IAAAAVFBMVEUAAACHjojlOy5NWlrKzcYRKjGFjIbp293YycuLa3pYY2LSqql4f3pCUFTgSjNodYRmcXUsPD/NTTbjRS+2jomhgnzNc223cGvZS0HaSD0XLjbaSjElhIr+AAAAAXRSTlMAQObYZgAAAHlJREFUCNdNyosOwyAIhWHAQS1Vt7a77/3fcxxdmv0xwmckutAR1nkm4ggbyEcg/wWmlGLDAA3oL50xi6fk5ffZ3E2E3QfZDCcCN2YtbEWZt+Drc6u6rlqv7Uk0LdKqqr5rk2UCRXOk0vmQKGfc94nOJyQjouF9H/wCc9gECEYfONoAAAAASUVORK5CYII=)](https://scala-steward.org) This project is a culmination of years of Scala development at Avast and tries to represent the best practices of Scala server development @@ -10,7 +10,7 @@ together well and allow you to build reliable server applications. ## [Documentation](./docs/index.md) -Or you can [deep dive into example code](example/src/main/scala/com/avast/server/toolkit/example/Main.scala) if you like that more. +Or you can [deep dive into example code](example/src/main/scala/com/avast/sst/example/Main.scala) if you like that more. ## Design diff --git a/build.sbt b/build.sbt index 7b36d3ee4..9327a3251 100644 --- a/build.sbt +++ b/build.sbt @@ -21,14 +21,18 @@ lazy val root = project bundleMonixHttp4sBlaze, bundleZioHttp4sBlaze, example, - http4sBlazeClient, - http4sBlazeServer, - jvmExecution, - jvmSsl, - jvmSystem, - micrometer, + http4sClientBlaze, + http4sClientBlazePureConfig, + http4sServer, + http4sServerBlaze, + http4sServerBlazePureConfig, + http4sServerMicrometer, + jvm, + jvmMicrometer, + jvmPureConfig, micrometerJmx, - pureconfig + micrometerJmxPureConfig, + pureConfig ) .settings( name := "scala-server-toolkit", @@ -37,7 +41,7 @@ lazy val root = project lazy val bundleMonixHttp4sBlaze = project .in(file("bundle-monix-http4s-blaze")) - .dependsOn(http4sBlazeClient, http4sBlazeServer, micrometer, micrometerJmx, pureconfig) + .dependsOn(http4sClientBlaze, http4sServerBlaze, http4sServerBlazePureConfig, http4sServerMicrometer, jvmMicrometer, jvmPureConfig) .settings(commonSettings) .settings( name := "sst-bundle-monix-http4s-blaze", @@ -46,7 +50,7 @@ lazy val bundleMonixHttp4sBlaze = project lazy val bundleZioHttp4sBlaze = project .in(file("bundle-zio-http4s-blaze")) - .dependsOn(http4sBlazeClient, http4sBlazeServer, micrometer, micrometerJmx, pureconfig) + .dependsOn(http4sClientBlaze, http4sServerBlaze, http4sServerBlazePureConfig, http4sServerMicrometer, jvmMicrometer, jvmPureConfig) .settings(commonSettings) .settings( name := "sst-bundle-zio-http4s-blaze", @@ -57,7 +61,7 @@ lazy val bundleZioHttp4sBlaze = project ) lazy val example = project - .dependsOn(bundleZioHttp4sBlaze, jvmExecution, jvmSystem) + .dependsOn(bundleZioHttp4sBlaze, micrometerJmxPureConfig) .enablePlugins(MdocPlugin) .settings(commonSettings) .settings( @@ -70,21 +74,40 @@ lazy val example = project libraryDependencies += Dependencies.logbackClassic ) -lazy val http4sBlazeClient = project - .in(file("http4s-blaze-client")) - .dependsOn(jvmSsl) +lazy val http4sClientBlaze = project + .in(file("http4s-client-blaze")) + .dependsOn(jvm) .settings(commonSettings) .settings( - name := "sst-http4s-blaze-client", + name := "sst-http4s-client-blaze", libraryDependencies += Dependencies.http4sBlazeClient ) -lazy val http4sBlazeServer = project - .in(file("http4s-blaze-server")) - .dependsOn(http4sBlazeClient % Test) +lazy val http4sClientBlazePureConfig = project + .in(file("http4s-client-blaze-pureconfig")) + .dependsOn(http4sClientBlaze, jvmPureConfig) + .settings(commonSettings) + .settings(name := "sst-http4s-client-blaze-pureconfig") + +lazy val http4sServer = project + .in(file("http4s-server")) + .settings(commonSettings) + .settings( + name := "sst-http4s-server", + libraryDependencies ++= Seq( + Dependencies.http4sServer, + Dependencies.http4sBlazeClient % Test, + Dependencies.http4sBlazeServer % Test, + Dependencies.http4sDsl % Test + ) + ) + +lazy val http4sServerBlaze = project + .in(file("http4s-server-blaze")) + .dependsOn(http4sServer, http4sClientBlaze % Test) .settings(commonSettings) .settings( - name := "sst-http4s-blaze-server", + name := "sst-http4s-server-blaze", libraryDependencies ++= Seq( Dependencies.http4sBlazeServer, Dependencies.http4sDsl, @@ -92,40 +115,44 @@ lazy val http4sBlazeServer = project ) ) -lazy val jvmExecution = project - .in(file("jvm-execution")) +lazy val http4sServerBlazePureConfig = project + .in(file("http4s-server-blaze-pureconfig")) + .dependsOn(http4sServerBlaze, pureConfig) .settings(commonSettings) - .settings( - name := "sst-jvm-execution", - libraryDependencies += Dependencies.slf4jApi - ) + .settings(name := "sst-http4s-server-blaze-pureconfig") -lazy val jvmSsl = project - .in(file("jvm-ssl")) +lazy val http4sServerMicrometer = project + .in(file("http4s-server-micrometer")) + .dependsOn(http4sServer) .settings(commonSettings) .settings( - name := "sst-jvm-ssl" + name := "sst-http4s-server-micrometer", + libraryDependencies += Dependencies.micrometerCore ) -lazy val jvmSystem = project - .in(file("jvm-system")) +lazy val jvm = project + .in(file("jvm")) .settings(commonSettings) .settings( - name := "sst-jvm-system" + name := "sst-jvm", + libraryDependencies += Dependencies.slf4jApi ) -lazy val micrometer = project - .in(file("micrometer")) - .dependsOn(http4sBlazeServer % Optional) +lazy val jvmMicrometer = project + .in(file("jvm-micrometer")) + .dependsOn(jvm) .settings(commonSettings) .settings( - name := "sst-micrometer", - libraryDependencies ++= Seq( - Dependencies.micrometerCore, - Dependencies.jsr305 // required because of Scala compiler - ) + name := "sst-jvm-micrometer", + libraryDependencies += Dependencies.micrometerCore ) +lazy val jvmPureConfig = project + .in(file("jvm-pureconfig")) + .dependsOn(jvm, pureConfig) + .settings(commonSettings) + .settings(name := "sst-jvm-pureconfig") + lazy val micrometerJmx = project .in(file("micrometer-jmx")) .settings(commonSettings) @@ -137,12 +164,13 @@ lazy val micrometerJmx = project ) ) -lazy val pureconfig = project - .dependsOn(http4sBlazeClient % Optional, - http4sBlazeServer % Optional, - jvmExecution % Optional, - jvmSsl % Optional, - micrometerJmx % Optional) +lazy val micrometerJmxPureConfig = project + .in(file("micrometer-jmx-pureconfig")) + .dependsOn(micrometerJmx, pureConfig) + .settings(commonSettings) + .settings(name := "sst-micrometer-jmx-pureconfig") + +lazy val pureConfig = project .settings(commonSettings) .settings( name := "sst-pureconfig", diff --git a/docs/http4s.md b/docs/http4s.md index 74862a485..4762591e9 100644 --- a/docs/http4s.md +++ b/docs/http4s.md @@ -1,8 +1,8 @@ # Module http4s -[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-http4s-blaze-server_2.12)](https://repo1.maven.org/maven2/com/avast/sst-http4s-blaze-server_2.12/) +[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-http4s-server-blaze_2.12)](https://repo1.maven.org/maven2/com/avast/sst-http4s-server-blaze_2.12/) -`libraryDependencies += "com.avast" %% "sst-http4s-blaze-server" % ""` +`libraryDependencies += "com.avast" %% "sst-http4s-server-blaze" % ""` There are `http4s-*` modules that provide easy initialization of a server and a client. Http4s is an interface with multiple possible implementations - for now we provide only implementations based on [Blaze](https://github.com/http4s/blaze). @@ -11,9 +11,10 @@ Both server and client are configured via configuration `case class` which conta ```scala import cats.effect._ -import com.avast.sst.execution.ExecutorModule -import com.avast.sst.http4s._ -import com.avast.sst.system.console.ConsoleModule +import com.avast.sst.http4s.client._ +import com.avast.sst.http4s.server._ +import com.avast.sst.jvm.execution.ExecutorModule +import com.avast.sst.jvm.system.console.ConsoleModule import org.http4s.dsl.Http4sDsl import org.http4s.HttpRoutes import zio.DefaultRuntime @@ -59,9 +60,9 @@ runtime.unsafeRun(program) ```scala import cats.effect._ -import com.avast.sst.execution.ExecutorModule -import com.avast.sst.http4s._ -import com.avast.sst.http4s.middleware.CorrelationIdMiddleware +import com.avast.sst.jvm.execution.ExecutorModule +import com.avast.sst.http4s.server._ +import com.avast.sst.http4s.server.middleware.CorrelationIdMiddleware import org.http4s.dsl.Http4sDsl import org.http4s.HttpRoutes import zio.DefaultRuntime diff --git a/docs/index.md b/docs/index.md index 39c2d2f25..9ca59a8a6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,6 +12,6 @@ Creating a simple HTTP server is as easy as this: #### build.sbt -[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-http4s-blaze-server_2.12)](https://repo1.maven.org/maven2/com/avast/sst-http4s-blaze-server_2.12/) +[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-bundle-zio-http4s-blaze_2.12)](https://repo1.maven.org/maven2/com/avast/sst-bundle-zio-http4s-blaze_2.12/) -`libraryDependencies += "com.avast" %% "sst-http4s-blaze-server" % ""` +`libraryDependencies += "com.avast" %% "sst-bundle-zio-http4s-blaze" % ""` diff --git a/docs/jvm.md b/docs/jvm.md index e83b6de82..26bbc2c2d 100644 --- a/docs/jvm.md +++ b/docs/jvm.md @@ -1,18 +1,19 @@ # Modules JVM -![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-jvm-system_2.12) +![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-jvm_2.12) -`libraryDependencies += "com.avast" %% "sst-jvm-system" % ""` +`libraryDependencies += "com.avast" %% "sst-jvm" % ""` -There is a set of `sst-jvm-*` modules that provide pure implementations of different JVM-related utilities: +Module `sst-jvm` provides pure implementations of different JVM-related utilities: -* `sst-jvm-execution` - creation of thread pools, -* `sst-jvm-ssl` - initialization of SSL context, -* `sst-jvm-system` - standard in/out/err, random number generation. +* creation of thread pools, +* initialization of SSL context, +* standard in/out/err, random number generation, +* and more. ```scala -import com.avast.sst.system.console.ConsoleModule -import com.avast.sst.system.random.RandomModule +import com.avast.sst.jvm.system.console.ConsoleModule +import com.avast.sst.jvm.system.random.RandomModule import zio.interop.catz._ import zio.DefaultRuntime import zio.Task @@ -23,11 +24,11 @@ val program = for { console = ConsoleModule.make[Task] _ <- console.printLine(s"Random number: $randomNumber") } yield () -// program: zio.ZIO[Any, Throwable, Unit] = zio.ZIO$FlatMap@2ce47652 +// program: zio.ZIO[Any, Throwable, Unit] = zio.ZIO$FlatMap@5b0e9e0c val runtime = new DefaultRuntime {} // this is just needed in example -// runtime: AnyRef with DefaultRuntime = repl.Session$App$$anon$1@35becbd4 // this is just needed in example +// runtime: AnyRef with DefaultRuntime = repl.Session$App$$anon$1@69c33ea2 // this is just needed in example runtime.unsafeRun(program) -// Random number: 1821017404 +// Random number: 948283653 ``` diff --git a/docs/pureconfig.md b/docs/pureconfig.md index e23de4a28..f4d0b15fa 100644 --- a/docs/pureconfig.md +++ b/docs/pureconfig.md @@ -4,9 +4,9 @@ `libraryDependencies += "com.avast" %% "sst-pureconfig" % ""` -This module allows you to load your application's configuration file according to a case class provided to it. It uses -[PureConfig](https://pureconfig.github.io) library to do so which uses [Lightbend Config](https://github.com/lightbend/config) which means -that your application's configuration will be in [HOCON](https://github.com/lightbend/config/blob/master/HOCON.md) format. +This module allows you to load your application's configuration file into a case class. It uses [PureConfig](https://pureconfig.github.io) +library to do so which uses [Lightbend Config](https://github.com/lightbend/config) which means that your application's configuration +will be in [HOCON](https://github.com/lightbend/config/blob/master/HOCON.md) format. Loading of configuration is side-effectful so it is wrapped in `F` which is `Sync`. This module also tweaks the error messages a little. diff --git a/example/src/main/mdoc/http4s.md b/example/src/main/mdoc/http4s.md index 72c953e6e..c2acd552c 100644 --- a/example/src/main/mdoc/http4s.md +++ b/example/src/main/mdoc/http4s.md @@ -1,8 +1,8 @@ # Module http4s -[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-http4s-blaze-server_2.12)](https://repo1.maven.org/maven2/com/avast/sst-http4s-blaze-server_2.12/) +[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-http4s-server-blaze_2.12)](https://repo1.maven.org/maven2/com/avast/sst-http4s-server-blaze_2.12/) -`libraryDependencies += "com.avast" %% "sst-http4s-blaze-server" % ""` +`libraryDependencies += "com.avast" %% "sst-http4s-server-blaze" % ""` There are `http4s-*` modules that provide easy initialization of a server and a client. Http4s is an interface with multiple possible implementations - for now we provide only implementations based on [Blaze](https://github.com/http4s/blaze). @@ -11,9 +11,10 @@ Both server and client are configured via configuration `case class` which conta ```scala mdoc:silent:reset-class import cats.effect._ -import com.avast.sst.execution.ExecutorModule -import com.avast.sst.http4s._ -import com.avast.sst.system.console.ConsoleModule +import com.avast.sst.http4s.client._ +import com.avast.sst.http4s.server._ +import com.avast.sst.jvm.execution.ExecutorModule +import com.avast.sst.jvm.system.console.ConsoleModule import org.http4s.dsl.Http4sDsl import org.http4s.HttpRoutes import zio.DefaultRuntime @@ -58,9 +59,9 @@ runtime.unsafeRun(program) ```scala mdoc:silent:reset import cats.effect._ -import com.avast.sst.execution.ExecutorModule -import com.avast.sst.http4s._ -import com.avast.sst.http4s.middleware.CorrelationIdMiddleware +import com.avast.sst.jvm.execution.ExecutorModule +import com.avast.sst.http4s.server._ +import com.avast.sst.http4s.server.middleware.CorrelationIdMiddleware import org.http4s.dsl.Http4sDsl import org.http4s.HttpRoutes import zio.DefaultRuntime diff --git a/example/src/main/mdoc/index.md b/example/src/main/mdoc/index.md index 39c2d2f25..9ca59a8a6 100644 --- a/example/src/main/mdoc/index.md +++ b/example/src/main/mdoc/index.md @@ -12,6 +12,6 @@ Creating a simple HTTP server is as easy as this: #### build.sbt -[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-http4s-blaze-server_2.12)](https://repo1.maven.org/maven2/com/avast/sst-http4s-blaze-server_2.12/) +[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-bundle-zio-http4s-blaze_2.12)](https://repo1.maven.org/maven2/com/avast/sst-bundle-zio-http4s-blaze_2.12/) -`libraryDependencies += "com.avast" %% "sst-http4s-blaze-server" % ""` +`libraryDependencies += "com.avast" %% "sst-bundle-zio-http4s-blaze" % ""` diff --git a/example/src/main/mdoc/jvm.md b/example/src/main/mdoc/jvm.md index db10d0379..fa0d739f1 100644 --- a/example/src/main/mdoc/jvm.md +++ b/example/src/main/mdoc/jvm.md @@ -1,18 +1,19 @@ # Modules JVM -![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-jvm-system_2.12) +![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-jvm_2.12) -`libraryDependencies += "com.avast" %% "sst-jvm-system" % ""` +`libraryDependencies += "com.avast" %% "sst-jvm" % ""` -There is a set of `sst-jvm-*` modules that provide pure implementations of different JVM-related utilities: +Module `sst-jvm` provides pure implementations of different JVM-related utilities: - * `sst-jvm-execution` - creation of thread pools, - * `sst-jvm-ssl` - initialization of SSL context, - * `sst-jvm-system` - standard in/out/err, random number generation. + * creation of thread pools, + * initialization of SSL context, + * standard in/out/err, random number generation, + * and more. ```scala mdoc -import com.avast.sst.system.console.ConsoleModule -import com.avast.sst.system.random.RandomModule +import com.avast.sst.jvm.system.console.ConsoleModule +import com.avast.sst.jvm.system.random.RandomModule import zio.interop.catz._ import zio.DefaultRuntime import zio.Task diff --git a/example/src/main/mdoc/pureconfig.md b/example/src/main/mdoc/pureconfig.md index 5c742929e..e67f565af 100644 --- a/example/src/main/mdoc/pureconfig.md +++ b/example/src/main/mdoc/pureconfig.md @@ -4,9 +4,9 @@ `libraryDependencies += "com.avast" %% "sst-pureconfig" % ""` -This module allows you to load your application's configuration file according to a case class provided to it. It uses -[PureConfig](https://pureconfig.github.io) library to do so which uses [Lightbend Config](https://github.com/lightbend/config) which means -that your application's configuration will be in [HOCON](https://github.com/lightbend/config/blob/master/HOCON.md) format. +This module allows you to load your application's configuration file into a case class. It uses [PureConfig](https://pureconfig.github.io) +library to do so which uses [Lightbend Config](https://github.com/lightbend/config) which means that your application's configuration +will be in [HOCON](https://github.com/lightbend/config/blob/master/HOCON.md) format. Loading of configuration is side-effectful so it is wrapped in `F` which is `Sync`. This module also tweaks the error messages a little. diff --git a/example/src/main/scala/com/avast/sst/example/Main.scala b/example/src/main/scala/com/avast/sst/example/Main.scala index 884b96332..c86cfa90d 100644 --- a/example/src/main/scala/com/avast/sst/example/Main.scala +++ b/example/src/main/scala/com/avast/sst/example/Main.scala @@ -6,13 +6,13 @@ import cats.effect.{Clock, Resource} import com.avast.sst.bundle.ZioServerApp import com.avast.sst.example.config.Configuration import com.avast.sst.example.module.Http4sRoutingModule -import com.avast.sst.execution.ExecutorModule -import com.avast.sst.http4s.Http4sBlazeServerModule -import com.avast.sst.micrometer.MicrometerJvmModule -import com.avast.sst.micrometer.interop.MicrometerHttp4sServerMetricsModule +import com.avast.sst.http4s.server.Http4sBlazeServerModule +import com.avast.sst.http4s.server.micrometer.MicrometerHttp4sServerMetricsModule +import com.avast.sst.jvm.execution.ExecutorModule +import com.avast.sst.jvm.micrometer.MicrometerJvmModule +import com.avast.sst.jvm.system.console.{Console, ConsoleModule} import com.avast.sst.micrometer.jmx.MicrometerJmxModule import com.avast.sst.pureconfig.PureConfigModule -import com.avast.sst.system.console.{Console, ConsoleModule} import org.http4s.server.Server import zio.Task import zio.interop.catz._ @@ -32,9 +32,7 @@ object Main extends ZioServerApp { ) meterRegistry <- MicrometerJmxModule.make[Task](configuration.jmx) _ <- Resource.liftF(MicrometerJvmModule.make[Task](meterRegistry)) - serverMetricsModule <- Resource.liftF[Task, MicrometerHttp4sServerMetricsModule[Task]]( - MicrometerHttp4sServerMetricsModule.make(meterRegistry, clock) - ) + serverMetricsModule <- Resource.liftF(MicrometerHttp4sServerMetricsModule.make[Task](meterRegistry, clock)) routingModule = new Http4sRoutingModule(serverMetricsModule) server <- Http4sBlazeServerModule.make[Task](configuration.server, routingModule.router, executorModule.executionContext) } yield server diff --git a/example/src/main/scala/com/avast/sst/example/config/Configuration.scala b/example/src/main/scala/com/avast/sst/example/config/Configuration.scala index d361f7437..b46744c14 100644 --- a/example/src/main/scala/com/avast/sst/example/config/Configuration.scala +++ b/example/src/main/scala/com/avast/sst/example/config/Configuration.scala @@ -1,11 +1,11 @@ package com.avast.sst.example.config -import com.avast.sst.http4s.Http4sBlazeServerConfig +import com.avast.sst.http4s.server.Http4sBlazeServerConfig import com.avast.sst.micrometer.jmx.MicrometerJmxConfig -import com.avast.sst.pureconfig.implicits.Http4sBlazeServer._ -import com.avast.sst.pureconfig.implicits.MicrometerJmx.jmxConfigReader +import com.avast.sst.http4s.server.pureconfig._ +import com.avast.sst.micrometer.jmx.pureconfig._ import pureconfig.ConfigReader -import pureconfig.generic.semiauto._ +import pureconfig.generic.semiauto.deriveReader final case class Configuration(server: Http4sBlazeServerConfig, jmx: MicrometerJmxConfig) diff --git a/example/src/main/scala/com/avast/sst/example/module/Http4sRoutingModule.scala b/example/src/main/scala/com/avast/sst/example/module/Http4sRoutingModule.scala index 05721ac43..0652e0975 100644 --- a/example/src/main/scala/com/avast/sst/example/module/Http4sRoutingModule.scala +++ b/example/src/main/scala/com/avast/sst/example/module/Http4sRoutingModule.scala @@ -1,7 +1,7 @@ package com.avast.sst.example.module -import com.avast.sst.http4s.Http4sRouting -import com.avast.sst.micrometer.interop.MicrometerHttp4sServerMetricsModule +import com.avast.sst.http4s.server.Http4sRouting +import com.avast.sst.http4s.server.micrometer.MicrometerHttp4sServerMetricsModule import org.http4s.dsl.Http4sDsl import org.http4s.{HttpApp, HttpRoutes} import zio.Task @@ -18,7 +18,7 @@ class Http4sRoutingModule(serverMetricsModule: MicrometerHttp4sServerMetricsModu } val router: HttpApp[Task] = Http4sRouting.make { - globalMetrics { + serverMetrics { routes } } diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala b/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala similarity index 66% rename from pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala rename to http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala index 444fa1ab1..317b8dfdc 100644 --- a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeClient.scala +++ b/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala @@ -1,20 +1,15 @@ -package com.avast.sst.pureconfig.implicits +package com.avast.sst.http4s.client.pureconfig import cats.syntax.either._ -import com.avast.sst.http4s.Http4sBlazeClientConfig +import com.avast.sst.http4s.client.Http4sBlazeClientConfig +import com.avast.sst.jvm.pureconfig._ import org.http4s.client.blaze.ParserMode import org.http4s.headers.`User-Agent` import pureconfig.ConfigReader import pureconfig.error.CannotConvert import pureconfig.generic.semiauto.{deriveEnumerationReader, deriveReader} -/** Implicit [[pureconfig.ConfigReader]] instances for `sst-http4s-blaze-client` module. - * - * ```Do not forget``` to have a dependency on the `sst-http4s-blaze-client` module in your project. - */ -object Http4sBlazeClient { - - import JvmSsl._ +trait ConfigReaders { implicit val userAgentReader: ConfigReader[`User-Agent`] = ConfigReader[String].emap { value => `User-Agent`.parse(value).leftMap { parseFailure => diff --git a/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/package.scala b/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/package.scala new file mode 100644 index 000000000..3b7a1c941 --- /dev/null +++ b/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/package.scala @@ -0,0 +1,3 @@ +package com.avast.sst.http4s.client + +package object pureconfig extends ConfigReaders diff --git a/http4s-blaze-client/src/main/scala/com/avast/sst/http4s/Http4sBlazeClient.scala b/http4s-client-blaze/src/main/scala/com/avast/sst/http4s/client/Http4sBlazeClient.scala similarity index 95% rename from http4s-blaze-client/src/main/scala/com/avast/sst/http4s/Http4sBlazeClient.scala rename to http4s-client-blaze/src/main/scala/com/avast/sst/http4s/client/Http4sBlazeClient.scala index 38c5bd10b..4de5fd9ed 100644 --- a/http4s-blaze-client/src/main/scala/com/avast/sst/http4s/Http4sBlazeClient.scala +++ b/http4s-client-blaze/src/main/scala/com/avast/sst/http4s/client/Http4sBlazeClient.scala @@ -1,9 +1,9 @@ -package com.avast.sst.http4s +package com.avast.sst.http4s.client import cats.Traverse import cats.effect.{ConcurrentEffect, Resource, Sync} import cats.implicits._ -import com.avast.sst.ssl.{SslContextConfig, SslContextModule} +import com.avast.sst.jvm.ssl.{SslContextConfig, SslContextModule} import javax.net.ssl.SSLContext import org.http4s.client.Client import org.http4s.client.blaze.BlazeClientBuilder diff --git a/http4s-blaze-client/src/main/scala/com/avast/sst/http4s/Http4sBlazeClientConfig.scala b/http4s-client-blaze/src/main/scala/com/avast/sst/http4s/client/Http4sBlazeClientConfig.scala similarity index 93% rename from http4s-blaze-client/src/main/scala/com/avast/sst/http4s/Http4sBlazeClientConfig.scala rename to http4s-client-blaze/src/main/scala/com/avast/sst/http4s/client/Http4sBlazeClientConfig.scala index f98d46d30..faa397d96 100644 --- a/http4s-blaze-client/src/main/scala/com/avast/sst/http4s/Http4sBlazeClientConfig.scala +++ b/http4s-client-blaze/src/main/scala/com/avast/sst/http4s/client/Http4sBlazeClientConfig.scala @@ -1,8 +1,8 @@ -package com.avast.sst.http4s +package com.avast.sst.http4s.client import java.util.concurrent.TimeUnit -import com.avast.sst.ssl.SslContextConfig +import com.avast.sst.jvm.ssl.SslContextConfig import org.http4s.BuildInfo import org.http4s.client.blaze.ParserMode import org.http4s.client.defaults diff --git a/http4s-blaze-client/src/test/scala/com/avast/sst/http4s/Http4SBlazeClientTest.scala b/http4s-client-blaze/src/test/scala/com/avast/sst/http4s/client/Http4SBlazeClientTest.scala similarity index 96% rename from http4s-blaze-client/src/test/scala/com/avast/sst/http4s/Http4SBlazeClientTest.scala rename to http4s-client-blaze/src/test/scala/com/avast/sst/http4s/client/Http4SBlazeClientTest.scala index bc9646b2f..f38b31aed 100644 --- a/http4s-blaze-client/src/test/scala/com/avast/sst/http4s/Http4SBlazeClientTest.scala +++ b/http4s-client-blaze/src/test/scala/com/avast/sst/http4s/client/Http4SBlazeClientTest.scala @@ -1,4 +1,4 @@ -package com.avast.sst.http4s +package com.avast.sst.http4s.client import cats.effect._ import org.http4s.headers.{`User-Agent`, AgentComment, AgentProduct} diff --git a/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/ConfigReaders.scala b/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/ConfigReaders.scala new file mode 100644 index 000000000..f70a3d042 --- /dev/null +++ b/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/ConfigReaders.scala @@ -0,0 +1,14 @@ +package com.avast.sst.http4s.server.pureconfig + +import com.avast.sst.http4s.server.Http4sBlazeServerConfig +import com.avast.sst.http4s.server.Http4sBlazeServerConfig.SocketOptions +import pureconfig.ConfigReader +import pureconfig.generic.semiauto.deriveReader + +trait ConfigReaders { + + implicit val socketOptionsReader: ConfigReader[SocketOptions] = deriveReader + + implicit val http4sServerConfigReader: ConfigReader[Http4sBlazeServerConfig] = deriveReader + +} diff --git a/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/package.scala b/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/package.scala new file mode 100644 index 000000000..cb322684e --- /dev/null +++ b/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/package.scala @@ -0,0 +1,3 @@ +package com.avast.sst.http4s.server + +package object pureconfig extends ConfigReaders diff --git a/http4s-blaze-server/src/main/scala/com/avast/sst/http4s/Http4sBlazeServerConfig.scala b/http4s-server-blaze/src/main/scala/com/avast/sst/http4s/server/Http4sBlazeServerConfig.scala similarity index 90% rename from http4s-blaze-server/src/main/scala/com/avast/sst/http4s/Http4sBlazeServerConfig.scala rename to http4s-server-blaze/src/main/scala/com/avast/sst/http4s/server/Http4sBlazeServerConfig.scala index 461bb4a19..b557c52fd 100644 --- a/http4s-blaze-server/src/main/scala/com/avast/sst/http4s/Http4sBlazeServerConfig.scala +++ b/http4s-server-blaze/src/main/scala/com/avast/sst/http4s/server/Http4sBlazeServerConfig.scala @@ -1,8 +1,8 @@ -package com.avast.sst.http4s +package com.avast.sst.http4s.server import java.util.concurrent.TimeUnit -import com.avast.sst.http4s.Http4sBlazeServerConfig.SocketOptions +import com.avast.sst.http4s.server.Http4sBlazeServerConfig.SocketOptions import org.http4s.blaze.channel import org.http4s.server.defaults diff --git a/http4s-blaze-server/src/main/scala/com/avast/sst/http4s/Http4sBlazeServerModule.scala b/http4s-server-blaze/src/main/scala/com/avast/sst/http4s/server/Http4sBlazeServerModule.scala similarity index 97% rename from http4s-blaze-server/src/main/scala/com/avast/sst/http4s/Http4sBlazeServerModule.scala rename to http4s-server-blaze/src/main/scala/com/avast/sst/http4s/server/Http4sBlazeServerModule.scala index 14e61cad7..4e532e8fb 100644 --- a/http4s-blaze-server/src/main/scala/com/avast/sst/http4s/Http4sBlazeServerModule.scala +++ b/http4s-server-blaze/src/main/scala/com/avast/sst/http4s/server/Http4sBlazeServerModule.scala @@ -1,4 +1,4 @@ -package com.avast.sst.http4s +package com.avast.sst.http4s.server import java.net.{InetSocketAddress, StandardSocketOptions} diff --git a/http4s-blaze-server/src/test/scala/com/avast/sst/http4s/Http4SBlazeServerModuleTest.scala b/http4s-server-blaze/src/test/scala/com/avast/sst/http4s/server/Http4sBlazeServerModuleTest.scala similarity index 85% rename from http4s-blaze-server/src/test/scala/com/avast/sst/http4s/Http4SBlazeServerModuleTest.scala rename to http4s-server-blaze/src/test/scala/com/avast/sst/http4s/server/Http4sBlazeServerModuleTest.scala index 0d2e08669..3f6a5b0d5 100644 --- a/http4s-blaze-server/src/test/scala/com/avast/sst/http4s/Http4SBlazeServerModuleTest.scala +++ b/http4s-server-blaze/src/test/scala/com/avast/sst/http4s/server/Http4sBlazeServerModuleTest.scala @@ -1,13 +1,14 @@ -package com.avast.sst.http4s +package com.avast.sst.http4s.server import cats.effect.{ContextShift, IO, Timer} +import com.avast.sst.http4s.client.{Http4sBlazeClient, Http4sBlazeClientConfig} import org.http4s.HttpRoutes import org.http4s.dsl.Http4sDsl import org.scalatest.AsyncFunSuite import scala.concurrent.ExecutionContext -class Http4SBlazeServerModuleTest extends AsyncFunSuite with Http4sDsl[IO] { +class Http4sBlazeServerModuleTest extends AsyncFunSuite with Http4sDsl[IO] { implicit private val cs: ContextShift[IO] = IO.contextShift(ExecutionContext.global) implicit private val timer: Timer[IO] = IO.timer(ExecutionContext.global) diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/HttpStatusMetrics.scala b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/HttpStatusMetrics.scala similarity index 93% rename from micrometer/src/main/scala/com/avast/sst/micrometer/HttpStatusMetrics.scala rename to http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/HttpStatusMetrics.scala index d17087ce3..18015b73f 100644 --- a/micrometer/src/main/scala/com/avast/sst/micrometer/HttpStatusMetrics.scala +++ b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/HttpStatusMetrics.scala @@ -1,4 +1,4 @@ -package com.avast.sst.micrometer +package com.avast.sst.http4s.server.micrometer import io.micrometer.core.instrument.{Counter, MeterRegistry} diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sMetricsOps.scala b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModule.scala similarity index 92% rename from micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sMetricsOps.scala rename to http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModule.scala index ef9d48ba7..8cff50b66 100644 --- a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sMetricsOps.scala +++ b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModule.scala @@ -1,18 +1,15 @@ -package com.avast.sst.micrometer.interop +package com.avast.sst.http4s.server.micrometer import java.util.concurrent.TimeUnit import cats.effect.Sync import cats.syntax.flatMap._ import cats.syntax.functor._ -import com.avast.sst.micrometer.HttpStatusMetrics import io.micrometer.core.instrument.MeterRegistry import org.http4s.metrics.{MetricsOps, TerminationType} import org.http4s.{Method, Status} -import scala.language.higherKinds - -object Http4sMetricsOps { +object MicrometerHttp4sMetricsOpsModule { def make[F[_]: Sync](meterRegistry: MeterRegistry): F[MetricsOps[F]] = { val F = Sync[F] diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/MicrometerHttp4sServerMetricsModule.scala b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sServerMetricsModule.scala similarity index 59% rename from micrometer/src/main/scala/com/avast/sst/micrometer/interop/MicrometerHttp4sServerMetricsModule.scala rename to http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sServerMetricsModule.scala index a73c1b151..fd6ad4a44 100644 --- a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/MicrometerHttp4sServerMetricsModule.scala +++ b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sServerMetricsModule.scala @@ -1,4 +1,4 @@ -package com.avast.sst.micrometer.interop +package com.avast.sst.http4s.server.micrometer import cats.effect.{Clock, Effect, Sync} import cats.syntax.flatMap._ @@ -9,8 +9,7 @@ import org.http4s.server.middleware.Metrics import scala.language.higherKinds -class MicrometerHttp4sServerMetricsModule[F[_]: Sync](val globalMetrics: HttpRoutes[F] => HttpRoutes[F], - val routeMetrics: Http4sRouteMetrics[F]) +class MicrometerHttp4sServerMetricsModule[F[_]: Sync](val serverMetrics: HttpRoutes[F] => HttpRoutes[F], val routeMetrics: RouteMetrics[F]) object MicrometerHttp4sServerMetricsModule { @@ -18,8 +17,8 @@ object MicrometerHttp4sServerMetricsModule { implicit val c: Clock[F] = clock for { - metricsOps <- Http4sMetricsOps.make[F](meterRegistry) - routeMetrics <- Sync[F].delay(new Http4sRouteMetrics[F](meterRegistry, clock)) + metricsOps <- MicrometerHttp4sMetricsOpsModule.make[F](meterRegistry) + routeMetrics <- Sync[F].delay(new RouteMetrics[F](meterRegistry, clock)) } yield new MicrometerHttp4sServerMetricsModule[F](Metrics(metricsOps), routeMetrics) } diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sRouteMetrics.scala b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/RouteMetrics.scala similarity index 88% rename from micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sRouteMetrics.scala rename to http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/RouteMetrics.scala index 9f70e9b81..18b35c5c6 100644 --- a/micrometer/src/main/scala/com/avast/sst/micrometer/interop/Http4sRouteMetrics.scala +++ b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/RouteMetrics.scala @@ -1,4 +1,4 @@ -package com.avast.sst.micrometer.interop +package com.avast.sst.http4s.server.micrometer import java.util.concurrent.TimeUnit @@ -6,13 +6,12 @@ import cats.effect.syntax.bracket._ import cats.effect.{Clock, Sync} import cats.syntax.flatMap._ import cats.syntax.functor._ -import com.avast.sst.micrometer.HttpStatusMetrics import io.micrometer.core.instrument.MeterRegistry import org.http4s.Response import scala.language.higherKinds -class Http4sRouteMetrics[F[_]: Sync](meterRegistry: MeterRegistry, clock: Clock[F]) { +class RouteMetrics[F[_]: Sync](meterRegistry: MeterRegistry, clock: Clock[F]) { private val F = Sync[F] diff --git a/http4s-blaze-server/src/main/scala/com/avast/sst/http4s/Http4sRouting.scala b/http4s-server/src/main/scala/com/avast/sst/http4s/server/Http4sRouting.scala similarity index 92% rename from http4s-blaze-server/src/main/scala/com/avast/sst/http4s/Http4sRouting.scala rename to http4s-server/src/main/scala/com/avast/sst/http4s/server/Http4sRouting.scala index 8c04212af..23fc8902a 100644 --- a/http4s-blaze-server/src/main/scala/com/avast/sst/http4s/Http4sRouting.scala +++ b/http4s-server/src/main/scala/com/avast/sst/http4s/server/Http4sRouting.scala @@ -1,4 +1,4 @@ -package com.avast.sst.http4s +package com.avast.sst.http4s.server import cats.Monad import cats.syntax.all._ @@ -11,7 +11,6 @@ object Http4sRouting { /** Makes [[org.http4s.HttpApp]] from [[org.http4s.HttpRoutes]] */ def make[F[_]: Monad](routes: HttpRoutes[F], more: HttpRoutes[F]*): HttpApp[F] = { - more .foldLeft[HttpRoutes[F]](routes)(_.combineK(_)) .orNotFound diff --git a/http4s-blaze-server/src/main/scala/com/avast/sst/http4s/middleware/CorrelationIdMiddleware.scala b/http4s-server/src/main/scala/com/avast/sst/http4s/server/middleware/CorrelationIdMiddleware.scala similarity index 94% rename from http4s-blaze-server/src/main/scala/com/avast/sst/http4s/middleware/CorrelationIdMiddleware.scala rename to http4s-server/src/main/scala/com/avast/sst/http4s/server/middleware/CorrelationIdMiddleware.scala index f269e76a8..2b6bc1928 100644 --- a/http4s-blaze-server/src/main/scala/com/avast/sst/http4s/middleware/CorrelationIdMiddleware.scala +++ b/http4s-server/src/main/scala/com/avast/sst/http4s/server/middleware/CorrelationIdMiddleware.scala @@ -1,11 +1,11 @@ -package com.avast.sst.http4s.middleware +package com.avast.sst.http4s.server.middleware import java.util.UUID import cats.data.{Kleisli, OptionT} import cats.effect.Sync import cats.syntax.functor._ -import com.avast.sst.http4s.middleware.CorrelationIdMiddleware.CorrelationId +import com.avast.sst.http4s.server.middleware.CorrelationIdMiddleware.CorrelationId import io.chrisdavenport.vault.Key import org.http4s.util.CaseInsensitiveString import org.http4s.{Header, HttpRoutes, Request, Response} diff --git a/http4s-blaze-server/src/test/scala/com/avast/sst/http4s/middleware/CorrelationIdMiddlewareTest.scala b/http4s-server/src/test/scala/com/avast/sst/http4s/server/middleware/CorrelationIdMiddlewareTest.scala similarity index 75% rename from http4s-blaze-server/src/test/scala/com/avast/sst/http4s/middleware/CorrelationIdMiddlewareTest.scala rename to http4s-server/src/test/scala/com/avast/sst/http4s/server/middleware/CorrelationIdMiddlewareTest.scala index cec929e87..a69a21ecc 100644 --- a/http4s-blaze-server/src/test/scala/com/avast/sst/http4s/middleware/CorrelationIdMiddlewareTest.scala +++ b/http4s-server/src/test/scala/com/avast/sst/http4s/server/middleware/CorrelationIdMiddlewareTest.scala @@ -1,8 +1,12 @@ -package com.avast.sst.http4s.middleware +package com.avast.sst.http4s.server.middleware + +import java.net.InetSocketAddress import cats.effect.{ContextShift, IO, Resource, Timer} -import com.avast.sst.http4s.{Http4sBlazeClient, Http4sBlazeClientConfig, Http4sBlazeServerConfig, Http4sBlazeServerModule, Http4sRouting} +import com.avast.sst.http4s.server.Http4sRouting +import org.http4s.client.blaze.BlazeClientBuilder import org.http4s.dsl.Http4sDsl +import org.http4s.server.blaze.BlazeServerBuilder import org.http4s.util.CaseInsensitiveString import org.http4s.{Header, HttpRoutes, Request, Uri} import org.scalatest.AsyncFunSuite @@ -26,8 +30,12 @@ class CorrelationIdMiddlewareTest extends AsyncFunSuite with Http4sDsl[IO] { } } } - server <- Http4sBlazeServerModule.make[IO](Http4sBlazeServerConfig("127.0.0.1", 0), routes, ExecutionContext.global) - client <- Http4sBlazeClient.make[IO](Http4sBlazeClientConfig(), ExecutionContext.global) + server <- BlazeServerBuilder[IO] + .bindSocketAddress(InetSocketAddress.createUnresolved("127.0.0.1", 0)) + .withExecutionContext(ExecutionContext.global) + .withHttpApp(routes) + .resource + client <- BlazeClientBuilder[IO](ExecutionContext.global).resource } yield (server, client) test diff --git a/micrometer/src/main/scala/com/avast/sst/micrometer/MicrometerJvmModule.scala b/jvm-micrometer/src/main/scala/com/avast/sst/jvm/micrometer/MicrometerJvmModule.scala similarity index 94% rename from micrometer/src/main/scala/com/avast/sst/micrometer/MicrometerJvmModule.scala rename to jvm-micrometer/src/main/scala/com/avast/sst/jvm/micrometer/MicrometerJvmModule.scala index aca50038e..c562f89b3 100644 --- a/micrometer/src/main/scala/com/avast/sst/micrometer/MicrometerJvmModule.scala +++ b/jvm-micrometer/src/main/scala/com/avast/sst/jvm/micrometer/MicrometerJvmModule.scala @@ -1,4 +1,4 @@ -package com.avast.sst.micrometer +package com.avast.sst.jvm.micrometer import cats.effect.Sync import io.micrometer.core.instrument.MeterRegistry diff --git a/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/ConfigReaders.scala b/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/ConfigReaders.scala new file mode 100644 index 000000000..22dba38de --- /dev/null +++ b/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/ConfigReaders.scala @@ -0,0 +1,25 @@ +package com.avast.sst.jvm.pureconfig + +import com.avast.sst.jvm.execution.ForkJoinPoolConfig.TaskPeekingMode +import com.avast.sst.jvm.execution.{ForkJoinPoolConfig, ThreadPoolExecutorConfig} +import com.avast.sst.jvm.ssl.{KeyStoreConfig, KeyStoreType, Protocol, SslContextConfig} +import pureconfig.ConfigReader +import pureconfig.generic.semiauto.{deriveEnumerationReader, deriveReader} + +trait ConfigReaders { + + implicit val threadPoolExecutorConfigReader: ConfigReader[ThreadPoolExecutorConfig] = deriveReader + + implicit val taskPeekingModeReader: ConfigReader[TaskPeekingMode] = deriveEnumerationReader + + implicit val forkJoinPoolConfigReader: ConfigReader[ForkJoinPoolConfig] = deriveReader + + implicit val sslProtocolReader: ConfigReader[Protocol] = deriveEnumerationReader + + implicit val keyStoreTypeReader: ConfigReader[KeyStoreType] = deriveEnumerationReader + + implicit val keyStoreConfigReader: ConfigReader[KeyStoreConfig] = deriveReader + + implicit val sslContextConfigReader: ConfigReader[SslContextConfig] = deriveReader + +} diff --git a/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/package.scala b/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/package.scala new file mode 100644 index 000000000..64c528050 --- /dev/null +++ b/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/package.scala @@ -0,0 +1,3 @@ +package com.avast.sst.jvm + +package object pureconfig extends ConfigReaders diff --git a/jvm-execution/src/main/scala/com/avast/sst/execution/ConfigurableThreadFactory.scala b/jvm/src/main/scala/com/avast/sst/jvm/execution/ConfigurableThreadFactory.scala similarity index 90% rename from jvm-execution/src/main/scala/com/avast/sst/execution/ConfigurableThreadFactory.scala rename to jvm/src/main/scala/com/avast/sst/jvm/execution/ConfigurableThreadFactory.scala index fb8d28611..b6a460c52 100644 --- a/jvm-execution/src/main/scala/com/avast/sst/execution/ConfigurableThreadFactory.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/execution/ConfigurableThreadFactory.scala @@ -1,14 +1,14 @@ -package com.avast.sst.execution +package com.avast.sst.jvm.execution import java.lang.Thread.UncaughtExceptionHandler import java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory import java.util.concurrent.atomic.AtomicLong import java.util.concurrent.{ForkJoinPool, ForkJoinWorkerThread, ThreadFactory} -import com.avast.sst.execution.ConfigurableThreadFactory.Config +import com.avast.sst.jvm.execution.ConfigurableThreadFactory.Config /** Thread factory (both [[java.util.concurrent.ThreadFactory]] and [[java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory]]) - * that creates new threads according to the provided [[com.avast.sst.execution.ConfigurableThreadFactory.Config]]. + * that creates new threads according to the provided [[com.avast.sst.jvm.execution.ConfigurableThreadFactory.Config]]. */ class ConfigurableThreadFactory(config: Config) extends ThreadFactory with ForkJoinWorkerThreadFactory { diff --git a/jvm-execution/src/main/scala/com/avast/sst/execution/ExecutorModule.scala b/jvm/src/main/scala/com/avast/sst/jvm/execution/ExecutorModule.scala similarity index 90% rename from jvm-execution/src/main/scala/com/avast/sst/execution/ExecutorModule.scala rename to jvm/src/main/scala/com/avast/sst/jvm/execution/ExecutorModule.scala index 37f2c7deb..f695f05e2 100644 --- a/jvm-execution/src/main/scala/com/avast/sst/execution/ExecutorModule.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/execution/ExecutorModule.scala @@ -1,4 +1,4 @@ -package com.avast.sst.execution +package com.avast.sst.jvm.execution import java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory import java.util.concurrent.{ @@ -13,7 +13,7 @@ import java.util.concurrent.{ } import cats.effect.{Blocker, Resource, Sync} -import com.avast.sst.execution.ConfigurableThreadFactory.Config +import com.avast.sst.jvm.execution.ConfigurableThreadFactory.Config import scala.concurrent.{ExecutionContext, ExecutionContextExecutorService} import scala.language.higherKinds @@ -53,7 +53,7 @@ class ExecutorModule[F[_]: Sync](val numOfCpus: Int, object ExecutorModule { - /** Makes [[com.avast.sst.execution.ExecutorModule]] with default callback executor and extra [[cats.effect.Blocker]] executor + /** Makes [[com.avast.sst.jvm.execution.ExecutorModule]] with default callback executor and extra [[cats.effect.Blocker]] executor * for blocking operations. */ def makeDefault[F[_]: Sync]: Resource[F, ExecutorModule[F]] = { @@ -66,7 +66,7 @@ object ExecutorModule { } yield new ExecutorModule[F](numOfCpus, executor, blockingExecutor) } - /** Makes [[com.avast.sst.execution.ExecutorModule]] with the provided callback executor and extra [[cats.effect.Blocker]] + /** Makes [[com.avast.sst.jvm.execution.ExecutorModule]] with the provided callback executor and extra [[cats.effect.Blocker]] * executor for blocking operations. */ def makeFromExecutionContext[F[_]: Sync](executor: ExecutionContext): Resource[F, ExecutorModule[F]] = { @@ -76,7 +76,7 @@ object ExecutorModule { } yield new ExecutorModule[F](numOfCpus, executor, blockingExecutor) } - /** Makes [[com.avast.sst.execution.ExecutorModule]] with executor and extra [[cats.effect.Blocker]] executor + /** Makes [[com.avast.sst.jvm.execution.ExecutorModule]] with executor and extra [[cats.effect.Blocker]] executor * for blocking operations. */ def makeFromConfig[F[_]: Sync](executorConfig: ThreadPoolExecutorConfig): Resource[F, ExecutorModule[F]] = { @@ -88,7 +88,7 @@ object ExecutorModule { } yield new ExecutorModule[F](numOfCpus, executor, blockingExecutor) } - /** Makes [[com.avast.sst.execution.ExecutorModule]] with fork-join executor and extra [[cats.effect.Blocker]] executor + /** Makes [[com.avast.sst.jvm.execution.ExecutorModule]] with fork-join executor and extra [[cats.effect.Blocker]] executor * for blocking operations. */ def makeForkJoinFromConfig[F[_]: Sync](executorConfig: ForkJoinPoolConfig): Resource[F, ExecutorModule[F]] = { diff --git a/jvm-execution/src/main/scala/com/avast/sst/execution/ForkJoinPoolConfig.scala b/jvm/src/main/scala/com/avast/sst/jvm/execution/ForkJoinPoolConfig.scala similarity index 81% rename from jvm-execution/src/main/scala/com/avast/sst/execution/ForkJoinPoolConfig.scala rename to jvm/src/main/scala/com/avast/sst/jvm/execution/ForkJoinPoolConfig.scala index bef556bf7..bed4135cc 100644 --- a/jvm-execution/src/main/scala/com/avast/sst/execution/ForkJoinPoolConfig.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/execution/ForkJoinPoolConfig.scala @@ -1,7 +1,7 @@ -package com.avast.sst.execution +package com.avast.sst.jvm.execution -import com.avast.sst.execution.ForkJoinPoolConfig.TaskPeekingMode -import com.avast.sst.execution.ForkJoinPoolConfig.TaskPeekingMode.{FIFO, LIFO} +import com.avast.sst.jvm.execution.ForkJoinPoolConfig.TaskPeekingMode +import com.avast.sst.jvm.execution.ForkJoinPoolConfig.TaskPeekingMode.{FIFO, LIFO} final case class ForkJoinPoolConfig(parallelismMin: Int = 8, parallelismFactor: Double = 1.0, diff --git a/jvm-execution/src/main/scala/com/avast/sst/execution/LoggingUncaughtExceptionHandler.scala b/jvm/src/main/scala/com/avast/sst/jvm/execution/LoggingUncaughtExceptionHandler.scala similarity index 91% rename from jvm-execution/src/main/scala/com/avast/sst/execution/LoggingUncaughtExceptionHandler.scala rename to jvm/src/main/scala/com/avast/sst/jvm/execution/LoggingUncaughtExceptionHandler.scala index f83e2bc4d..5b7313698 100644 --- a/jvm-execution/src/main/scala/com/avast/sst/execution/LoggingUncaughtExceptionHandler.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/execution/LoggingUncaughtExceptionHandler.scala @@ -1,4 +1,4 @@ -package com.avast.sst.execution +package com.avast.sst.jvm.execution import java.lang.Thread.UncaughtExceptionHandler diff --git a/jvm-execution/src/main/scala/com/avast/sst/execution/ThreadPoolExecutorConfig.scala b/jvm/src/main/scala/com/avast/sst/jvm/execution/ThreadPoolExecutorConfig.scala similarity index 91% rename from jvm-execution/src/main/scala/com/avast/sst/execution/ThreadPoolExecutorConfig.scala rename to jvm/src/main/scala/com/avast/sst/jvm/execution/ThreadPoolExecutorConfig.scala index 891eb1d8c..9e8ebc7aa 100644 --- a/jvm-execution/src/main/scala/com/avast/sst/execution/ThreadPoolExecutorConfig.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/execution/ThreadPoolExecutorConfig.scala @@ -1,4 +1,4 @@ -package com.avast.sst.execution +package com.avast.sst.jvm.execution import java.util.concurrent.TimeUnit diff --git a/jvm-ssl/src/main/scala/com/avast/sst/ssl/KeyStoreConfig.scala b/jvm/src/main/scala/com/avast/sst/jvm/ssl/KeyStoreConfig.scala similarity index 83% rename from jvm-ssl/src/main/scala/com/avast/sst/ssl/KeyStoreConfig.scala rename to jvm/src/main/scala/com/avast/sst/jvm/ssl/KeyStoreConfig.scala index 1b293100e..e9db0c18c 100644 --- a/jvm-ssl/src/main/scala/com/avast/sst/ssl/KeyStoreConfig.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/ssl/KeyStoreConfig.scala @@ -1,4 +1,4 @@ -package com.avast.sst.ssl +package com.avast.sst.jvm.ssl import java.nio.file.Path diff --git a/jvm-ssl/src/main/scala/com/avast/sst/ssl/KeyStoreType.scala b/jvm/src/main/scala/com/avast/sst/jvm/ssl/KeyStoreType.scala similarity index 89% rename from jvm-ssl/src/main/scala/com/avast/sst/ssl/KeyStoreType.scala rename to jvm/src/main/scala/com/avast/sst/jvm/ssl/KeyStoreType.scala index a2e8de779..b6a0f91f0 100644 --- a/jvm-ssl/src/main/scala/com/avast/sst/ssl/KeyStoreType.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/ssl/KeyStoreType.scala @@ -1,4 +1,4 @@ -package com.avast.sst.ssl +package com.avast.sst.jvm.ssl import cats.Show diff --git a/jvm-ssl/src/main/scala/com/avast/sst/ssl/Protocol.scala b/jvm/src/main/scala/com/avast/sst/jvm/ssl/Protocol.scala similarity index 88% rename from jvm-ssl/src/main/scala/com/avast/sst/ssl/Protocol.scala rename to jvm/src/main/scala/com/avast/sst/jvm/ssl/Protocol.scala index 751fd28ee..748a8b683 100644 --- a/jvm-ssl/src/main/scala/com/avast/sst/ssl/Protocol.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/ssl/Protocol.scala @@ -1,4 +1,4 @@ -package com.avast.sst.ssl +package com.avast.sst.jvm.ssl import cats.Show diff --git a/jvm-ssl/src/main/scala/com/avast/sst/ssl/SslContextConfig.scala b/jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextConfig.scala similarity index 76% rename from jvm-ssl/src/main/scala/com/avast/sst/ssl/SslContextConfig.scala rename to jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextConfig.scala index 7d8525162..73c685418 100644 --- a/jvm-ssl/src/main/scala/com/avast/sst/ssl/SslContextConfig.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextConfig.scala @@ -1,7 +1,7 @@ -package com.avast.sst.ssl +package com.avast.sst.jvm.ssl -import com.avast.sst.ssl.Protocol.TLS -import com.avast.sst.ssl.Protocol.TLS +import com.avast.sst.jvm.ssl.Protocol.TLS +import com.avast.sst.jvm.ssl.Protocol.TLS final case class SslContextConfig(protocol: Protocol = TLS, keystore: Option[KeyStoreConfig] = None, diff --git a/jvm-ssl/src/main/scala/com/avast/sst/ssl/SslContextModule.scala b/jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextModule.scala similarity index 99% rename from jvm-ssl/src/main/scala/com/avast/sst/ssl/SslContextModule.scala rename to jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextModule.scala index fa5ee319f..936566e6d 100644 --- a/jvm-ssl/src/main/scala/com/avast/sst/ssl/SslContextModule.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextModule.scala @@ -1,4 +1,4 @@ -package com.avast.sst.ssl +package com.avast.sst.jvm.ssl import java.nio.file.Files import java.security.KeyStore diff --git a/jvm-system/src/main/scala/com/avast/sst/system/console/Console.scala b/jvm/src/main/scala/com/avast/sst/jvm/system/console/Console.scala similarity index 95% rename from jvm-system/src/main/scala/com/avast/sst/system/console/Console.scala rename to jvm/src/main/scala/com/avast/sst/jvm/system/console/Console.scala index b1a8c79c9..323c5dc17 100644 --- a/jvm-system/src/main/scala/com/avast/sst/system/console/Console.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/system/console/Console.scala @@ -1,4 +1,4 @@ -package com.avast.sst.system.console +package com.avast.sst.jvm.system.console import java.io.{OutputStream, Reader} diff --git a/jvm-system/src/main/scala/com/avast/sst/system/console/ConsoleModule.scala b/jvm/src/main/scala/com/avast/sst/jvm/system/console/ConsoleModule.scala similarity index 66% rename from jvm-system/src/main/scala/com/avast/sst/system/console/ConsoleModule.scala rename to jvm/src/main/scala/com/avast/sst/jvm/system/console/ConsoleModule.scala index c5b92428f..ef5f298f7 100644 --- a/jvm-system/src/main/scala/com/avast/sst/system/console/ConsoleModule.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/system/console/ConsoleModule.scala @@ -1,4 +1,4 @@ -package com.avast.sst.system.console +package com.avast.sst.jvm.system.console import cats.effect.Sync @@ -8,7 +8,7 @@ import scala.{Console => SConsole} /** Provides console - standard in/out/err. */ object ConsoleModule { - /** Makes [[com.avast.sst.system.console.Console]] with standard in/out/err. */ + /** Makes [[com.avast.sst.jvm.system.console.Console]] with standard in/out/err. */ def make[F[_]: Sync]: Console[F] = Console(SConsole.in, SConsole.out, SConsole.err) } diff --git a/jvm-system/src/main/scala/com/avast/sst/system/random/Random.scala b/jvm/src/main/scala/com/avast/sst/jvm/system/random/Random.scala similarity index 96% rename from jvm-system/src/main/scala/com/avast/sst/system/random/Random.scala rename to jvm/src/main/scala/com/avast/sst/jvm/system/random/Random.scala index c073e22e7..caad843b6 100644 --- a/jvm-system/src/main/scala/com/avast/sst/system/random/Random.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/system/random/Random.scala @@ -1,4 +1,4 @@ -package com.avast.sst.system.random +package com.avast.sst.jvm.system.random import cats.effect.Sync diff --git a/jvm-system/src/main/scala/com/avast/sst/system/random/RandomModule.scala b/jvm/src/main/scala/com/avast/sst/jvm/system/random/RandomModule.scala similarity index 55% rename from jvm-system/src/main/scala/com/avast/sst/system/random/RandomModule.scala rename to jvm/src/main/scala/com/avast/sst/jvm/system/random/RandomModule.scala index fc32378bd..9c2ee25c6 100644 --- a/jvm-system/src/main/scala/com/avast/sst/system/random/RandomModule.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/system/random/RandomModule.scala @@ -1,4 +1,4 @@ -package com.avast.sst.system.random +package com.avast.sst.jvm.system.random import java.security.SecureRandom @@ -9,16 +9,16 @@ import scala.language.higherKinds /** Provides random number generators. */ object RandomModule { - /** Makes [[com.avast.sst.system.random.Random]] with default random seed. */ + /** Makes [[com.avast.sst.jvm.system.random.Random]] with default random seed. */ def makeRandom[F[_]: Sync]: F[Random[F]] = Sync[F].delay(Random(new scala.util.Random())) - /** Makes [[com.avast.sst.system.random.Random]] with the provided `seed`. */ + /** Makes [[com.avast.sst.jvm.system.random.Random]] with the provided `seed`. */ def makeRandom[F[_]: Sync](seed: Long): F[Random[F]] = Sync[F].delay(Random(new scala.util.Random(seed))) - /** Makes [[com.avast.sst.system.random.Random]] based on [[java.security.SecureRandom]] with default random seed. */ + /** Makes [[com.avast.sst.jvm.system.random.Random]] based on [[java.security.SecureRandom]] with default random seed. */ def makeSecureRandom[F[_]: Sync]: F[Random[F]] = Sync[F].delay(Random(new SecureRandom())) - /** Makes [[com.avast.sst.system.random.Random]] based on [[java.security.SecureRandom]] with the provided `seed`. */ + /** Makes [[com.avast.sst.jvm.system.random.Random]] based on [[java.security.SecureRandom]] with the provided `seed`. */ def makeSecureRandom[F[_]: Sync](seed: Array[Byte]): F[Random[F]] = Sync[F].delay(Random(new SecureRandom(seed))) } diff --git a/jvm-ssl/src/test/resources/truststore.jks b/jvm/src/test/resources/truststore.jks similarity index 100% rename from jvm-ssl/src/test/resources/truststore.jks rename to jvm/src/test/resources/truststore.jks diff --git a/jvm-execution/src/test/scala/com/avast/sst/execution/ExecutorModuleTest.scala b/jvm/src/test/scala/com/avast/sst/jvm/execution/ExecutorModuleTest.scala similarity index 91% rename from jvm-execution/src/test/scala/com/avast/sst/execution/ExecutorModuleTest.scala rename to jvm/src/test/scala/com/avast/sst/jvm/execution/ExecutorModuleTest.scala index 1815940ed..81db843ff 100644 --- a/jvm-execution/src/test/scala/com/avast/sst/execution/ExecutorModuleTest.scala +++ b/jvm/src/test/scala/com/avast/sst/jvm/execution/ExecutorModuleTest.scala @@ -1,4 +1,4 @@ -package com.avast.sst.execution +package com.avast.sst.jvm.execution import cats.effect.SyncIO import org.scalatest.FunSuite diff --git a/jvm-ssl/src/test/scala/com/avast/sst/ssl/SslContextModuleTest.scala b/jvm/src/test/scala/com/avast/sst/jvm/ssl/SslContextModuleTest.scala similarity index 94% rename from jvm-ssl/src/test/scala/com/avast/sst/ssl/SslContextModuleTest.scala rename to jvm/src/test/scala/com/avast/sst/jvm/ssl/SslContextModuleTest.scala index b1bd8f358..bf7b2ad26 100644 --- a/jvm-ssl/src/test/scala/com/avast/sst/ssl/SslContextModuleTest.scala +++ b/jvm/src/test/scala/com/avast/sst/jvm/ssl/SslContextModuleTest.scala @@ -1,4 +1,4 @@ -package com.avast.sst.ssl +package com.avast.sst.jvm.ssl import java.nio.file.Paths diff --git a/jvm-system/src/test/scala/com/avast/sst/system/console/ConsoleModuleTest.scala b/jvm/src/test/scala/com/avast/sst/jvm/system/console/ConsoleModuleTest.scala similarity index 96% rename from jvm-system/src/test/scala/com/avast/sst/system/console/ConsoleModuleTest.scala rename to jvm/src/test/scala/com/avast/sst/jvm/system/console/ConsoleModuleTest.scala index 15bb65b1c..4a2e2a890 100644 --- a/jvm-system/src/test/scala/com/avast/sst/system/console/ConsoleModuleTest.scala +++ b/jvm/src/test/scala/com/avast/sst/jvm/system/console/ConsoleModuleTest.scala @@ -1,4 +1,4 @@ -package com.avast.sst.system.console +package com.avast.sst.jvm.system.console import java.io.{ByteArrayInputStream, ByteArrayOutputStream} diff --git a/jvm-system/src/test/scala/com/avast/sst/system/random/RandomModuleTest.scala b/jvm/src/test/scala/com/avast/sst/jvm/system/random/RandomModuleTest.scala similarity index 89% rename from jvm-system/src/test/scala/com/avast/sst/system/random/RandomModuleTest.scala rename to jvm/src/test/scala/com/avast/sst/jvm/system/random/RandomModuleTest.scala index 31e98c834..e08424fd9 100644 --- a/jvm-system/src/test/scala/com/avast/sst/system/random/RandomModuleTest.scala +++ b/jvm/src/test/scala/com/avast/sst/jvm/system/random/RandomModuleTest.scala @@ -1,4 +1,4 @@ -package com.avast.sst.system.random +package com.avast.sst.jvm.system.random import cats.effect.SyncIO import org.scalatest.FunSuite diff --git a/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/ConfigReaders.scala b/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/ConfigReaders.scala new file mode 100644 index 000000000..732c094ce --- /dev/null +++ b/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/ConfigReaders.scala @@ -0,0 +1,11 @@ +package com.avast.sst.micrometer.jmx.pureconfig + +import com.avast.sst.micrometer.jmx.MicrometerJmxConfig +import pureconfig.ConfigReader +import pureconfig.generic.semiauto.deriveReader + +trait ConfigReaders { + + implicit val jmxConfigReader: ConfigReader[MicrometerJmxConfig] = deriveReader + +} diff --git a/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/package.scala b/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/package.scala new file mode 100644 index 000000000..23a2f022c --- /dev/null +++ b/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/package.scala @@ -0,0 +1,3 @@ +package com.avast.sst.micrometer.jmx + +package object pureconfig extends ConfigReaders diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 4aa77e527..514d7c174 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -6,6 +6,7 @@ object Dependencies { val http4sBlazeClient = "org.http4s" %% "http4s-blaze-client" % Versions.http4s val http4sBlazeServer = "org.http4s" %% "http4s-blaze-server" % Versions.http4s val http4sDsl = "org.http4s" %% "http4s-dsl" % Versions.http4s + val http4sServer = "org.http4s" %% "http4s-server" % Versions.http4s val jsr305 = "com.google.code.findbugs" % "jsr305" % "3.0.2" val kindProjector = "org.typelevel" %% "kind-projector" % "0.10.3" val logbackClassic = "ch.qos.logback" % "logback-classic" % "1.2.3" diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala deleted file mode 100644 index e7ff62c53..000000000 --- a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/Http4sBlazeServer.scala +++ /dev/null @@ -1,18 +0,0 @@ -package com.avast.sst.pureconfig.implicits - -import com.avast.sst.http4s.Http4sBlazeServerConfig -import com.avast.sst.http4s.Http4sBlazeServerConfig.SocketOptions -import pureconfig.ConfigReader -import pureconfig.generic.semiauto.deriveReader - -/** Implicit [[pureconfig.ConfigReader]] instances for `sst-http4s-blaze-server` module. - * - * ```Do not forget``` to have a dependency on the `sst-http4s-blaze-server` module in your project. - */ -object Http4sBlazeServer { - - implicit val socketOptionsReader: ConfigReader[SocketOptions] = deriveReader - - implicit val http4sServerConfigReader: ConfigReader[Http4sBlazeServerConfig] = deriveReader - -} diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala deleted file mode 100644 index b6a8c24d0..000000000 --- a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmExecution.scala +++ /dev/null @@ -1,20 +0,0 @@ -package com.avast.sst.pureconfig.implicits - -import com.avast.sst.execution.ForkJoinPoolConfig.TaskPeekingMode -import com.avast.sst.execution.{ForkJoinPoolConfig, ThreadPoolExecutorConfig} -import pureconfig.ConfigReader -import pureconfig.generic.semiauto.{deriveEnumerationReader, deriveReader} - -/** Implicit [[pureconfig.ConfigReader]] instances for `sst-jvm-execution` module. - * - * ```Do not forget``` to have a dependency on the `sst-jvm-execution` module in your project. - */ -object JvmExecution { - - implicit val threadPoolExecutorConfigReader: ConfigReader[ThreadPoolExecutorConfig] = deriveReader - - implicit val taskPeekingModeReader: ConfigReader[TaskPeekingMode] = deriveEnumerationReader - - implicit val forkJoinPoolConfigReader: ConfigReader[ForkJoinPoolConfig] = deriveReader - -} diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala deleted file mode 100644 index 62dbfc726..000000000 --- a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/JvmSsl.scala +++ /dev/null @@ -1,21 +0,0 @@ -package com.avast.sst.pureconfig.implicits - -import com.avast.sst.ssl.{KeyStoreConfig, KeyStoreType, Protocol, SslContextConfig} -import pureconfig.ConfigReader -import pureconfig.generic.semiauto.{deriveEnumerationReader, deriveReader} - -/** Implicit [[pureconfig.ConfigReader]] instances for `sst-jvm-ssl` module. - * - * ```Do not forget``` to have a dependency on the `sst-jvm-ssl` module in your project. - */ -object JvmSsl { - - implicit val sslProtocolReader: ConfigReader[Protocol] = deriveEnumerationReader - - implicit val keyStoreTypeReader: ConfigReader[KeyStoreType] = deriveEnumerationReader - - implicit val keyStoreConfigReader: ConfigReader[KeyStoreConfig] = deriveReader - - implicit val sslContextConfigReader: ConfigReader[SslContextConfig] = deriveReader - -} diff --git a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala b/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala deleted file mode 100644 index 265106ced..000000000 --- a/pureconfig/src/main/scala/com/avast/sst/pureconfig/implicits/MicrometerJmx.scala +++ /dev/null @@ -1,15 +0,0 @@ -package com.avast.sst.pureconfig.implicits - -import com.avast.sst.micrometer.jmx.MicrometerJmxConfig -import pureconfig.ConfigReader -import pureconfig.generic.semiauto.deriveReader - -/** Implicit [[pureconfig.ConfigReader]] instances for `sst-micrometer-jmx` module. - * - * ```Do not forget``` to have a dependency on the `sst-micrometer-jmx` module in your project. - */ -object MicrometerJmx { - - implicit val jmxConfigReader: ConfigReader[MicrometerJmxConfig] = deriveReader - -} From ab622d4a85fc7a68c5161b814a966911a0b66fda Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Wed, 9 Oct 2019 15:39:51 +0200 Subject: [PATCH 05/13] refactor: Minor PR improvements --- .../com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala index 9a2bf1763..18e479dad 100644 --- a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala +++ b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala @@ -43,10 +43,12 @@ object MicrometerJmxModule { .build } - private class DomainJmxConfig(domain: String) extends JmxConfig { + private class DomainJmxConfig(override val domain: String) extends JmxConfig { + + // implements MeterRegistryConfig.get which can return null according to JavaDoc and @Nullable annotation @SuppressWarnings(Array("org.wartremover.warts.Null")) override def get(key: String): String = null - override def domain(): String = domain + } } From 5d63f01ac13200235b4a91eeb8912d0582b53bf8 Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Wed, 9 Oct 2019 16:32:53 +0200 Subject: [PATCH 06/13] docs: Add more ScalaDoc refactor: Minor PR improvements --- .../sst/http4s/client/pureconfig/ConfigReaders.scala | 2 +- .../sst/http4s/server/pureconfig/ConfigReaders.scala | 2 +- .../sst/http4s/server/micrometer/HttpStatusMetrics.scala | 9 ++++++--- .../micrometer/MicrometerHttp4sMetricsOpsModule.scala | 3 ++- .../micrometer/MicrometerHttp4sServerMetricsModule.scala | 2 ++ .../sst/http4s/server/micrometer/RouteMetrics.scala | 7 ++++++- .../avast/sst/jvm/micrometer/MicrometerJvmModule.scala | 1 + .../scala/com/avast/sst/jvm/ssl/SslContextModule.scala | 2 +- .../sst/micrometer/jmx/pureconfig/ConfigReaders.scala | 2 +- .../avast/sst/micrometer/jmx/MicrometerJmxModule.scala | 3 ++- 10 files changed, 23 insertions(+), 10 deletions(-) diff --git a/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala b/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala index 317b8dfdc..bc07a989a 100644 --- a/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala +++ b/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala @@ -19,6 +19,6 @@ trait ConfigReaders { implicit val parserModeReader: ConfigReader[ParserMode] = deriveEnumerationReader - implicit val http4sClientConfigReader: ConfigReader[Http4sBlazeClientConfig] = deriveReader + implicit val http4sBlazeClientConfigReader: ConfigReader[Http4sBlazeClientConfig] = deriveReader } diff --git a/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/ConfigReaders.scala b/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/ConfigReaders.scala index f70a3d042..d41dcff47 100644 --- a/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/ConfigReaders.scala +++ b/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/ConfigReaders.scala @@ -9,6 +9,6 @@ trait ConfigReaders { implicit val socketOptionsReader: ConfigReader[SocketOptions] = deriveReader - implicit val http4sServerConfigReader: ConfigReader[Http4sBlazeServerConfig] = deriveReader + implicit val http4sBlazeServerConfigReader: ConfigReader[Http4sBlazeServerConfig] = deriveReader } diff --git a/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/HttpStatusMetrics.scala b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/HttpStatusMetrics.scala index 18015b73f..a8292389f 100644 --- a/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/HttpStatusMetrics.scala +++ b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/HttpStatusMetrics.scala @@ -1,9 +1,11 @@ package com.avast.sst.http4s.server.micrometer import io.micrometer.core.instrument.{Counter, MeterRegistry} +import org.http4s.Status import scala.collection.concurrent.TrieMap +/** Records counts of HTTP statuses in [[io.micrometer.core.instrument.MeterRegistry]]. */ private[micrometer] class HttpStatusMetrics(prefix: String, meterRegistry: MeterRegistry) { private val meters = TrieMap[Int, Counter]( @@ -14,9 +16,10 @@ private[micrometer] class HttpStatusMetrics(prefix: String, meterRegistry: Meter 5 -> meterRegistry.counter(s"$prefix.status.5xx") ) - def recordHttpStatus(status: Int): Unit = { - meters(status / 100).increment() - meters.getOrElseUpdate(status, meterRegistry.counter(s"$prefix.status.$status")).increment() + def recordHttpStatus(status: Status): Unit = { + val code = status.code + meters(code / 100).increment() + meters.getOrElseUpdate(code, meterRegistry.counter(s"$prefix.status.$code")).increment() } } diff --git a/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModule.scala b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModule.scala index 8cff50b66..2f9861324 100644 --- a/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModule.scala +++ b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModule.scala @@ -11,6 +11,7 @@ import org.http4s.{Method, Status} object MicrometerHttp4sMetricsOpsModule { + /** Makes [[org.http4s.metrics.MetricsOps]] to record the usual HTTP server metrics. */ def make[F[_]: Sync](meterRegistry: MeterRegistry): F[MetricsOps[F]] = { val F = Sync[F] @@ -34,7 +35,7 @@ object MicrometerHttp4sMetricsOpsModule { override def recordTotalTime(method: Method, status: Status, elapsed: Long, classifier: Option[String]): F[Unit] = { for { _ <- F.delay(totalTime.record(elapsed, TimeUnit.NANOSECONDS)) - _ <- F.delay(httpStatusCodes.recordHttpStatus(status.code)) + _ <- F.delay(httpStatusCodes.recordHttpStatus(status)) } yield () } diff --git a/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sServerMetricsModule.scala b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sServerMetricsModule.scala index fd6ad4a44..f2b895a19 100644 --- a/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sServerMetricsModule.scala +++ b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sServerMetricsModule.scala @@ -13,6 +13,8 @@ class MicrometerHttp4sServerMetricsModule[F[_]: Sync](val serverMetrics: HttpRou object MicrometerHttp4sServerMetricsModule { + /** Makes [[com.avast.sst.http4s.server.micrometer.MicrometerHttp4sServerMetricsModule]] that can be used to setup monitoring + * of the whole HTTP server and individual routes. */ def make[F[_]: Effect](meterRegistry: MeterRegistry, clock: Clock[F]): F[MicrometerHttp4sServerMetricsModule[F]] = { implicit val c: Clock[F] = clock diff --git a/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/RouteMetrics.scala b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/RouteMetrics.scala index 18b35c5c6..f6aac4259 100644 --- a/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/RouteMetrics.scala +++ b/http4s-server-micrometer/src/main/scala/com/avast/sst/http4s/server/micrometer/RouteMetrics.scala @@ -11,10 +11,15 @@ import org.http4s.Response import scala.language.higherKinds +/** Provides the usual metrics for single HTTP route. */ class RouteMetrics[F[_]: Sync](meterRegistry: MeterRegistry, clock: Clock[F]) { private val F = Sync[F] + /** Wraps a single route with the usual metrics (requests in-flight, timer, HTTP status counts). + * + * @param name will be used in metric name + */ def wrap(name: String)(route: => F[Response[F]]): F[Response[F]] = { val prefix = s"http.$name" val activeRequests = meterRegistry.counter(s"$prefix.active-requests") @@ -24,7 +29,7 @@ class RouteMetrics[F[_]: Sync](meterRegistry: MeterRegistry, clock: Clock[F]) { start <- clock.monotonic(TimeUnit.NANOSECONDS) response <- F.delay(activeRequests.increment()) .bracket { _ => - route.flatTap(response => F.delay(httpStatusCodes.recordHttpStatus(response.status.code))) + route.flatTap(response => F.delay(httpStatusCodes.recordHttpStatus(response.status))) } { _ => for { time <- computeTime(start) diff --git a/jvm-micrometer/src/main/scala/com/avast/sst/jvm/micrometer/MicrometerJvmModule.scala b/jvm-micrometer/src/main/scala/com/avast/sst/jvm/micrometer/MicrometerJvmModule.scala index c562f89b3..2a948c04e 100644 --- a/jvm-micrometer/src/main/scala/com/avast/sst/jvm/micrometer/MicrometerJvmModule.scala +++ b/jvm-micrometer/src/main/scala/com/avast/sst/jvm/micrometer/MicrometerJvmModule.scala @@ -7,6 +7,7 @@ import io.micrometer.core.instrument.binder.system.ProcessorMetrics object MicrometerJvmModule { + /** Sets up publishing of JVM metrics (class loading, GC, memory, CPU, ...) into the given [[io.micrometer.core.instrument.MeterRegistry]] */ def make[F[_]: Sync](registry: MeterRegistry): F[Unit] = { Sync[F].delay { new ClassLoaderMetrics().bindTo(registry) diff --git a/jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextModule.scala b/jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextModule.scala index 936566e6d..02dfbcad4 100644 --- a/jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextModule.scala +++ b/jvm/src/main/scala/com/avast/sst/jvm/ssl/SslContextModule.scala @@ -11,7 +11,7 @@ import javax.net.ssl.{KeyManager, KeyManagerFactory, SSLContext, TrustManager, T import scala.language.higherKinds -@SuppressWarnings(Array("org.wartremover.warts.Null")) +@SuppressWarnings(Array("org.wartremover.warts.Null")) // JVM-interop code that must use nulls object SslContextModule { /** Loads [[javax.net.ssl.SSLContext]] and fills it with key/trust managers from the provided config. */ diff --git a/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/ConfigReaders.scala b/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/ConfigReaders.scala index 732c094ce..b3d7839ed 100644 --- a/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/ConfigReaders.scala +++ b/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/ConfigReaders.scala @@ -6,6 +6,6 @@ import pureconfig.generic.semiauto.deriveReader trait ConfigReaders { - implicit val jmxConfigReader: ConfigReader[MicrometerJmxConfig] = deriveReader + implicit val micrometerJmxConfigReader: ConfigReader[MicrometerJmxConfig] = deriveReader } diff --git a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala index 18e479dad..3ecd145c8 100644 --- a/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala +++ b/micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala @@ -12,6 +12,7 @@ import scala.language.higherKinds object MicrometerJmxModule { + /** Makes configured [[io.micrometer.jmx.JmxMeterRegistry]]. */ @SuppressWarnings(Array("org.wartremover.warts.NonUnitStatements")) def make[F[_]: Sync](config: MicrometerJmxConfig): Resource[F, JmxMeterRegistry] = { Resource @@ -26,7 +27,7 @@ object MicrometerJmxModule { dropwizardRegistry, makeJmxReporter(dropwizardRegistry, config.domain) ) - registry.config().namingConvention(NamingConvention.dot) + registry.config.namingConvention(NamingConvention.dot) registry } else { new JmxMeterRegistry(new DomainJmxConfig(config.domain), Clock.SYSTEM) From b4ecaa402707749d64049820abd3742963874bf1 Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Wed, 9 Oct 2019 17:22:01 +0200 Subject: [PATCH 07/13] test: Add http4s-micrometer interop tests --- example/src/main/mdoc/index.md | 10 +++++++- example/src/main/mdoc/jvm.md | 2 +- example/src/main/mdoc/micrometer.md | 2 ++ .../micrometer/HttpStatusMetricsTest.scala | 25 +++++++++++++++++++ ...MicrometerHttp4sMetricsOpsModuleTest.scala | 25 +++++++++++++++++++ .../server/micrometer/RouteMetricsTest.scala | 23 +++++++++++++++++ 6 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 example/src/main/mdoc/micrometer.md create mode 100644 http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/HttpStatusMetricsTest.scala create mode 100644 http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModuleTest.scala create mode 100644 http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/RouteMetricsTest.scala diff --git a/example/src/main/mdoc/index.md b/example/src/main/mdoc/index.md index 9ca59a8a6..b7a049242 100644 --- a/example/src/main/mdoc/index.md +++ b/example/src/main/mdoc/index.md @@ -2,8 +2,11 @@ * [Getting Started](#getting-started) * [Rationale](rationale.md) +* [Module Structure](#module-structure) +* [Bundles](#bundles) * [Modules http4s](http4s.md) -* [Modules JVM](jvm.md) +* [Module JVM](jvm.md) +* [Modules Micrometer](micrometer.md) * [Module PureConfig](pureconfig.md) ## Getting Started @@ -15,3 +18,8 @@ Creating a simple HTTP server is as easy as this: [![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-bundle-zio-http4s-blaze_2.12)](https://repo1.maven.org/maven2/com/avast/sst-bundle-zio-http4s-blaze_2.12/) `libraryDependencies += "com.avast" %% "sst-bundle-zio-http4s-blaze" % ""` + +## Module Structure + +## Bundles + diff --git a/example/src/main/mdoc/jvm.md b/example/src/main/mdoc/jvm.md index fa0d739f1..6d00ff171 100644 --- a/example/src/main/mdoc/jvm.md +++ b/example/src/main/mdoc/jvm.md @@ -1,4 +1,4 @@ -# Modules JVM +# Module JVM ![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-jvm_2.12) diff --git a/example/src/main/mdoc/micrometer.md b/example/src/main/mdoc/micrometer.md new file mode 100644 index 000000000..4bb900b4f --- /dev/null +++ b/example/src/main/mdoc/micrometer.md @@ -0,0 +1,2 @@ +# Modules Micrometer + diff --git a/http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/HttpStatusMetricsTest.scala b/http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/HttpStatusMetricsTest.scala new file mode 100644 index 000000000..251d09417 --- /dev/null +++ b/http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/HttpStatusMetricsTest.scala @@ -0,0 +1,25 @@ +package com.avast.sst.http4s.server.micrometer + +import io.micrometer.core.instrument.simple.SimpleMeterRegistry +import org.http4s.Status +import org.scalatest.FunSuite + +class HttpStatusMetricsTest extends FunSuite { + + test("HTTP status monitoring") { + val simpleMeterRegistry = new SimpleMeterRegistry() + val target = new HttpStatusMetrics("test", simpleMeterRegistry) + + target.recordHttpStatus(Status.Ok) + target.recordHttpStatus(Status.NoContent) + target.recordHttpStatus(Status.BadRequest) + target.recordHttpStatus(Status.ServiceUnavailable) + + assert(simpleMeterRegistry.get("test.status.2xx").counter().count() === 2.0) + assert(simpleMeterRegistry.get("test.status.200").counter().count() === 1.0) + assert(simpleMeterRegistry.get("test.status.204").counter().count() === 1.0) + assert(simpleMeterRegistry.get("test.status.4xx").counter().count() === 1.0) + assert(simpleMeterRegistry.get("test.status.5xx").counter().count() === 1.0) + } + +} diff --git a/http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModuleTest.scala b/http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModuleTest.scala new file mode 100644 index 000000000..f57f84c2e --- /dev/null +++ b/http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/MicrometerHttp4sMetricsOpsModuleTest.scala @@ -0,0 +1,25 @@ +package com.avast.sst.http4s.server.micrometer + +import java.util.concurrent.TimeUnit + +import cats.effect.SyncIO +import io.micrometer.core.instrument.simple.SimpleMeterRegistry +import org.http4s.{Method, Status} +import org.scalatest.FunSuite + +class MicrometerHttp4sMetricsOpsModuleTest extends FunSuite { + + test("http4s MetricsOps for Micrometer") { + val registry = new SimpleMeterRegistry() + val metricsOps = MicrometerHttp4sMetricsOpsModule.make[SyncIO](registry).unsafeRunSync() + + metricsOps.increaseActiveRequests(None).unsafeRunSync() + metricsOps.recordTotalTime(Method.GET, Status.Ok, 2500, None).unsafeRunSync() + + assert(registry.get("http.global.active-requests").counter().count() === 1) + assert(registry.get("http.global.total-time").timer().count() === 1) + assert(registry.get("http.global.total-time").timer().totalTime(TimeUnit.NANOSECONDS) > 2499) + assert(registry.get("http.global.status.200").counter().count() === 1) + } + +} diff --git a/http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/RouteMetricsTest.scala b/http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/RouteMetricsTest.scala new file mode 100644 index 000000000..d5a003dfc --- /dev/null +++ b/http4s-server-micrometer/src/test/scala/com/avast/sst/http4s/server/micrometer/RouteMetricsTest.scala @@ -0,0 +1,23 @@ +package com.avast.sst.http4s.server.micrometer + +import java.util.concurrent.TimeUnit + +import cats.effect.{Clock, SyncIO} +import io.micrometer.core.instrument.simple.SimpleMeterRegistry +import org.http4s.Response +import org.scalatest.FunSuite + +class RouteMetricsTest extends FunSuite { + + test("Single route metrics") { + val registry = new SimpleMeterRegistry() + val target = new RouteMetrics[SyncIO](registry, Clock.create[SyncIO]) + + target.wrap("test")(SyncIO.pure(Response.notFound[SyncIO])).unsafeRunSync() + assert(registry.get("http.test.active-requests").counter().count() === 0) + assert(registry.get("http.test.total-time").timer().count() === 1) + assert(registry.get("http.test.total-time").timer().totalTime(TimeUnit.MILLISECONDS) > 0) + assert(registry.get("http.test.status.404").counter().count() === 1) + } + +} From 78daa80eab3ab640d3aa029be017a3effe091fcf Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Wed, 9 Oct 2019 22:31:55 +0200 Subject: [PATCH 08/13] build: Try to fix build on Travis --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 9327a3251..2ef840b96 100644 --- a/build.sbt +++ b/build.sbt @@ -61,7 +61,7 @@ lazy val bundleZioHttp4sBlaze = project ) lazy val example = project - .dependsOn(bundleZioHttp4sBlaze, micrometerJmxPureConfig) + .dependsOn(bundleZioHttp4sBlaze, micrometerJmxPureConfig, pureConfig) .enablePlugins(MdocPlugin) .settings(commonSettings) .settings( From 4b79398b45be787bbed47a6d27f1223f54e58190 Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Wed, 9 Oct 2019 22:38:25 +0200 Subject: [PATCH 09/13] build: Try to fix build on Travis --- example/src/main/scala/com/avast/sst/example/Main.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/example/src/main/scala/com/avast/sst/example/Main.scala b/example/src/main/scala/com/avast/sst/example/Main.scala index c86cfa90d..4147270c9 100644 --- a/example/src/main/scala/com/avast/sst/example/Main.scala +++ b/example/src/main/scala/com/avast/sst/example/Main.scala @@ -12,7 +12,6 @@ import com.avast.sst.jvm.execution.ExecutorModule import com.avast.sst.jvm.micrometer.MicrometerJvmModule import com.avast.sst.jvm.system.console.{Console, ConsoleModule} import com.avast.sst.micrometer.jmx.MicrometerJmxModule -import com.avast.sst.pureconfig.PureConfigModule import org.http4s.server.Server import zio.Task import zio.interop.catz._ @@ -22,7 +21,7 @@ object Main extends ZioServerApp { def program: Resource[Task, Server[Task]] = { for { - configuration <- Resource.liftF(PureConfigModule.makeOrRaise[Task, Configuration]) + configuration <- Resource.liftF(com.avast.sst.pureconfig.PureConfigModule.makeOrRaise[Task, Configuration]) executorModule <- ExecutorModule.makeFromExecutionContext[Task](runtime.Platform.executor.asEC) clock = Clock.create[Task] currentTime <- Resource.liftF(clock.realTime(TimeUnit.MILLISECONDS)) From e26cae57fbcf5a4de48e2fdcf6ba43ba20b65f5f Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Wed, 9 Oct 2019 22:44:23 +0200 Subject: [PATCH 10/13] build: Fix Travis build - file system is case sensitive, mine not --- build.sbt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 2ef840b96..6811fc41e 100644 --- a/build.sbt +++ b/build.sbt @@ -61,7 +61,8 @@ lazy val bundleZioHttp4sBlaze = project ) lazy val example = project - .dependsOn(bundleZioHttp4sBlaze, micrometerJmxPureConfig, pureConfig) + .in(file("example")) + .dependsOn(bundleZioHttp4sBlaze, micrometerJmxPureConfig) .enablePlugins(MdocPlugin) .settings(commonSettings) .settings( @@ -171,6 +172,7 @@ lazy val micrometerJmxPureConfig = project .settings(name := "sst-micrometer-jmx-pureconfig") lazy val pureConfig = project + .in(file("pureconfig")) .settings(commonSettings) .settings( name := "sst-pureconfig", From 75e0550562f14077e44915f705d9c17d11cb8ea9 Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Wed, 9 Oct 2019 22:53:39 +0200 Subject: [PATCH 11/13] Revert "build: Try to fix build on Travis" This reverts commit 4b79398b45be787bbed47a6d27f1223f54e58190. --- example/src/main/scala/com/avast/sst/example/Main.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/example/src/main/scala/com/avast/sst/example/Main.scala b/example/src/main/scala/com/avast/sst/example/Main.scala index 4147270c9..c86cfa90d 100644 --- a/example/src/main/scala/com/avast/sst/example/Main.scala +++ b/example/src/main/scala/com/avast/sst/example/Main.scala @@ -12,6 +12,7 @@ import com.avast.sst.jvm.execution.ExecutorModule import com.avast.sst.jvm.micrometer.MicrometerJvmModule import com.avast.sst.jvm.system.console.{Console, ConsoleModule} import com.avast.sst.micrometer.jmx.MicrometerJmxModule +import com.avast.sst.pureconfig.PureConfigModule import org.http4s.server.Server import zio.Task import zio.interop.catz._ @@ -21,7 +22,7 @@ object Main extends ZioServerApp { def program: Resource[Task, Server[Task]] = { for { - configuration <- Resource.liftF(com.avast.sst.pureconfig.PureConfigModule.makeOrRaise[Task, Configuration]) + configuration <- Resource.liftF(PureConfigModule.makeOrRaise[Task, Configuration]) executorModule <- ExecutorModule.makeFromExecutionContext[Task](runtime.Platform.executor.asEC) clock = Clock.create[Task] currentTime <- Resource.liftF(clock.realTime(TimeUnit.MILLISECONDS)) From d27be4643283e6694b9879269b69bd7063aa7845 Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Wed, 9 Oct 2019 23:33:49 +0200 Subject: [PATCH 12/13] docs: Add missing docs to Micrometer, module structure and bundles --- docs/http4s.md | 2 +- docs/index.md | 78 ++++++++++++++++++++++++++++- docs/jvm.md | 10 ++-- docs/micrometer.md | 59 ++++++++++++++++++++++ docs/pureconfig.md | 8 ++- example/src/main/mdoc/http4s.md | 2 +- example/src/main/mdoc/index.md | 67 ++++++++++++++++++++++++- example/src/main/mdoc/jvm.md | 2 +- example/src/main/mdoc/micrometer.md | 44 ++++++++++++++++ example/src/main/mdoc/pureconfig.md | 8 ++- 10 files changed, 267 insertions(+), 13 deletions(-) create mode 100644 docs/micrometer.md diff --git a/docs/http4s.md b/docs/http4s.md index 4762591e9..24dfa0757 100644 --- a/docs/http4s.md +++ b/docs/http4s.md @@ -60,9 +60,9 @@ runtime.unsafeRun(program) ```scala import cats.effect._ -import com.avast.sst.jvm.execution.ExecutorModule import com.avast.sst.http4s.server._ import com.avast.sst.http4s.server.middleware.CorrelationIdMiddleware +import com.avast.sst.jvm.execution.ExecutorModule import org.http4s.dsl.Http4sDsl import org.http4s.HttpRoutes import zio.DefaultRuntime diff --git a/docs/index.md b/docs/index.md index 9ca59a8a6..ed08dc1cd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,16 +2,90 @@ * [Getting Started](#getting-started) * [Rationale](rationale.md) +* [Module Structure](#module-structure) +* [Bundles](#bundles) * [Modules http4s](http4s.md) -* [Modules JVM](jvm.md) +* [Module JVM](jvm.md) +* [Modules Micrometer](micrometer.md) * [Module PureConfig](pureconfig.md) ## Getting Started -Creating a simple HTTP server is as easy as this: +Creating a simple HTTP server using [http4s](https://http4s.org) and [ZIO](https://zio.dev) is as easy as this: #### build.sbt [![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-bundle-zio-http4s-blaze_2.12)](https://repo1.maven.org/maven2/com/avast/sst-bundle-zio-http4s-blaze_2.12/) `libraryDependencies += "com.avast" %% "sst-bundle-zio-http4s-blaze" % ""` + +#### Main + +```scala +import cats.effect._ +import com.avast.sst.http4s.client._ +import com.avast.sst.http4s.server._ +import com.avast.sst.jvm.execution.ExecutorModule +import com.avast.sst.jvm.system.console.ConsoleModule +import org.http4s.dsl.Http4sDsl +import org.http4s.HttpRoutes +import zio.DefaultRuntime +import zio.interop.catz._ +import zio.interop.catz.implicits._ +import zio.Task + +implicit val runtime = new DefaultRuntime {} // this is just needed in example + +val dsl = Http4sDsl[Task] // this is just needed in example +import dsl._ + +val routes = Http4sRouting.make { + HttpRoutes.of[Task] { + case GET -> Root / "hello" => Ok("Hello World!") + } +} + +val resource = for { + executorModule <- ExecutorModule.makeDefault[Task] + console = ConsoleModule.make[Task] + server <- Http4sBlazeServerModule.make[Task](Http4sBlazeServerConfig("127.0.0.1", 0), routes, executorModule.executionContext) + client <- Http4sBlazeClient.make[Task](Http4sBlazeClientConfig(), executorModule.executionContext) +} yield (server, client, console) + +val program = resource + .use { + case (server, client, console) => + client + .expect[String](s"http://127.0.0.1:${server.address.getPort}/hello") + .flatMap(console.printLine) + } +``` + +```scala +runtime.unsafeRun(program) +// Hello World! +``` + +## Module Structure + +The project is split into many small modules based on dependencies. For example code related to loading of configuration files via +[PureConfig](https://pureconfig.github.io) lives in module named `sst-pureconfig` and code related to http4s server implemented using +[Blaze](https://github.com/http4s/blaze) lives in module named `sst-http4s-server-blaze`. + +There are also modules that implement interoperability between usually two dependencies. For example we want to configure our HTTP server +using PureConfig so definition of `implicit` `ConfigReader` instances lives in module named `sst-http4s-server-blaze-pureconfig`. Or to give +another example, monitoring of HTTP server using [Micrometer](https://micrometer.io) lives in module named `sst-http4s-server-micrometer`. +Note that such module depends on APIs of both http4s server and Micrometer but it does not depend on concrete implementation which allows +you to choose any http4s implementation (Blaze, ...) and any Micrometer implementation (JMX, StatsD, ...). + +## Bundles + +Having many small and independent modules is great but in practice everyone wants to use certain combination of dependencies and does not +want to worry about many small dependencies. There are "bundles" for such use case - either the ones provided by this project or custom +ones created by the user. + +One of the main decisions (dependency-wise) is to choose the effect data type. This project does not force you into specific data type and +supports both [ZIO](https://zio.dev) and [Monix](https://monix.io) out-of-the-box. So there are two main bundles one for each effect data +type that also bring in http4s server/client (Blaze), PureConfig and Micrometer. + +Unless you have specific needs take one of these bundles and write your server application using them - it will be the simplest way. diff --git a/docs/jvm.md b/docs/jvm.md index 26bbc2c2d..32e77fa6c 100644 --- a/docs/jvm.md +++ b/docs/jvm.md @@ -1,4 +1,4 @@ -# Modules JVM +# Module JVM ![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-jvm_2.12) @@ -14,8 +14,8 @@ Module `sst-jvm` provides pure implementations of different JVM-related utilitie ```scala import com.avast.sst.jvm.system.console.ConsoleModule import com.avast.sst.jvm.system.random.RandomModule -import zio.interop.catz._ import zio.DefaultRuntime +import zio.interop.catz._ import zio.Task val program = for { @@ -24,11 +24,11 @@ val program = for { console = ConsoleModule.make[Task] _ <- console.printLine(s"Random number: $randomNumber") } yield () -// program: zio.ZIO[Any, Throwable, Unit] = zio.ZIO$FlatMap@5b0e9e0c +// program: zio.ZIO[Any, Throwable, Unit] = zio.ZIO$FlatMap@159314ca val runtime = new DefaultRuntime {} // this is just needed in example -// runtime: AnyRef with DefaultRuntime = repl.Session$App$$anon$1@69c33ea2 // this is just needed in example +// runtime: AnyRef with DefaultRuntime = repl.Session$App$$anon$1@bafc754 // this is just needed in example runtime.unsafeRun(program) -// Random number: 948283653 +// Random number: 530700338 ``` diff --git a/docs/micrometer.md b/docs/micrometer.md new file mode 100644 index 000000000..eec7ee791 --- /dev/null +++ b/docs/micrometer.md @@ -0,0 +1,59 @@ +# Modules Micrometer + +[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-micrometer-jmx_2.12)](https://repo1.maven.org/maven2/com/avast/sst-micrometer-jmx_2.12/) + +`libraryDependencies += "com.avast" %% "sst-micrometer-jmx" % ""` + +This module allows you to monitor your applications using [Micrometer](https://micrometer.io). There are many actual implementations of +the Micrometer API one of which is JMX. Module `sst-micrometer-jmx` implements the initialization of Micrometer for JMX. There are also +interop modules such as `sst-http4s-server-micrometer` which implement monitoring of HTTP server and individual routes using Micrometer. + +```scala +import cats.effect.{Clock, Resource} +import com.avast.sst.http4s.server._ +import com.avast.sst.http4s.server.micrometer.MicrometerHttp4sServerMetricsModule +import com.avast.sst.jvm.execution.ExecutorModule +import com.avast.sst.jvm.micrometer.MicrometerJvmModule +import com.avast.sst.micrometer.jmx._ +import org.http4s.dsl.Http4sDsl +import org.http4s.HttpRoutes +import org.http4s.server.Server +import zio.DefaultRuntime +import zio.interop.catz._ +import zio.interop.catz.implicits._ +import zio.Task + +implicit val runtime = new DefaultRuntime {} // this is just needed in example +// runtime: AnyRef with DefaultRuntime = repl.Session$App$$anon$1@1c5cd2ea // this is just needed in example + +val dsl = Http4sDsl[Task] // this is just needed in example +// dsl: Http4sDsl[Task] = org.http4s.dsl.Http4sDsl$$anon$1@1f7fcec2 // this is just needed in example +import dsl._ + +for { + executorModule <- ExecutorModule.makeFromExecutionContext[Task](runtime.Platform.executor.asEC) + clock = Clock.create[Task] + jmxMeterRegistry <- MicrometerJmxModule.make[Task](MicrometerJmxConfig("com.avast")) + _ <- Resource.liftF(MicrometerJvmModule.make[Task](jmxMeterRegistry)) + serverMetricsModule <- Resource.liftF(MicrometerHttp4sServerMetricsModule.make[Task](jmxMeterRegistry, clock)) + routes = Http4sRouting.make { + serverMetricsModule.serverMetrics { + HttpRoutes.of[Task] { + case GET -> Root / "hello" => Ok("Hello World!") + } + } + } + server <- Http4sBlazeServerModule.make[Task](Http4sBlazeServerConfig("127.0.0.1", 0), routes, executorModule.executionContext) +} yield server +// res0: Resource[Task, Server[Task]] = Bind( +// Bind( +// Bind( +// Suspend(zio.ZIO$FlatMap@77e1dacd), +// com.avast.sst.jvm.execution.ExecutorModule$$$Lambda$1652/2118457232@34ede267 +// ), +// cats.effect.Resource$$Lambda$1653/622274963@7a522157 +// ), +// +// ) +``` + diff --git a/docs/pureconfig.md b/docs/pureconfig.md index f4d0b15fa..b0703c97d 100644 --- a/docs/pureconfig.md +++ b/docs/pureconfig.md @@ -11,7 +11,7 @@ will be in [HOCON](https://github.com/lightbend/config/blob/master/HOCON.md) for Loading of configuration is side-effectful so it is wrapped in `F` which is `Sync`. This module also tweaks the error messages a little. ```scala -import com.avast.sst.pureconfig._ +import com.avast.sst.pureconfig.PureConfigModule import pureconfig.ConfigReader import pureconfig.generic.semiauto.deriveReader import zio.interop.catz._ @@ -24,3 +24,9 @@ implicit val serverConfigurationReader: ConfigReader[ServerConfiguration] = deri val maybeConfiguration = PureConfigModule.make[Task, ServerConfiguration] ``` +Look for `sst-*-pureconfig` modules to get `implicit` instances of `ConfigReader` for specific libraries, e.g.: + +```scala +import com.avast.sst.http4s.server.pureconfig._ +``` + diff --git a/example/src/main/mdoc/http4s.md b/example/src/main/mdoc/http4s.md index c2acd552c..196f2c7bf 100644 --- a/example/src/main/mdoc/http4s.md +++ b/example/src/main/mdoc/http4s.md @@ -59,9 +59,9 @@ runtime.unsafeRun(program) ```scala mdoc:silent:reset import cats.effect._ -import com.avast.sst.jvm.execution.ExecutorModule import com.avast.sst.http4s.server._ import com.avast.sst.http4s.server.middleware.CorrelationIdMiddleware +import com.avast.sst.jvm.execution.ExecutorModule import org.http4s.dsl.Http4sDsl import org.http4s.HttpRoutes import zio.DefaultRuntime diff --git a/example/src/main/mdoc/index.md b/example/src/main/mdoc/index.md index b7a049242..73b8a3b33 100644 --- a/example/src/main/mdoc/index.md +++ b/example/src/main/mdoc/index.md @@ -11,7 +11,7 @@ ## Getting Started -Creating a simple HTTP server is as easy as this: +Creating a simple HTTP server using [http4s](https://http4s.org) and [ZIO](https://zio.dev) is as easy as this: #### build.sbt @@ -19,7 +19,72 @@ Creating a simple HTTP server is as easy as this: `libraryDependencies += "com.avast" %% "sst-bundle-zio-http4s-blaze" % ""` +#### Main + +```scala mdoc:silent:reset-class +import cats.effect._ +import com.avast.sst.http4s.client._ +import com.avast.sst.http4s.server._ +import com.avast.sst.jvm.execution.ExecutorModule +import com.avast.sst.jvm.system.console.ConsoleModule +import org.http4s.dsl.Http4sDsl +import org.http4s.HttpRoutes +import zio.DefaultRuntime +import zio.interop.catz._ +import zio.interop.catz.implicits._ +import zio.Task + +implicit val runtime = new DefaultRuntime {} // this is just needed in example + +val dsl = Http4sDsl[Task] // this is just needed in example +import dsl._ + +val routes = Http4sRouting.make { + HttpRoutes.of[Task] { + case GET -> Root / "hello" => Ok("Hello World!") + } +} + +val resource = for { + executorModule <- ExecutorModule.makeDefault[Task] + console = ConsoleModule.make[Task] + server <- Http4sBlazeServerModule.make[Task](Http4sBlazeServerConfig("127.0.0.1", 0), routes, executorModule.executionContext) + client <- Http4sBlazeClient.make[Task](Http4sBlazeClientConfig(), executorModule.executionContext) +} yield (server, client, console) + +val program = resource + .use { + case (server, client, console) => + client + .expect[String](s"http://127.0.0.1:${server.address.getPort}/hello") + .flatMap(console.printLine) + } +``` + +```scala mdoc +runtime.unsafeRun(program) +``` + ## Module Structure +The project is split into many small modules based on dependencies. For example code related to loading of configuration files via +[PureConfig](https://pureconfig.github.io) lives in module named `sst-pureconfig` and code related to http4s server implemented using +[Blaze](https://github.com/http4s/blaze) lives in module named `sst-http4s-server-blaze`. + +There are also modules that implement interoperability between usually two dependencies. For example we want to configure our HTTP server +using PureConfig so definition of `implicit` `ConfigReader` instances lives in module named `sst-http4s-server-blaze-pureconfig`. Or to give +another example, monitoring of HTTP server using [Micrometer](https://micrometer.io) lives in module named `sst-http4s-server-micrometer`. +Note that such module depends on APIs of both http4s server and Micrometer but it does not depend on concrete implementation which allows +you to choose any http4s implementation (Blaze, ...) and any Micrometer implementation (JMX, StatsD, ...). + ## Bundles +Having many small and independent modules is great but in practice everyone wants to use certain combination of dependencies and does not +want to worry about many small dependencies. There are "bundles" for such use case - either the ones provided by this project or custom +ones created by the user. + +One of the main decisions (dependency-wise) is to choose the effect data type. This project does not force you into specific data type and +supports both [ZIO](https://zio.dev) and [Monix](https://monix.io) out-of-the-box. So there are two main bundles one for each effect data +type that also bring in http4s server/client (Blaze), PureConfig and Micrometer. + +Unless you have specific needs take one of these bundles and write your server application using them - it will be the simplest way. diff --git a/example/src/main/mdoc/jvm.md b/example/src/main/mdoc/jvm.md index 6d00ff171..4180d5dbb 100644 --- a/example/src/main/mdoc/jvm.md +++ b/example/src/main/mdoc/jvm.md @@ -14,8 +14,8 @@ Module `sst-jvm` provides pure implementations of different JVM-related utilitie ```scala mdoc import com.avast.sst.jvm.system.console.ConsoleModule import com.avast.sst.jvm.system.random.RandomModule -import zio.interop.catz._ import zio.DefaultRuntime +import zio.interop.catz._ import zio.Task val program = for { diff --git a/example/src/main/mdoc/micrometer.md b/example/src/main/mdoc/micrometer.md index 4bb900b4f..81671db6e 100644 --- a/example/src/main/mdoc/micrometer.md +++ b/example/src/main/mdoc/micrometer.md @@ -1,2 +1,46 @@ # Modules Micrometer +[![Maven Central](https://img.shields.io/maven-central/v/com.avast/sst-micrometer-jmx_2.12)](https://repo1.maven.org/maven2/com/avast/sst-micrometer-jmx_2.12/) + +`libraryDependencies += "com.avast" %% "sst-micrometer-jmx" % ""` + +This module allows you to monitor your applications using [Micrometer](https://micrometer.io). There are many actual implementations of +the Micrometer API one of which is JMX. Module `sst-micrometer-jmx` implements the initialization of Micrometer for JMX. There are also +interop modules such as `sst-http4s-server-micrometer` which implement monitoring of HTTP server and individual routes using Micrometer. + +```scala mdoc +import cats.effect.{Clock, Resource} +import com.avast.sst.http4s.server._ +import com.avast.sst.http4s.server.micrometer.MicrometerHttp4sServerMetricsModule +import com.avast.sst.jvm.execution.ExecutorModule +import com.avast.sst.jvm.micrometer.MicrometerJvmModule +import com.avast.sst.micrometer.jmx._ +import org.http4s.dsl.Http4sDsl +import org.http4s.HttpRoutes +import org.http4s.server.Server +import zio.DefaultRuntime +import zio.interop.catz._ +import zio.interop.catz.implicits._ +import zio.Task + +implicit val runtime = new DefaultRuntime {} // this is just needed in example + +val dsl = Http4sDsl[Task] // this is just needed in example +import dsl._ + +for { + executorModule <- ExecutorModule.makeFromExecutionContext[Task](runtime.Platform.executor.asEC) + clock = Clock.create[Task] + jmxMeterRegistry <- MicrometerJmxModule.make[Task](MicrometerJmxConfig("com.avast")) + _ <- Resource.liftF(MicrometerJvmModule.make[Task](jmxMeterRegistry)) + serverMetricsModule <- Resource.liftF(MicrometerHttp4sServerMetricsModule.make[Task](jmxMeterRegistry, clock)) + routes = Http4sRouting.make { + serverMetricsModule.serverMetrics { + HttpRoutes.of[Task] { + case GET -> Root / "hello" => Ok("Hello World!") + } + } + } + server <- Http4sBlazeServerModule.make[Task](Http4sBlazeServerConfig("127.0.0.1", 0), routes, executorModule.executionContext) +} yield server +``` diff --git a/example/src/main/mdoc/pureconfig.md b/example/src/main/mdoc/pureconfig.md index e67f565af..f9224e7e7 100644 --- a/example/src/main/mdoc/pureconfig.md +++ b/example/src/main/mdoc/pureconfig.md @@ -11,7 +11,7 @@ will be in [HOCON](https://github.com/lightbend/config/blob/master/HOCON.md) for Loading of configuration is side-effectful so it is wrapped in `F` which is `Sync`. This module also tweaks the error messages a little. ```scala mdoc:silent -import com.avast.sst.pureconfig._ +import com.avast.sst.pureconfig.PureConfigModule import pureconfig.ConfigReader import pureconfig.generic.semiauto.deriveReader import zio.interop.catz._ @@ -23,3 +23,9 @@ implicit val serverConfigurationReader: ConfigReader[ServerConfiguration] = deri val maybeConfiguration = PureConfigModule.make[Task, ServerConfiguration] ``` + +Look for `sst-*-pureconfig` modules to get `implicit` instances of `ConfigReader` for specific libraries, e.g.: + +```scala +import com.avast.sst.http4s.server.pureconfig._ +``` From db96dc400601e35ba976d822bda551d185e53898 Mon Sep 17 00:00:00 2001 From: Janecek Jakub Date: Thu, 10 Oct 2019 12:58:21 +0200 Subject: [PATCH 13/13] refactor: Move implicits to implicits object --- docs/jvm.md | 2 +- docs/pureconfig.md | 2 +- example/src/main/mdoc/pureconfig.md | 2 +- .../scala/com/avast/sst/example/config/Configuration.scala | 4 ++-- .../avast/sst/http4s/client/pureconfig/ConfigReaders.scala | 2 +- .../com/avast/sst/http4s/client/pureconfig/implicits.scala | 3 +++ .../com/avast/sst/http4s/client/pureconfig/package.scala | 3 --- .../com/avast/sst/http4s/server/pureconfig/implicits.scala | 3 +++ .../com/avast/sst/http4s/server/pureconfig/package.scala | 3 --- .../main/scala/com/avast/sst/jvm/pureconfig/implicits.scala | 3 +++ .../src/main/scala/com/avast/sst/jvm/pureconfig/package.scala | 3 --- .../com/avast/sst/micrometer/jmx/pureconfig/implicits.scala | 3 +++ .../com/avast/sst/micrometer/jmx/pureconfig/package.scala | 3 --- 13 files changed, 18 insertions(+), 18 deletions(-) create mode 100644 http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/implicits.scala delete mode 100644 http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/package.scala create mode 100644 http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/implicits.scala delete mode 100644 http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/package.scala create mode 100644 jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/implicits.scala delete mode 100644 jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/package.scala create mode 100644 micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/implicits.scala delete mode 100644 micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/package.scala diff --git a/docs/jvm.md b/docs/jvm.md index 32e77fa6c..420519a7b 100644 --- a/docs/jvm.md +++ b/docs/jvm.md @@ -29,6 +29,6 @@ val program = for { val runtime = new DefaultRuntime {} // this is just needed in example // runtime: AnyRef with DefaultRuntime = repl.Session$App$$anon$1@bafc754 // this is just needed in example runtime.unsafeRun(program) -// Random number: 530700338 +// Random number: 235841973 ``` diff --git a/docs/pureconfig.md b/docs/pureconfig.md index b0703c97d..6ab28ea17 100644 --- a/docs/pureconfig.md +++ b/docs/pureconfig.md @@ -27,6 +27,6 @@ val maybeConfiguration = PureConfigModule.make[Task, ServerConfiguration] Look for `sst-*-pureconfig` modules to get `implicit` instances of `ConfigReader` for specific libraries, e.g.: ```scala -import com.avast.sst.http4s.server.pureconfig._ +import com.avast.sst.http4s.server.pureconfig.implicits._ ``` diff --git a/example/src/main/mdoc/pureconfig.md b/example/src/main/mdoc/pureconfig.md index f9224e7e7..6e80440c8 100644 --- a/example/src/main/mdoc/pureconfig.md +++ b/example/src/main/mdoc/pureconfig.md @@ -27,5 +27,5 @@ val maybeConfiguration = PureConfigModule.make[Task, ServerConfiguration] Look for `sst-*-pureconfig` modules to get `implicit` instances of `ConfigReader` for specific libraries, e.g.: ```scala -import com.avast.sst.http4s.server.pureconfig._ +import com.avast.sst.http4s.server.pureconfig.implicits._ ``` diff --git a/example/src/main/scala/com/avast/sst/example/config/Configuration.scala b/example/src/main/scala/com/avast/sst/example/config/Configuration.scala index b46744c14..293a13c7f 100644 --- a/example/src/main/scala/com/avast/sst/example/config/Configuration.scala +++ b/example/src/main/scala/com/avast/sst/example/config/Configuration.scala @@ -2,8 +2,8 @@ package com.avast.sst.example.config import com.avast.sst.http4s.server.Http4sBlazeServerConfig import com.avast.sst.micrometer.jmx.MicrometerJmxConfig -import com.avast.sst.http4s.server.pureconfig._ -import com.avast.sst.micrometer.jmx.pureconfig._ +import com.avast.sst.http4s.server.pureconfig.implicits._ +import com.avast.sst.micrometer.jmx.pureconfig.implicits._ import pureconfig.ConfigReader import pureconfig.generic.semiauto.deriveReader diff --git a/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala b/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala index bc07a989a..de50144f4 100644 --- a/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala +++ b/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/ConfigReaders.scala @@ -2,7 +2,7 @@ package com.avast.sst.http4s.client.pureconfig import cats.syntax.either._ import com.avast.sst.http4s.client.Http4sBlazeClientConfig -import com.avast.sst.jvm.pureconfig._ +import com.avast.sst.jvm.pureconfig.implicits._ import org.http4s.client.blaze.ParserMode import org.http4s.headers.`User-Agent` import pureconfig.ConfigReader diff --git a/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/implicits.scala b/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/implicits.scala new file mode 100644 index 000000000..d535661a4 --- /dev/null +++ b/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/implicits.scala @@ -0,0 +1,3 @@ +package com.avast.sst.http4s.client.pureconfig + +object implicits extends ConfigReaders diff --git a/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/package.scala b/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/package.scala deleted file mode 100644 index 3b7a1c941..000000000 --- a/http4s-client-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/client/pureconfig/package.scala +++ /dev/null @@ -1,3 +0,0 @@ -package com.avast.sst.http4s.client - -package object pureconfig extends ConfigReaders diff --git a/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/implicits.scala b/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/implicits.scala new file mode 100644 index 000000000..af3719357 --- /dev/null +++ b/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/implicits.scala @@ -0,0 +1,3 @@ +package com.avast.sst.http4s.server.pureconfig + +object implicits extends ConfigReaders diff --git a/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/package.scala b/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/package.scala deleted file mode 100644 index cb322684e..000000000 --- a/http4s-server-blaze-pureconfig/src/main/scala/com/avast/sst/http4s/server/pureconfig/package.scala +++ /dev/null @@ -1,3 +0,0 @@ -package com.avast.sst.http4s.server - -package object pureconfig extends ConfigReaders diff --git a/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/implicits.scala b/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/implicits.scala new file mode 100644 index 000000000..22982ce30 --- /dev/null +++ b/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/implicits.scala @@ -0,0 +1,3 @@ +package com.avast.sst.jvm.pureconfig + +object implicits extends ConfigReaders diff --git a/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/package.scala b/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/package.scala deleted file mode 100644 index 64c528050..000000000 --- a/jvm-pureconfig/src/main/scala/com/avast/sst/jvm/pureconfig/package.scala +++ /dev/null @@ -1,3 +0,0 @@ -package com.avast.sst.jvm - -package object pureconfig extends ConfigReaders diff --git a/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/implicits.scala b/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/implicits.scala new file mode 100644 index 000000000..c987f96e3 --- /dev/null +++ b/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/implicits.scala @@ -0,0 +1,3 @@ +package com.avast.sst.micrometer.jmx.pureconfig + +object implicits extends ConfigReaders diff --git a/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/package.scala b/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/package.scala deleted file mode 100644 index 23a2f022c..000000000 --- a/micrometer-jmx-pureconfig/src/main/scala/com/avast/sst/micrometer/jmx/pureconfig/package.scala +++ /dev/null @@ -1,3 +0,0 @@ -package com.avast.sst.micrometer.jmx - -package object pureconfig extends ConfigReaders