diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2013-11-23 21:57:27 -0300 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2013-11-23 21:57:27 -0300 |
commit | f9b596754feb657f1130eebd0cc4ac2a5e741518 (patch) | |
tree | b3dab1bd1591e2ab045eab28dc7db4db0b9f743d /kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorMessagePassingTracing.scala | |
parent | 6ba7487204e0339437c7279e6330fc03419a2c5c (diff) | |
download | Kamon-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.scala | 45 |
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 + } +} |