aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego <diegolparra@gmail.com>2015-06-11 08:42:58 -0300
committerDiego <diegolparra@gmail.com>2015-08-09 21:03:23 -0300
commit018e30868ccbbdcaa9ecae2840143218444eddc3 (patch)
tree4bc4d2457e073769a7bd1ad562b61fe0f12e3f27
parentd4c063e790af5bc0a58dea7f04fd2df59b3414f1 (diff)
downloadKamon-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.scala54
-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.scala6
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: _*)