diff options
author | Diego <diegolparra@gmail.com> | 2014-06-28 11:37:00 -0300 |
---|---|---|
committer | Diego <diegolparra@gmail.com> | 2014-06-28 11:37:00 -0300 |
commit | 0279260cde60505f311aeed08b4706a4dc6fded0 (patch) | |
tree | cd494275cd47bb1ae49c229e4aa7a66eb4ea4927 /kamon-examples/kamon-play-example/app | |
parent | 4d5803e579e223c4f4f5cb37ab79ca069a007949 (diff) | |
download | Kamon-0279260cde60505f311aeed08b4706a4dc6fded0.tar.gz Kamon-0279260cde60505f311aeed08b4706a4dc6fded0.tar.bz2 Kamon-0279260cde60505f311aeed08b4706a4dc6fded0.zip |
+ kamon-examples: updated play example to the latest version
Diffstat (limited to 'kamon-examples/kamon-play-example/app')
3 files changed, 94 insertions, 0 deletions
diff --git a/kamon-examples/kamon-play-example/app/Global.scala b/kamon-examples/kamon-play-example/app/Global.scala new file mode 100644 index 00000000..b7907560 --- /dev/null +++ b/kamon-examples/kamon-play-example/app/Global.scala @@ -0,0 +1,9 @@ +import filters.TraceLocalFilter +import play.api.mvc.WithFilters + +object Global extends WithFilters(TraceLocalFilter){ + +} + + + diff --git a/kamon-examples/kamon-play-example/app/controllers/KamonPlayExample.scala b/kamon-examples/kamon-play-example/app/controllers/KamonPlayExample.scala new file mode 100644 index 00000000..e5fd78b0 --- /dev/null +++ b/kamon-examples/kamon-play-example/app/controllers/KamonPlayExample.scala @@ -0,0 +1,49 @@ +/* =================================================== + * Copyright © 2013-2014 the kamon project <http://kamon.io/> + * + * 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 controllers + +import play.api.Logger +import play.api.libs.concurrent.Execution.Implicits.defaultContext +import play.api.mvc.{Action, Controller} + +import scala.concurrent._ + +/* + +curl -i -H 'X-Trace-Token:kamon-test' -H 'MyTraceLocalStorageKey:extra-header' -X GET "http://localhost:9000/helloKamon" + +we should get: + +HTTP/1.1 200 OK +Content-Type: text/plain; charset=utf-8 +MyTraceLocalStorageKey: extra-header -> Extra Information +X-Trace-Token: kamon-test -> default Trace-Token +Content-Length: 18 + +Say hello to Kamon + + */ +object KamonPlayExample extends Controller { + + val logger = Logger(this.getClass) + + def sayHelloKamon() = Action.async { + Future { + logger.info("Say hello to Kamon") + Ok("Say hello to Kamon") + } + } +} diff --git a/kamon-examples/kamon-play-example/app/filters/TraceLocalFilter.scala b/kamon-examples/kamon-play-example/app/filters/TraceLocalFilter.scala new file mode 100644 index 00000000..c9600fad --- /dev/null +++ b/kamon-examples/kamon-play-example/app/filters/TraceLocalFilter.scala @@ -0,0 +1,36 @@ +package filters + +import kamon.trace.{TraceRecorder, TraceLocal} +import play.api.Logger +import play.api.mvc.{Result, RequestHeader, Filter} +import play.api.libs.concurrent.Execution.Implicits.defaultContext +import scala.concurrent.Future + +object TraceLocalKey extends TraceLocal.TraceLocalKey { + type ValueType = String +} + +/* + By default Kamon spreads the trace-token-header-name but sometimes is necessary pass through the application requests with some infomation like + extra headers, with kamon it's possible using TraceLocalStorage, in Play applications we can do an Action Filter or using Action Composition, + in this example we are using a simple filter where given a Header store the value and then put the value in the result headers.. + + More detailed used of TraceLocalStorage: https://github.com/kamon-io/Kamon/blob/b17539d231da923ea854c01d2c69eb02ef1e85b1/kamon-core/src/test/scala/kamon/trace/TraceLocalSpec.scala + */ +object TraceLocalFilter extends Filter { + val logger = Logger(this.getClass) + val TraceLocalStorageKey = "MyTraceLocalStorageKey" + + 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 { + val traceTokenValue = TraceLocal.retrieve(TraceLocalKey).getOrElse("unknown") + logger.info(s"traceTokenValue: $traceTokenValue") + result ⇒ result.withHeaders((TraceLocalStorageKey -> traceTokenValue)) + } + } + } +} |