aboutsummaryrefslogtreecommitdiff
path: root/kamon-spray/src/main/scala/spray/can/server
diff options
context:
space:
mode:
authorIvan Topolnak <ivantopo@gmail.com>2013-11-05 18:38:39 -0300
committerIvan Topolnak <ivantopo@gmail.com>2013-11-05 18:38:39 -0300
commit2b63540e5fffab545d0846cfb3dab5c0e1d0c9e1 (patch)
tree56c4ad1f025c9144376cd4463ad4d4a23e37b571 /kamon-spray/src/main/scala/spray/can/server
parent5127c3bb83cd6fe90e071720d995cfb53d913e6a (diff)
downloadKamon-2b63540e5fffab545d0846cfb3dab5c0e1d0c9e1.tar.gz
Kamon-2b63540e5fffab545d0846cfb3dab5c0e1d0c9e1.tar.bz2
Kamon-2b63540e5fffab545d0846cfb3dab5c0e1d0c9e1.zip
basic separation of concerns between sub-projects
Diffstat (limited to 'kamon-spray/src/main/scala/spray/can/server')
-rw-r--r--kamon-spray/src/main/scala/spray/can/server/ServerRequestTracing.scala56
1 files changed, 56 insertions, 0 deletions
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))
+ }
+ }
+}