2121
2222package org .typelevel .keypool
2323
24+ import java .util .concurrent .TimeUnit
2425import cats ._
2526import cats .effect .kernel ._
2627import cats .effect .kernel .syntax .spawn ._
@@ -202,7 +203,7 @@ object KeyPool {
202203 val (m_, toDestroy) = findStale(now, idleCount, m)
203204 (
204205 m_,
205- toDestroy.traverse_(r => metrics.decIdle >> r._2._2).attempt.flatMap {
206+ toDestroy.traverse_(r => metrics.idle.dec() >> r._2._2).attempt.flatMap {
206207 case Left (t) => onReaperException(t)
207208 // .handleErrorWith(t => F.delay(t.printStackTrace())) // CHEATING?
208209 case Right (()) => F .unit
@@ -259,7 +260,7 @@ object KeyPool {
259260 }
260261 }
261262
262- def decIdle = kp.kpMetrics.decIdle .whenA(isFromPool)
263+ def decIdle = kp.kpMetrics.idle.dec() .whenA(isFromPool)
263264
264265 def go (now : FiniteDuration , pc : PoolMap [A , (B , F [Unit ])]): (PoolMap [A , (B , F [Unit ])], F [Unit ]) =
265266 pc match {
@@ -271,12 +272,12 @@ object KeyPool {
271272 case None =>
272273 val cnt_ = idleCount + 1
273274 val m_ = PoolMap .open(cnt_, m + (k -> One ((r, destroy), now)))
274- (m_, kp.kpMetrics.incIdle )
275+ (m_, kp.kpMetrics.idle.inc() )
275276 case Some (l) =>
276277 val (l_, mx) = addToList(now, kp.kpMaxPerKey(k), (r, destroy), l)
277278 val cnt_ = idleCount + mx.fold(1 )(_ => 0 )
278279 val m_ = PoolMap .open(cnt_, m + (k -> l_))
279- (m_, mx.fold(kp.kpMetrics.incIdle )(_ => decIdle >> destroy))
280+ (m_, mx.fold(kp.kpMetrics.idle.inc() )(_ => decIdle >> destroy))
280281 }
281282 }
282283
@@ -302,13 +303,16 @@ object KeyPool {
302303 }
303304 }
304305
306+ def allocateNew : F [(B , F [Unit ])] =
307+ kp.kpMetrics.acquireDuration
308+ .recordDuration(TimeUnit .MILLISECONDS )
309+ .use(_ => kp.kpRes(k).allocated)
310+
305311 for {
306312 _ <- kp.kpMaxTotalSem.permit
307313 optR <- Resource .eval(kp.kpVar.modify(go))
308314 releasedState <- Resource .eval(Ref [F ].of[Reusable ](kp.kpDefaultReuseState))
309- resource <- Resource .make(
310- optR.fold(kp.kpMetrics.recordAcquireDuration(kp.kpRes(k)))(r => Applicative [F ].pure(r))
311- ) { resource =>
315+ resource <- Resource .make(optR.fold(allocateNew)(r => Applicative [F ].pure(r))) { resource =>
312316 for {
313317 reusable <- releasedState.get
314318 out <- reusable match {
@@ -317,9 +321,9 @@ object KeyPool {
317321 }
318322 } yield out
319323 }
320- _ <- Resource .eval(kp.kpMetrics.acquiredTotal.add( 1 ).whenA(optR.isEmpty))
321- _ <- Resource .make(kp.kpMetrics.incInUse) (_ => kp.kpMetrics.decInUse )
322- _ <- kp.kpMetrics.recordInUseDuration
324+ _ <- Resource .eval(kp.kpMetrics.acquiredTotal.inc( ).whenA(optR.isEmpty))
325+ _ <- Resource .make(kp.kpMetrics.inUse.inc()) (_ => kp.kpMetrics.inUse.dec() )
326+ _ <- kp.kpMetrics.inUseDuration.recordDuration( TimeUnit . MILLISECONDS )
323327 } yield new Managed (resource._1, optR.isDefined, releasedState)
324328 }
325329
0 commit comments