From 50823a3cc4f6644d569255c7e04423c36eedf295 Mon Sep 17 00:00:00 2001 From: Ivan Topolnak Date: Sat, 21 Sep 2013 22:57:43 -0300 Subject: wip --- .../SprayServerInstrumentation.scala | 57 ++++++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) (limited to 'kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala') diff --git a/kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala b/kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala index 6573549d..f8ab709e 100644 --- a/kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala +++ b/kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala @@ -1,10 +1,12 @@ package kamon.instrumentation -import org.aspectj.lang.annotation.{After, Pointcut, Aspect} -import kamon.Tracer -import kamon.trace.UowTracing.{Finish, Rename} +import org.aspectj.lang.annotation.{DeclareMixin, After, Pointcut, Aspect} +import kamon.{TraceContext, Tracer} +import kamon.trace.UowTracing.{WebExternal, Finish, Rename} import spray.http.HttpRequest import spray.can.server.OpenRequestComponent +import spray.can.client.HttpHostConnector.RequestContext +import spray.http.HttpHeaders.Host @Aspect class SprayServerInstrumentation { @@ -17,7 +19,7 @@ class SprayServerInstrumentation { //@After("openRequestInit()") //def afterInit(): Unit = { Tracer.start - println("Created the context: " + Tracer.context() + " for the transaction: " + request.uri.path.toString()) + //println("Created the context: " + Tracer.context() + " for the transaction: " + request.uri.path.toString()) Tracer.context().map(_.entries ! Rename(request.uri.path.toString())) } @@ -30,4 +32,51 @@ class SprayServerInstrumentation { Tracer.context().map(_.entries ! Finish()) } + + + + + @Pointcut("execution(spray.can.client.HttpHostConnector.RequestContext.new(..)) && this(ctx)") + def requestRecordInit(ctx: TracingAwareRequestContext): Unit = {} + + @After("requestRecordInit(ctx)") + def whenCreatedRequestRecord(ctx: TracingAwareRequestContext): Unit = { + // Necessary to force the initialization of TracingAwareRequestContext at the moment of creation. + ctx.context + } + + + + + + + @Pointcut("execution(* spray.can.client.HttpHostConnectionSlot.dispatchToCommander(..)) && args(ctx, msg)") + def requestRecordInit2(ctx: TracingAwareRequestContext, msg: Any): Unit = {} + + @After("requestRecordInit2(ctx, msg)") + def whenCreatedRequestRecord2(ctx: TracingAwareRequestContext, msg: Any): Unit = { + println("=======> Spent in WEB External: " + (System.nanoTime() - ctx.timestamp)) + + // TODO: REMOVE THIS: + val request = (ctx.asInstanceOf[RequestContext]).request + + ctx.context.map(_.entries ! WebExternal(ctx.timestamp, System.nanoTime(), request.header[Host].map(_.host).getOrElse("UNKNOWN"))) + + } +} + +trait TracingAwareRequestContext { + def context: Option[TraceContext] + def timestamp: Long +} + +case class DefaultTracingAwareRequestContext(context: Option[TraceContext] = Tracer.context(), + timestamp: Long = System.nanoTime) extends TracingAwareRequestContext + + +@Aspect +class SprayRequestContextTracing { + + @DeclareMixin("spray.can.client.HttpHostConnector.RequestContext") + def mixin: TracingAwareRequestContext = DefaultTracingAwareRequestContext() } \ No newline at end of file -- cgit v1.2.3