Last active
August 29, 2015 14:21
-
-
Save dpsoft/636a11201fefbcf79593 to your computer and use it in GitHub Desktop.
TraceLocal
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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