the-algorithm/tweetypie/common/src/scala/com/twitter/tweetypie/util/StitchUtils.scala

55 lines
1.4 KiB
Scala

package com.twitter.tweetypie.util
import com.twitter.finagle.stats.Stat
import com.twitter.finagle.stats.StatsReceiver
import com.twitter.servo
import com.twitter.util.Return
import com.twitter.util.Throw
import com.twitter.stitch.Stitch
object StitchUtils {
def trackLatency[T](latencyStat: Stat, s: => Stitch[T]): Stitch[T] = {
Stitch
.time(s)
.map {
case (res, duration) =>
latencyStat.add(duration.inMillis)
res
}
.lowerFromTry
}
def observe[T](statsReceiver: StatsReceiver, apiName: String): Stitch[T] => Stitch[T] = {
val stats = statsReceiver.scope(apiName)
val requests = stats.counter("requests")
val success = stats.counter("success")
val latencyStat = stats.stat("latency_ms")
val exceptionCounter =
new servo.util.ExceptionCounter(stats, "failures")
stitch =>
trackLatency(latencyStat, stitch)
.respond {
case Return(_) =>
requests.incr()
success.incr()
case Throw(e) =>
exceptionCounter(e)
requests.incr()
}
}
def translateExceptions[T](
stitch: Stitch[T],
translateException: PartialFunction[Throwable, Throwable]
): Stitch[T] =
stitch.rescue {
case t if translateException.isDefinedAt(t) =>
Stitch.exception(translateException(t))
case t => Stitch.exception(t)
}
}