diff options
14 files changed, 66 insertions, 60 deletions
diff --git a/kamon-core/src/main/scala/kamon/Kamon.scala b/kamon-core/src/main/scala/kamon/Kamon.scala index fb1b2393..75ef1efe 100644 --- a/kamon-core/src/main/scala/kamon/Kamon.scala +++ b/kamon-core/src/main/scala/kamon/Kamon.scala @@ -1,12 +1,11 @@ package kamon -import akka.actor.{Actor, Props, ActorSystem} +import akka.actor._ import kamon.metric.{HistogramSnapshot, ActorSystemMetrics} import scala.concurrent.duration.FiniteDuration -import com.newrelic.api.agent.NewRelic import scala.collection.concurrent.TrieMap import kamon.instrumentation.{SimpleContextPassingInstrumentation, ActorInstrumentationConfiguration} -import scala.util.DynamicVariable +import kamon.metric.ActorSystemMetrics object Instrument { @@ -14,6 +13,19 @@ object Instrument { } object Kamon { + trait Extension extends akka.actor.Extension { + def manager: ActorRef + } + + def apply[T <: Extension](key: ExtensionId[T])(implicit system: ActorSystem): ActorRef = key(system).manager + + + + + + + + implicit lazy val actorSystem = ActorSystem("kamon") object Metric { @@ -32,18 +44,6 @@ object Kamon { } -object Tracer { - val traceContext = new DynamicVariable[Option[TraceContext]](None) - - - def context() = traceContext.value - def set(ctx: TraceContext) = traceContext.value = Some(ctx) - - def start = set(newTraceContext) - def newTraceContext(): TraceContext = TraceContext()(Kamon.actorSystem) -} - - class MetricManager extends Actor { implicit val ec = context.system.dispatcher @@ -70,29 +70,3 @@ class MetricManager extends Actor { case class RegisterForAllDispatchers(frequency: FiniteDuration) case class DispatcherMetrics(actorSystem: String, dispatcher: String, activeThreads: HistogramSnapshot, poolSize: HistogramSnapshot, queueSize: HistogramSnapshot) - - - - - - -class NewrelicReporterActor extends Actor { - import scala.concurrent.duration._ - - //Kamon.metricManager ! RegisterForAllDispatchers(5 seconds) - - def receive = { - case DispatcherMetrics(actorSystem, dispatcher, activeThreads, poolSize, queueSize) => { - /*println("PUBLISHED DISPATCHER STATS") - println(s"Custom/$actorSystem/Dispatcher/$dispatcher/Threads/active =>" + activeThreads.median.toFloat) - println(s"Custom/$actorSystem/Dispatcher/$dispatcher/Threads/inactive =>" + (poolSize.median.toFloat-activeThreads.median.toFloat)) - println(s"Custom/$actorSystem/Dispatcher/$dispatcher/Queue =>" + queueSize.median.toFloat)*/ - - - NewRelic.recordMetric(s"Custom/$actorSystem/Dispatcher/$dispatcher/Threads/active", activeThreads.median.toFloat) - NewRelic.recordMetric(s"Custom/$actorSystem/Dispatcher/$dispatcher/Threads/inactive", (poolSize.median.toFloat-activeThreads.median.toFloat)) - - NewRelic.recordMetric(s"Custom/$actorSystem/Dispatcher/$dispatcher/Queue", queueSize.median.toFloat) - } - } -}
\ No newline at end of file diff --git a/kamon-core/src/main/scala/kamon/instrumentation/ActorInstrumentation.scala b/kamon-core/src/main/scala/kamon/instrumentation/ActorInstrumentation.scala index 4e47c2a4..4e078201 100644 --- a/kamon-core/src/main/scala/kamon/instrumentation/ActorInstrumentation.scala +++ b/kamon-core/src/main/scala/kamon/instrumentation/ActorInstrumentation.scala @@ -2,8 +2,9 @@ package kamon.instrumentation import akka.actor.{Props, ActorSystem, ActorRef} import akka.dispatch.{MessageDispatcher, Envelope} -import kamon.{Tracer, TraceContext} +import kamon.{Tracer} import kamon.instrumentation.SimpleContextPassingInstrumentation.SimpleTraceMessage +import kamon.trace.TraceContext trait ActorInstrumentationConfiguration { def sendMessageTransformation(from: ActorRef, to: ActorRef, message: Any): Any diff --git a/kamon-core/src/main/scala/kamon/instrumentation/ActorLoggingInstrumentation.scala b/kamon-core/src/main/scala/kamon/instrumentation/ActorLoggingInstrumentation.scala index 47d1756f..9b53bd5d 100644 --- a/kamon-core/src/main/scala/kamon/instrumentation/ActorLoggingInstrumentation.scala +++ b/kamon-core/src/main/scala/kamon/instrumentation/ActorLoggingInstrumentation.scala @@ -1,9 +1,10 @@ package kamon.instrumentation import org.aspectj.lang.annotation.{Around, Pointcut, DeclareMixin, Aspect} -import kamon.{Tracer, TraceContext} +import kamon.{Tracer} import org.aspectj.lang.ProceedingJoinPoint import org.slf4j.MDC +import kamon.trace.TraceContext @Aspect class ActorLoggingInstrumentation { diff --git a/kamon-core/src/main/scala/kamon/instrumentation/ActorRefTellInstrumentation.scala b/kamon-core/src/main/scala/kamon/instrumentation/ActorRefTellInstrumentation.scala index 7b5d5339..9b5ce0a4 100644 --- a/kamon-core/src/main/scala/kamon/instrumentation/ActorRefTellInstrumentation.scala +++ b/kamon-core/src/main/scala/kamon/instrumentation/ActorRefTellInstrumentation.scala @@ -3,11 +3,12 @@ package kamon.instrumentation import org.aspectj.lang.annotation._ import org.aspectj.lang.ProceedingJoinPoint import akka.actor.{Props, ActorSystem, ActorRef} -import kamon.{Tracer, TraceContext} +import kamon.{Tracer} import akka.dispatch.{Envelope, MessageDispatcher} import com.codahale.metrics.Timer import scala.Some import kamon.trace.context.TracingAwareContext +import kamon.trace.TraceContext case class TraceableMessage(traceContext: Option[TraceContext], message: Any, timer: Timer.Context) case class DefaultTracingAwareEnvelopeContext(traceContext: Option[TraceContext] = Tracer.traceContext.value, timestamp: Long = System.nanoTime) extends TracingAwareContext diff --git a/kamon-core/src/main/scala/kamon/instrumentation/RunnableInstrumentation.scala b/kamon-core/src/main/scala/kamon/instrumentation/RunnableInstrumentation.scala index 992cfa82..2be6e5d1 100644 --- a/kamon-core/src/main/scala/kamon/instrumentation/RunnableInstrumentation.scala +++ b/kamon-core/src/main/scala/kamon/instrumentation/RunnableInstrumentation.scala @@ -1,9 +1,10 @@ package kamon.instrumentation import org.aspectj.lang.annotation._ -import kamon.{Tracer, TraceContext} +import kamon.{Tracer} import org.aspectj.lang.ProceedingJoinPoint import scala.Some +import kamon.trace.TraceContext /** * Marker interface, just to make sure we don't instrument all the Runnables in the classpath. diff --git a/kamon-core/src/main/scala/kamon/trace/context/TracingAwareContext.scala b/kamon-core/src/main/scala/kamon/trace/context/TracingAwareContext.scala index 3766dd22..c8d0d4f0 100644 --- a/kamon-core/src/main/scala/kamon/trace/context/TracingAwareContext.scala +++ b/kamon-core/src/main/scala/kamon/trace/context/TracingAwareContext.scala @@ -1,6 +1,6 @@ package kamon.trace.context -import kamon.TraceContext +import kamon.trace.TraceContext trait TracingAwareContext { def traceContext: Option[TraceContext] diff --git a/kamon-core/src/test/scala/akka/instrumentation/ActorInstrumentationSpec.scala b/kamon-core/src/test/scala/akka/instrumentation/ActorInstrumentationSpec.scala index 21be4a73..cdfa2813 100644 --- a/kamon-core/src/test/scala/akka/instrumentation/ActorInstrumentationSpec.scala +++ b/kamon-core/src/test/scala/akka/instrumentation/ActorInstrumentationSpec.scala @@ -4,12 +4,13 @@ import org.scalatest.{WordSpecLike, Matchers} import akka.actor.{ActorRef, Actor, Props, ActorSystem} import akka.testkit.{ImplicitSender, TestKit} -import kamon.{TraceContext, Tracer} +import kamon.{Tracer} import akka.pattern.{pipe, ask} import akka.util.Timeout import scala.concurrent.duration._ import scala.concurrent.{Await, Future} import akka.routing.RoundRobinRouter +import kamon.trace.TraceContext class ActorInstrumentationSpec extends TestKit(ActorSystem("ActorInstrumentationSpec")) with WordSpecLike with Matchers with ImplicitSender { diff --git a/kamon-core/src/test/scala/kamon/instrumentation/RunnableInstrumentationSpec.scala b/kamon-core/src/test/scala/kamon/instrumentation/RunnableInstrumentationSpec.scala index 6010a185..570f64dd 100644 --- a/kamon-core/src/test/scala/kamon/instrumentation/RunnableInstrumentationSpec.scala +++ b/kamon-core/src/test/scala/kamon/instrumentation/RunnableInstrumentationSpec.scala @@ -3,12 +3,13 @@ package kamon.instrumentation import scala.concurrent.{Await, Promise, Future} import org.scalatest.{Matchers, OptionValues, WordSpec} import org.scalatest.concurrent.{ScalaFutures, PatienceConfiguration} -import kamon.{Tracer, Kamon, TraceContext} +import kamon.{Tracer, Kamon} import java.util.UUID import scala.util.Success import scala.concurrent.duration._ import java.util.concurrent.TimeUnit import akka.actor.ActorSystem +import kamon.trace.TraceContext class RunnableInstrumentationSpec extends WordSpec with Matchers with ScalaFutures with PatienceConfiguration with OptionValues { diff --git a/kamon-metrics/src/main/scala/kamon/Metrics.scala b/kamon-metrics/src/main/scala/kamon/Metrics.scala index 2b0e94bd..355c67c7 100644 --- a/kamon-metrics/src/main/scala/kamon/Metrics.scala +++ b/kamon-metrics/src/main/scala/kamon/Metrics.scala @@ -1,7 +1,20 @@ package kamon import com.codahale.metrics.MetricRegistry +import com.typesafe.config.ConfigFactory +import akka.actor.{ActorRef, ExtendedActorSystem, ExtensionIdProvider, ExtensionId} +import kamon.Kamon.Extension +import akka.actor + +class MetricsExtension(system: ExtendedActorSystem) extends Kamon.Extension { + def manager: ActorRef = ??? +} + +object Metrics extends ExtensionId[MetricsExtension] with ExtensionIdProvider { + def lookup(): ExtensionId[_ <: actor.Extension] = Metrics + def createExtension(system: ExtendedActorSystem): Extension = new MetricsExtension(system) -object Metrics { val registry = new MetricRegistry + + } diff --git a/kamon-metrics/src/test/scala/kamon/MailboxSizeMetricsSpec.scala b/kamon-metrics/src/test/scala/kamon/MailboxSizeMetricsSpec.scala index 7cae30f1..206c58e1 100644 --- a/kamon-metrics/src/test/scala/kamon/MailboxSizeMetricsSpec.scala +++ b/kamon-metrics/src/test/scala/kamon/MailboxSizeMetricsSpec.scala @@ -1,12 +1,16 @@ package kamon -import org.scalatest.WordSpec +import org.scalatest.{WordSpecLike, WordSpec} +import akka.testkit.TestKit +import akka.actor.{Props, ActorSystem} -class MailboxSizeMetricsSpec extends WordSpec { +class MailboxSizeMetricsSpec extends TestKit(ActorSystem("mailbox-size-metrics-spec")) with WordSpecLike { "the mailbox size metrics instrumentation" should { "register a counter for mailbox size upon actor creation" in { + val target = system.actorOf(Props.empty, "sample") + Metrics.registry.getHistograms.get("akka://mailbox-size-metrics-spec/sample:MAILBOX") } } } diff --git a/kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala b/kamon-spray/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala index 2239f382..743769e2 100644 --- a/kamon-core/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala +++ b/kamon-spray/src/main/scala/kamon/instrumentation/SprayServerInstrumentation.scala @@ -1,13 +1,8 @@ package kamon.instrumentation import org.aspectj.lang.annotation._ -import kamon.{TraceContext, Tracer} -import kamon.trace.UowTracing._ -import kamon.trace.context.TracingAwareContext import org.aspectj.lang.ProceedingJoinPoint import spray.http.HttpRequest -import kamon.trace.UowTracing.Finish -import kamon.trace.UowTracing.Rename import spray.http.HttpHeaders.Host //import spray.can.client.HttpHostConnector.RequestContext diff --git a/kamon-core/src/main/scala/kamon/TraceContext.scala b/kamon-trace/src/main/scala/kamon/trace/TraceContext.scala index 63cdb488..78db911d 100644 --- a/kamon-core/src/main/scala/kamon/TraceContext.scala +++ b/kamon-trace/src/main/scala/kamon/trace/TraceContext.scala @@ -1,12 +1,9 @@ -package kamon +package kamon.trace import java.util.UUID import akka.actor._ import java.util.concurrent.atomic.AtomicLong -import kamon.trace.UowTraceAggregator import scala.concurrent.duration._ -import kamon.newrelic.NewRelicReporting -import kamon.trace.UowTracing.Start // TODO: Decide if we need or not an ID, generating it takes time and it doesn't seem necessary. case class TraceContext(id: Long, tracer: ActorRef, uow: String = "", userContext: Option[Any] = None) diff --git a/kamon-trace/src/main/scala/kamon/trace/Tracer.scala b/kamon-trace/src/main/scala/kamon/trace/Tracer.scala new file mode 100644 index 00000000..e64cfaa6 --- /dev/null +++ b/kamon-trace/src/main/scala/kamon/trace/Tracer.scala @@ -0,0 +1,16 @@ +package kamon.trace + +import scala.util.DynamicVariable + + + +object Tracer { + val traceContext = new DynamicVariable[Option[TraceContext]](None) + + + def context() = traceContext.value + def set(ctx: TraceContext) = traceContext.value = Some(ctx) + + def start = set(newTraceContext) + def newTraceContext(): TraceContext = TraceContext()(Kamon.actorSystem) +} diff --git a/project/Build.scala b/project/Build.scala index 7374d195..a874302f 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -38,6 +38,7 @@ object Build extends Build { libraryDependencies ++= compile(akkaActor, aspectJ, newrelic) ++ test(scalatest, akkaTestKit, sprayTestkit)) + .dependsOn(kamonCore) lazy val kamonSpray = Project("kamon-spray", file("kamon-spray")) |