aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Topolnak <ivantopo@gmail.com>2013-11-08 18:16:14 -0300
committerIvan Topolnak <ivantopo@gmail.com>2013-11-08 18:16:14 -0300
commit0a9d299e56db77481c47e23d05491c091d746f52 (patch)
treeee1c227fc0c8f3ed6e40863097e5e1e8d20434b4
parentbf86900669d649308f4914c54e6fe076510506a6 (diff)
downloadKamon-0a9d299e56db77481c47e23d05491c091d746f52.tar.gz
Kamon-0a9d299e56db77481c47e23d05491c091d746f52.tar.bz2
Kamon-0a9d299e56db77481c47e23d05491c091d746f52.zip
wip
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala6
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/AgentJsonProtocol.scala4
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala26
-rw-r--r--kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala8
-rw-r--r--kamon-trace/src/main/scala/kamon/trace/Trace.scala1
-rw-r--r--kamon-trace/src/main/scala/kamon/trace/UowTracing.scala2
-rw-r--r--kamon-trace/src/main/scala/kamon/trace/instrumentation/ActorRefTellInstrumentation.scala6
-rw-r--r--kamon-trace/src/main/scala/kamon/trace/instrumentation/RunnableTracing.scala25
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