Skip to content

Commit

Permalink
Merge pull request #452 from NDLANO/prometheus-metrics
Browse files Browse the repository at this point in the history
Add prometheus metrics endpoint to applications
  • Loading branch information
jnatten authored Apr 16, 2024
2 parents 0277302 + 6e512c7 commit c9a13a4
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 9 deletions.
22 changes: 19 additions & 3 deletions network/src/main/scala/no/ndla/network/tapir/Routes.scala
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@
package no.ndla.network.tapir

import com.sun.net.httpserver.HttpServer
import io.circe.generic.auto._
import io.circe.generic.auto.*
import io.prometheus.metrics.model.registry.PrometheusRegistry
import no.ndla.common.RequestLogger
import no.ndla.common.configuration.HasBaseProps
import no.ndla.network.model.RequestInfo
import no.ndla.network.tapir.NoNullJsonPrinter._
import no.ndla.network.tapir.NoNullJsonPrinter.*
import org.log4s.{Logger, getLogger}
import sttp.model.StatusCode
import sttp.monad.MonadError
Expand All @@ -24,6 +25,8 @@ import sttp.tapir.server.interceptor.exception.{ExceptionContext, ExceptionHandl
import sttp.tapir.server.interceptor.reject.{RejectContext, RejectHandler}
import sttp.tapir.server.interceptor.{RequestInterceptor, RequestResult}
import sttp.tapir.server.jdkhttp.{Id, JdkHttpServer, JdkHttpServerOptions}
import sttp.tapir.server.metrics.MetricLabels
import sttp.tapir.server.metrics.prometheus.PrometheusMetrics
import sttp.tapir.server.model.ValuedEndpointOutput
import sttp.tapir.{AttributeKey, EndpointInput, statusCode}

Expand Down Expand Up @@ -85,7 +88,12 @@ trait Routes[F[_]] {
}

object JDKMiddleware {
private def shouldLogRequest(req: ServerRequest): Boolean = s"/${req.uri.path.mkString("/")}" != "/health"
private def shouldLogRequest(req: ServerRequest): Boolean = {
if (req.uri.path.size != 1) return true
if (req.uri.path.head == "metrics") return false
if (req.uri.path.head == "health") return false
true
}

val beforeTime = new AttributeKey[Long]("beforeTime")
def before(req: ServerRequest): ServerRequest = {
Expand Down Expand Up @@ -135,6 +143,12 @@ trait Routes[F[_]] {
}

def startJdkServerAsync(name: String, port: Int)(warmupFunc: => Unit): HttpServer = {
val registry = new PrometheusRegistry()
val prometheusMetrics = PrometheusMetrics.default[Id](
namespace = "tapir",
registry = registry,
labels = MetricLabels.Default
)
// val executor: ExecutorService = Executors.newVirtualThreadPerTaskExecutor()
val executor: ExecutorService = Executors.newWorkStealingPool(props.TAPIR_THREADS)

Expand All @@ -144,6 +158,7 @@ trait Routes[F[_]] {
.exceptionHandler(NdlaExceptionHandler[Id]())
.decodeFailureHandler(decodeFailureHandler[Id])
.serverLog(None)
.metricsInterceptor(prometheusMetrics.metricsInterceptor())
.prependInterceptor(RequestInterceptor.transformServerRequest[Id](JDKMiddleware.before))
.prependInterceptor(RequestInterceptor.transformResultEffect(new JDKMiddleware.after))
.options
Expand All @@ -154,6 +169,7 @@ trait Routes[F[_]] {
.options(options)
.executor(executor)
.addEndpoints(endpoints)
.addEndpoint(prometheusMetrics.metricsEndpoint)
.port(port)
.start()

Expand Down
13 changes: 7 additions & 6 deletions project/Dependencies.scala
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,13 @@ object Dependencies {
)

lazy val tapir: Seq[ModuleID] = Seq(
"com.softwaremill.sttp.tapir" %% "tapir-http4s-server" % TapirV,
"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % TapirV,
"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % TapirV,
"com.softwaremill.sttp.tapir" %% "tapir-jdkhttp-server" % TapirV,
"com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % ApiSpecV,
"com.softwaremill.sttp.tapir" %% "tapir-testing" % TapirV % "test"
"com.softwaremill.sttp.tapir" %% "tapir-http4s-server" % TapirV,
"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % TapirV,
"com.softwaremill.sttp.tapir" %% "tapir-json-circe" % TapirV,
"com.softwaremill.sttp.tapir" %% "tapir-jdkhttp-server" % TapirV,
"com.softwaremill.sttp.tapir" %% "tapir-prometheus-metrics" % TapirV,
"com.softwaremill.sttp.apispec" %% "openapi-circe-yaml" % ApiSpecV,
"com.softwaremill.sttp.tapir" %% "tapir-testing" % TapirV % "test"
).map {
// NOTE: tapir-jdkhttp-server includes some logback provider for slf4j
// this conflicts with the existing provider, so lets exclude it.
Expand Down

0 comments on commit c9a13a4

Please sign in to comment.