/
Main.scala
73 lines (68 loc) · 3.77 KB
/
Main.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.avast.sst.example
import cats.effect.{Clock, Resource}
import com.avast.sst.bundle.ZioServerApp
import com.avast.sst.doobie.DoobieHikariModule
import com.avast.sst.example.config.Configuration
import com.avast.sst.example.module.Http4sRoutingModule
import com.avast.sst.example.service.RandomService
import com.avast.sst.http4s.client.Http4sBlazeClientModule
import com.avast.sst.http4s.client.monix.catnap.Http4sClientCircuitBreakerModule
import com.avast.sst.http4s.server.Http4sBlazeServerModule
import com.avast.sst.http4s.server.micrometer.MicrometerHttp4sServerMetricsModule
import com.avast.sst.jvm.execution.ConfigurableThreadFactory.Config
import com.avast.sst.jvm.execution.{ConfigurableThreadFactory, 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.monix.catnap.CircuitBreakerModule
import com.avast.sst.monix.catnap.CircuitBreakerModule.{withLogging, withMetrics}
import com.avast.sst.monix.catnap.micrometer.MicrometerCircuitBreakerMetricsModule
import com.avast.sst.pureconfig.PureConfigModule
import com.zaxxer.hikari.metrics.micrometer.MicrometerMetricsTrackerFactory
import org.http4s.server.Server
import zio.Task
import zio.interop.catz.*
import zio.interop.catz.implicits.*
import java.util.concurrent.TimeUnit
import scala.concurrent.ExecutionContext
object Main extends ZioServerApp {
def program: Resource[Task, Server] = {
for {
configuration <- Resource.eval(PureConfigModule.makeOrRaise[Task, Configuration])
executorModule <- ExecutorModule.makeFromExecutionContext[Task](runtime.platform.executor.asEC)
clock = Clock.create[Task]
currentTime <- Resource.eval(clock.realTime(TimeUnit.MILLISECONDS))
console <- Resource.pure[Task, Console[Task]](ConsoleModule.make[Task])
_ <- Resource.eval(
console.printLine(s"The current Unix epoch time is $currentTime. This system has ${executorModule.numOfCpus} CPUs.")
)
meterRegistry <- MicrometerJmxModule.make[Task](configuration.jmx)
_ <- Resource.eval(MicrometerJvmModule.make[Task](meterRegistry))
serverMetricsModule <- Resource.eval(MicrometerHttp4sServerMetricsModule.make[Task](meterRegistry, executorModule.blocker, clock))
boundedConnectExecutionContext <-
executorModule
.makeThreadPoolExecutor(
configuration.boundedConnectExecutor,
new ConfigurableThreadFactory(Config(nameFormat = Some("hikari-connect-%02d")))
)
.map(ExecutionContext.fromExecutorService)
hikariMetricsFactory = new MicrometerMetricsTrackerFactory(meterRegistry)
doobieTransactor <-
DoobieHikariModule
.make[Task](
configuration.database,
boundedConnectExecutionContext: ExecutionContext,
executorModule.blocker,
Some(hikariMetricsFactory)
)
randomService = RandomService(doobieTransactor)
httpClient <- Http4sBlazeClientModule.make[Task](configuration.client, executorModule.executionContext)
circuitBreakerMetrics <- Resource.eval(MicrometerCircuitBreakerMetricsModule.make[Task]("test-http-client", meterRegistry))
circuitBreaker <- Resource.eval(CircuitBreakerModule[Task].make(configuration.circuitBreaker, clock))
enrichedCircuitBreaker = withLogging("test-http-client", withMetrics(circuitBreakerMetrics, circuitBreaker))
client = Http4sClientCircuitBreakerModule.make[Task](httpClient, enrichedCircuitBreaker)
routingModule = new Http4sRoutingModule(randomService, client, serverMetricsModule)
server <- Http4sBlazeServerModule.make[Task](configuration.server, routingModule.router, executorModule.executionContext)
} yield server
}
}