@@ -27,8 +27,8 @@ import munit.CatsEffectSuite
2727import org .typelevel .keypool .internal .Metrics
2828import org .typelevel .otel4s .{Attribute , Attributes }
2929import org .typelevel .otel4s .metrics .{BucketBoundaries , Meter , MeterProvider }
30- import org .typelevel .otel4s .oteljava . testkit . metrics .MetricsTestkit
31- import org .typelevel .otel4s .oteljava .testkit .metrics .data .{ HistogramPointData , Metric , MetricData }
30+ import org .typelevel .otel4s .sdk . metrics .data .{ MetricPoints , PointData , TimeWindow }
31+ import org .typelevel .otel4s .sdk .testkit .metrics .MetricsTestkit
3232
3333import scala .concurrent .duration ._
3434import scala .util .control .NoStackTrace
@@ -38,7 +38,7 @@ class PoolMetricsSpec extends CatsEffectSuite {
3838
3939 test(" Metrics should be empty for unused pool" ) {
4040 val expectedSnapshot =
41- MetricsSnapshot (Nil , Nil , Nil , Nil , Nil )
41+ MetricsSnapshot (Vector .empty, Vector .empty, Vector .empty, Vector .empty, Vector .empty )
4242
4343 createTestkit.use { testkit =>
4444 for {
@@ -53,8 +53,8 @@ class PoolMetricsSpec extends CatsEffectSuite {
5353 inUse <- pool.take.surround(sdk.snapshot)
5454 afterUse <- sdk.snapshot
5555 } yield {
56- assertEquals(inUse.inUse, List (1L ))
57- assertEquals(afterUse.inUse, List (0L ))
56+ assertEquals(inUse.inUse, Vector (1L ))
57+ assertEquals(afterUse.inUse, Vector (0L ))
5858 }
5959 }
6060 }
@@ -71,8 +71,8 @@ class PoolMetricsSpec extends CatsEffectSuite {
7171 inUse <- deferred.get
7272 afterUse <- sdk.snapshot
7373 } yield {
74- assertEquals(inUse.inUse, List (1L ))
75- assertEquals(afterUse.inUse, List (0L ))
74+ assertEquals(inUse.inUse, Vector (1L ))
75+ assertEquals(afterUse.inUse, Vector (0L ))
7676 }
7777 }
7878 }
@@ -83,8 +83,8 @@ class PoolMetricsSpec extends CatsEffectSuite {
8383 inUse <- pool.take.surround(sdk.snapshot)
8484 afterUse <- sdk.snapshot
8585 } yield {
86- assertEquals(inUse.idle, Nil )
87- assertEquals(afterUse.idle, Nil )
86+ assertEquals(inUse.idle, Vector .empty )
87+ assertEquals(afterUse.idle, Vector .empty )
8888 }
8989 }
9090 }
@@ -95,77 +95,89 @@ class PoolMetricsSpec extends CatsEffectSuite {
9595 inUse <- pool.take.surround(sdk.snapshot)
9696 afterUse <- sdk.snapshot
9797 } yield {
98- assertEquals(inUse.idle, Nil )
99- assertEquals(afterUse.idle, List (1L ))
98+ assertEquals(inUse.idle, Vector .empty )
99+ assertEquals(afterUse.idle, Vector (1L ))
100100 }
101101 }
102102 }
103103
104104 test(" Idle: decrement on reaper cleanup" ) {
105- TestControl .executeEmbed {
106- poolTest(_.withMaxIdle(1 ).withIdleTimeAllowedInPool(1 .second)) { (sdk, pool) =>
107- for {
108- inUse <- pool.take.surround(sdk.snapshot)
109- afterUse <- sdk.snapshot
110- afterSleep <- sdk.snapshot.delayBy(6 .seconds)
111- } yield {
112- assertEquals(inUse.idle, Nil )
113- assertEquals(afterUse.idle, List (1L ))
114- assertEquals(afterSleep.idle, List (0L ))
115- }
105+ poolTest(_.withMaxIdle(1 ).withIdleTimeAllowedInPool(1 .second)) { (sdk, pool) =>
106+ for {
107+ inUse <- pool.take.surround(sdk.snapshot)
108+ afterUse <- sdk.snapshot
109+ afterSleep <- sdk.snapshot.delayBy(6 .seconds)
110+ } yield {
111+ assertEquals(inUse.idle, Vector .empty)
112+ assertEquals(afterUse.idle, Vector (1L ))
113+ assertEquals(afterSleep.idle, Vector (0L ))
116114 }
117115 }
116+
118117 }
119118
120119 test(" Generate valid metric snapshots" ) {
121- TestControl .executeEmbed {
122- createTestkit.use { sdk =>
123- mkPool(sdk.metrics.meterProvider)
124- .use(pool => pool.take.surround(sdk.snapshot.delayBy(1 .second)).product(sdk.snapshot))
125- .map { case (inUse, afterUse) =>
126- val acquireDuration =
127- List (
128- HistogramPointData (0 , 1 , HistogramBuckets , List (1 , 0 , 0 , 0 , 0 ))
129- )
130-
131- val expectedInUse = MetricsSnapshot (
132- idle = Nil ,
133- inUse = List (1 ),
134- inUseDuration = Nil ,
135- acquiredTotal = List (1 ),
136- acquireDuration = acquireDuration
120+ poolTest() { (sdk, pool) =>
121+ pool.take
122+ .surround(sdk.snapshot.delayBy(1 .second))
123+ .product(sdk.snapshot)
124+ .map { case (inUse, afterUse) =>
125+ val acquireDuration = Vector (
126+ PointData .histogram(
127+ TimeWindow (Duration .Zero , 1 .second),
128+ Attributes (Attribute (" pool.name" , " test" )),
129+ Vector .empty,
130+ Some (PointData .Histogram .Stats (0.0 , 0.0 , 0.0 , 1 )),
131+ HistogramBuckets ,
132+ Vector (1 , 0 , 0 , 0 , 0 )
137133 )
134+ )
138135
139- val expectedAfterUser = MetricsSnapshot (
140- idle = List (1 ),
141- inUse = List (0 ),
142- inUseDuration = List (
143- HistogramPointData (1.0 , 1 , HistogramBuckets , List (0 , 1 , 0 , 0 , 0 ))
144- ),
145- acquiredTotal = List (1 ),
146- acquireDuration = acquireDuration
147- )
136+ val expectedInUse = MetricsSnapshot (
137+ idle = Vector .empty,
138+ inUse = Vector (1L ),
139+ inUseDuration = Vector .empty,
140+ acquiredTotal = Vector (1L ),
141+ acquireDuration = acquireDuration
142+ )
148143
149- assertEquals(inUse, expectedInUse)
150- assertEquals(afterUse, expectedAfterUser)
151- }
152- }
144+ val expectedAfterUser = MetricsSnapshot (
145+ idle = Vector (1L ),
146+ inUse = Vector (0L ),
147+ inUseDuration = Vector (
148+ PointData .histogram(
149+ TimeWindow (Duration .Zero , 1 .second),
150+ Attributes (Attribute (" pool.name" , " test" )),
151+ Vector .empty,
152+ Some (PointData .Histogram .Stats (1.0 , 1.0 , 1.0 , 1 )),
153+ HistogramBuckets ,
154+ Vector (0 , 1 , 0 , 0 , 0 )
155+ )
156+ ),
157+ acquiredTotal = Vector (1L ),
158+ acquireDuration = acquireDuration
159+ )
160+
161+ assertEquals(inUse, expectedInUse)
162+ assertEquals(afterUse, expectedAfterUser)
163+ }
153164 }
154165 }
155166
156167 private def poolTest (
157168 customize : Pool .Builder [IO , Ref [IO , Int ]] => Pool .Builder [IO , Ref [IO , Int ]] = identity
158- )(scenario : (OtelTestkit [IO ], Pool [IO , Ref [IO , Int ]]) => IO [Unit ]): IO [Unit ] = {
159- createTestkit.use { sdk =>
160- sdk.metrics.meterProvider.get(" org.typelevel.keypool" ).flatMap { implicit M : Meter [IO ] =>
161- val builder = Pool
162- .Builder (Ref .of[IO , Int ](1 ), nothing)
163- .withMetricsProvider(metricsProvider)
164-
165- customize(builder).build.use(pool => scenario(sdk, pool))
169+ )(scenario : (OtelTestkit [IO ], Pool [IO , Ref [IO , Int ]]) => IO [Unit ]): IO [Unit ] =
170+ TestControl .executeEmbed {
171+ createTestkit.use { sdk =>
172+ sdk.metrics.meterProvider.get(" org.typelevel.keypool" ).flatMap { implicit M : Meter [IO ] =>
173+ val builder = Pool
174+ .Builder (Ref .of[IO , Int ](1 ), nothing)
175+ .withMetricsProvider(metricsProvider)
176+
177+ customize(builder).build.use(pool => scenario(sdk, pool))
178+ }
166179 }
167180 }
168- }
169181
170182 private def mkPool (meterProvider : MeterProvider [IO ]) =
171183 Resource .eval(meterProvider.get(" org.typelevel.keypool" )).flatMap { implicit M : Meter [IO ] =>
@@ -183,8 +195,8 @@ class PoolMetricsSpec extends CatsEffectSuite {
183195 Otel4sMetrics .provider[IO ](
184196 " keypool" ,
185197 Attributes (Attribute (" pool.name" , " test" )),
186- BucketBoundaries ( HistogramBuckets .toVector) ,
187- BucketBoundaries ( HistogramBuckets .toVector)
198+ HistogramBuckets ,
199+ HistogramBuckets
188200 )
189201
190202 private def createTestkit : Resource [IO , OtelTestkit [IO ]] =
@@ -194,25 +206,27 @@ class PoolMetricsSpec extends CatsEffectSuite {
194206
195207 def snapshot : IO [MetricsSnapshot ] =
196208 for {
197- metrics <- testkit.collectMetrics[ Metric ]
209+ metrics <- testkit.collectMetrics
198210 } yield {
199- def counterValue (name : String ): List [Long ] =
211+ def counterValue (name : String ): Vector [Long ] =
200212 metrics
201213 .find(_.name == name)
202214 .map(_.data)
203- .collectFirst { case MetricData .LongSum (points) =>
204- points.map(_.value)
215+ .collectFirst { case sum : MetricPoints .Sum =>
216+ sum.points.toVector.collect { case long : PointData .LongNumber =>
217+ long.value
218+ }
205219 }
206- .getOrElse(Nil )
220+ .getOrElse(Vector .empty )
207221
208- def histogramSnapshot (name : String ): List [ HistogramPointData ] =
222+ def histogramSnapshot (name : String ): Vector [ PointData . Histogram ] =
209223 metrics
210224 .find(_.name == name)
211225 .map(_.data)
212- .collectFirst { case MetricData .Histogram (points) =>
213- points.map(_.value)
226+ .collectFirst { case histogram : MetricPoints .Histogram =>
227+ histogram. points.toVector
214228 }
215- .getOrElse(Nil )
229+ .getOrElse(Vector .empty )
216230
217231 MetricsSnapshot (
218232 counterValue(" keypool.idle.current" ),
@@ -225,8 +239,8 @@ class PoolMetricsSpec extends CatsEffectSuite {
225239 }
226240 }
227241
228- private val HistogramBuckets : List [ Double ] =
229- List ( 0.01 , 1 , 100 , 1000 )
242+ private val HistogramBuckets : BucketBoundaries =
243+ BucketBoundaries ( Vector ( 0.01 , 1.0 , 100.0 , 1000.0 ) )
230244
231245 private def nothing (ref : Ref [IO , Int ]): IO [Unit ] =
232246 ref.get.void
@@ -241,11 +255,11 @@ object PoolMetricsSpec {
241255 }
242256
243257 final case class MetricsSnapshot (
244- idle : List [Long ],
245- inUse : List [Long ],
246- inUseDuration : List [ HistogramPointData ],
247- acquiredTotal : List [Long ],
248- acquireDuration : List [ HistogramPointData ]
258+ idle : Vector [Long ],
259+ inUse : Vector [Long ],
260+ inUseDuration : Vector [ PointData . Histogram ],
261+ acquiredTotal : Vector [Long ],
262+ acquireDuration : Vector [ PointData . Histogram ]
249263 )
250264
251265}
0 commit comments