diff options
8 files changed, 37 insertions, 41 deletions
diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala index c4d7c089..65b631f1 100644 --- a/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala @@ -1,6 +1,6 @@ package kamon.newrelic -import akka.actor.Actor +import akka.actor.{ActorLogging, Actor} import spray.json._ import scala.concurrent.Future import spray.httpx.{SprayJsonSupport, RequestBuilding, ResponseTransformation} @@ -13,7 +13,7 @@ import spray.client.pipelining._ import scala.util.control.NonFatal import kamon.newrelic.NewRelicMetric.{Data, ID, MetricBatch} -class Agent extends Actor with RequestBuilding with ResponseTransformation with SprayJsonSupport { +class Agent extends Actor with RequestBuilding with ResponseTransformation with SprayJsonSupport with ActorLogging { import context.dispatcher import Agent._ @@ -79,6 +79,8 @@ class Agent extends Actor with RequestBuilding with ResponseTransformation with def sendMetricData(runId: Long, collector: String, metrics: List[(ID, Data)]) = { + log.info("Reporting this to NewRelic: " + metrics.mkString("\n")) + val end = System.currentTimeMillis() / 1000L val start = end - 60 compressedPipeline { diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/AgentJsonProtocol.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/AgentJsonProtocol.scala index 30e17e77..990f50dd 100644 --- a/kamon-newrelic/src/main/scala/kamon/newrelic/AgentJsonProtocol.scala +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/AgentJsonProtocol.scala @@ -33,12 +33,12 @@ object AgentJsonProtocol extends DefaultJsonProtocol { "name" -> JsString(id.name) // TODO Include scope ), JsArray( + JsNumber(data.callCount), JsNumber(data.total), JsNumber(data.totalExclusive), JsNumber(data.min), JsNumber(data.max), - JsNumber(data.sumOfSquares), - JsNumber(data.callCount) + JsNumber(data.sumOfSquares) ) ) } diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala index 2ee7ada0..a2fbc5e9 100644 --- a/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala @@ -37,7 +37,7 @@ class NewRelicManager extends Actor with ActorLogging { object NewRelicMetric { case class ID(name: String, scope: Option[String]) - case class Data(var total: Double, var totalExclusive: Double, var min: Double, var max: Double, var sumOfSquares: Double, var callCount: Long) { + case class Data(var callCount: Long, var total: Double, var totalExclusive: Double, var min: Double, var max: Double, var sumOfSquares: Double) { def record(value: Double): Unit = { if(value > max) max = value if(value < min) min = value @@ -50,7 +50,7 @@ object NewRelicMetric { } object Data { - def apply(): Data = Data(0, 0, 0, 0, 0, 0) + def apply(): Data = Data(0, 0, 0, Double.MaxValue, 0, 0) } case object FlushMetrics @@ -59,7 +59,7 @@ object NewRelicMetric { class WebTransactionMetrics extends Actor with ActorLogging { - val apdexT = 1500000000 + val apdexT = 0.5D var metrics = mutable.Map.empty[NewRelicMetric.ID, NewRelicMetric.Data] var apdex = NewRelicMetric.Data(0, 0, 0, apdexT, apdexT, 0) @@ -80,23 +80,25 @@ class WebTransactionMetrics extends Actor with ActorLogging { def recordApdex(time: Double): Unit = { if(time <= apdexT) - apdex.total += 1 + apdex.callCount += 1 else if(time > apdexT && time <= (4 * apdexT)) - apdex.totalExclusive += 1 + apdex.total += 1 else - apdex.min += 1 + apdex.totalExclusive += 1 } def updateStats(trace: UowTrace): Unit = { // Basic Metrics - recordApdex(trace.elapsed) - recordValue(NewRelicMetric.ID("WebTransaction", None), trace.elapsed) - recordValue(NewRelicMetric.ID("HttpDispatcher", None), trace.elapsed) - recordValue(NewRelicMetric.ID("WebTransaction/Custom/" + trace.name, None), trace.elapsed) + val elapsedSeconds = trace.elapsed / 1E9D + + recordApdex(elapsedSeconds) + recordValue(NewRelicMetric.ID("WebTransaction", None), elapsedSeconds) + recordValue(NewRelicMetric.ID("HttpDispatcher", None), elapsedSeconds) + recordValue(NewRelicMetric.ID("WebTransaction/Custom/" + trace.name, None), elapsedSeconds) - println("Recorded Apdex: " + apdex) - println("Current Metrics: " + metrics.mkString("\n")) + /*println("Recorded Apdex: " + apdex) + println("Current Metrics: \n" + metrics.mkString("\n"))*/ } } diff --git a/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala b/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala index 628a2c41..5e1bfdd3 100644 --- a/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala +++ b/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala @@ -8,6 +8,7 @@ import scala.concurrent.{Await, Future} import kamon.spray.UowDirectives import kamon.trace.Trace import kamon.Kamon +import scala.util.Random object SimpleRequestProcessor extends App with SimpleRoutingApp with RequestBuilding with UowDirectives { import scala.concurrent.duration._ @@ -25,7 +26,7 @@ object SimpleRequestProcessor extends App with SimpleRoutingApp with RequestBuil val pipeline = sendReceive val replier = system.actorOf(Props[Replier]) - + val random = new Random() startServer(interface = "localhost", port = 9090) { get { path("test"){ @@ -48,7 +49,10 @@ object SimpleRequestProcessor extends App with SimpleRoutingApp with RequestBuil } } ~ path("ok") { - complete("ok") + complete{ + //Thread.sleep(random.nextInt(1) + random.nextInt(5) + random.nextInt(2)) + "ok" + } } ~ path("future") { dynamic { diff --git a/kamon-trace/src/main/scala/kamon/trace/Trace.scala b/kamon-trace/src/main/scala/kamon/trace/Trace.scala index 6e01ad26..1956509c 100644 --- a/kamon-trace/src/main/scala/kamon/trace/Trace.scala +++ b/kamon-trace/src/main/scala/kamon/trace/Trace.scala @@ -60,7 +60,6 @@ class TraceManager extends Actor with ActorLogging { context.child(tracerName).getOrElse(newTracer(tracerName)) ! segment case trace: UowTrace => - println("Delivering a trace to: " + listeners) listeners foreach(_ ! trace) } diff --git a/kamon-trace/src/main/scala/kamon/trace/UowTracing.scala b/kamon-trace/src/main/scala/kamon/trace/UowTracing.scala index 009a6da2..273e0ca1 100644 --- a/kamon-trace/src/main/scala/kamon/trace/UowTracing.scala +++ b/kamon-trace/src/main/scala/kamon/trace/UowTracing.scala @@ -41,6 +41,7 @@ class UowTraceAggregator(reporting: ActorRef, aggregationTimeout: Duration) exte def receive = { case start: Start => this.start = start.timestamp + segments = segments :+ start; name = start.name case finish: Finish => end = finish.timestamp @@ -58,7 +59,6 @@ class UowTraceAggregator(reporting: ActorRef, aggregationTimeout: Duration) exte def finishTracing(): Unit = { reporting ! UowTrace(name, "", start, end, segments) - println("Recorded Segments: " + segments) context.stop(self) } } diff --git a/kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorRefTellInstrumentation.scala b/kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorRefTellInstrumentation.scala index 3caba77c..057e339d 100644 --- a/kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorRefTellInstrumentation.scala +++ b/kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorRefTellInstrumentation.scala @@ -34,11 +34,9 @@ class ActorCellInvokeInstrumentation { class EnvelopeTracingContext { @DeclareMixin("akka.dispatch.Envelope") - def mixin: ContextAware = new ContextAware { - val traceContext: Option[TraceContext] = Trace.context() - } + def mixin: ContextAware = ContextAware.default - @Pointcut("execution(akka.dispatch.ContextAware.new(..)) && this(ctx)") + @Pointcut("execution(akka.dispatch.Envelope.new(..)) && this(ctx)") def requestRecordInit(ctx: ContextAware): Unit = {} @After("requestRecordInit(ctx)") diff --git a/kamon-trace/src/main/scala/kamon/trace/instrumentation/RunnableTracing.scala b/kamon-trace/src/main/scala/kamon/trace/instrumentation/RunnableTracing.scala index 3e5a7cce..5c16a648 100644 --- a/kamon-trace/src/main/scala/kamon/trace/instrumentation/RunnableTracing.scala +++ b/kamon-trace/src/main/scala/kamon/trace/instrumentation/RunnableTracing.scala @@ -2,7 +2,7 @@ package kamon.trace.instrumentation import org.aspectj.lang.annotation._ import org.aspectj.lang.ProceedingJoinPoint -import kamon.trace.{TraceContext, Trace} +import kamon.trace.{ContextAware, TraceContext, Trace} @Aspect class RunnableTracing { @@ -12,32 +12,30 @@ class RunnableTracing { * while their run method is executed. */ @DeclareMixin("scala.concurrent.impl.CallbackRunnable || scala.concurrent.impl.Future.PromiseCompletingRunnable") - def onCompleteCallbacksRunnable: TraceContextAwareRunnable = new TraceContextAwareRunnable { - val traceContext: Option[TraceContext] = Trace.traceContext.value - } + def onCompleteCallbacksRunnable: ContextAware = ContextAware.default /** * Pointcuts */ - @Pointcut("execution(kamon.instrumentation.TraceContextAwareRunnable+.new(..)) && this(runnable)") - def instrumentedRunnableCreation(runnable: TraceContextAwareRunnable): Unit = {} + @Pointcut("execution(kamon.trace.ContextAware+.new(..)) && this(runnable)") + def instrumentedRunnableCreation(runnable: ContextAware): Unit = {} - @Pointcut("execution(* kamon.instrumentation.TraceContextAwareRunnable+.run()) && this(runnable)") - def runnableExecution(runnable: TraceContextAwareRunnable) = {} + @Pointcut("execution(* kamon.trace.ContextAware+.run()) && this(runnable)") + def runnableExecution(runnable: ContextAware) = {} @After("instrumentedRunnableCreation(runnable)") - def beforeCreation(runnable: TraceContextAwareRunnable): Unit = { + def beforeCreation(runnable: ContextAware): Unit = { // Force traceContext initialization. runnable.traceContext } @Around("runnableExecution(runnable)") - def around(pjp: ProceedingJoinPoint, runnable: TraceContextAwareRunnable): Any = { + def around(pjp: ProceedingJoinPoint, runnable: ContextAware): Any = { import pjp._ Trace.traceContext.withValue(runnable.traceContext) { @@ -45,11 +43,4 @@ class RunnableTracing { } } -} - -/** - * Marker interface, just to make sure we don't instrument all the Runnables in the classpath. - */ -trait TraceContextAwareRunnable { - def traceContext: Option[TraceContext] }
\ No newline at end of file |