From 2b63540e5fffab545d0846cfb3dab5c0e1d0c9e1 Mon Sep 17 00:00:00 2001 From: Ivan Topolnak Date: Tue, 5 Nov 2013 18:38:39 -0300 Subject: basic separation of concerns between sub-projects --- .../spray/can/server/ServerRequestTracing.scala | 56 ++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 kamon-spray/src/main/scala/spray/can/server/ServerRequestTracing.scala (limited to 'kamon-spray/src/main/scala/spray/can/server') diff --git a/kamon-spray/src/main/scala/spray/can/server/ServerRequestTracing.scala b/kamon-spray/src/main/scala/spray/can/server/ServerRequestTracing.scala new file mode 100644 index 00000000..d5e21f35 --- /dev/null +++ b/kamon-spray/src/main/scala/spray/can/server/ServerRequestTracing.scala @@ -0,0 +1,56 @@ +package spray.can.server + +import org.aspectj.lang.annotation.{After, Pointcut, DeclareMixin, Aspect} +import kamon.trace.{Trace, TraceContext, ContextAware} +import spray.http.HttpRequest +import akka.actor.ActorSystem +import akka.event.Logging.Warning + + +@Aspect +class ServerRequestTracing { + + @DeclareMixin("spray.can.server.OpenRequestComponent.DefaultOpenRequest") + def mixinContextAwareToOpenRequest: ContextAware = ContextAware.default + + + @Pointcut("execution(spray.can.server.OpenRequestComponent$DefaultOpenRequest.new(..)) && this(openRequest) && args(*, request, *, *)") + def openRequestInit(openRequest: ContextAware, request: HttpRequest): Unit = {} + + @After("openRequestInit(openRequest, request)") + def afterInit(openRequest: ContextAware, request: HttpRequest): Unit = { + val system: ActorSystem = openRequest.asInstanceOf[OpenRequest].context.actorContext.system + val defaultTraceName: String = request.method.value + ": " + request.uri.path + + Trace.start(defaultTraceName)(system) + + // Necessary to force initialization of traceContext when initiating the request. + openRequest.traceContext + } + + @Pointcut("execution(* spray.can.server.OpenRequestComponent$DefaultOpenRequest.handleResponseEndAndReturnNextOpenRequest(..)) && target(openRequest)") + def openRequestCreation(openRequest: ContextAware): Unit = {} + + @After("openRequestCreation(openRequest)") + def afterFinishingRequest(openRequest: ContextAware): Unit = { + val storedContext = openRequest.traceContext + val incomingContext = Trace.finish() + + for(original <- storedContext) { + incomingContext match { + case Some(incoming) if original.id != incoming.id => + publishWarning(s"Different ids when trying to close a Trace, original: [$original] - incoming: [$incoming]") + + case Some(_) => // nothing to do here. + + case None => + publishWarning(s"Trace context not present while closing the Trace: [$original]") + } + } + + def publishWarning(text: String): Unit = { + val system: ActorSystem = openRequest.asInstanceOf[OpenRequest].context.actorContext.system + system.eventStream.publish(Warning("", classOf[ServerRequestTracing], text)) + } + } +} -- cgit v1.2.3