diff options
author | Diego <diegolparra@gmail.com> | 2014-06-16 15:52:14 -0300 |
---|---|---|
committer | Diego <diegolparra@gmail.com> | 2014-06-16 15:52:14 -0300 |
commit | 4abab8df49d1bc5d9a051a8b54852e0712be7b74 (patch) | |
tree | 3e8be92dd0b458c388cfae54da1f6318a9d68f0e /kamon-play/src/test/scala/kamon/play | |
parent | e3d16846beb4ce0a629a79430d8742f369a73a32 (diff) | |
download | Kamon-4abab8df49d1bc5d9a051a8b54852e0712be7b74.tar.gz Kamon-4abab8df49d1bc5d9a051a8b54852e0712be7b74.tar.bz2 Kamon-4abab8df49d1bc5d9a051a8b54852e0712be7b74.zip |
+ play: refactor in RequestInstrumentation in order to propagate the TraceContext through the filters and all actions in the incoming request
Diffstat (limited to 'kamon-play/src/test/scala/kamon/play')
-rw-r--r-- | kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala | 54 |
1 files changed, 44 insertions, 10 deletions
diff --git a/kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala b/kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala index 8cf2d8e1..710c6ed5 100644 --- a/kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala +++ b/kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala @@ -16,15 +16,16 @@ package kamon.play -import play.api.test._ -import play.api.test.Helpers._ +import kamon.play.action.TraceName +import kamon.trace.{ TraceLocal, TraceRecorder } import org.scalatestplus.play._ -import play.api.mvc.{ Results, Action } +import play.api.libs.concurrent.Execution.Implicits.defaultContext import play.api.mvc.Results.Ok -import scala.Some +import play.api.mvc._ +import play.api.test.Helpers._ +import play.api.test._ + import scala.concurrent.Future -import kamon.play.action.TraceName -import kamon.trace.TraceRecorder class RequestInstrumentationSpec extends PlaySpec with OneServerPerSuite { @@ -32,7 +33,8 @@ class RequestInstrumentationSpec extends PlaySpec with OneServerPerSuite { val executor = scala.concurrent.ExecutionContext.Implicits.global - implicit override lazy val app = FakeApplication(withRoutes = { + implicit override lazy val app = FakeApplication(withGlobal = Some(MockGlobalTest), withRoutes = { + case ("GET", "/async") ⇒ Action.async { Future { @@ -59,16 +61,23 @@ class RequestInstrumentationSpec extends PlaySpec with OneServerPerSuite { }(executor) } } + case ("GET", "/retrieve") ⇒ + Action { + Ok("retrieve from TraceLocal") + } }) private val traceTokenValue = "kamon-trace-token-test" private val traceTokenHeaderName = "X-Trace-Token" private val expectedToken = Some(traceTokenValue) private val traceTokenHeader = traceTokenHeaderName -> traceTokenValue + private val traceLocalStorageValue = "localStorageValue" + private val traceLocalStorageKey = "localStorageKey" + private val traceLocalStorageHeader = traceLocalStorageKey -> traceLocalStorageValue "the Request instrumentation" should { "respond to the Async Action with X-Trace-Token" in { - val Some(result) = route(FakeRequest(GET, "/async").withHeaders(traceTokenHeader)) + val Some(result) = route(FakeRequest(GET, "/async").withHeaders(traceTokenHeader, traceLocalStorageHeader)) header(traceTokenHeaderName, result) must be(expectedToken) } @@ -90,9 +99,34 @@ class RequestInstrumentationSpec extends PlaySpec with OneServerPerSuite { "respond to the Async Action with X-Trace-Token and the renamed trace" in { val Some(result) = route(FakeRequest(GET, "/async-renamed").withHeaders(traceTokenHeader)) - Thread.sleep(3000) + Thread.sleep(500) // wait to complete the future TraceRecorder.currentContext.map(_.name) must be(Some("renamed-trace")) header(traceTokenHeaderName, result) must be(expectedToken) } + + "propagate the TraceContext and LocalStorage through of filters in the current request" in { + val Some(result) = route(FakeRequest(GET, "/retrieve").withHeaders(traceTokenHeader, traceLocalStorageHeader)) + TraceLocal.retrieve(TraceLocalKey).get must be(traceLocalStorageValue) + } } -}
\ No newline at end of file + + object MockGlobalTest extends WithFilters(TraceLocalFilter) + + object TraceLocalKey extends TraceLocal.TraceLocalKey { + type ValueType = String + } + + object TraceLocalFilter extends Filter { + override def apply(next: (RequestHeader) ⇒ Future[Result])(header: RequestHeader): Future[Result] = { + TraceRecorder.withTraceContext(TraceRecorder.currentContext) { + + TraceLocal.store(TraceLocalKey)(header.headers.get(traceLocalStorageKey).getOrElse("unknown")) + + next(header).map { + result ⇒ result.withHeaders((traceLocalStorageKey -> TraceLocal.retrieve(TraceLocalKey).get)) + } + } + } + } +} + |