aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main
diff options
context:
space:
mode:
authorIvan Topolnak <ivantopo@gmail.com>2013-10-02 19:01:00 -0300
committerIvan Topolnak <ivantopo@gmail.com>2013-10-02 19:01:00 -0300
commit0b62687fd294de343ae90824f4d570e4273586c1 (patch)
tree6b68e1bd5357ba0a0effe27cc800b50194bcfdc5 /kamon-core/src/main
parentdf99b59fd05c5f5e6a4b48bb5e3485449a6d6eda (diff)
downloadKamon-0b62687fd294de343ae90824f4d570e4273586c1.tar.gz
Kamon-0b62687fd294de343ae90824f4d570e4273586c1.tar.bz2
Kamon-0b62687fd294de343ae90824f4d570e4273586c1.zip
Switched to DynamicVariables, solve context passing issue produced by runnable batching
Diffstat (limited to 'kamon-core/src/main')
-rw-r--r--kamon-core/src/main/scala/kamon/Kamon.scala16
-rw-r--r--kamon-core/src/main/scala/kamon/TraceContextSwap.scala34
-rw-r--r--kamon-core/src/main/scala/kamon/executor/eventbus.scala2
-rw-r--r--kamon-core/src/main/scala/kamon/instrumentation/ActorRefTellInstrumentation.scala16
-rw-r--r--kamon-core/src/main/scala/kamon/instrumentation/RunnableInstrumentation.scala37
-rw-r--r--kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala32
-rw-r--r--kamon-core/src/main/scala/kamon/metric/MetricFilter.scala6
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
-}