Skip to content

Commit

Permalink
Appy scalafmt formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
DraganRaicici committed Mar 21, 2024
1 parent f95cef8 commit b00ac7d
Show file tree
Hide file tree
Showing 20 changed files with 273 additions and 195 deletions.
11 changes: 7 additions & 4 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.9.10")
addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.10.0")

addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")
addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.2.1")

addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.9.3")
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.0.11")

addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.3.1")
addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.3.11")

// Formatting
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2")
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,21 @@ import org.slf4j.LoggerFactory
import play.api.http.HttpEntity

/**
* A Play controller implementation to return collected metrics.
* Use this controller to create an endpoint which can be scraped by Prometheus.
*
* Add to your `routes.conf`:
* {{{
* # Prometheus metrics
* GET /metrics io.github.stijndehaes.playprometheusfilters.controllers.PrometheusController.getMetrics
* }}}
*/
class PrometheusController @Inject()(registry: CollectorRegistry, cc: ControllerComponents) extends AbstractController(cc) {
* A Play controller implementation to return collected metrics. Use this controller to create an endpoint which can be
* scraped by Prometheus.
*
* Add to your `routes.conf`:
* {{{
* # Prometheus metrics
* GET /metrics io.github.stijndehaes.playprometheusfilters.controllers.PrometheusController.getMetrics
* }}}
*/
class PrometheusController @Inject() (registry: CollectorRegistry, cc: ControllerComponents)
extends AbstractController(cc) {

private val logger = LoggerFactory.getLogger(classOf[PrometheusController])

def getMetrics = Action {
def getMetrics: Action[AnyContent] = Action {
logger.trace("Metrics call received")
val samples = new StringBuilder()
val writer = new WriterAdapter(samples)
Expand All @@ -36,4 +37,4 @@ class PrometheusController @Inject()(registry: CollectorRegistry, cc: Controller
)
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,17 @@ import scala.concurrent.ExecutionContext
import org.apache.pekko.stream.Materializer

/**
* A simple [[MetricsFilter]] using a histogram metric to record latency without any labels.
*/
* A simple [[MetricsFilter]] using a histogram metric to record latency without any labels.
*/
@Singleton
class LatencyFilter @Inject()(registry: CollectorRegistry, configuration: Configuration)(implicit val actorSystem: ActorSystem, ec: ExecutionContext) extends MetricsFilter(configuration) {
class LatencyFilter @Inject() (registry: CollectorRegistry, configuration: Configuration)(implicit
val actorSystem: ActorSystem,
ec: ExecutionContext
) extends MetricsFilter(configuration) {

override implicit val mat: Materializer = Materializer(actorSystem)

override val metrics: List[LatencyRequestMetric] = List(
LatencyOnlyRequestMetricsBuilder.build(registry, DefaultPlayUnmatchedDefaults)
)
}
}
Original file line number Diff line number Diff line change
@@ -1,52 +1,56 @@
package com.github.stijndehaes.playprometheusfilters.filters

import com.github.stijndehaes.playprometheusfilters.metrics.{CounterRequestMetrics, LatencyRequestMetrics, RequestMetric, RequestMetricBuilder}
import com.github.stijndehaes.playprometheusfilters.metrics.{
CounterRequestMetrics,
LatencyRequestMetrics,
RequestMetric,
RequestMetricBuilder
}
import io.prometheus.client.Collector
import org.apache.pekko.stream.Materializer
import play.api.Configuration
import play.api.mvc.{Filter, RequestHeader, Result}

import scala.concurrent.{ExecutionContext, Future}
import scala.jdk.CollectionConverters._
import scala.util.matching.Regex

/**
* Generic filter implementation to add metrics for a request.
* Subclasses only have to define the `metrics` property to apply metrics.
*
* {{{
* @Singleton
* class MyFilter @Inject()(registry: CollectorRegistry)(implicit mat: Materializer, ec: ExecutionContext) extends MetricsFilter {
*
* override val metrics = List(
* LatencyOnlyRequestMetricsBuilder.build(registry, DefaultUnmatchedDefaults)
* )
* }
* }}}
*
* Metrics can be created by using a [[RequestMetricBuilder RequestMetricBuilder]].
* The builder creates and configures the metrics for the class instance.
*
* See [[CounterRequestMetrics CounterRequestMetrics]] and
* [[LatencyRequestMetrics LatencyRequestMetrics]] for some provided
* builders.
*
* @param mat
* @param ec
*/
abstract class MetricsFilter(configuration: Configuration)(implicit val mat: Materializer, ec: ExecutionContext) extends Filter {
* Generic filter implementation to add metrics for a request. Subclasses only have to define the `metrics` property to
* apply metrics.
*
* {{{
* @Singleton
* class MyFilter @Inject()(registry: CollectorRegistry)(implicit mat: Materializer, ec: ExecutionContext) extends MetricsFilter {
*
* override val metrics = List(
* LatencyOnlyRequestMetricsBuilder.build(registry, DefaultUnmatchedDefaults)
* )
* }
* }}}
*
* Metrics can be created by using a [[RequestMetricBuilder RequestMetricBuilder]]. The builder creates and configures
* the metrics for the class instance.
*
* See [[CounterRequestMetrics CounterRequestMetrics]] and [[LatencyRequestMetrics LatencyRequestMetrics]] for some
* provided builders.
*
* @param mat
* @param ec
*/
abstract class MetricsFilter(configuration: Configuration)(implicit val mat: Materializer, ec: ExecutionContext)
extends Filter {

val metrics: List[RequestMetric[_, RequestHeader, Result]]

val excludePaths = {
val excludePaths: Set[Regex] =
Option(configuration.underlying)
.map(_.getStringList("play-prometheus-filters.exclude.paths"))
.map(_.asScala.toSet)
.map(_.map(_.r))
.getOrElse(Set.empty)
}

def apply(nextFilter: RequestHeader => Future[Result])
(requestHeader: RequestHeader): Future[Result] = {
def apply(nextFilter: RequestHeader => Future[Result])(requestHeader: RequestHeader): Future[Result] = {

// check if current uri is excluded from metrics
def urlIsExcluded = excludePaths.exists(_.findFirstMatchIn(requestHeader.uri).isDefined)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ import javax.inject.{Inject, Singleton}
import scala.concurrent.ExecutionContext

/**
* A simple [[MetricsFilter]] using a counter metric to count requests.
* Only adds a 'route' label.
*/
* A simple [[MetricsFilter]] using a counter metric to count requests. Only adds a 'route' label.
*/
@Singleton
class RouteLatencyFilter @Inject()(registry: CollectorRegistry, configuration: Configuration)(implicit mat: Materializer, ec: ExecutionContext) extends MetricsFilter(configuration) {
class RouteLatencyFilter @Inject() (registry: CollectorRegistry, configuration: Configuration)(implicit
mat: Materializer,
ec: ExecutionContext
) extends MetricsFilter(configuration) {

override val metrics = List(
RouteLatencyRequestMetricsBuilder.build(registry, DefaultPlayUnmatchedDefaults)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@ import javax.inject.{Inject, Singleton}
import scala.concurrent.ExecutionContext

/**
* A [[MetricsFilter]] using a counter metric to count requests.
* Adds a 'method', 'status', 'controller', 'path' and 'verb' labels.
*/
* A [[MetricsFilter]] using a counter metric to count requests. Adds a 'method', 'status', 'controller', 'path' and
* 'verb' labels.
*/
@Singleton
class StatusAndRouteCounterFilter @Inject()(registry: CollectorRegistry, configuration: Configuration)(implicit mat: Materializer, ec: ExecutionContext) extends MetricsFilter(configuration) {
class StatusAndRouteCounterFilter @Inject() (registry: CollectorRegistry, configuration: Configuration)(implicit
mat: Materializer,
ec: ExecutionContext
) extends MetricsFilter(configuration) {

override val metrics = List(
CounterRequestMetricBuilder.build(registry, DefaultPlayUnmatchedDefaults)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,17 @@ import javax.inject.{Inject, Singleton}
import scala.concurrent.ExecutionContext

/**
* A [[MetricsFilter]] using a both a histogram and counter metric to record latency and count requests.
*
* Latency metric adds 'RouteActionMethod', 'Status', 'Controller', 'Path' and 'Verb' labels.
* Counter metric adds 'method', 'status', 'controller', 'path' and 'verb' labels.
*/
* A [[MetricsFilter]] using a both a histogram and counter metric to record latency and count requests.
*
* Latency metric adds 'RouteActionMethod', 'Status', 'Controller', 'Path' and 'Verb' labels. Counter metric adds
* 'method', 'status', 'controller', 'path' and 'verb' labels.
*/
@Singleton
class StatusAndRouteLatencyAndCounterFilter @Inject()(registry: CollectorRegistry, configuration: Configuration)(implicit mat: Materializer, ec: ExecutionContext) extends MetricsFilter(configuration) {
class StatusAndRouteLatencyAndCounterFilter @Inject() (registry: CollectorRegistry, configuration: Configuration)(
implicit
mat: Materializer,
ec: ExecutionContext
) extends MetricsFilter(configuration) {

override val metrics = List(
LatencyRequestMetricsBuilder.build(registry, DefaultPlayUnmatchedDefaults),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@ import javax.inject.{Inject, Singleton}
import scala.concurrent.ExecutionContext

/**
* A [[MetricsFilter]] using a histogram metric to record latency.
* Latency metric adds 'RouteActionMethod', 'Status', 'Controller', 'Path' and 'Verb' labels.
*/
* A [[MetricsFilter]] using a histogram metric to record latency. Latency metric adds 'RouteActionMethod', 'Status',
* 'Controller', 'Path' and 'Verb' labels.
*/
@Singleton
class StatusAndRouteLatencyFilter @Inject()(registry: CollectorRegistry, configuration: Configuration)(implicit mat: Materializer, ec: ExecutionContext) extends MetricsFilter(configuration) {
class StatusAndRouteLatencyFilter @Inject() (registry: CollectorRegistry, configuration: Configuration)(implicit
mat: Materializer,
ec: ExecutionContext
) extends MetricsFilter(configuration) {

override val metrics = List(
LatencyRequestMetricsBuilder.build(registry, DefaultPlayUnmatchedDefaults)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@ import javax.inject.{Inject, Singleton}
import scala.concurrent.ExecutionContext

/**
* A [[MetricsFilter]] using a counter metric to count requests statuses.
* Only adds a 'status' label containing the status codes.
*/
* A [[MetricsFilter]] using a counter metric to count requests statuses. Only adds a 'status' label containing the
* status codes.
*/
@Singleton
class StatusCounterFilter @Inject()(registry: CollectorRegistry, configuration: Configuration)(implicit mat: Materializer, ec: ExecutionContext) extends MetricsFilter(configuration) {
class StatusCounterFilter @Inject() (registry: CollectorRegistry, configuration: Configuration)(implicit
mat: Materializer,
ec: ExecutionContext
) extends MetricsFilter(configuration) {

override val metrics = List(
StatusCounterRequestMetricBuilder.build(registry, DefaultPlayUnmatchedDefaults)
)
}
}

0 comments on commit b00ac7d

Please sign in to comment.