Skip to content

Instantly share code, notes, and snippets.

@dpsoft
Last active August 29, 2015 14:21
Show Gist options
  • Save dpsoft/636a11201fefbcf79593 to your computer and use it in GitHub Desktop.
Save dpsoft/636a11201fefbcf79593 to your computer and use it in GitHub Desktop.
TraceLocal
object TraceLocal {
trait TraceLocalKey[T]
trait AvailableToMdc extends TraceLocalKey[String] {
def mdcKey: String
}
object AvailableToMdc {
case class DefaultKeyAvailableToMdc(mdcKey: String) extends AvailableToMdc
def fromKey(mdcKey: String): AvailableToMdc = DefaultKeyAvailableToMdc(mdcKey)
def apply(mdcKey: String): AvailableToMdc = fromKey(mdcKey)
}
case class HttpContext(agent: String, uri: String, xforwarded: String)
object HttpContextKey extends TraceLocal.TraceLocalKey[HttpContext]
def store[T](key: TraceLocalKey[T])(value: Any): Unit = Tracer.currentContext match {
case ctx: MetricsOnlyContext ⇒ ctx.traceLocalStorage.store(key)(value)
case EmptyTraceContext ⇒ // Can't store in the empty context.
}
def retrieve[T](key: TraceLocalKey[T]): Option[T] = Tracer.currentContext match {
case ctx: MetricsOnlyContext ⇒ ctx.traceLocalStorage.retrieve(key)
case EmptyTraceContext ⇒ None // Can't retrieve anything from the empty context.
}
// Java variant
@throws(classOf[NoSuchElementException])
def get[T](key: TraceLocalKey[T]):T = retrieve(key).get
def getOrElse[T](key: TraceLocalKey[T], code:Supplier[T]):T= retrieve(key).getOrElse(code.get)
def storeForMdc(key: String, value: String): Unit = store(AvailableToMdc.fromKey(key))(value)
def newTraceLocalKey[T]:TraceLocalKey[T] = new TraceLocalKey[T] {}
}
class TraceLocalStorage {
val underlyingStorage = TrieMap[TraceLocalKey[_], Any]()
def store[T](key: TraceLocalKey[T])(value: Any): Unit = underlyingStorage.put(key, value)
def retrieve[T](key: TraceLocalKey[T]): Option[T] = underlyingStorage.get(key).map(_.asInstanceOf[T])
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment