From b2c218c100ee3a455f419ad6b0cff0dc68237288 Mon Sep 17 00:00:00 2001 From: Diego Date: Mon, 10 Aug 2015 00:23:22 -0300 Subject: ! play-2.3.x: grouping traces that doesn't are tagged as UntaggedTraces in order to avoid the creation of undesired traces --- .../src/main/scala/kamon/play/Play.scala | 4 +-- .../src/test/resources/conf/application.conf | 2 +- .../kamon/play/RequestInstrumentationSpec.scala | 35 ++++++++++++++++++++-- .../scala/kamon/play/WSInstrumentationSpec.scala | 4 +-- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/kamon-play-2.3.x/src/main/scala/kamon/play/Play.scala b/kamon-play-2.3.x/src/main/scala/kamon/play/Play.scala index d9fdfea8..f704dba0 100644 --- a/kamon-play-2.3.x/src/main/scala/kamon/play/Play.scala +++ b/kamon-play-2.3.x/src/main/scala/kamon/play/Play.scala @@ -68,14 +68,14 @@ class DefaultNameGenerator extends NameGenerator { // Convert paths of form GET /foo/bar/$paramname/blah to foo.bar.paramname.blah.get val p = normalizePattern.replaceAllIn(path, "$1").replace('/', '.').dropWhile(_ == '.') val normalisedPath = { - if (p.lastOption.filter(_ != '.').isDefined) s"$p." + if (p.lastOption.exists(_ != '.')) s"$p." else p } s"$normalisedPath${verb.toLowerCase(Locale.ENGLISH)}" } traceName }) - } getOrElse s"${requestHeader.method}: ${requestHeader.uri}" + } getOrElse "UntaggedTraces" def generateHttpClientSegmentName(request: WSRequest): String = request.url } diff --git a/kamon-play-2.3.x/src/test/resources/conf/application.conf b/kamon-play-2.3.x/src/test/resources/conf/application.conf index b927087c..be7ae283 100644 --- a/kamon-play-2.3.x/src/test/resources/conf/application.conf +++ b/kamon-play-2.3.x/src/test/resources/conf/application.conf @@ -2,7 +2,7 @@ kamon { play { include-trace-token-header = true trace-token-header-name = "X-Trace-Token" - name-generator = kamon.play.DefaultNameGenerator + name-generator = kamon.play.TestNameGenerator } } diff --git a/kamon-play-2.3.x/src/test/scala/kamon/play/RequestInstrumentationSpec.scala b/kamon-play-2.3.x/src/test/scala/kamon/play/RequestInstrumentationSpec.scala index ff115f31..9ef26350 100644 --- a/kamon-play-2.3.x/src/test/scala/kamon/play/RequestInstrumentationSpec.scala +++ b/kamon-play-2.3.x/src/test/scala/kamon/play/RequestInstrumentationSpec.scala @@ -19,12 +19,12 @@ import kamon.Kamon import kamon.metric.instrument.CollectionContext import kamon.play.action.TraceName import kamon.trace.TraceLocal.HttpContextKey -import kamon.trace.{ Tracer, TraceLocal, TraceContext } +import kamon.trace.{ Tracer, TraceLocal } import org.scalatestplus.play._ import play.api.DefaultGlobal import play.api.http.Writeable import play.api.libs.concurrent.Execution.Implicits.defaultContext -import play.api.libs.ws.WS +import play.api.libs.ws.{ WSRequest, WS } import play.api.mvc.Results.Ok import play.api.mvc._ import play.api.test.Helpers._ @@ -36,9 +36,10 @@ import scala.concurrent.duration._ import scala.concurrent.{ Await, Future } class RequestInstrumentationSpec extends PlaySpec with OneServerPerSuite { - Kamon.start() System.setProperty("config.file", "./kamon-play-2.3.x/src/test/resources/conf/application.conf") + Kamon.start() + override lazy val port: Port = 19002 val executor = scala.concurrent.ExecutionContext.Implicits.global @@ -264,4 +265,32 @@ object controllers { Ok("invoked show with: " + id) } } +} + +class TestNameGenerator extends NameGenerator { + import scala.collection.concurrent.TrieMap + import play.api.{ Routes ⇒ PlayRoutes } + import java.util.Locale + import kamon.util.TriemapAtomicGetOrElseUpdate.Syntax + + private val cache = TrieMap.empty[String, String] + private val normalizePattern = """\$([^<]+)<[^>]+>""".r + + def generateTraceName(requestHeader: RequestHeader): String = requestHeader.tags.get(PlayRoutes.ROUTE_VERB).map { verb ⇒ + val path = requestHeader.tags(PlayRoutes.ROUTE_PATTERN) + cache.atomicGetOrElseUpdate(s"$verb$path", { + val traceName = { + // Convert paths of form GET /foo/bar/$paramname/blah to foo.bar.paramname.blah.get + val p = normalizePattern.replaceAllIn(path, "$1").replace('/', '.').dropWhile(_ == '.') + val normalisedPath = { + if (p.lastOption.exists(_ != '.')) s"$p." + else p + } + s"$normalisedPath${verb.toLowerCase(Locale.ENGLISH)}" + } + traceName + }) + } getOrElse s"${requestHeader.method}: ${requestHeader.uri}" + + def generateHttpClientSegmentName(request: WSRequest): String = request.url } \ No newline at end of file diff --git a/kamon-play-2.3.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala b/kamon-play-2.3.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala index 346ef084..93ace7be 100644 --- a/kamon-play-2.3.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala +++ b/kamon-play-2.3.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala @@ -31,10 +31,10 @@ import scala.concurrent.Await import scala.concurrent.duration._ class WSInstrumentationSpec extends WordSpecLike with Matchers with OneServerPerSuite { - Kamon.start() - System.setProperty("config.file", "./kamon-play-2.3.x/src/test/resources/conf/application.conf") + Kamon.start() + override lazy val port: Port = 19003 implicit override lazy val app = FakeApplication(withRoutes = { case ("GET", "/async") ⇒ Action { Ok("ok") } -- cgit v1.2.3