From b3f7694cb8f1af4ef6747acd17dd0d6981df2030 Mon Sep 17 00:00:00 2001 From: Diego Date: Fri, 28 Feb 2014 20:06:21 -0300 Subject: WIP:play support simple refactor --- .../instrumentation/RequestInstrumentation.scala | 50 ++++++------ .../kamon/play/RequestInstrumentationSpec.scala | 94 ++++++++++++++++++++++ .../play/filter/RequestInstrumentationSpec.scala | 94 ---------------------- 3 files changed, 117 insertions(+), 121 deletions(-) create mode 100644 kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala delete mode 100644 kamon-play/src/test/scala/kamon/play/filter/RequestInstrumentationSpec.scala (limited to 'kamon-play/src') 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 a983cc17..76edb90c 100644 --- a/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala +++ b/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala @@ -16,15 +16,16 @@ package kamon.play.instrumentation -import org.aspectj.lang.annotation._ -import play.api.mvc._ import kamon.trace.{ TraceRecorder, TraceContextAware } import kamon.Kamon import kamon.play.Play -import akka.actor.ActorSystem import play.libs.Akka -import scala.Some +import play.api.mvc._ +import akka.actor.ActorSystem import org.aspectj.lang.ProceedingJoinPoint +import org.aspectj.lang.annotation._ +import scala.Some +import scala.concurrent.ExecutionContext.Implicits.global @Aspect class RequestInstrumentation { @@ -40,26 +41,6 @@ class RequestInstrumentation { Kamon(Play)(Akka.system()) } - @Pointcut("execution(* play.api.GlobalSettings+.onRouteRequest(*)) && args(request)") - def onRouteRequest(request: TraceContextAware): Unit = {} - - @After("onRouteRequest(request)") - def afterRouteRequest(request: TraceContextAware): Unit = { - val system: ActorSystem = Akka.system() - val playExtension = Kamon(Play)(system) - - val requestHeader: RequestHeader = request.asInstanceOf[RequestHeader] - val defaultTraceName: String = 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) - - //Necessary to force initialization of traceContext when initiating the request. - request.traceContext - } - @Pointcut("execution(* play.api.GlobalSettings+.doFilter(*)) && args(next)") def doFilter(next: EssentialAction): Unit = {} @@ -69,23 +50,38 @@ class RequestInstrumentation { } private[this] val kamonRequestFilter = Filter { (nextFilter, requestHeader) ⇒ - import scala.concurrent.ExecutionContext.Implicits.global + processRequest(requestHeader) val incomingContext = TraceRecorder.currentContext nextFilter(requestHeader).map { result ⇒ + TraceRecorder.finish() val simpleResult = incomingContext match { case None ⇒ result - case Some(traceContext) ⇒ { + 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) + + //Necessary to force initialization of traceContext when initiating the request. + requestHeader.asInstanceOf[TraceContextAware].traceContext + } } diff --git a/kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala b/kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala new file mode 100644 index 00000000..92b819da --- /dev/null +++ b/kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala @@ -0,0 +1,94 @@ +/* =================================================== + * Copyright © 2013 2014 the kamon project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + +package kamon.play + +import play.api.test._ +import play.api.mvc.{ Results, Action } +import play.api.mvc.Results.Ok +import scala.Some +import scala.concurrent.ExecutionContext.Implicits.global +import scala.concurrent.Future +import org.junit.runner.RunWith +import org.specs2.runner.JUnitRunner +import play.api.mvc.AsyncResult +import play.api.test.FakeApplication + +@RunWith(classOf[JUnitRunner]) +class RequestInstrumentationSpec extends PlaySpecification { + + System.setProperty("config.file", "./kamon-play/src/test/resources/conf/application.conf") + + val appWithRoutes = FakeApplication(withRoutes = { + case ("GET", "/asyncResult") ⇒ + Action { + AsyncResult { + scala.concurrent.Future { + Ok("AsyncResult") + } + } + } + case ("GET", "/async") ⇒ + Action.async { + Future { + Ok("Async.async") + } + } + case ("GET", "/notFound") ⇒ + Action { + Results.NotFound + } + case ("GET", "/redirect") ⇒ + Action { + Results.Redirect("/redirected", MOVED_PERMANENTLY) + } + case ("GET", "/default") ⇒ + Action { + Ok("default") + } + }) + + private val traceTokenValue = "kamon-trace-token-test" + private val traceTokenHeaderName = "X-UOW" + private val expectedToken = Some(traceTokenValue) + private val traceTokenHeader = (traceTokenHeaderName -> traceTokenValue) + + "respond to the asyncResult action with X-Trace-Token" in new WithServer(appWithRoutes) { + val Some(result) = route(FakeRequest(GET, "/asyncResult").withHeaders(traceTokenHeader)) + header(traceTokenHeaderName, result) must equalTo(expectedToken) + } + + "respond to the async action with X-Trace-Token" in new WithServer(appWithRoutes) { + val Some(result) = route(FakeRequest(GET, "/async").withHeaders(traceTokenHeader)) + header(traceTokenHeaderName, result) must equalTo(expectedToken) + } + + "respond to the notFound action with X-Trace-Token" in new WithServer(appWithRoutes) { + val Some(result) = route(FakeRequest(GET, "/notFound").withHeaders(traceTokenHeader)) + header(traceTokenHeaderName, result) must equalTo(expectedToken) + } + + "respond to the default action with X-Trace-Token" in new WithServer(appWithRoutes) { + val Some(result) = route(FakeRequest(GET, "/default").withHeaders(traceTokenHeader)) + header(traceTokenHeaderName, result) must equalTo(expectedToken) + } + + "respond to the redirect action with X-Trace-Token" in new WithServer(appWithRoutes) { + val Some(result) = route(FakeRequest(GET, "/redirect").withHeaders(traceTokenHeader)) + header("Location", result) must equalTo(Some("/redirected")) + header(traceTokenHeaderName, result) must equalTo(expectedToken) + } +} \ No newline at end of file diff --git a/kamon-play/src/test/scala/kamon/play/filter/RequestInstrumentationSpec.scala b/kamon-play/src/test/scala/kamon/play/filter/RequestInstrumentationSpec.scala deleted file mode 100644 index 65f0219e..00000000 --- a/kamon-play/src/test/scala/kamon/play/filter/RequestInstrumentationSpec.scala +++ /dev/null @@ -1,94 +0,0 @@ -/* =================================================== - * Copyright © 2013 2014 the kamon project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - -package kamon.play.filter - -import play.api.test._ -import play.api.mvc.{ Results, Action } -import play.api.mvc.Results.Ok -import scala.Some -import scala.concurrent.ExecutionContext.Implicits.global -import scala.concurrent.Future -import org.junit.runner.RunWith -import org.specs2.runner.JUnitRunner -import play.api.mvc.AsyncResult -import play.api.test.FakeApplication - -@RunWith(classOf[JUnitRunner]) -class RequestInstrumentationSpec extends PlaySpecification { - - System.setProperty("config.file", "./kamon-play/src/test/resources/conf/application.conf") - - val appWithRoutes = FakeApplication(withRoutes = { - case ("GET", "/asyncResult") ⇒ - Action { - AsyncResult { - scala.concurrent.Future { - Ok("AsyncResult") - } - } - } - case ("GET", "/async") ⇒ - Action.async { - Future { - Ok("Async.async") - } - } - case ("GET", "/notFound") ⇒ - Action { - Results.NotFound - } - case ("GET", "/redirect") ⇒ - Action { - Results.Redirect("/redirected", MOVED_PERMANENTLY) - } - case ("GET", "/default") ⇒ - Action { - Ok("default") - } - }) - - private val traceTokenValue = "kamon-trace-token-test" - private val traceTokenHeaderName = "X-UOW" - private val expectedToken = Some(traceTokenValue) - private val traceTokenHeader = (traceTokenHeaderName -> traceTokenValue) - - "respond to the asyncResult action with X-Trace-Token" in new WithServer(appWithRoutes) { - val Some(result) = route(FakeRequest(GET, "/asyncResult").withHeaders(traceTokenHeader)) - header(traceTokenHeaderName, result) must equalTo(expectedToken) - } - - "respond to the async action with X-Trace-Token" in new WithServer(appWithRoutes) { - val Some(result) = route(FakeRequest(GET, "/async").withHeaders(traceTokenHeader)) - header(traceTokenHeaderName, result) must equalTo(expectedToken) - } - - "respond to the notFound action with X-Trace-Token" in new WithServer(appWithRoutes) { - val Some(result) = route(FakeRequest(GET, "/notFound").withHeaders(traceTokenHeader)) - header(traceTokenHeaderName, result) must equalTo(expectedToken) - } - - "respond to the default action with X-Trace-Token" in new WithServer(appWithRoutes) { - val Some(result) = route(FakeRequest(GET, "/default").withHeaders(traceTokenHeader)) - header(traceTokenHeaderName, result) must equalTo(expectedToken) - } - - "respond to the redirect action with X-Trace-Token" in new WithServer(appWithRoutes) { - val Some(result) = route(FakeRequest(GET, "/redirect").withHeaders(traceTokenHeader)) - header("Location", result) must equalTo(Some("/redirected")) - header(traceTokenHeaderName, result) must equalTo(expectedToken) - } -} \ No newline at end of file -- cgit v1.2.3