aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2014-07-27 17:03:10 -0300
committerIvan Topolnjak <ivantopo@gmail.com>2014-07-27 17:03:10 -0300
commit023cc7a93e92524d1829256677cfbff1056fbe6f (patch)
tree246f185f10d2acc60b30d847dbb88ef5158c28f0
parentf366ce56f60e8df06f943fe48a861c7883bb606f (diff)
downloadKamon-023cc7a93e92524d1829256677cfbff1056fbe6f.tar.gz
Kamon-023cc7a93e92524d1829256677cfbff1056fbe6f.tar.bz2
Kamon-023cc7a93e92524d1829256677cfbff1056fbe6f.zip
+ play: record http server metrics, closes #56
-rw-r--r--kamon-play/src/main/resources/reference.conf4
-rw-r--r--kamon-play/src/main/scala/kamon/play/Play.scala3
-rw-r--r--kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala13
-rw-r--r--kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala26
4 files changed, 43 insertions, 3 deletions
diff --git a/kamon-play/src/main/resources/reference.conf b/kamon-play/src/main/resources/reference.conf
index 47a31ef4..72266a0c 100644
--- a/kamon-play/src/main/resources/reference.conf
+++ b/kamon-play/src/main/resources/reference.conf
@@ -3,6 +3,10 @@
# ================================== #
kamon {
+ metrics {
+ tick-interval = 1 hour
+ }
+
play {
include-trace-token-header = true
trace-token-header-name = "X-Trace-Token"
diff --git a/kamon-play/src/main/scala/kamon/play/Play.scala b/kamon-play/src/main/scala/kamon/play/Play.scala
index ca9c10e5..03436458 100644
--- a/kamon-play/src/main/scala/kamon/play/Play.scala
+++ b/kamon-play/src/main/scala/kamon/play/Play.scala
@@ -18,6 +18,8 @@ package kamon.play
import akka.actor.{ ExtendedActorSystem, Extension, ExtensionIdProvider, ExtensionId }
import kamon.Kamon
+import kamon.http.HttpServerMetrics
+import kamon.metric.Metrics
object Play extends ExtensionId[PlayExtension] with ExtensionIdProvider {
override def lookup(): ExtensionId[_ <: Extension] = Play
@@ -29,6 +31,7 @@ class PlayExtension(private val system: ExtendedActorSystem) extends Kamon.Exten
private val config = system.settings.config.getConfig("kamon.play")
+ val httpServerMetrics = Kamon(Metrics)(system).register(HttpServerMetrics, HttpServerMetrics.Factory).get
val defaultDispatcher = system.dispatchers.lookup(config.getString("dispatcher"))
val includeTraceToken: Boolean = config.getBoolean("include-trace-token-header")
val traceTokenHeaderName: String = config.getString("trace-token-header-name")
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 db864fb6..975510e9 100644
--- a/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala
+++ b/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala
@@ -16,7 +16,7 @@
package kamon.play.instrumentation
import kamon.Kamon
-import kamon.play.Play
+import kamon.play.{ PlayExtension, Play }
import kamon.trace.{ TraceContextAware, TraceRecorder }
import org.aspectj.lang.ProceedingJoinPoint
import org.aspectj.lang.annotation._
@@ -52,11 +52,17 @@ class RequestInstrumentation {
val essentialAction = (requestHeader: RequestHeader) ⇒ {
val incomingContext = TraceRecorder.currentContext
- val executor = Kamon(Play)(Akka.system()).defaultDispatcher
+ val playExtension = Kamon(Play)(Akka.system())
+ val executor = playExtension.defaultDispatcher
next(requestHeader).map {
result ⇒
+ TraceRecorder.currentContext.map { ctx ⇒
+ recordHttpServerMetrics(result, ctx.name, playExtension)
+ }
+
TraceRecorder.finish()
+
incomingContext match {
case None ⇒ result
case Some(traceContext) ⇒
@@ -70,6 +76,9 @@ class RequestInstrumentation {
pjp.proceed(Array(EssentialAction(essentialAction)))
}
+ def recordHttpServerMetrics(result: Result, traceName: String, playExtension: PlayExtension): Unit =
+ playExtension.httpServerMetrics.recordResponse(traceName, result.header.status.toString, 1L)
+
@Around("execution(* play.api.GlobalSettings+.onError(..)) && args(request, ex)")
def aroundOnError(pjp: ProceedingJoinPoint, request: TraceContextAware, ex: Throwable): Any = request.traceContext match {
case None ⇒ pjp.proceed()
diff --git a/kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala b/kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala
index 3090e60e..fc195580 100644
--- a/kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala
+++ b/kamon-play/src/test/scala/kamon/play/RequestInstrumentationSpec.scala
@@ -15,6 +15,10 @@
package kamon.play
+import scala.concurrent.duration._
+import kamon.Kamon
+import kamon.http.HttpServerMetrics
+import kamon.metric.{ CollectionContext, Metrics }
import kamon.play.action.TraceName
import kamon.trace.{ TraceLocal, TraceRecorder }
import org.scalatestplus.play._
@@ -23,8 +27,9 @@ import play.api.mvc.Results.Ok
import play.api.mvc._
import play.api.test.Helpers._
import play.api.test._
+import play.libs.Akka
-import scala.concurrent.Future
+import scala.concurrent.{ Await, Future }
class RequestInstrumentationSpec extends PlaySpec with OneServerPerSuite {
@@ -107,6 +112,25 @@ class RequestInstrumentationSpec extends PlaySpec with OneServerPerSuite {
val Some(result) = route(FakeRequest(GET, "/retrieve").withHeaders(traceTokenHeader, traceLocalStorageHeader))
TraceLocal.retrieve(TraceLocalKey).get must be(traceLocalStorageValue)
}
+
+ "record http server metrics for all processed requests" in {
+ val collectionContext = CollectionContext(100)
+ Kamon(Metrics)(Akka.system()).register(HttpServerMetrics, HttpServerMetrics.Factory).get.collect(collectionContext)
+
+ for (repetition ← 1 to 10) {
+ Await.result(route(FakeRequest(GET, "/default").withHeaders(traceTokenHeader)).get, 10 seconds)
+ }
+
+ for (repetition ← 1 to 5) {
+ Await.result(route(FakeRequest(GET, "/notFound").withHeaders(traceTokenHeader)).get, 10 seconds)
+ }
+
+ val snapshot = Kamon(Metrics)(Akka.system()).register(HttpServerMetrics, HttpServerMetrics.Factory).get.collect(collectionContext)
+ snapshot.countsPerTraceAndStatusCode("GET: /default")("200").count must be(10)
+ snapshot.countsPerTraceAndStatusCode("GET: /notFound")("404").count must be(5)
+ snapshot.countsPerStatusCode("200").count must be(10)
+ snapshot.countsPerStatusCode("404").count must be(5)
+ }
}
object MockGlobalTest extends WithFilters(TraceLocalFilter)