diff options
author | Ivan Topolnak <ivantopo@gmail.com> | 2013-10-02 19:01:00 -0300 |
---|---|---|
committer | Ivan Topolnak <ivantopo@gmail.com> | 2013-10-02 19:01:00 -0300 |
commit | 4045ba1274fe6ba51ab071de6e2a5e1b31cef668 (patch) | |
tree | e5f1e7f2493b3c624aee824d70f14c383a1e2eac /kamon-core/src/main/scala/kamon | |
parent | e9a4828ae75b19d63090825fa556596e433d2383 (diff) | |
download | Kamon-4045ba1274fe6ba51ab071de6e2a5e1b31cef668.tar.gz Kamon-4045ba1274fe6ba51ab071de6e2a5e1b31cef668.tar.bz2 Kamon-4045ba1274fe6ba51ab071de6e2a5e1b31cef668.zip |
Switched to DynamicVariables, solve context passing issue produced by runnable batching
Diffstat (limited to 'kamon-core/src/main/scala/kamon')
7 files changed, 20 insertions, 123 deletions
diff --git a/kamon-core/src/main/scala/kamon/Kamon.scala b/kamon-core/src/main/scala/kamon/Kamon.scala index 118239f7..fb1b2393 100644 --- a/kamon-core/src/main/scala/kamon/Kamon.scala +++ b/kamon-core/src/main/scala/kamon/Kamon.scala @@ -6,6 +6,7 @@ import scala.concurrent.duration.FiniteDuration import com.newrelic.api.agent.NewRelic import scala.collection.concurrent.TrieMap import kamon.instrumentation.{SimpleContextPassingInstrumentation, ActorInstrumentationConfiguration} +import scala.util.DynamicVariable object Instrument { @@ -32,20 +33,13 @@ object Kamon { object Tracer { - val ctx = new ThreadLocal[Option[TraceContext]] { - override def initialValue() = None - } + val traceContext = new DynamicVariable[Option[TraceContext]](None) - def context() = ctx.get() - def clear = ctx.remove() - def set(traceContext: TraceContext) = ctx.set(Some(traceContext)) - def start = set(newTraceContext) - def stop = ctx.get match { - case Some(context) => context.close - case None => - } + def context() = traceContext.value + def set(ctx: TraceContext) = traceContext.value = Some(ctx) + def start = set(newTraceContext) def newTraceContext(): TraceContext = TraceContext()(Kamon.actorSystem) } diff --git a/kamon-core/src/main/scala/kamon/TraceContextSwap.scala b/kamon-core/src/main/scala/kamon/TraceContextSwap.scala deleted file mode 100644 index 470b2f34..00000000 --- a/kamon-core/src/main/scala/kamon/TraceContextSwap.scala +++ /dev/null @@ -1,34 +0,0 @@ -package kamon - -import org.slf4j.MDC - -/** - * Provides support for making a TraceContext available as ThreadLocal and cleanning up afterwards. - */ -trait TraceContextSwap { - - def withContext[A](ctx: Option[TraceContext], body: => A): A = withContext(ctx, body, body) - - def withContext[A](ctx: Option[TraceContext], primary: => A, fallback: => A): A = { - - val previous = Tracer.context() - val r = ctx match { - case Some(context) => { - //MDC.put("uow", context.userContext.get.asInstanceOf[String]) - Tracer.set(context) - val bodyResult = primary - //Tracer.clear - //MDC.remove("uow") - - bodyResult - } - case None => fallback - } - previous.map(ctx => Tracer.set(ctx)) - - r - } - -} - -object TraceContextSwap extends TraceContextSwap diff --git a/kamon-core/src/main/scala/kamon/executor/eventbus.scala b/kamon-core/src/main/scala/kamon/executor/eventbus.scala index a1c099d4..d51305a8 100644 --- a/kamon-core/src/main/scala/kamon/executor/eventbus.scala +++ b/kamon-core/src/main/scala/kamon/executor/eventbus.scala @@ -92,7 +92,7 @@ object TryAkka extends App{ threadPrintln("Before doing it") val f = Future { threadPrintln("This is happening inside the future body") } - Tracer.stop + //Thread.sleep(3000) diff --git a/kamon-core/src/main/scala/kamon/instrumentation/ActorRefTellInstrumentation.scala b/kamon-core/src/main/scala/kamon/instrumentation/ActorRefTellInstrumentation.scala index 6126d642..915f9635 100644 --- a/kamon-core/src/main/scala/kamon/instrumentation/ActorRefTellInstrumentation.scala +++ b/kamon-core/src/main/scala/kamon/instrumentation/ActorRefTellInstrumentation.scala @@ -10,7 +10,7 @@ import scala.Some import kamon.trace.context.TracingAwareContext case class TraceableMessage(traceContext: Option[TraceContext], message: Any, timer: Timer.Context) -case class DefaultTracingAwareEnvelopeContext(traceContext: Option[TraceContext] = Tracer.context(), timestamp: Long = System.nanoTime) extends TracingAwareContext +case class DefaultTracingAwareEnvelopeContext(traceContext: Option[TraceContext] = Tracer.traceContext.value, timestamp: Long = System.nanoTime) extends TracingAwareContext @Aspect("perthis(actorCellCreation(akka.actor.ActorSystem, akka.actor.ActorRef, akka.actor.Props, akka.dispatch.MessageDispatcher, akka.actor.ActorRef))") class ActorCellInvokeInstrumentation { @@ -24,17 +24,11 @@ class ActorCellInvokeInstrumentation { @Around("invokingActorBehaviourAtActorCell(envelope)") def around(pjp: ProceedingJoinPoint, envelope: Envelope): Unit = { //safe cast - envelope.asInstanceOf[TracingAwareContext].traceContext match { - case Some(c) => { - Tracer.set(c) - pjp.proceed() - Tracer.clear - } - case None => - //assert(Tracer.context() == None) - pjp.proceed() + val msgContext = envelope.asInstanceOf[TracingAwareContext].traceContext + + Tracer.traceContext.withValue(msgContext) { + pjp.proceed() } - Tracer.clear } } diff --git a/kamon-core/src/main/scala/kamon/instrumentation/RunnableInstrumentation.scala b/kamon-core/src/main/scala/kamon/instrumentation/RunnableInstrumentation.scala index 456917e0..02d74287 100644 --- a/kamon-core/src/main/scala/kamon/instrumentation/RunnableInstrumentation.scala +++ b/kamon-core/src/main/scala/kamon/instrumentation/RunnableInstrumentation.scala @@ -22,7 +22,7 @@ class RunnableInstrumentation { */ @DeclareMixin("scala.concurrent.impl.CallbackRunnable || scala.concurrent.impl.Future.PromiseCompletingRunnable") def onCompleteCallbacksRunnable: TraceContextAwareRunnable = new TraceContextAwareRunnable { - val traceContext: Option[TraceContext] = Tracer.context() + val traceContext: Option[TraceContext] = Tracer.traceContext.value } @@ -38,43 +38,20 @@ class RunnableInstrumentation { - import kamon.TraceContextSwap.withContext - @After("instrumentedRunnableCreation(runnable)") def beforeCreation(runnable: TraceContextAwareRunnable) = { - val x = runnable.traceContext - /*if(runnable.traceContext.isEmpty) - println("WTFWI from: " + (new Throwable).getStackTraceString) - else - println("NOWTF: " + (new Throwable).getStackTraceString)*/ - /* if(traceContext.isEmpty) - println("NO TRACE CONTEXT FOR RUNNABLE at: [[[%s]]]", (new Throwable).getStackTraceString)//println((new Throwable).getStackTraceString) - else - println("SUPER TRACE CONTEXT FOR RUNNABLE at: [[[%s]]]", (new Throwable).getStackTraceString)*/ + // Force traceContext initialization. + runnable.traceContext } @Around("runnableExecution(runnable)") - def around(pjp: ProceedingJoinPoint, runnable: TraceContextAwareRunnable) = { + def around(pjp: ProceedingJoinPoint, runnable: TraceContextAwareRunnable): Any = { import pjp._ - /*println("EXECUTING") - if(runnable.traceContext.isEmpty) - println("NOMONEY") - - runnable.traceContext match { - case Some(context) => { - //MDC.put("uow", context.userContext.get.asInstanceOf[String]) - Tracer.set(context) - val bodyResult = proceed() - Tracer.clear - //MDC.remove("uow") - - bodyResult - } - case None => proceed() - }*/ - withContext(runnable.traceContext, proceed()) + Tracer.traceContext.withValue(runnable.traceContext) { + proceed() + } } } diff --git a/kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala b/kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala index 06254739..32eabe71 100644 --- a/kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala +++ b/kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala @@ -17,7 +17,7 @@ trait ContextAware { class SprayOpenRequestContextTracing { @DeclareMixin("spray.can.server.OpenRequestComponent.DefaultOpenRequest") def mixinContextAwareToOpenRequest: ContextAware = new ContextAware { - val traceContext: Option[TraceContext] = Tracer.context() + val traceContext: Option[TraceContext] = Tracer.traceContext.value } } @@ -29,18 +29,9 @@ class SprayServerInstrumentation { @After("openRequestInit(openRequest, enclosing, request, closeAfterResponseCompletion, timestamp)") def afterInit(openRequest: OpenRequest, enclosing: OpenRequestComponent, request: HttpRequest, closeAfterResponseCompletion: Boolean, timestamp: Long): Unit = { - //@After("openRequestInit()") - //def afterInit(): Unit = { Tracer.start val discard = openRequest.asInstanceOf[ContextAware].traceContext - //println("Reply: %s - %s ", Tracer.context().get.id, request.uri.path.toString()) - -// if(discard.isEmpty || discard != Tracer.context()) { -// println("MEGA ERROR") -// } - //openRequest.traceContext - //println("Created the context: " + Tracer.context() + " for the transaction: " + request) Tracer.context().map(_.entries ! Rename(request.uri.path.toString())) } @@ -49,18 +40,13 @@ class SprayServerInstrumentation { @After("openRequestCreation(openRequest)") def afterFinishingRequest(openRequest: OpenRequest): Unit = { -// println("Finishing a request: " + Tracer.context()) val original = openRequest.asInstanceOf[ContextAware].traceContext - println("The original is: " + original + " - " + openRequest.request.uri.path) + Tracer.context().map(_.entries ! Finish()) if(Tracer.context() != original) { println(s"OMG DIFFERENT Original: [${original}] - Came in: [${Tracer.context}]") } - - if(Tracer.context().isEmpty) { - println("WOOOOOPAAAAAAAAA") - } } @Pointcut("execution(spray.can.client.HttpHostConnector.RequestContext.new(..)) && this(ctx)") @@ -71,20 +57,6 @@ class SprayServerInstrumentation { // Necessary to force the initialization of TracingAwareRequestContext at the moment of creation. ctx.traceContext } - - @Pointcut("execution(* spray.can.client.HttpHostConnectionSlot.dispatchToCommander(..)) && args(ctx, msg)") - def requestRecordInit2(ctx: TracingAwareContext, msg: Any): Unit = {} - - @After("requestRecordInit2(ctx, msg)") - def whenCreatedRequestRecord2(ctx: TracingAwareContext, msg: Any): Unit = { - //println("=======> Spent in WEB External: " + (System.nanoTime() - ctx.timestamp)) - - // TODO: REMOVE THIS: -// val request = (ctx.asInstanceOf[RequestContext]).request - -// ctx.context.map(_.entries ! WebExternal(ctx.timestamp, System.nanoTime(), request.header[Host].map(_.host).getOrElse("UNKNOWN"))) - - } } case class DefaultTracingAwareRequestContext(traceContext: Option[TraceContext] = Tracer.context(), timestamp: Long = System.nanoTime) extends TracingAwareContext diff --git a/kamon-core/src/main/scala/kamon/metric/MetricFilter.scala b/kamon-core/src/main/scala/kamon/metric/MetricFilter.scala deleted file mode 100644 index fb117968..00000000 --- a/kamon-core/src/main/scala/kamon/metric/MetricFilter.scala +++ /dev/null @@ -1,6 +0,0 @@ -package kamon.metric - -object MetricFilter { - def actorSystem(system: String): Boolean = !system.startsWith("kamon") - def actor(path: String, system: String): Boolean = true -} |