55 lines
1.4 KiB
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)
|
|
}
|
|
}
|