diff --git a/build.sbt b/build.sbt index beac893..70359e4 100644 --- a/build.sbt +++ b/build.sbt @@ -42,6 +42,7 @@ lazy val root = project .aggregate( (sequentially.projectRefs ++ `sequentially-ce`.projectRefs ++ + `sequentially-ce-metrics`.projectRefs ++ `sequentially-metrics`.projectRefs :+ projectToRef(benchmark)): _* ) diff --git a/sequentially-ce-metrics/src/main/scala/com/evolutiongaming/concurrent/MeteredSequentiallyF.scala b/sequentially-ce-metrics/src/main/scala/com/evolutiongaming/concurrent/MeteredSequentiallyF.scala index aac0063..81155b9 100644 --- a/sequentially-ce-metrics/src/main/scala/com/evolutiongaming/concurrent/MeteredSequentiallyF.scala +++ b/sequentially-ce-metrics/src/main/scala/com/evolutiongaming/concurrent/MeteredSequentiallyF.scala @@ -10,7 +10,7 @@ import scala.concurrent.Future /** Wrapper around SequentiallyF that adds metrics tracking. * Since SequentiallyF is a final class, we wrap it by delegation. */ -final class MeteredSequentiallyF[F[_]: Async, -K] private ( +final class MeteredSequentiallyF[F[_] : Async, -K] private ( private val sequentially: SequentiallyF[F, K], private val metrics: SequentiallyMetricsF[F], ) { @@ -27,14 +27,14 @@ final class MeteredSequentiallyF[F[_]: Async, -K] private ( def applyF[T](key: K)(task: => F[T]): F[T] = { val start = System.nanoTime() - + metrics.queue(start) *> metrics.run(sequentially.applyF(key)(task)) } } object MeteredSequentiallyF { - def apply[F[_]: Async, K]( + def apply[F[_] : Async, K]( sequentially: SequentiallyF[F, K], name: String, sequentiallyMetrics: SequentiallyMetricsF.Factory[F], @@ -42,7 +42,7 @@ object MeteredSequentiallyF { apply(sequentially, sequentiallyMetrics(name)) } - def apply[F[_]: Async, K]( + def apply[F[_] : Async, K]( sequentially: SequentiallyF[F, K], metrics: SequentiallyMetricsF[F], ): MeteredSequentiallyF[F, K] = { @@ -59,7 +59,7 @@ object MeteredSequentiallyF { def apply[K]: SequentiallyF[F, K] } - def apply[F[_]: Async]( + def apply[F[_] : Async]( provider: Provider[F], sequentiallyMetrics: SequentiallyMetricsF.Factory[F], ): Factory[F] = new Factory[F] { diff --git a/sequentially-ce-metrics/src/main/scala/com/evolutiongaming/concurrent/SequentiallyMetricsF.scala b/sequentially-ce-metrics/src/main/scala/com/evolutiongaming/concurrent/SequentiallyMetricsF.scala index 770d803..c16d7b2 100644 --- a/sequentially-ce-metrics/src/main/scala/com/evolutiongaming/concurrent/SequentiallyMetricsF.scala +++ b/sequentially-ce-metrics/src/main/scala/com/evolutiongaming/concurrent/SequentiallyMetricsF.scala @@ -19,7 +19,7 @@ object SequentiallyMetricsF { /** @note Must be singleton as metric names must be unique. * @see CollectorRegistry#register */ - def apply[F[_]: Sync]( + def apply[F[_] : Sync]( prometheusRegistry: CollectorRegistry, prefix: String = "sequentially", ): Factory[F] = { @@ -54,4 +54,3 @@ object SequentiallyMetricsF { } } } - diff --git a/sequentially-ce-metrics/src/test/scala/com/evolutiongaming/concurrent/MeteredSequentiallyFSpec.scala b/sequentially-ce-metrics/src/test/scala/com/evolutiongaming/concurrent/MeteredSequentiallyFSpec.scala index e17d2f5..6e2512f 100644 --- a/sequentially-ce-metrics/src/test/scala/com/evolutiongaming/concurrent/MeteredSequentiallyFSpec.scala +++ b/sequentially-ce-metrics/src/test/scala/com/evolutiongaming/concurrent/MeteredSequentiallyFSpec.scala @@ -94,12 +94,12 @@ class MeteredSequentiallyFSpec extends AnyWordSpec with Matchers with ScalaFutur val queueCount = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-metrics", "queue") + Array("test-metrics", "queue"), ) val runCount = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-metrics", "run") + Array("test-metrics", "run"), ) queueCount.doubleValue() should be >= 0.0 @@ -116,7 +116,7 @@ class MeteredSequentiallyFSpec extends AnyWordSpec with Matchers with ScalaFutur val (dispatcher, dispatcherCleanup) = Dispatcher.parallel[IO].allocated.unsafeRunSync() val metricsFactory = SequentiallyMetricsF.Factory[IO](registry) val metered = MeteredSequentiallyF(sequentially, "test-apply", metricsFactory) - + implicit val disp: Dispatcher[IO] = dispatcher try { @@ -153,12 +153,12 @@ class MeteredSequentiallyFSpec extends AnyWordSpec with Matchers with ScalaFutur val queueCount = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-apply-metrics", "queue") + Array("test-apply-metrics", "queue"), ) val runCount = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-apply-metrics", "run") + Array("test-apply-metrics", "run"), ) queueCount.doubleValue() should be >= 0.0 @@ -225,12 +225,12 @@ class MeteredSequentiallyFSpec extends AnyWordSpec with Matchers with ScalaFutur val queueCount = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-multiple", "queue") + Array("test-multiple", "queue"), ) val runCount = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-multiple", "run") + Array("test-multiple", "run"), ) queueCount.doubleValue() shouldEqual 10.0 @@ -255,12 +255,12 @@ class MeteredSequentiallyFSpec extends AnyWordSpec with Matchers with ScalaFutur val count1 = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("name1", "run") + Array("name1", "run"), ) val count2 = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("name2", "run") + Array("name2", "run"), ) count1.doubleValue() should be >= 0.0 @@ -310,16 +310,16 @@ class MeteredSequentiallyFSpec extends AnyWordSpec with Matchers with ScalaFutur val registry = new CollectorRegistry() val (sequentially, cleanup) = SequentiallyF.resource[IO, Int]().allocated.unsafeRunSync() val metricsFactory = SequentiallyMetricsF.Factory[IO](registry) - + val provider = new MeteredSequentiallyF.Factory.Provider[IO] { override def apply[K]: SequentiallyF[IO, K] = sequentially.asInstanceOf[SequentiallyF[IO, K]] } - + val factory = MeteredSequentiallyF.Factory(provider, metricsFactory) try { val metered = factory("test-factory") - + val result = metered.applyF(1)(IO.pure("result")).unsafeRunSync() result shouldEqual "result" @@ -332,11 +332,11 @@ class MeteredSequentiallyFSpec extends AnyWordSpec with Matchers with ScalaFutur val registry = new CollectorRegistry() val (sequentially, cleanup) = SequentiallyF.resource[IO, Int]().allocated.unsafeRunSync() val metricsFactory = SequentiallyMetricsF.Factory[IO](registry) - + val provider = new MeteredSequentiallyF.Factory.Provider[IO] { override def apply[K]: SequentiallyF[IO, K] = sequentially.asInstanceOf[SequentiallyF[IO, K]] } - + val factory = MeteredSequentiallyF.Factory(provider, metricsFactory) try { @@ -357,11 +357,11 @@ class MeteredSequentiallyFSpec extends AnyWordSpec with Matchers with ScalaFutur val registry = new CollectorRegistry() val (sequentially, cleanup) = SequentiallyF.resource[IO, Int]().allocated.unsafeRunSync() val metricsFactory = SequentiallyMetricsF.Factory[IO](registry) - + val provider = new MeteredSequentiallyF.Factory.Provider[IO] { override def apply[K]: SequentiallyF[IO, K] = sequentially.asInstanceOf[SequentiallyF[IO, K]] } - + val factory = MeteredSequentiallyF.Factory(provider, metricsFactory) try { @@ -371,7 +371,7 @@ class MeteredSequentiallyFSpec extends AnyWordSpec with Matchers with ScalaFutur val count = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("factory-test", "run") + Array("factory-test", "run"), ) count.doubleValue() should be >= 0.0 @@ -382,4 +382,3 @@ class MeteredSequentiallyFSpec extends AnyWordSpec with Matchers with ScalaFutur } } } - diff --git a/sequentially-ce-metrics/src/test/scala/com/evolutiongaming/concurrent/SequentiallyMetricsFSpec.scala b/sequentially-ce-metrics/src/test/scala/com/evolutiongaming/concurrent/SequentiallyMetricsFSpec.scala index aa98c3d..ca9f8b3 100644 --- a/sequentially-ce-metrics/src/test/scala/com/evolutiongaming/concurrent/SequentiallyMetricsFSpec.scala +++ b/sequentially-ce-metrics/src/test/scala/com/evolutiongaming/concurrent/SequentiallyMetricsFSpec.scala @@ -40,7 +40,7 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { val factory = SequentiallyMetricsF.Factory[IO](registry, prefix = "custom_prefix") factory("test-name") - + // Verify metric exists with custom prefix val metricName = "custom_prefix_time" val samples = registry.metricFamilySamples().asIterator().asScala.toSeq @@ -53,7 +53,7 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { val factory = SequentiallyMetricsF.Factory[IO](registry) factory("test-name") - + // Verify metric exists with default prefix val metricName = "sequentially_time" val samples = registry.metricFamilySamples().asIterator().asScala.toSeq @@ -70,7 +70,7 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { val metrics = factory("test-queue") val startNanos = System.nanoTime() - + // Record queue time metrics.queue(startNanos).unsafeRunSync() @@ -78,9 +78,9 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { val summary = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-queue", "queue") + Array("test-queue", "queue"), ) - + Option(summary).isDefined shouldBe true summary.doubleValue() should be >= 0.0 } @@ -99,12 +99,12 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { val count1 = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("name1", "queue") + Array("name1", "queue"), ) val count2 = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("name2", "queue") + Array("name2", "queue"), ) Option(count1).isDefined shouldBe true @@ -139,7 +139,7 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { val count = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-run", "run") + Array("test-run", "run"), ) Option(count).isDefined shouldBe true @@ -159,12 +159,12 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { val count1 = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("name1", "run") + Array("name1", "run"), ) val count2 = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("name2", "run") + Array("name2", "run"), ) Option(count1).isDefined shouldBe true @@ -202,7 +202,7 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { val count = Option(registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-error", "run") + Array("test-error", "run"), )) // If exception occurs before flatMap completes, metric may not be recorded @@ -251,7 +251,7 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { val summary = registry.getSampleValue( "sequentially_time_sum", Array("name", "operation"), - Array("test-duration", "run") + Array("test-duration", "run"), ) Option(summary).isDefined shouldBe true @@ -275,12 +275,12 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { val queueCount = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-integration", "queue") + Array("test-integration", "queue"), ) val runCount = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-integration", "run") + Array("test-integration", "run"), ) Option(queueCount).isDefined shouldBe true @@ -305,12 +305,12 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { val queueCount = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-multiple", "queue") + Array("test-multiple", "queue"), ) val runCount = registry.getSampleValue( "sequentially_time_count", Array("name", "operation"), - Array("test-multiple", "run") + Array("test-multiple", "run"), ) Option(queueCount).isDefined shouldBe true @@ -320,4 +320,3 @@ class SequentiallyMetricsFSpec extends AnyWordSpec with Matchers { } } } -