aboutsummaryrefslogtreecommitdiff
path: root/kamon-play
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2014-06-19 00:47:07 -0300
committerIvan Topolnjak <ivantopo@gmail.com>2014-06-19 00:47:07 -0300
commit1150d528eb5231993e542c086e2df90cf760d8a7 (patch)
treee1c86f9a115872073c46890b5ef32dbe1bd0bd3d /kamon-play
parent35b8a715d78ddd194d410ba0cc2119b5a1caa924 (diff)
parent4abab8df49d1bc5d9a051a8b54852e0712be7b74 (diff)
downloadKamon-1150d528eb5231993e542c086e2df90cf760d8a7.tar.gz
Kamon-1150d528eb5231993e542c086e2df90cf760d8a7.tar.bz2
Kamon-1150d528eb5231993e542c086e2df90cf760d8a7.zip
Merge branch 'master' into release-0.2
Conflicts: kamon-play/src/test/scala/kamon/play/WSInstrumentationSpec.scala kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala project/Dependencies.scala project/Projects.scala version.sbt
Diffstat (limited to 'kamon-play')
-rw-r--r--kamon-play/src/main/resources/reference.conf2
-rw-r--r--kamon-play/src/main/scala/kamon/play/Play.scala1
-rw-r--r--kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala90
-rw-r--r--kamon-play/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala3
4 files changed, 42 insertions, 54 deletions
diff --git a/kamon-play/src/main/resources/reference.conf b/kamon-play/src/main/resources/reference.conf
index 34e0f793..47a31ef4 100644
--- a/kamon-play/src/main/resources/reference.conf
+++ b/kamon-play/src/main/resources/reference.conf
@@ -6,5 +6,7 @@ kamon {
play {
include-trace-token-header = true
trace-token-header-name = "X-Trace-Token"
+
+ dispatcher = ${kamon.default-dispatcher}
}
} \ No newline at end of file
diff --git a/kamon-play/src/main/scala/kamon/play/Play.scala b/kamon-play/src/main/scala/kamon/play/Play.scala
index d52de450..ca9c10e5 100644
--- a/kamon-play/src/main/scala/kamon/play/Play.scala
+++ b/kamon-play/src/main/scala/kamon/play/Play.scala
@@ -29,6 +29,7 @@ class PlayExtension(private val system: ExtendedActorSystem) extends Kamon.Exten
private val config = system.settings.config.getConfig("kamon.play")
+ val defaultDispatcher = system.dispatchers.lookup(config.getString("dispatcher"))
val includeTraceToken: Boolean = config.getBoolean("include-trace-token-header")
val traceTokenHeaderName: String = config.getString("trace-token-header-name")
}
diff --git a/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala b/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala
index e671d097..00170b1b 100644
--- a/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala
+++ b/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala
@@ -16,43 +16,62 @@
package kamon.play.instrumentation
-import scala.concurrent.ExecutionContext.Implicits.global
-import kamon.trace.{ TraceRecorder, TraceContextAware }
import kamon.Kamon
import kamon.play.Play
-import play.libs.Akka
-import play.api.mvc._
-import akka.actor.ActorSystem
+import kamon.trace.{ TraceContextAware, TraceRecorder }
import org.aspectj.lang.ProceedingJoinPoint
import org.aspectj.lang.annotation._
-import scala.Some
+import play.api.mvc._
+import play.libs.Akka
@Aspect
class RequestInstrumentation {
- @DeclareMixin("play.api.mvc.RequestHeader$$anon$4")
+ @DeclareMixin("play.api.mvc.RequestHeader+")
def mixinContextAwareNewRequest: TraceContextAware = TraceContextAware.default
- @Pointcut("execution(* play.api.GlobalSettings+.onStart(*)) && args(application)")
- def onStart(application: play.api.Application): Unit = {}
-
- @After("onStart(application)")
+ @After("execution(* play.api.GlobalSettings+.onStart(*)) && args(application)")
def afterApplicationStart(application: play.api.Application): Unit = {
Kamon(Play)(Akka.system())
}
- @Pointcut("execution(* play.api.GlobalSettings+.doFilter(*)) && args(next)")
- def doFilter(next: EssentialAction): Unit = {}
+ @Before("execution(* play.api.GlobalSettings+.onRouteRequest(..)) && args(requestHeader)")
+ def onRouteRequest(requestHeader: RequestHeader): Unit = {
+ val system = Akka.system()
+ val playExtension = Kamon(Play)(system)
+ val defaultTraceName: String = s"${requestHeader.method}: ${requestHeader.uri}"
- @Around("doFilter(next)")
- def afterDoFilter(pjp: ProceedingJoinPoint, next: EssentialAction): Any = {
- Filters(pjp.proceed(Array(next)).asInstanceOf[EssentialAction], kamonRequestFilter)
+ val token = if (playExtension.includeTraceToken) {
+ requestHeader.headers.toSimpleMap.find(_._1 == playExtension.traceTokenHeaderName).map(_._2)
+ } else None
+
+ TraceRecorder.start(defaultTraceName, token)(system)
}
- @Pointcut("execution(* play.api.GlobalSettings+.onError(..)) && args(request, ex)")
- def onError(request: TraceContextAware, ex: Throwable): Unit = {}
+ @Around("execution(* play.api.GlobalSettings+.doFilter(*)) && args(next)")
+ def afterDoFilter(pjp: ProceedingJoinPoint, next: EssentialAction): Any = {
+ val essentialAction = (requestHeader: RequestHeader) ⇒ {
+
+ val incomingContext = TraceRecorder.currentContext
+ val executor = Kamon(Play)(Akka.system()).defaultDispatcher
+
+ next(requestHeader).map {
+ result ⇒
+ TraceRecorder.finish()
+ incomingContext match {
+ case None ⇒ result
+ case Some(traceContext) ⇒
+ val playExtension = Kamon(Play)(traceContext.system)
+ if (playExtension.includeTraceToken) {
+ result.withHeaders(playExtension.traceTokenHeaderName -> traceContext.token)
+ } else result
+ }
+ }(executor)
+ }
+ pjp.proceed(Array(EssentialAction(essentialAction)))
+ }
- @Around("onError(request, ex)")
+ @Around("execution(* play.api.GlobalSettings+.onError(..)) && args(request, ex)")
def aroundOnError(pjp: ProceedingJoinPoint, request: TraceContextAware, ex: Throwable): Any = request.traceContext match {
case None ⇒ pjp.proceed()
case Some(ctx) ⇒ {
@@ -61,37 +80,4 @@ class RequestInstrumentation {
pjp.proceed()
}
}
-
- private[this] val kamonRequestFilter = Filter { (nextFilter, requestHeader) ⇒
- processRequest(requestHeader)
-
- val incomingContext = TraceRecorder.currentContext
-
- nextFilter(requestHeader).map { result ⇒
-
- TraceRecorder.finish()
-
- val simpleResult = incomingContext match {
- case None ⇒ result
- case Some(traceContext) ⇒
- val playExtension = Kamon(Play)(traceContext.system)
- if (playExtension.includeTraceToken) {
- result.withHeaders(playExtension.traceTokenHeaderName -> traceContext.token)
- } else result
- }
- simpleResult
- }
- }
-
- private[this] def processRequest(requestHeader: RequestHeader): Unit = {
- val system: ActorSystem = Akka.system()
- val playExtension = Kamon(Play)(system)
- val defaultTraceName: String = s"${requestHeader.method}: ${requestHeader.uri}"
-
- val token = if (playExtension.includeTraceToken) {
- requestHeader.headers.toSimpleMap.find(_._1 == playExtension.traceTokenHeaderName).map(_._2)
- } else None
-
- TraceRecorder.start(defaultTraceName, token)(system)
- }
}
diff --git a/kamon-play/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala b/kamon-play/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala
index fce5ca13..f9e01471 100644
--- a/kamon-play/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala
+++ b/kamon-play/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala
@@ -55,8 +55,7 @@ object WSInstrumentation {
def basicRequestAttributes(request: WSRequest): Map[String, String] = {
Map[String, String](
"host" -> request.header("host").getOrElse("Unknown"),
- "path" -> request.method,
- "method" -> request.method)
+ "path" -> request.method)
}
}