diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2014-06-19 00:47:07 -0300 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2014-06-19 00:47:07 -0300 |
commit | 1150d528eb5231993e542c086e2df90cf760d8a7 (patch) | |
tree | e1c86f9a115872073c46890b5ef32dbe1bd0bd3d /kamon-play | |
parent | 35b8a715d78ddd194d410ba0cc2119b5a1caa924 (diff) | |
parent | 4abab8df49d1bc5d9a051a8b54852e0712be7b74 (diff) | |
download | Kamon-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')
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) } } |