aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2013-05-24 02:23:36 -0300
committerIvan Topolnjak <ivantopo@gmail.com>2013-05-24 02:23:36 -0300
commit4dab50d280053b410dbb421c7f8a0182c8b27b78 (patch)
treeaec3452ae77a093f18fc3072de801a314e64908f /src
parent32746f4fca3ebf2edf4a15ada327ae2733676f0b (diff)
parentde7cbe9f32ba75b6c51a78fbb59b9de94a2a9244 (diff)
downloadKamon-4dab50d280053b410dbb421c7f8a0182c8b27b78.tar.gz
Kamon-4dab50d280053b410dbb421c7f8a0182c8b27b78.tar.bz2
Kamon-4dab50d280053b410dbb421c7f8a0182c8b27b78.zip
Merge branch 'master' of github.com:dpsoft/Kamon
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/kamon/instrumentation/PromiseInstrumentation.scala28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/main/scala/kamon/instrumentation/PromiseInstrumentation.scala b/src/main/scala/kamon/instrumentation/PromiseInstrumentation.scala
index b87abe44..f1aec404 100644
--- a/src/main/scala/kamon/instrumentation/PromiseInstrumentation.scala
+++ b/src/main/scala/kamon/instrumentation/PromiseInstrumentation.scala
@@ -1,10 +1,11 @@
package kamon.instrumentation
-import org.aspectj.lang.annotation.{Around, Before, Pointcut, Aspect}
+import org.aspectj.lang.annotation._
import kamon.TraceContext
import scala.util.Try
import scala.concurrent.ExecutionContext
import org.aspectj.lang.ProceedingJoinPoint
+import scala.Some
@Aspect("perthis(promiseCreation())")
class PromiseInstrumentation {
@@ -42,4 +43,29 @@ class PromiseInstrumentation {
proceed(getArgs.updated(0, wrappedFunction))
}
+
+ @Pointcut("execution(* scala.concurrent.impl.Future$.apply(..)) && args(body, executor)")
+ def registeringApplyOnFuture(body: () => Any, executor: ExecutionContext) = {}
+
+ @Around("registeringApplyOnFuture(body, executor)")
+ def aroundApplyOnFuture(pjp:ProceedingJoinPoint, body: () => Any, executor: ExecutionContext) = {
+ import pjp._
+
+ val wrappedBody = wrapFutureBody(traceContext)(body)
+ proceed(getArgs.updated(0, wrappedBody))
+ }
+
+ def wrapFutureBody[A](ctx:Option[TraceContext])(block: => A) : A = {
+ ctx match {
+ case Some(ctx) => {
+ println("Wrapping body")
+ TraceContext.set(ctx)
+ val result = block
+ TraceContext.clear
+ result
+ }
+ case None => block
+ }
+ }
+
}