mirror of
https://github.com/twitter/the-algorithm.git
synced 2024-06-30 15:06:07 +02:00
44 lines
1.3 KiB
Scala
44 lines
1.3 KiB
Scala
![]() |
package com.twitter.home_mixer.util
|
||
|
|
||
|
import com.twitter.finagle.stats.StatsReceiver
|
||
|
import com.twitter.servo.keyvalue.KeyValueResult
|
||
|
import com.twitter.util.Return
|
||
|
import com.twitter.util.Throw
|
||
|
import com.twitter.util.Try
|
||
|
|
||
|
trait ObservedKeyValueResultHandler {
|
||
|
val statsReceiver: StatsReceiver
|
||
|
val statScope: String
|
||
|
|
||
|
private lazy val scopedStatsReceiver = statsReceiver.scope(statScope)
|
||
|
private lazy val keyTotalCounter = scopedStatsReceiver.counter("key/total")
|
||
|
private lazy val keyFoundCounter = scopedStatsReceiver.counter("key/found")
|
||
|
private lazy val keyLossCounter = scopedStatsReceiver.counter("key/loss")
|
||
|
private lazy val keyFailureCounter = scopedStatsReceiver.counter("key/failure")
|
||
|
|
||
|
def observedGet[K, V](
|
||
|
key: Option[K],
|
||
|
keyValueResult: KeyValueResult[K, V],
|
||
|
): Try[Option[V]] = {
|
||
|
if (key.nonEmpty) {
|
||
|
keyTotalCounter.incr()
|
||
|
keyValueResult(key.get) match {
|
||
|
case Return(Some(value)) =>
|
||
|
keyFoundCounter.incr()
|
||
|
Return(Some(value))
|
||
|
case Return(None) =>
|
||
|
keyLossCounter.incr()
|
||
|
Return(None)
|
||
|
case Throw(exception) =>
|
||
|
keyFailureCounter.incr()
|
||
|
Throw(exception)
|
||
|
case _ =>
|
||
|
// never reaches here
|
||
|
Return(None)
|
||
|
}
|
||
|
} else {
|
||
|
Throw(MissingKeyException)
|
||
|
}
|
||
|
}
|
||
|
}
|