aboutsummaryrefslogtreecommitdiff
path: root/kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorMessagePassingTracing.scala
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2013-11-23 21:57:27 -0300
committerIvan Topolnjak <ivantopo@gmail.com>2013-11-23 21:57:27 -0300
commitf9b596754feb657f1130eebd0cc4ac2a5e741518 (patch)
treeb3dab1bd1591e2ab045eab28dc7db4db0b9f743d /kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorMessagePassingTracing.scala
parent6ba7487204e0339437c7279e6330fc03419a2c5c (diff)
downloadKamon-f9b596754feb657f1130eebd0cc4ac2a5e741518.tar.gz
Kamon-f9b596754feb657f1130eebd0cc4ac2a5e741518.tar.bz2
Kamon-f9b596754feb657f1130eebd0cc4ac2a5e741518.zip
Little clean up to actor message passing tracing
Diffstat (limited to 'kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorMessagePassingTracing.scala')
-rw-r--r--kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorMessagePassingTracing.scala45
1 files changed, 45 insertions, 0 deletions
diff --git a/kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorMessagePassingTracing.scala b/kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorMessagePassingTracing.scala
new file mode 100644
index 00000000..9eb0a7f9
--- /dev/null
+++ b/kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorMessagePassingTracing.scala
@@ -0,0 +1,45 @@
+package kamon.trace.instrumentation
+
+import org.aspectj.lang.annotation._
+import org.aspectj.lang.ProceedingJoinPoint
+import akka.actor.{Props, ActorSystem, ActorRef}
+import akka.dispatch.{Envelope, MessageDispatcher}
+import com.codahale.metrics.Timer
+import kamon.trace.{ContextAware, TraceContext, Trace}
+
+
+@Aspect
+class BehaviourInvokeTracing {
+
+ @Pointcut("execution(akka.actor.ActorCell.new(..)) && args(system, ref, props, dispatcher, parent)")
+ def actorCellCreation(system: ActorSystem, ref: ActorRef, props: Props, dispatcher: MessageDispatcher, parent: ActorRef): Unit = {}
+
+ @Pointcut("(execution(* akka.actor.ActorCell.invoke(*)) || execution(* akka.routing.RoutedActorCell.sendMessage(*))) && args(envelope)")
+ def invokingActorBehaviourAtActorCell(envelope: Envelope) = {}
+
+ @Around("invokingActorBehaviourAtActorCell(envelope)")
+ def aroundBehaviourInvoke(pjp: ProceedingJoinPoint, envelope: Envelope): Unit = {
+ //safe cast
+ val ctxInMessage = envelope.asInstanceOf[ContextAware].traceContext
+
+ Trace.withValue(ctxInMessage) {
+ pjp.proceed()
+ }
+ }
+}
+
+@Aspect
+class EnvelopeTraceContextMixin {
+
+ @DeclareMixin("akka.dispatch.Envelope")
+ def mixin: ContextAware = ContextAware.default
+
+ @Pointcut("execution(akka.dispatch.Envelope.new(..)) && this(ctx)")
+ def envelopeCreation(ctx: ContextAware): Unit = {}
+
+ @After("envelopeCreation(ctx)")
+ def afterEnvelopeCreation(ctx: ContextAware): Unit = {
+ // Necessary to force the initialization of ContextAware at the moment of creation.
+ ctx.traceContext
+ }
+}