object Meter {
def metered[Alg[_[_]]: Instrument: FunctorK, F[_]: Bracket[*[_], Throwable]: Timer](
instance: Alg[F]
)(mr: MeterRegistry[F])(meteredMethods: String*): Alg[F] =
instance.instrument.mapK {
λ[Instrumentation[F, *] ~> F] {
fa =>
if (meteredMethods.contains(fa.methodName))
requestTimer(mr)(fa.algebraName)(fa.methodName).record(fa.value)
else
fa.value
}
}
def meteredAllMethods[Alg[_[_]]: Instrument: FunctorK, F[_]: Bracket[*[_], Throwable]: Timer](
instance: Alg[F]
)(mr: MeterRegistry[F]): Alg[F] =
instance.instrument.mapK {
λ[Instrumentation[F, *] ~> F] {
fa =>
requestTimer(mr)(fa.algebraName)(fa.methodName).record(fa.value)
}
}
}