diff options
author | Diego <diegolparra@gmail.com> | 2015-06-11 08:42:58 -0300 |
---|---|---|
committer | Diego <diegolparra@gmail.com> | 2015-08-09 21:03:23 -0300 |
commit | 018e30868ccbbdcaa9ecae2840143218444eddc3 (patch) | |
tree | 4bc4d2457e073769a7bd1ad562b61fe0f12e3f27 | |
parent | d4c063e790af5bc0a58dea7f04fd2df59b3414f1 (diff) | |
download | Kamon-018e30868ccbbdcaa9ecae2840143218444eddc3.tar.gz Kamon-018e30868ccbbdcaa9ecae2840143218444eddc3.tar.bz2 Kamon-018e30868ccbbdcaa9ecae2840143218444eddc3.zip |
! play: starting play 2.4.x integration
-rw-r--r-- | kamon-play24/src/main/resources/META-INF/aop.xml (renamed from kamon-play-2.4.x/src/main/resources/META-INF/aop.xml) | 0 | ||||
-rw-r--r-- | kamon-play24/src/main/resources/reference.conf (renamed from kamon-play-2.4.x/src/main/resources/reference.conf) | 5 | ||||
-rw-r--r-- | kamon-play24/src/main/scala/kamon/play/Play.scala (renamed from kamon-play-2.4.x/src/main/scala/kamon/play/Play.scala) | 0 | ||||
-rw-r--r-- | kamon-play24/src/main/scala/kamon/play/action/KamonTraceActions.scala (renamed from kamon-play-2.4.x/src/main/scala/kamon/play/action/KamonTraceActions.scala) | 0 | ||||
-rw-r--r-- | kamon-play24/src/main/scala/kamon/play/di/KamonModule.scala | 54 | ||||
-rw-r--r-- | kamon-play24/src/main/scala/kamon/play/instrumentation/LoggerLikeInstrumentation.scala (renamed from kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/LoggerLikeInstrumentation.scala) | 0 | ||||
-rw-r--r-- | kamon-play24/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala (renamed from kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala) | 44 | ||||
-rw-r--r-- | kamon-play24/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala (renamed from kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala) | 1 | ||||
-rw-r--r-- | kamon-play24/src/test/resources/META-INF/aop.xml (renamed from kamon-play-2.4.x/src/test/resources/META-INF/aop.xml) | 0 | ||||
-rw-r--r-- | kamon-play24/src/test/resources/conf/application.conf (renamed from kamon-play-2.4.x/src/test/resources/conf/application.conf) | 0 | ||||
-rw-r--r-- | kamon-play24/src/test/resources/logback.xml (renamed from kamon-play-2.4.x/src/test/resources/logback.xml) | 0 | ||||
-rw-r--r-- | kamon-play24/src/test/scala/kamon/play/LoggerLikeInstrumentationSpec.scala (renamed from kamon-play-2.4.x/src/test/scala/kamon/play/LoggerLikeInstrumentationSpec.scala) | 2 | ||||
-rw-r--r-- | kamon-play24/src/test/scala/kamon/play/RequestInstrumentationSpec.scala (renamed from kamon-play-2.4.x/src/test/scala/kamon/play/RequestInstrumentationSpec.scala) | 16 | ||||
-rw-r--r-- | kamon-play24/src/test/scala/kamon/play/WSInstrumentationSpec.scala (renamed from kamon-play-2.4.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala) | 3 | ||||
-rw-r--r-- | kamon-play24/src/test/scala/kamon/play/instrumentation/FakeRequestIntrumentation.scala (renamed from kamon-play-2.4.x/src/test/scala/kamon/play/instrumentation/FakeRequestIntrumentation.scala) | 0 | ||||
-rw-r--r-- | project/Projects.scala | 6 |
16 files changed, 75 insertions, 56 deletions
diff --git a/kamon-play-2.4.x/src/main/resources/META-INF/aop.xml b/kamon-play24/src/main/resources/META-INF/aop.xml index e24d48d5..e24d48d5 100644 --- a/kamon-play-2.4.x/src/main/resources/META-INF/aop.xml +++ b/kamon-play24/src/main/resources/META-INF/aop.xml diff --git a/kamon-play-2.4.x/src/main/resources/reference.conf b/kamon-play24/src/main/resources/reference.conf index af43edec..db94b3f6 100644 --- a/kamon-play-2.4.x/src/main/resources/reference.conf +++ b/kamon-play24/src/main/resources/reference.conf @@ -30,4 +30,7 @@ kamon { extension-id = "kamon.play.Play" } } -}
\ No newline at end of file +} + +#register the module with Play +play.modules.enabled += "kamon.play.di.KamonModule"
\ No newline at end of file diff --git a/kamon-play-2.4.x/src/main/scala/kamon/play/Play.scala b/kamon-play24/src/main/scala/kamon/play/Play.scala index 4d72f16e..4d72f16e 100644 --- a/kamon-play-2.4.x/src/main/scala/kamon/play/Play.scala +++ b/kamon-play24/src/main/scala/kamon/play/Play.scala diff --git a/kamon-play-2.4.x/src/main/scala/kamon/play/action/KamonTraceActions.scala b/kamon-play24/src/main/scala/kamon/play/action/KamonTraceActions.scala index 854989a4..854989a4 100644 --- a/kamon-play-2.4.x/src/main/scala/kamon/play/action/KamonTraceActions.scala +++ b/kamon-play24/src/main/scala/kamon/play/action/KamonTraceActions.scala diff --git a/kamon-play24/src/main/scala/kamon/play/di/KamonModule.scala b/kamon-play24/src/main/scala/kamon/play/di/KamonModule.scala new file mode 100644 index 00000000..372e7300 --- /dev/null +++ b/kamon-play24/src/main/scala/kamon/play/di/KamonModule.scala @@ -0,0 +1,54 @@ +/* ========================================================================================= + * Copyright © 2013-2015 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 kamon.play.di + +import javax.inject._ +import kamon.metric.MetricsModule +import kamon.trace.TracerModule +import play.api.inject.{ ApplicationLifecycle, Module } +import play.api.{ Logger, Configuration, Environment } +import scala.concurrent.Future + +trait Kamon { + def start(): Unit + def shutdown(): Unit + def metrics(): MetricsModule + def tracer(): TracerModule +} + +class KamonModule extends Module { + def bindings(environment: Environment, configuration: Configuration) = { + Seq(bind[Kamon].to[KamonAPI].eagerly()) + } +} + +@Singleton +class KamonAPI @Inject() (lifecycle: ApplicationLifecycle, environment: Environment) extends Kamon { + private val log = Logger(classOf[KamonAPI]) + + log.info("Registering the Kamon Play Module.") + + start() //force to start kamon eagerly on application startup + + def start(): Unit = kamon.Kamon.start() + def shutdown(): Unit = kamon.Kamon.shutdown() + def metrics(): MetricsModule = kamon.Kamon.metrics + def tracer(): TracerModule = kamon.Kamon.tracer + + lifecycle.addStopHook { () ⇒ + Future.successful(shutdown()) + } +} diff --git a/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/LoggerLikeInstrumentation.scala b/kamon-play24/src/main/scala/kamon/play/instrumentation/LoggerLikeInstrumentation.scala index 3c79fae4..3c79fae4 100644 --- a/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/LoggerLikeInstrumentation.scala +++ b/kamon-play24/src/main/scala/kamon/play/instrumentation/LoggerLikeInstrumentation.scala diff --git a/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala b/kamon-play24/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala index 9b47d5bb..7bf6d0d0 100644 --- a/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala +++ b/kamon-play24/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala @@ -16,8 +16,8 @@ package kamon.play.instrumentation import kamon.Kamon +import kamon.Kamon.tracer import kamon.play.Play -import kamon.trace.TraceLocal.{ HttpContext, HttpContextKey } import kamon.trace._ import kamon.util.SameThreadExecutionContext import org.aspectj.lang.ProceedingJoinPoint @@ -28,15 +28,11 @@ import play.api.mvc._ @Aspect class RequestInstrumentation { - import RequestInstrumentation._ - @DeclareMixin("play.api.mvc.RequestHeader+") def mixinContextAwareNewRequest: TraceContextAware = TraceContextAware.default @Before("call(* play.api.http.DefaultHttpRequestHandler.routeRequest(..)) && args(requestHeader)") def beforeRouteRequest(requestHeader: RequestHeader): Unit = { - import Kamon.tracer - val playExtension = Kamon(Play) val token = if (playExtension.includeTraceToken) { @@ -47,64 +43,44 @@ class RequestInstrumentation { } @Around("call(* play.api.http.HttpFilters.filters(..))") - def aroundFilters(pjp: ProceedingJoinPoint): Any = { + def filters(pjp: ProceedingJoinPoint): Any = { val filter = new EssentialFilter { - override def apply(next: EssentialAction): EssentialAction = { - val essentialAction = (requestHeader: RequestHeader) ⇒ { - + def apply(next: EssentialAction): EssentialAction = { + val action = (requestHeader: RequestHeader) ⇒ { val playExtension = Kamon(Play) def onResult(result: Result): Result = { Tracer.currentContext.collect { ctx ⇒ ctx.finish() - - httpServerMetrics.recordResponse(ctx.name, result.header.status.toString) + playExtension.httpServerMetrics.recordResponse(ctx.name, result.header.status.toString) if (playExtension.includeTraceToken) result.withHeaders(playExtension.traceTokenHeaderName -> ctx.token) else result } getOrElse result } - //store in TraceLocal useful data to diagnose errors - storeDiagnosticData(requestHeader) - //override the current trace name Tracer.currentContext.rename(playExtension.generateTraceName(requestHeader)) - // Invoke the action next(requestHeader).map(onResult)(SameThreadExecutionContext) } - EssentialAction(essentialAction) + EssentialAction(action) } } pjp.proceed().asInstanceOf[Seq[EssentialFilter]] :+ filter } @Before("call(* play.api.http.HttpErrorHandler.onClientServerError(..)) && args(requestContextAware, statusCode, *)") - def beforeOnClientError(requestContextAware: TraceContextAware, statusCode: Int): Unit = { + def onClientError(requestContextAware: TraceContextAware, statusCode: Int): Unit = { requestContextAware.traceContext.collect { ctx ⇒ - httpServerMetrics.recordResponse(ctx.name, statusCode.toString) + Kamon(Play).httpServerMetrics.recordResponse(ctx.name, statusCode.toString) } } @Before("call(* play.api.http.HttpErrorHandler.onServerError(..)) && args(requestContextAware, ex)") - def beforeOnServerError(requestContextAware: TraceContextAware, ex: Throwable): Unit = { + def onServerError(requestContextAware: TraceContextAware, ex: Throwable): Unit = { requestContextAware.traceContext.collect { ctx ⇒ - httpServerMetrics.recordResponse(ctx.name, InternalServerError.header.status.toString) + Kamon(Play).httpServerMetrics.recordResponse(ctx.name, InternalServerError.header.status.toString) } } - - def storeDiagnosticData(request: RequestHeader): Unit = { - val agent = request.headers.get(UserAgent).getOrElse(Unknown) - val forwarded = request.headers.get(XForwardedFor).getOrElse(Unknown) - - TraceLocal.store(HttpContextKey)(HttpContext(agent, request.uri, forwarded)) - } -} - -object RequestInstrumentation { - val UserAgent = "User-Agent" - val XForwardedFor = "X-Forwarded-For" - val Unknown = "unknown" - val httpServerMetrics = Kamon(Play).httpServerMetrics } diff --git a/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala b/kamon-play24/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala index 66c933f6..93f6d95a 100644 --- a/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala +++ b/kamon-play24/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala @@ -24,6 +24,7 @@ import org.aspectj.lang.ProceedingJoinPoint import org.aspectj.lang.annotation.{ Around, Aspect, Pointcut } import play.api.libs.ws.{ WSRequest, WSResponse } import scala.concurrent.Future +import scala.util.Try @Aspect class WSInstrumentation { diff --git a/kamon-play-2.4.x/src/test/resources/META-INF/aop.xml b/kamon-play24/src/test/resources/META-INF/aop.xml index 2888a31a..2888a31a 100644 --- a/kamon-play-2.4.x/src/test/resources/META-INF/aop.xml +++ b/kamon-play24/src/test/resources/META-INF/aop.xml diff --git a/kamon-play-2.4.x/src/test/resources/conf/application.conf b/kamon-play24/src/test/resources/conf/application.conf index b927087c..b927087c 100644 --- a/kamon-play-2.4.x/src/test/resources/conf/application.conf +++ b/kamon-play24/src/test/resources/conf/application.conf diff --git a/kamon-play-2.4.x/src/test/resources/logback.xml b/kamon-play24/src/test/resources/logback.xml index c336bbfe..c336bbfe 100644 --- a/kamon-play-2.4.x/src/test/resources/logback.xml +++ b/kamon-play24/src/test/resources/logback.xml diff --git a/kamon-play-2.4.x/src/test/scala/kamon/play/LoggerLikeInstrumentationSpec.scala b/kamon-play24/src/test/scala/kamon/play/LoggerLikeInstrumentationSpec.scala index de85743c..408509c5 100644 --- a/kamon-play-2.4.x/src/test/scala/kamon/play/LoggerLikeInstrumentationSpec.scala +++ b/kamon-play24/src/test/scala/kamon/play/LoggerLikeInstrumentationSpec.scala @@ -19,7 +19,6 @@ import ch.qos.logback.classic.spi.ILoggingEvent import ch.qos.logback.classic.{ AsyncAppender, LoggerContext } import ch.qos.logback.core.read.ListAppender import ch.qos.logback.core.status.NopStatusListener -import kamon.Kamon import kamon.trace.TraceLocal import kamon.trace.TraceLocal.AvailableToMdc import org.scalatest.BeforeAndAfter @@ -35,7 +34,6 @@ import scala.concurrent.duration._ import scala.concurrent.{ Await, Future } class LoggerLikeInstrumentationSpec extends PlaySpec with OneServerPerSuite with BeforeAndAfter { - Kamon.start() System.setProperty("config.file", "./kamon-play/src/test/resources/conf/application.conf") val executor = scala.concurrent.ExecutionContext.Implicits.global diff --git a/kamon-play-2.4.x/src/test/scala/kamon/play/RequestInstrumentationSpec.scala b/kamon-play24/src/test/scala/kamon/play/RequestInstrumentationSpec.scala index 43db7a12..8a3fef7c 100644 --- a/kamon-play-2.4.x/src/test/scala/kamon/play/RequestInstrumentationSpec.scala +++ b/kamon-play24/src/test/scala/kamon/play/RequestInstrumentationSpec.scala @@ -39,7 +39,6 @@ import scala.concurrent.duration._ import scala.concurrent.{ Await, Future } class RequestInstrumentationSpec extends PlaySpec with OneServerPerSuite { - Kamon.start() System.setProperty("config.file", "./kamon-play/src/test/resources/conf/application.conf") override lazy val port: Port = 19002 @@ -146,16 +145,6 @@ class RequestInstrumentationSpec extends PlaySpec with OneServerPerSuite { Kamon.metrics.find("show.some.id.get", "trace") must not be empty } - "include HttpContext information for help to diagnose possible errors" in { - Await.result(WS.url(s"http://localhost:$port/getRouted").get(), 10 seconds) - route(FakeRequest(GET, "/default").withHeaders("User-Agent" -> "Fake-Agent")) - - val httpCtx = TraceLocal.retrieve(HttpContextKey).get - httpCtx.agent must be("Fake-Agent") - httpCtx.uri must be("/default") - httpCtx.xforwarded must be("unknown") - } - "record http server metrics for all processed requests" in { val collectionContext = CollectionContext(100) Kamon.metrics.find("play-server", "http-server").get.collect(collectionContext) @@ -196,6 +185,7 @@ object TraceLocalKey extends TraceLocal.TraceLocalKey { } class TraceLocalFilter extends Filter { + val traceLocalStorageValue = "localStorageValue" val traceLocalStorageKey = "localStorageKey" val traceLocalStorageHeader = traceLocalStorageKey -> traceLocalStorageValue @@ -253,8 +243,8 @@ class Routes @Inject() (application: controllers.Application) extends GeneratedR } override def errorHandler: HttpErrorHandler = new HttpErrorHandler() { - override def onClientError(request: RequestHeader, statusCode: Int, message: String): Future[Result] = ??? - override def onServerError(request: RequestHeader, exception: Throwable): Future[Result] = ??? + override def onClientError(request: RequestHeader, statusCode: Int, message: String): Future[Result] = Future.successful(Results.InternalServerError) + override def onServerError(request: RequestHeader, exception: Throwable): Future[Result] = Future.successful(Results.InternalServerError) } } diff --git a/kamon-play-2.4.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala b/kamon-play24/src/test/scala/kamon/play/WSInstrumentationSpec.scala index fe16ccbf..11d3133c 100644 --- a/kamon-play-2.4.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala +++ b/kamon-play24/src/test/scala/kamon/play/WSInstrumentationSpec.scala @@ -16,7 +16,6 @@ package kamon.play -import kamon.Kamon import kamon.metric.{ Entity, EntitySnapshot, TraceMetrics } import kamon.trace.{ Tracer, TraceContext, SegmentCategory } import org.scalatest.{ Matchers, WordSpecLike } @@ -31,8 +30,6 @@ import scala.concurrent.Await import scala.concurrent.duration._ class WSInstrumentationSpec extends WordSpecLike with Matchers with OneServerPerSuite { - Kamon.start() - System.setProperty("config.file", "./kamon-play/src/test/resources/conf/application.conf") override lazy val port: Port = 19003 diff --git a/kamon-play-2.4.x/src/test/scala/kamon/play/instrumentation/FakeRequestIntrumentation.scala b/kamon-play24/src/test/scala/kamon/play/instrumentation/FakeRequestIntrumentation.scala index 10e285db..10e285db 100644 --- a/kamon-play-2.4.x/src/test/scala/kamon/play/instrumentation/FakeRequestIntrumentation.scala +++ b/kamon-play24/src/test/scala/kamon/play/instrumentation/FakeRequestIntrumentation.scala diff --git a/project/Projects.scala b/project/Projects.scala index 6d863b97..7a87b077 100644 --- a/project/Projects.scala +++ b/project/Projects.scala @@ -125,7 +125,7 @@ object Projects extends Build { test(slf4Api, slf4nop)) // lazy val kamonPlay = Project("kamon-play", file("kamon-play")) -// .dependsOn(kamonCore % "compile->compile;test->test", kamonScala, kamonAkka) +// .dependsOn(kamonCore % "compile->compile;test->test", kamonScala) // .settings(basicSettings: _*) // .settings(formatSettings: _*) // .settings(aspectJSettings: _*) @@ -135,8 +135,8 @@ object Projects extends Build { // provided(aspectJ) ++ // test(playTest, akkaTestKit, slf4Api)) - lazy val kamonPlay24 = Project("kamon-play-24x", file("kamon-play-2.4.x")) - .dependsOn(kamonCore % "compile->compile;test->test", kamonScala, kamonAkka) + lazy val kamonPlay24 = Project("kamon-play24", file("kamon-play24")) + .dependsOn(kamonCore % "compile->compile;test->test", kamonScala) .settings(basicSettings: _*) .settings(formatSettings: _*) .settings(aspectJSettings: _*) |