From 4045ba1274fe6ba51ab071de6e2a5e1b31cef668 Mon Sep 17 00:00:00 2001 From: Ivan Topolnak Date: Wed, 2 Oct 2013 19:01:00 -0300 Subject: Switched to DynamicVariables, solve context passing issue produced by runnable batching --- .../ActorRefTellInstrumentation.scala | 16 +++------- .../instrumentation/RunnableInstrumentation.scala | 37 ++++------------------ .../SprayServerInstrumentation.scala | 32 ++----------------- 3 files changed, 14 insertions(+), 71 deletions(-) (limited to 'kamon-core/src/main/scala/kamon/instrumentation') 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 -- cgit v1.2.3