aboutsummaryrefslogtreecommitdiff
path: root/kamon-spray/src/main/scala/spray/can/client
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2014-02-03 09:22:58 -0300
committerIvan Topolnjak <ivantopo@gmail.com>2014-02-03 09:22:58 -0300
commit819406d3ba117b886fedb133959bd7c362a8f726 (patch)
tree9b5cd0cd3e89837a578192942eb521faf40dc54f /kamon-spray/src/main/scala/spray/can/client
parent6f036514edb6dd406803acdffcff437dd92efe9b (diff)
downloadKamon-819406d3ba117b886fedb133959bd7c362a8f726.tar.gz
Kamon-819406d3ba117b886fedb133959bd7c362a8f726.tar.bz2
Kamon-819406d3ba117b886fedb133959bd7c362a8f726.zip
initial tests for spray-client instrumentation
Diffstat (limited to 'kamon-spray/src/main/scala/spray/can/client')
-rw-r--r--kamon-spray/src/main/scala/spray/can/client/ClientRequestInstrumentation.scala44
1 files changed, 38 insertions, 6 deletions
diff --git a/kamon-spray/src/main/scala/spray/can/client/ClientRequestInstrumentation.scala b/kamon-spray/src/main/scala/spray/can/client/ClientRequestInstrumentation.scala
index 868cbaca..4e2a352c 100644
--- a/kamon-spray/src/main/scala/spray/can/client/ClientRequestInstrumentation.scala
+++ b/kamon-spray/src/main/scala/spray/can/client/ClientRequestInstrumentation.scala
@@ -18,12 +18,15 @@ package spray.can.client
import org.aspectj.lang.annotation._
import org.aspectj.lang.ProceedingJoinPoint
-import spray.http.{ HttpMessageEnd, HttpRequest }
+import spray.http.{ HttpResponse, HttpMessageEnd, HttpRequest }
import spray.http.HttpHeaders.Host
import kamon.trace.{ TraceRecorder, SegmentCompletionHandleAware, TraceContextAware }
import kamon.metrics.TraceMetrics.HttpClientRequest
import kamon.Kamon
import kamon.spray.Spray
+import akka.actor.ActorRef
+import scala.concurrent.{ Future, ExecutionContext }
+import akka.util.Timeout
@Aspect
class ClientRequestInstrumentation {
@@ -43,13 +46,10 @@ class ClientRequestInstrumentation {
// The read to ctx.completionHandle should take care of initializing the aspect timely.
if (ctx.segmentCompletionHandle.isEmpty) {
TraceRecorder.currentContext.map { traceContext ⇒
- val requestAttributes = Map[String, String](
- "host" -> request.header[Host].map(_.value).getOrElse("unknown"),
- "path" -> request.uri.path.toString(),
- "method" -> request.method.toString())
-
+ val requestAttributes = basicRequestAttributes(request)
val clientRequestName = Kamon(Spray)(traceContext.system).assignHttpClientRequestName(request)
val completionHandle = traceContext.startSegment(HttpClientRequest(clientRequestName, SprayTime), requestAttributes)
+
ctx.segmentCompletionHandle = Some(completionHandle)
}
}
@@ -82,6 +82,38 @@ class ClientRequestInstrumentation {
case None ⇒ pjp.proceed()
}
}
+
+ @Pointcut("execution(* spray.client.pipelining$.sendReceive(akka.actor.ActorRef, *, *)) && args(transport, ec, timeout)")
+ def requestLevelApiSendReceive(transport: ActorRef, ec: ExecutionContext, timeout: Timeout): Unit = {}
+
+ @Around("requestLevelApiSendReceive(transport, ec, timeout)")
+ def aroundRequestLevelApiSendReceive(pjp: ProceedingJoinPoint, transport: ActorRef, ec: ExecutionContext, timeout: Timeout): Any = {
+ val originalSendReceive = pjp.proceed().asInstanceOf[HttpRequest ⇒ Future[HttpResponse]]
+
+ (request: HttpRequest) ⇒ {
+ val responseFuture = originalSendReceive.apply(request)
+
+ TraceRecorder.currentContext.map { traceContext ⇒
+ val requestAttributes = basicRequestAttributes(request)
+ val clientRequestName = Kamon(Spray)(traceContext.system).assignHttpClientRequestName(request)
+ val completionHandle = traceContext.startSegment(HttpClientRequest(clientRequestName, UserTime), requestAttributes)
+
+ responseFuture.onComplete { result ⇒
+ completionHandle.finish(Map.empty)
+ }(ec)
+ }
+
+ responseFuture
+ }
+
+ }
+
+ def basicRequestAttributes(request: HttpRequest): Map[String, String] = {
+ Map[String, String](
+ "host" -> request.header[Host].map(_.value).getOrElse("unknown"),
+ "path" -> request.uri.path.toString(),
+ "method" -> request.method.toString())
+ }
}
object ClientRequestInstrumentation {